@shapeshift-labs/frontier-lang-compiler 0.2.99 → 0.2.101

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 (57) hide show
  1. package/dist/declarations/bidirectional-target-change-evidence.d.ts +299 -0
  2. package/dist/declarations/bidirectional-target-change.d.ts +19 -120
  3. package/dist/declarations/native-project-admission.d.ts +43 -22
  4. package/dist/declarations/semantic-edit-bundle.d.ts +13 -1
  5. package/dist/declarations/semantic-edit-replay-diagnostics.d.ts +24 -0
  6. package/dist/declarations/semantic-edit-script.d.ts +53 -51
  7. package/dist/declarations/semantic-lineage.d.ts +62 -51
  8. package/dist/declarations/semantic-merge-candidates.d.ts +39 -0
  9. package/dist/declarations/semantic-patch-bundle.d.ts +13 -0
  10. package/dist/declarations/semantic-sidecar-admission.d.ts +14 -0
  11. package/dist/declarations/semantic-sidecar.d.ts +12 -14
  12. package/dist/internal/index-impl/bidirectionalTargetRoundtripEvidence.js +200 -0
  13. package/dist/internal/index-impl/createBidirectionalTargetChangeRecord.js +62 -17
  14. package/dist/internal/index-impl/createNativeSourcePreservation.js +16 -1
  15. package/dist/internal/index-impl/createProjectImportAdmissionRecord.js +151 -1
  16. package/dist/internal/index-impl/createSemanticImportSidecar.js +5 -0
  17. package/dist/internal/index-impl/createSemanticImportSidecarAdmission.js +29 -11
  18. package/dist/internal/index-impl/declarationRecord.js +2 -2
  19. package/dist/internal/index-impl/inferSemanticLineageEvents.js +8 -0
  20. package/dist/internal/index-impl/nativeChangeProjectionEndpoint.js +56 -16
  21. package/dist/internal/index-impl/projectImportAdmissionMergeScore.js +26 -74
  22. package/dist/internal/index-impl/projectImportAdmissionProjectionCoverage.js +74 -0
  23. package/dist/internal/index-impl/projectSemanticEditScriptToSource.js +92 -74
  24. package/dist/internal/index-impl/replaySemanticEditProjection.js +114 -40
  25. package/dist/internal/index-impl/semanticEditBundleAdmission.js +95 -12
  26. package/dist/internal/index-impl/semanticEditBundleIndex.js +16 -10
  27. package/dist/internal/index-impl/semanticEditInsertionAnchors.js +8 -5
  28. package/dist/internal/index-impl/semanticEditReplayDiagnostics.js +167 -0
  29. package/dist/internal/index-impl/semanticEditSourceRanges.js +283 -0
  30. package/dist/internal/index-impl/semanticHistoryLineageResolution.js +56 -3
  31. package/dist/internal/index-impl/semanticIndexFromNativeDeclarations.js +2 -2
  32. package/dist/internal/index-impl/semanticLineageHashEvidence.js +97 -0
  33. package/dist/internal/index-impl/semanticLineageInferenceMatching.js +158 -13
  34. package/dist/internal/index-impl/semanticLineageResolutionRecords.js +46 -2
  35. package/dist/internal/index-impl/semanticMergeCandidateRecords.js +22 -2
  36. package/dist/internal/index-impl/semanticMergeCandidateScoreFacets.js +221 -0
  37. package/dist/internal/index-impl/semanticPatchBundleAdmission.js +122 -20
  38. package/dist/internal/index-impl/semanticPatchBundleLineageLinks.js +199 -0
  39. package/dist/internal/index-impl/semanticPatchBundleOverlaps.js +29 -3
  40. package/dist/internal/index-impl/semanticPatchBundleRecords.js +28 -104
  41. package/dist/internal/index-impl/semanticPatchBundleSourceRecords.js +127 -0
  42. package/dist/internal/index-impl/sourcePreservationFromProjectionContext.js +9 -2
  43. package/dist/internal/index-impl/sourceTextForSpan.js +4 -9
  44. package/dist/lightweight-dependency-relations.js +113 -7
  45. package/dist/native-import-language-profiles.js +10 -2
  46. package/dist/native-import-utils.js +15 -1
  47. package/dist/native-region-scanner-js-helpers.js +68 -18
  48. package/dist/native-region-scanner-js-imports.js +7 -0
  49. package/dist/native-region-scanner-js.js +16 -8
  50. package/dist/native-region-scanner.js +2 -1
  51. package/dist/semantic-import-regions.js +8 -6
  52. package/dist/semantic-import-sidecar-admission-types.d.ts +14 -0
  53. package/dist/semantic-import-sidecar-entry.js +151 -7
  54. package/dist/semantic-import-sidecar-types.d.ts +18 -13
  55. package/dist/semantic-import-source-preservation-utils.js +55 -0
  56. package/dist/semantic-import-source-preservation.js +98 -3
  57. package/package.json +1 -1
@@ -3,32 +3,42 @@ import { normalizeSemanticMergeReadiness, uniqueStrings } from '../../native-imp
3
3
  export function createSemanticPatchBundleAdmission(input = {}, context = {}) {
4
4
  const transformAdmission = semanticTransformAdmission(context);
5
5
  const semanticEditAdmission = context.semanticEditAdmission ?? { status: 'none', action: 'none', readiness: 'needs-review', reasonCodes: [] };
6
- const fallbackReadiness = fallbackAdmissionReadiness(transformAdmission, semanticEditAdmission, context.readiness);
7
- const readiness = normalizeSemanticMergeReadiness(input.readiness ?? fallbackReadiness) ?? input.readiness ?? fallbackReadiness;
8
- const status = input.status ?? admissionStatusForReadiness(readiness, transformAdmission, semanticEditAdmission);
9
- const autoApplyCandidate = input.autoApplyCandidate ?? (status === 'admitted' && [
10
- transformAdmission.action,
11
- semanticEditAdmission.action
12
- ].includes('admit'));
6
+ const evidenceAdmission = autoMergeEvidenceAdmission(context, { transformAdmission, semanticEditAdmission });
7
+ const fallbackReadiness = fallbackAdmissionReadiness(transformAdmission, semanticEditAdmission, evidenceAdmission, context.readiness);
8
+ const inputReadiness = normalizeSemanticMergeReadiness(input.readiness ?? fallbackReadiness) ?? input.readiness ?? fallbackReadiness;
9
+ const readiness = hasPositiveApplyAction(transformAdmission, semanticEditAdmission) && evidenceAdmission.action !== 'admit'
10
+ ? evidenceAdmission.readiness
11
+ : inputReadiness;
12
+ const computedStatus = admissionStatusForReadiness(readiness, transformAdmission, semanticEditAdmission, evidenceAdmission);
13
+ const status = input.status === 'admitted' && computedStatus !== 'admitted' ? computedStatus : input.status ?? computedStatus;
14
+ const computedAutoApplyCandidate = status === 'admitted' &&
15
+ hasPositiveApplyAction(transformAdmission, semanticEditAdmission) &&
16
+ evidenceAdmission.action === 'admit';
17
+ const autoApplyCandidate = input.autoApplyCandidate === true ? computedAutoApplyCandidate : input.autoApplyCandidate ?? computedAutoApplyCandidate;
18
+ const admittedWithoutPositiveProof = status === 'admitted' &&
19
+ hasPositiveApplyAction(transformAdmission, semanticEditAdmission) &&
20
+ evidenceAdmission.action !== 'admit';
13
21
  return compactRecord({
14
22
  status,
15
23
  readiness,
16
- reviewRequired: input.reviewRequired ?? status !== 'admitted',
24
+ reviewRequired: input.reviewRequired ?? (status !== 'admitted' || admittedWithoutPositiveProof),
17
25
  autoMergeClaim: false,
18
26
  autoApplyCandidate,
19
27
  transformAdmission,
20
28
  semanticEditAdmission,
29
+ evidenceAdmission,
21
30
  reasonCodes: uniqueStrings([
22
31
  ...strings(input.reasonCodes),
23
32
  ...strings(context.source?.reasons),
24
33
  ...strings(context.mergeCandidate?.reasons),
25
34
  ...transformAdmission.reasonCodes,
26
- ...strings(semanticEditAdmission.reasonCodes)
27
- ]),
35
+ ...strings(semanticEditAdmission.reasonCodes),
36
+ ...strings(evidenceAdmission.reasonCodes)
37
+ ].filter(Boolean)),
28
38
  conflictKeys: uniqueStrings([...strings(input.conflictKeys), ...context.conflictKeys]),
29
39
  admittedAt: input.admittedAt,
30
40
  reviewerId: input.reviewerId,
31
- evidenceIds: uniqueStrings([...strings(input.evidenceIds), ...strings(transformAdmission.evidenceIds)]),
41
+ evidenceIds: uniqueStrings([...strings(input.evidenceIds), ...strings(transformAdmission.evidenceIds), ...strings(evidenceAdmission.evidenceIds)]),
32
42
  metadata: input.metadata
33
43
  });
34
44
  }
@@ -74,7 +84,7 @@ function transformReasonCodes(input) {
74
84
  !input.complete ? 'transform-evidence-incomplete' : undefined,
75
85
  input.ready ? 'transform-auto-apply-candidate' : undefined,
76
86
  ...input.readinesses.map((readiness) => `transform-readiness:${readiness}`)
77
- ]);
87
+ ].filter(Boolean));
78
88
  }
79
89
 
80
90
  function transformReadiness(value) {
@@ -87,21 +97,90 @@ function transformReadiness(value) {
87
97
  return undefined;
88
98
  }
89
99
 
90
- function fallbackAdmissionReadiness(transformAdmission, semanticEditAdmission, fallback) {
91
- if ([transformAdmission.readiness, semanticEditAdmission.readiness].includes('blocked')) return 'blocked';
92
- if (hasAdmissibleReadyAction(transformAdmission, semanticEditAdmission)) return 'ready';
100
+ function autoMergeEvidenceAdmission(context, admissions) {
101
+ const evidence = uniqueEvidenceRecords([
102
+ ...array(context.evidenceRecords),
103
+ ...array(context.evidence),
104
+ ...array(context.source?.evidence),
105
+ ...array(context.source?.patch?.evidence),
106
+ ...array(context.source?.semanticPatch?.evidence),
107
+ ...array(context.mergeCandidate?.evidence)
108
+ ]);
109
+ const positiveApply = hasPositiveApplyAttempt(admissions.transformAdmission, admissions.semanticEditAdmission);
110
+ if (!positiveApply) return { status: 'none', action: 'none', readiness: 'needs-review', reasonCodes: [], evidenceIds: evidenceIds(evidence) };
111
+ const summary = summarizeAutoMergeEvidence(evidence);
112
+ const blocked = summary.failed > 0 || summary.conflict > 0;
113
+ const ready = !blocked && summary.stale === 0 && summary.passed > 0;
114
+ const status = blocked ? 'blocked' : summary.stale > 0 ? 'stale' : ready ? 'ready' : 'needs-review';
115
+ return compactRecord({
116
+ status,
117
+ action: blocked ? 'block' : status === 'stale' ? 'rerun-semantic-import' : ready ? 'admit' : 'review',
118
+ readiness: blocked ? 'blocked' : ready ? 'ready' : 'needs-review',
119
+ reasonCodes: autoMergeEvidenceReasonCodes(summary, status),
120
+ evidenceIds: summary.evidenceIds,
121
+ passed: summary.passed,
122
+ failed: summary.failed,
123
+ conflict: summary.conflict,
124
+ stale: summary.stale
125
+ });
126
+ }
127
+
128
+ function summarizeAutoMergeEvidence(evidence) {
129
+ const testLike = evidence.filter(isAutoMergeTestEvidence);
130
+ const failed = testLike.filter((record) => evidenceStatus(record, ['failed', 'failure', 'error', 'blocked', 'rejected']));
131
+ const passed = testLike.filter((record) => evidenceStatus(record, ['passed', 'ok', 'success', 'succeeded', 'accepted', 'verified']));
132
+ const conflict = evidence.filter((record) => evidenceStatus(record, ['conflict', 'conflicted']) || record?.metadata?.conflict === true || strings(record?.reasonCodes ?? record?.reasons).some((reason) => reason.toLowerCase().includes('conflict')));
133
+ const stale = evidence.filter((record) => evidenceStatus(record, ['stale']) || record?.metadata?.stale === true || strings(record?.reasonCodes ?? record?.reasons).some((reason) => reason.toLowerCase().includes('stale')));
134
+ return {
135
+ evidenceIds: evidenceIds(evidence),
136
+ passed: passed.length,
137
+ failed: failed.length,
138
+ conflict: conflict.length,
139
+ stale: stale.length
140
+ };
141
+ }
142
+
143
+ function autoMergeEvidenceReasonCodes(summary, status) {
144
+ return uniqueStrings([
145
+ summary.passed ? 'auto-merge-tests-passed' : undefined,
146
+ summary.passed === 0 ? 'auto-merge-tests-passed-evidence-missing' : undefined,
147
+ summary.failed ? 'auto-merge-tests-failed' : undefined,
148
+ summary.conflict ? 'auto-merge-conflict-evidence' : undefined,
149
+ summary.stale ? 'auto-merge-stale-evidence' : undefined,
150
+ status === 'ready' ? 'auto-merge-positive-proof' : undefined
151
+ ].filter(Boolean));
152
+ }
153
+
154
+ function fallbackAdmissionReadiness(transformAdmission, semanticEditAdmission, evidenceAdmission, fallback) {
155
+ if ([transformAdmission.readiness, semanticEditAdmission.readiness, evidenceAdmission.readiness].includes('blocked')) return 'blocked';
156
+ if (hasSkipReadyAction(semanticEditAdmission)) return 'ready';
157
+ if (hasPositiveApplyAction(transformAdmission, semanticEditAdmission)) return evidenceAdmission.action === 'admit' ? 'ready' : evidenceAdmission.readiness;
93
158
  return fallback;
94
159
  }
95
160
 
96
- function admissionStatusForReadiness(readiness, transformAdmission, semanticEditAdmission) {
161
+ function admissionStatusForReadiness(readiness, transformAdmission, semanticEditAdmission, evidenceAdmission) {
97
162
  if (readiness === 'blocked') return 'blocked';
98
- if (hasAdmissibleReadyAction(transformAdmission, semanticEditAdmission) && readiness === 'ready') return 'admitted';
163
+ if (hasAdmissibleReadyAction(transformAdmission, semanticEditAdmission, evidenceAdmission) && readiness === 'ready') return 'admitted';
99
164
  return readiness === 'needs-review' ? 'needs-review' : 'proposed';
100
165
  }
101
166
 
102
- function hasAdmissibleReadyAction(transformAdmission, semanticEditAdmission) {
103
- return [transformAdmission.action, semanticEditAdmission.action].includes('admit') ||
104
- (semanticEditAdmission.action === 'skip' && semanticEditAdmission.readiness === 'ready' && semanticEditAdmission.reviewRequired === false);
167
+ function hasAdmissibleReadyAction(transformAdmission, semanticEditAdmission, evidenceAdmission) {
168
+ return hasSkipReadyAction(semanticEditAdmission) ||
169
+ (hasPositiveApplyAction(transformAdmission, semanticEditAdmission) && evidenceAdmission.action === 'admit');
170
+ }
171
+
172
+ function hasPositiveApplyAction(transformAdmission, semanticEditAdmission) {
173
+ return [transformAdmission.action, semanticEditAdmission.action].includes('admit');
174
+ }
175
+
176
+ function hasPositiveApplyAttempt(transformAdmission, semanticEditAdmission) {
177
+ return hasPositiveApplyAction(transformAdmission, semanticEditAdmission) ||
178
+ Number(semanticEditAdmission.summary?.acceptedClean ?? 0) > 0 ||
179
+ strings(transformAdmission.reasonCodes).includes('transform-readiness:auto-merge-candidate');
180
+ }
181
+
182
+ function hasSkipReadyAction(semanticEditAdmission) {
183
+ return semanticEditAdmission.action === 'skip' && semanticEditAdmission.readiness === 'ready' && semanticEditAdmission.reviewRequired === false;
105
184
  }
106
185
 
107
186
  function hasCrossLanguageTransform(index) {
@@ -109,6 +188,29 @@ function hasCrossLanguageTransform(index) {
109
188
  return strings(index.transformTargetLanguages).some((target) => !source.has(target));
110
189
  }
111
190
 
191
+ function isAutoMergeTestEvidence(record) {
192
+ const kind = String(record?.kind ?? record?.type ?? '').toLowerCase();
193
+ return ['test', 'tests', 'proof', 'gate', 'verification', 'check'].includes(kind);
194
+ }
195
+
196
+ function evidenceStatus(record, statuses) {
197
+ const status = String(record?.status ?? record?.outcome ?? '').toLowerCase();
198
+ return statuses.includes(status);
199
+ }
200
+
201
+ function uniqueEvidenceRecords(records) {
202
+ const seen = new Set();
203
+ const result = [];
204
+ for (const record of records.filter(Boolean)) {
205
+ const key = record.id ?? JSON.stringify(record);
206
+ if (seen.has(key)) continue;
207
+ seen.add(key);
208
+ result.push(record);
209
+ }
210
+ return result;
211
+ }
212
+
213
+ function evidenceIds(evidence) { return uniqueStrings(evidence.map((record) => record.id)); }
112
214
  function array(value) { if (value === undefined || value === null) return []; return Array.isArray(value) ? value : [value]; }
113
215
  function strings(value) { return array(value).map((entry) => String(entry ?? '')).filter(Boolean); }
114
216
  function compactRecord(value) { return Object.fromEntries(Object.entries(value ?? {}).filter(([, entry]) => entry !== undefined && (!Array.isArray(entry) || entry.length > 0))); }
@@ -0,0 +1,199 @@
1
+ import { uniqueStrings } from '../../native-import-utils.js';
2
+
3
+ export function lineageLinkInputs(source, options, changedRegions, targetPortability) {
4
+ return [
5
+ ...array(options.lineageResolutionLinks ?? options.semanticLineageResolutionLinks),
6
+ ...array(options.lineageResolutions ?? options.semanticLineageResolutions),
7
+ ...array(source.lineageResolutionLinks ?? source.semanticLineageResolutionLinks),
8
+ ...array(source.lineageResolutions ?? source.semanticLineageResolutions),
9
+ ...array(source.metadata?.semanticLineageResolutionLinks),
10
+ ...array(source.metadata?.semanticHistoryLineageResolution),
11
+ ...array(source.metadata?.semanticLineageResolution),
12
+ ...array(source.metadata?.targetPortability?.lineageResolutionLinks),
13
+ ...array(targetPortability?.lineageResolutionLinks),
14
+ ...array(targetPortability?.lineageResolutions),
15
+ ...changedRegions.flatMap((region) => lineageLinksFromRegion(region))
16
+ ];
17
+ }
18
+
19
+ export function normalizeLineageResolutionLinks(entries) {
20
+ const seen = new Set();
21
+ const result = [];
22
+ for (const entry of lineageResolutionEntries(entries)) {
23
+ const currentAnchors = array(entry.currentAnchors);
24
+ const summary = entry.summary ?? {};
25
+ const anchorSummary = entry.anchorSummary ?? {};
26
+ const ids = uniqueStrings([
27
+ entry.id,
28
+ entry.resolutionId,
29
+ entry.lineageResolutionId,
30
+ ...strings(entry.lineageResolutionIds),
31
+ ...strings(entry.semanticLineageResolutionIds),
32
+ ...strings(summary.lineageResolutionIds)
33
+ ]);
34
+ const link = compactRecord({
35
+ id: firstString(entry.id, entry.resolutionId, entry.lineageResolutionId, ids[0]),
36
+ lineageResolutionIds: ids,
37
+ status: entry.status,
38
+ readiness: entry.readiness ?? entry.admission?.readiness,
39
+ action: entry.action ?? entry.admission?.action,
40
+ anchorKeys: uniqueStrings([
41
+ entry.anchorKey,
42
+ entry.query?.anchorKey,
43
+ entry.startAnchor?.key,
44
+ ...strings(entry.anchorKeys),
45
+ ...strings(anchorSummary.activeAnchorKeys),
46
+ ...strings(anchorSummary.candidateAnchorKeys),
47
+ ...strings(anchorSummary.blockedAnchorKeys),
48
+ ...strings(summary.activeAnchorKeys),
49
+ ...strings(summary.candidateAnchorKeys),
50
+ ...strings(summary.blockedAnchorKeys),
51
+ ...currentAnchors.map((anchor) => anchor.key)
52
+ ]),
53
+ sourcePaths: uniqueStrings([
54
+ entry.sourcePath,
55
+ entry.query?.sourcePath,
56
+ entry.startAnchor?.sourcePath,
57
+ ...strings(entry.sourcePaths),
58
+ ...strings(entry.lineageSourcePaths),
59
+ ...strings(summary.sourcePaths),
60
+ ...currentAnchors.flatMap((anchor) => [anchor.sourcePath, ...strings(anchor.lineageSourcePaths)])
61
+ ]),
62
+ evidenceIds: uniqueStrings([
63
+ ...strings(entry.evidenceIds),
64
+ ...strings(entry.lineageEvidenceIds),
65
+ ...strings(summary.evidenceIds),
66
+ ...currentAnchors.flatMap((anchor) => strings(anchor.evidenceIds))
67
+ ]),
68
+ proofIds: uniqueStrings([
69
+ ...strings(entry.proofIds),
70
+ ...strings(entry.lineageProofIds),
71
+ ...strings(summary.proofIds),
72
+ ...currentAnchors.flatMap((anchor) => strings(anchor.proofIds))
73
+ ]),
74
+ lineageEventIds: uniqueStrings([
75
+ ...strings(entry.lineageEventIds),
76
+ ...strings(entry.traversedEventIds),
77
+ ...strings(summary.lineageEventIds),
78
+ ...strings(summary.traversedEventIds),
79
+ ...currentAnchors.flatMap((anchor) => strings(anchor.lineageEventIds))
80
+ ]),
81
+ terminalEventIds: uniqueStrings([
82
+ ...strings(entry.terminalEventIds),
83
+ ...strings(summary.terminalEventIds),
84
+ ...currentAnchors.flatMap((anchor) => strings(anchor.terminalLineageEventIds))
85
+ ]),
86
+ crdtOperationIds: uniqueStrings([
87
+ ...strings(entry.crdtOperationIds),
88
+ ...strings(summary.crdtOperationIds),
89
+ ...currentAnchors.flatMap((anchor) => strings(anchor.crdtOperationIds))
90
+ ]),
91
+ crdtHeads: uniqueStrings([
92
+ ...strings(entry.crdtHeads),
93
+ ...strings(summary.crdtHeads),
94
+ ...currentAnchors.flatMap((anchor) => strings(anchor.crdtHeads))
95
+ ]),
96
+ reasonCodes: uniqueStrings([
97
+ ...strings(entry.reasonCodes),
98
+ ...strings(entry.lineageReasonCodes),
99
+ ...strings(summary.reasonCodes),
100
+ ...currentAnchors.flatMap((anchor) => strings(anchor.lineageReasonCodes))
101
+ ])
102
+ });
103
+ const key = firstString(link.id, ...strings(link.lineageResolutionIds), ...strings(link.lineageEventIds), ...strings(link.evidenceIds), ...strings(link.sourcePaths));
104
+ if (!key || seen.has(key)) continue;
105
+ seen.add(key);
106
+ result.push(link);
107
+ }
108
+ return result;
109
+ }
110
+
111
+ export function semanticLineageLinkIndex(links = [], changedRegions = [], targetPortability, admission) {
112
+ const records = normalizeLineageResolutionLinks([
113
+ ...array(links),
114
+ ...array(targetPortability?.lineageResolutionLinks),
115
+ ...array(targetPortability?.lineageResolutions),
116
+ ...array(admission?.metadata?.semanticLineageResolutionLinks),
117
+ ...array(changedRegions).flatMap((region) => lineageLinksFromRegion(region))
118
+ ]);
119
+ return {
120
+ lineageResolutionIds: uniqueStrings(records.flatMap((record) => [record.id, ...strings(record.lineageResolutionIds)])),
121
+ lineageEventIds: uniqueStrings(records.flatMap((record) => record.lineageEventIds)),
122
+ sourcePaths: uniqueStrings(records.flatMap((record) => record.sourcePaths)),
123
+ evidenceIds: uniqueStrings(records.flatMap((record) => record.evidenceIds)),
124
+ proofIds: uniqueStrings(records.flatMap((record) => record.proofIds)),
125
+ reasonCodes: uniqueStrings(records.flatMap((record) => record.reasonCodes)),
126
+ terminalEventIds: uniqueStrings(records.flatMap((record) => record.terminalEventIds)),
127
+ crdtOperationIds: uniqueStrings(records.flatMap((record) => record.crdtOperationIds)),
128
+ crdtHeads: uniqueStrings(records.flatMap((record) => record.crdtHeads))
129
+ };
130
+ }
131
+
132
+ export function linkAdmissionLineage(admission, lineageLinks) {
133
+ if (lineageLinks.length === 0) return admission;
134
+ const lineageIndex = semanticLineageLinkIndex(lineageLinks);
135
+ return {
136
+ ...admission,
137
+ evidenceIds: uniqueStrings([...strings(admission.evidenceIds), ...lineageIndex.evidenceIds]),
138
+ reasonCodes: uniqueStrings([...strings(admission.reasonCodes), 'semantic-lineage-resolution-linked', ...lineageIndex.reasonCodes]),
139
+ metadata: compactRecord({
140
+ ...(admission.metadata ?? {}),
141
+ semanticLineageResolutionLinks: lineageLinks
142
+ })
143
+ };
144
+ }
145
+
146
+ function lineageLinksFromRegion(region = {}) {
147
+ const metadata = region.metadata ?? {};
148
+ const bidirectional = metadata.bidirectionalTargetChange ?? {};
149
+ const history = metadata.semanticHistoryLineageResolution ?? {};
150
+ const lineage = metadata.semanticLineageResolution ?? {};
151
+ return [
152
+ ...array(region.lineageResolutionLinks),
153
+ ...array(region.lineageResolutions),
154
+ compactRecord({
155
+ lineageResolutionIds: region.lineageResolutionIds,
156
+ lineageEventIds: region.lineageEventIds,
157
+ sourcePaths: region.lineageSourcePaths,
158
+ evidenceIds: region.lineageEvidenceIds,
159
+ proofIds: region.lineageProofIds,
160
+ reasonCodes: region.lineageReasonCodes
161
+ }),
162
+ bidirectional,
163
+ history,
164
+ lineage,
165
+ ...array(bidirectional.lineageResolutionLinks),
166
+ ...array(history.lineageResolutionLinks),
167
+ ...array(lineage.lineageResolutionLinks)
168
+ ].filter((entry) => Object.keys(entry ?? {}).length > 0);
169
+ }
170
+
171
+ function lineageResolutionEntries(entries) {
172
+ const result = [];
173
+ for (const entry of array(entries).filter(Boolean)) {
174
+ result.push(entry);
175
+ result.push(...array(entry.resolutions));
176
+ result.push(...array(entry.lineageResolutions));
177
+ result.push(...array(entry.semanticLineageResolutions));
178
+ result.push(...array(entry.lineageResolutionLinks));
179
+ result.push(...array(entry.semanticLineageResolutionLinks));
180
+ }
181
+ return result;
182
+ }
183
+
184
+ function array(value) {
185
+ if (value === undefined || value === null) return [];
186
+ return Array.isArray(value) ? value : [value];
187
+ }
188
+
189
+ function strings(value) {
190
+ return array(value).map((entry) => String(entry ?? '')).filter(Boolean);
191
+ }
192
+
193
+ function firstString(...values) {
194
+ return values.map((value) => value === undefined || value === null ? '' : String(value)).find(Boolean);
195
+ }
196
+
197
+ function compactRecord(value) {
198
+ return Object.fromEntries(Object.entries(value ?? {}).filter(([, entry]) => entry !== undefined && (!Array.isArray(entry) || entry.length > 0)));
199
+ }
@@ -90,7 +90,7 @@ export function querySemanticPatchBundleOverlaps(records,query={}){
90
90
  }
91
91
 
92
92
  function sharedIndex(left,right,options){
93
- return{
93
+ const shared={
94
94
  operationContentHashes:intersect(left.operationContentHashes,right.operationContentHashes),
95
95
  editContentHashes:intersect(left.editContentHashes,right.editContentHashes),
96
96
  semanticEditKeys:intersect(left.semanticEditKeys,right.semanticEditKeys),
@@ -110,11 +110,37 @@ function sharedIndex(left,right,options){
110
110
  baseHashes:intersect(left.baseHashes,right.baseHashes),
111
111
  targetHashes:intersect(left.targetHashes,right.targetHashes)
112
112
  };
113
+ const scopedEdit=hasSharedEditScope(shared);
114
+ const scopedSource=hasSharedSourceScope(shared);
115
+ return{
116
+ ...shared,
117
+ operationContentHashes:scopedEdit?shared.operationContentHashes:[],
118
+ editContentHashes:scopedEdit?shared.editContentHashes:[],
119
+ semanticEditKeys:scopedSource?shared.semanticEditKeys:[],
120
+ semanticIdentityHashes:scopedSource?shared.semanticIdentityHashes:[],
121
+ semanticEditReplayCurrentHashes:scopedSource?shared.semanticEditReplayCurrentHashes:[],
122
+ semanticEditReplayOutputHashes:scopedEdit?shared.semanticEditReplayOutputHashes:[],
123
+ semanticTransformContentHashes:shared.projectionIdentityHashes.length?shared.semanticTransformContentHashes:[],
124
+ semanticTransformIdentityHashes:shared.projectionIdentityHashes.length?shared.semanticTransformIdentityHashes:[]
125
+ };
126
+ }
127
+
128
+ function hasSharedEditScope(shared){
129
+ return Boolean(shared.regionKeys.length||shared.conflictKeys.length||shared.sourceIdentityHashes.length
130
+ ||(shared.sourcePaths.length&&(shared.semanticEditKeys.length||shared.semanticIdentityHashes.length)));
131
+ }
132
+
133
+ function hasSharedSourceScope(shared){
134
+ return Boolean(shared.sourcePaths.length||shared.regionKeys.length||shared.conflictKeys.length||shared.sourceIdentityHashes.length);
113
135
  }
114
136
 
115
137
  function overlapAdmission(shared,{leftIndex,rightIndex,options}){
116
- const duplicate=shared.operationContentHashes.length||shared.editContentHashes.length||shared.semanticTransformContentHashes.length||shared.semanticEditReplayIds.length||shared.semanticEditReplayOutputHashes.length;
117
- const semantic=shared.semanticEditKeys.length||shared.semanticIdentityHashes.length||shared.sourceIdentityHashes.length||shared.semanticTransformIdentityHashes.length||shared.projectionIdentityHashes.length;
138
+ const hashMismatch=disjointNonEmpty(leftIndex.baseHashes,rightIndex.baseHashes)||disjointNonEmpty(leftIndex.targetHashes,rightIndex.targetHashes);
139
+ const sourceRelated=shared.sourcePaths.length||shared.regionKeys.length||shared.conflictKeys.length||shared.sourceIdentityHashes.length;
140
+ const editContent=shared.operationContentHashes.length||shared.editContentHashes.length||shared.semanticEditReplayOutputHashes.length;
141
+ const transformContent=shared.semanticTransformContentHashes.length&&shared.projectionIdentityHashes.length;
142
+ const duplicate=(transformContent||shared.semanticEditReplayIds.length||(editContent&&sourceRelated))&&!hashMismatch;
143
+ const semantic=editContent||shared.semanticEditKeys.length||shared.semanticIdentityHashes.length||shared.sourceIdentityHashes.length||shared.semanticTransformIdentityHashes.length||shared.projectionIdentityHashes.length;
118
144
  const source=shared.regionKeys.length||shared.conflictKeys.length||shared.sourcePaths.length||shared.semanticEditReplayCurrentHashes.length;
119
145
  const status=duplicate?'duplicate':semantic?'semantic-overlap':source?'source-overlap':'independent';
120
146
  const reasonCodes=uniqueStrings([
@@ -2,6 +2,8 @@ import{idFragment,normalizeSemanticMergeReadiness,uniqueStrings}from'../../nativ
2
2
  import{createSemanticEditBundleAdmission}from'./semanticEditBundleAdmission.js';
3
3
  import{createSemanticPatchBundleAdmission}from'./semanticPatchBundleAdmission.js';
4
4
  import{semanticEditRecordIndex,semanticEditSummary}from'./semanticEditBundleIndex.js';
5
+ import{lineageLinkInputs,linkAdmissionLineage,normalizeLineageResolutionLinks,semanticLineageLinkIndex}from'./semanticPatchBundleLineageLinks.js';
6
+ import{normalizeRegions,normalizeSourceMapLinks,normalizeSources,sourceRef}from'./semanticPatchBundleSourceRecords.js';
5
7
  import{normalizeSemanticTransformIdentityRecords,semanticTransformInputs,semanticTransformRecordIndex,semanticTransformSummary}from'./semanticTransformIdentityRecords.js';
6
8
 
7
9
  export const SemanticPatchBundleAdmissionStatuses=Object.freeze(['proposed','queued','admitted','needs-review','blocked','rejected']);
@@ -13,8 +15,10 @@ export function createSemanticPatchBundleRecord(input={},options={}){
13
15
  const semanticEditScripts=array(options.semanticEditScripts??source.semanticEditScripts??source.semanticEditScript);
14
16
  const semanticEditProjections=array(options.semanticEditProjections??source.semanticEditProjections??source.semanticEditProjection);
15
17
  const semanticEditReplays=array(options.semanticEditReplays??source.semanticEditReplays??source.semanticEditReplay);
18
+ const evidenceRecords=[...array(options.evidence??source.evidence),...array(patch?.evidence),...array(mergeCandidate?.evidence),...semanticEditScripts.flatMap((script)=>array(script.evidence))];
16
19
  const editAdmission=createSemanticEditBundleAdmission({
17
20
  semanticEditScripts,semanticEditProjections,semanticEditReplays,
21
+ evidence:evidenceRecords,
18
22
  ...(source.metadata?.semanticEditAdmission??{}),
19
23
  ...(source.semanticEditAdmission??{}),
20
24
  ...(options.semanticEditAdmission??{})
@@ -35,15 +39,16 @@ export function createSemanticPatchBundleRecord(input={},options={}){
35
39
  sourceRef(source.before,'before',source.beforeHash),
36
40
  sourceRef(source.after,'after',source.afterHash)
37
41
  ],source);
38
- const evidenceRecords=[...array(options.evidence??source.evidence),...array(patch?.evidence),...array(mergeCandidate?.evidence),...semanticEditScripts.flatMap((script)=>array(script.evidence))];
39
42
  const patchId=firstString(options.patchId,source.patchId,patch?.id,mergeCandidate?.patchId);
40
43
  const mergeCandidateId=firstString(options.mergeCandidateId,source.mergeCandidateId,mergeCandidate?.id);
41
44
  const baseHash=firstString(options.baseHash,source.baseHash,source.beforeHash,patch?.baseHash,mergeCandidate?.baseHash,...sources.map((item)=>item.baseHash));
42
45
  const targetHash=firstString(options.targetHash,source.targetHash,source.afterHash,patch?.targetHash,mergeCandidate?.targetHash,...sources.map((item)=>item.targetHash));
43
46
  const readiness=normalizeSemanticMergeReadiness(firstString(options.readiness,source.readiness,source.admission?.readiness,mergeCandidate?.readiness))
44
47
  ?? firstString(options.readiness,source.readiness,source.admission?.readiness,mergeCandidate?.readiness,'needs-review');
45
- const evidenceIds=uniqueStrings([...strings(options.evidenceIds),...strings(source.evidenceIds),...evidenceRecords.map((record)=>record?.id),...strings(mergeCandidate?.evidenceIds)]);
46
- const proofIds=uniqueStrings([...strings(options.proofIds),...strings(source.proofIds),...evidenceRecords.filter((record)=>record?.kind==='proof').map((record)=>record.id),...strings(mergeCandidate?.proofIds)]);
48
+ const lineageLinks=normalizeLineageResolutionLinks(lineageLinkInputs(source,options,changedRegions,targetPortability));
49
+ const lineageIndex=semanticLineageLinkIndex(lineageLinks,changedRegions,targetPortability);
50
+ const evidenceIds=uniqueStrings([...strings(options.evidenceIds),...strings(source.evidenceIds),...evidenceRecords.map((record)=>record?.id),...strings(mergeCandidate?.evidenceIds),...lineageIndex.evidenceIds]);
51
+ const proofIds=uniqueStrings([...strings(options.proofIds),...strings(source.proofIds),...evidenceRecords.filter((record)=>record?.kind==='proof').map((record)=>record.id),...strings(mergeCandidate?.proofIds),...lineageIndex.proofIds]);
47
52
  const historyIds=uniqueStrings([...strings(options.historyIds),...strings(options.historyId),...strings(source.historyIds),...strings(source.historyId)]);
48
53
  const semanticOperationIds=uniqueStrings([...strings(options.semanticOperationIds),...strings(options.semanticOperationId),...strings(source.semanticOperationIds),...strings(source.semanticOperationId),...strings(patch?.semanticOperationIds),...strings(mergeCandidate?.semanticOperationIds),...editIndex.semanticEditOperationIds]);
49
54
  const conflictKeys=uniqueStrings([
@@ -53,12 +58,12 @@ export function createSemanticPatchBundleRecord(input={},options={}){
53
58
  ...changedRegions.flatMap((region)=>[region.conflictKey,...array(region.admission?.conflictKeys)]),
54
59
  ...(source.metadata?.semanticMergeConflictSummary?.conflictKeys??[])
55
60
  ]);
56
- const admission=createSemanticPatchBundleAdmission(options.admission??source.admission,{readiness,conflictKeys,source,mergeCandidate,semanticTransformIndex,semanticTransformIdentities,semanticEditAdmission:editAdmission});
61
+ const admission=linkAdmissionLineage(createSemanticPatchBundleAdmission(options.admission??source.admission,{readiness,conflictKeys,source,mergeCandidate,evidenceRecords,semanticTransformIndex,semanticTransformIdentities,semanticEditAdmission:editAdmission}),lineageLinks);
57
62
  const id=options.id??(source.kind==='frontier.lang.semanticPatchBundleRecord'?source.id:undefined)
58
63
  ??`semantic_patch_bundle_${idFragment(firstString(source.id,patchId,mergeCandidateId,source.sourcePath,source.language,'record'))}`;
59
64
  const language=options.language??source.language??mergeCandidate?.language??sources.find((item)=>item.language)?.language;
60
65
  const sourcePath=options.sourcePath??source.sourcePath??mergeCandidate?.sourcePath??sources.find((item)=>item.sourcePath)?.sourcePath;
61
- const index=recordIndex({baseHash,targetHash,sources,changedRegions,sourceMapLinks,evidenceIds,proofIds,historyIds,semanticOperationIds,patchId,mergeCandidateId,admission,semanticEditAdmission:editAdmission,semanticEditIndex:editIndex,semanticTransformIndex,targetPortability});
66
+ const index=recordIndex({baseHash,targetHash,sources,changedRegions,sourceMapLinks,evidenceIds,proofIds,historyIds,semanticOperationIds,patchId,mergeCandidateId,admission,semanticEditAdmission:editAdmission,semanticEditIndex:editIndex,semanticTransformIndex,targetPortability,lineageLinks});
62
67
  return{
63
68
  kind:'frontier.lang.semanticPatchBundleRecord',
64
69
  version:1,
@@ -95,6 +100,7 @@ export function createSemanticPatchBundleRecord(input={},options={}){
95
100
  semanticEditAdmission:editAdmission,
96
101
  semanticTransformSummary:semanticTransformSummary(semanticTransformIndex),
97
102
  targetPortability,
103
+ semanticLineageResolutionLinks:lineageLinks,
98
104
  ...options.metadata
99
105
  })
100
106
  };
@@ -104,118 +110,30 @@ export function querySemanticPatchBundleRecords(records,query={}){
104
110
  return array(records).filter(Boolean).filter((record)=>matchesRecord(record,query)).sort((left,right)=>String(left.id).localeCompare(String(right.id)));
105
111
  }
106
112
 
107
- function normalizeSources(entries,context){
108
- return entries.filter(Boolean).map((entry,index)=>compactRecord({
109
- id:entry.id??entry.sourceId,
110
- side:entry.side,
111
- importId:entry.importId??entry.importResultId,
112
- language:entry.language??context.language,
113
- sourcePath:entry.sourcePath??context.sourcePath,
114
- sourceHash:entry.sourceHash??entry.hash,
115
- baseHash:entry.baseHash??entry.beforeHash??context.baseHash??context.beforeHash,
116
- targetHash:entry.targetHash??entry.afterHash??context.targetHash??context.afterHash,
117
- nativeSourceId:entry.nativeSourceId,
118
- nativeAstId:entry.nativeAstId,
119
- semanticIndexId:entry.semanticIndexId,
120
- universalAstId:entry.universalAstId,
121
- sourceMapIds:uniqueStrings(entry.sourceMapIds),
122
- ordinal:index
123
- })).filter((entry)=>entry.importId||entry.sourcePath||entry.sourceHash||entry.baseHash||entry.targetHash);
124
- }
125
-
126
- function sourceRef(importResult,side,sourceHash){
127
- if(!importResult)return undefined;
128
- return compactRecord({
129
- id:`${side}_${importResult.id??idFragment(importResult.sourcePath??'source')}`,side,importId:importResult.id,
130
- language:importResult.language,
131
- sourcePath:importResult.sourcePath,
132
- sourceHash:sourceHash??importResult.nativeSource?.sourceHash??importResult.nativeAst?.sourceHash??importResult.sourceHash,
133
- nativeSourceId:importResult.nativeSource?.id,
134
- nativeAstId:importResult.nativeAst?.id,
135
- semanticIndexId:importResult.semanticIndex?.id,
136
- universalAstId:importResult.universalAst?.id,
137
- sourceMapIds:uniqueStrings((importResult.sourceMaps??[]).map((map)=>map.id))
138
- });
139
- }
140
-
141
- function normalizeRegions(regions,context){
142
- return regions.filter(Boolean).map((region,index)=>{
143
- const projection=region.metadata?.changedRegionProjection??region.projection;
144
- const projected=projection?.region??{};
145
- const key=firstString(region.key,region.ownershipKey,projected.key,region.conflictKey,region.id);
146
- const conflictKey=firstString(region.conflictKey,projection?.conflictKey,key);
147
- const links=array(projection?.sourceMapLinks??region.sourceMapLinks);
148
- return compactRecord({
149
- id:region.id??projected.id??`changed_region_${index+1}`,
150
- key,
151
- conflictKey,
152
- changeKind:region.changeKind??projection?.changeKind,
153
- regionKind:region.regionKind??region.ownershipRegionKind??projected.kind,
154
- granularity:region.granularity??projected.granularity,
155
- precision:region.precision??projected.precision,
156
- language:region.language??projection?.language??context.language,
157
- sourcePath:region.sourcePath??projection?.sourcePath??context.sourcePath,
158
- sourceHash:region.sourceHash??projection?.after?.sourceHash??projection?.before?.sourceHash,
159
- symbolId:region.symbolId??projected.symbolId,
160
- symbolName:region.symbolName??region.name??projected.symbolName,
161
- symbolKind:region.symbolKind??projected.symbolKind,
162
- sourceSpan:region.sourceSpan??projected.sourceSpan,
163
- sourceMapLinkIds:uniqueStrings([...strings(region.sourceMapLinkIds),...links.map((link)=>link.id)]),
164
- sourceMapIds:uniqueStrings([...strings(region.sourceMapIds),...links.map((link)=>link.sourceMapId)]),
165
- sourceMapMappingIds:uniqueStrings([...strings(region.sourceMapMappingIds),...links.map((link)=>link.sourceMapMappingId)]),
166
- admission:compactRecord({
167
- readiness:projection?.admission?.readiness??region.admission?.readiness,
168
- action:projection?.admission?.action??region.admission?.action,
169
- reasonCodes:uniqueStrings([...strings(region.admission?.reasonCodes),...strings(projection?.admission?.reasons)]),
170
- conflictKeys:uniqueStrings([...strings(region.admission?.conflictKeys),...strings(projection?.admission?.conflictKeys)])
171
- }),
172
- metadata:region.metadata
173
- });
174
- });
175
- }
176
-
177
- function normalizeSourceMapLinks(links){
178
- const seen=new Set();
179
- const result=[];
180
- for(const link of links.filter(Boolean)){
181
- const id=link.id??`source_map_link_${result.length+1}`;
182
- if(seen.has(id))continue;
183
- seen.add(id);
184
- result.push(compactRecord({
185
- id,side:link.side,sourceMapId:link.sourceMapId,sourceMapMappingId:link.sourceMapMappingId,
186
- sourcePath:link.sourcePath,sourceHash:link.sourceHash,targetPath:link.targetPath,targetHash:link.targetHash,
187
- semanticSymbolId:link.semanticSymbolId,
188
- semanticOccurrenceId:link.semanticOccurrenceId,
189
- semanticNodeId:link.semanticNodeId,
190
- nativeSourceId:link.nativeSourceId,
191
- nativeAstNodeId:link.nativeAstNodeId,
192
- precision:link.precision,
193
- sourceSpan:link.sourceSpan,
194
- generatedSpan:link.generatedSpan,
195
- regionKey:link.ownershipRegionKey,
196
- regionKind:link.ownershipRegionKind
197
- }));
198
- }
199
- return result;
200
- }
201
-
202
113
  function recordIndex(parts){
203
114
  const editIndex=parts.semanticEditIndex??semanticEditRecordIndex([],[],[],parts);
204
115
  const editAdmission=parts.semanticEditAdmission??{};
205
116
  const semanticTransformIndex=parts.semanticTransformIndex??semanticTransformRecordIndex([],parts);
117
+ const lineageIndex=semanticLineageLinkIndex(parts.lineageLinks,parts.changedRegions,parts.targetPortability,parts.admission);
206
118
  return{
207
119
  baseHashes:uniqueStrings([parts.baseHash,...parts.sources.map((item)=>item.baseHash)]),
208
120
  targetHashes:uniqueStrings([parts.targetHash,...parts.sources.map((item)=>item.targetHash)]),
209
121
  sourceHashes:uniqueStrings(parts.sources.map((item)=>item.sourceHash)),
210
- sourcePaths:uniqueStrings([...parts.sources.map((item)=>item.sourcePath),...strings(editAdmission.sourcePaths),...editIndex.projectedSourcePaths,...semanticTransformIndex.transformSourcePaths,...semanticTransformIndex.transformTargetPaths]),
122
+ sourcePaths:uniqueStrings([...parts.sources.map((item)=>item.sourcePath),...strings(editAdmission.sourcePaths),...editIndex.projectedSourcePaths,...semanticTransformIndex.transformSourcePaths,...semanticTransformIndex.transformTargetPaths,...lineageIndex.sourcePaths]),
211
123
  regionKeys:uniqueStrings([...parts.changedRegions.map((region)=>region.key),...editIndex.anchorKeys]),
212
124
  regionKinds:uniqueStrings(parts.changedRegions.map((region)=>region.regionKind)),
213
125
  conflictKeys:uniqueStrings([...parts.changedRegions.flatMap((region)=>[region.conflictKey,...array(region.admission?.conflictKeys)]),...editIndex.conflictKeys]),
214
126
  sourceMapIds:uniqueStrings([...parts.sourceMapLinks.map((link)=>link.sourceMapId),...parts.changedRegions.flatMap((region)=>region.sourceMapIds??[])]),
215
127
  sourceMapMappingIds:uniqueStrings([...parts.sourceMapLinks.map((link)=>link.sourceMapMappingId),...parts.changedRegions.flatMap((region)=>region.sourceMapMappingIds??[])]),
216
128
  sourceMapLinkIds:uniqueStrings(parts.sourceMapLinks.map((link)=>link.id)),
217
- evidenceIds:parts.evidenceIds,
218
- proofIds:parts.proofIds,
129
+ evidenceIds:uniqueStrings([...parts.evidenceIds,...lineageIndex.evidenceIds]),
130
+ proofIds:uniqueStrings([...parts.proofIds,...lineageIndex.proofIds]),
131
+ lineageResolutionIds:lineageIndex.lineageResolutionIds,
132
+ lineageEventIds:lineageIndex.lineageEventIds,
133
+ lineageSourcePaths:lineageIndex.sourcePaths,
134
+ lineageEvidenceIds:lineageIndex.evidenceIds,
135
+ lineageProofIds:lineageIndex.proofIds,
136
+ lineageReasonCodes:lineageIndex.reasonCodes,
219
137
  historyIds:parts.historyIds,
220
138
  semanticOperationIds:uniqueStrings(parts.semanticOperationIds),
221
139
  semanticEditScriptIds:editIndex.semanticEditScriptIds,
@@ -255,7 +173,7 @@ function recordIndex(parts){
255
173
  }
256
174
 
257
175
  function matchesRecord(record,query){
258
- const index=record.index??recordIndex({...record,baseHash:record.baseHash,targetHash:record.targetHash,sources:record.sources??[],changedRegions:record.changedRegions??[],sourceMapLinks:record.sourceMapLinks??[],evidenceIds:record.evidenceIds??[],proofIds:record.proofIds??[],historyIds:record.historyIds??[],semanticOperationIds:record.semanticOperationIds??[],patchId:record.patchId,mergeCandidateId:record.mergeCandidateId,admission:record.admission??{},semanticEditAdmission:record.admission?.semanticEditAdmission??record.metadata?.semanticEditAdmission,targetPortability:record.metadata?.targetPortability});
176
+ const index=record.index??recordIndex({...record,baseHash:record.baseHash,targetHash:record.targetHash,sources:record.sources??[],changedRegions:record.changedRegions??[],sourceMapLinks:record.sourceMapLinks??[],evidenceIds:record.evidenceIds??[],proofIds:record.proofIds??[],historyIds:record.historyIds??[],semanticOperationIds:record.semanticOperationIds??[],patchId:record.patchId,mergeCandidateId:record.mergeCandidateId,admission:record.admission??{},semanticEditAdmission:record.admission?.semanticEditAdmission??record.metadata?.semanticEditAdmission,targetPortability:record.metadata?.targetPortability,lineageLinks:normalizeLineageResolutionLinks([...array(record.metadata?.semanticLineageResolutionLinks),...array(record.admission?.metadata?.semanticLineageResolutionLinks)])});
259
177
  return matchAny(queryValues(query.id,query.ids),[record.id])
260
178
  &&matchAny(queryValues(query.patchId,query.patchIds),index.patchIds)
261
179
  &&matchAny(queryValues(query.mergeCandidateId,query.mergeCandidateIds),index.mergeCandidateIds)
@@ -271,6 +189,12 @@ function matchesRecord(record,query){
271
189
  &&matchAny(queryValues(query.sourceMapLinkId,query.sourceMapLinkIds),index.sourceMapLinkIds)
272
190
  &&matchAny(queryValues(query.evidenceId,query.evidenceIds),index.evidenceIds)
273
191
  &&matchAny(queryValues(query.proofId,query.proofIds),index.proofIds)
192
+ &&matchAny(queryValues(query.lineageResolutionId,query.lineageResolutionIds,query.semanticLineageResolutionId,query.semanticLineageResolutionIds),index.lineageResolutionIds)
193
+ &&matchAny(queryValues(query.lineageEventId,query.lineageEventIds),index.lineageEventIds)
194
+ &&matchAny(queryValues(query.lineageSourcePath,query.lineageSourcePaths),index.lineageSourcePaths)
195
+ &&matchAny(queryValues(query.lineageEvidenceId,query.lineageEvidenceIds),index.lineageEvidenceIds)
196
+ &&matchAny(queryValues(query.lineageProofId,query.lineageProofIds),index.lineageProofIds)
197
+ &&matchAny(queryValues(query.lineageReasonCode,query.lineageReasonCodes),index.lineageReasonCodes)
274
198
  &&matchAny(queryValues(query.historyId,query.historyIds),index.historyIds)
275
199
  &&matchAny(queryValues(query.semanticOperationId,query.semanticOperationIds),index.semanticOperationIds)
276
200
  &&matchAny(queryValues(query.semanticEditScriptId,query.semanticEditScriptIds),index.semanticEditScriptIds)