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

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.
@@ -0,0 +1,78 @@
1
+ import type { SemanticMergeReadiness } from '@shapeshift-labs/frontier-lang-kernel';
2
+ import type { SemanticEditProjection, SemanticEditReplay, SemanticEditScript } from './semantic-edit-script.js';
3
+
4
+ export type SemanticEditBundleAdmissionStatus =
5
+ | 'none'
6
+ | 'ready'
7
+ | 'already-applied'
8
+ | 'needs-review'
9
+ | 'stale'
10
+ | 'conflict'
11
+ | 'blocked'
12
+ | string;
13
+
14
+ export interface SemanticEditBundleAdmissionSummary {
15
+ readonly scripts: number;
16
+ readonly projections: number;
17
+ readonly replays: number;
18
+ readonly files: number;
19
+ readonly acceptedClean: number;
20
+ readonly alreadyApplied: number;
21
+ readonly conflicts: number;
22
+ readonly stale: number;
23
+ readonly blocked: number;
24
+ readonly needsReview: number;
25
+ readonly projected: number;
26
+ readonly projectionBlocked: number;
27
+ readonly scriptStatuses: readonly string[];
28
+ readonly projectionStatuses: readonly string[];
29
+ readonly replayStatuses: readonly string[];
30
+ readonly replayActions: readonly string[];
31
+ readonly sourcePaths: readonly string[];
32
+ readonly scriptIds: readonly string[];
33
+ readonly projectionIds: readonly string[];
34
+ readonly replayIds: readonly string[];
35
+ readonly reasonCodes: readonly string[];
36
+ }
37
+
38
+ export interface SemanticEditBundleAdmission {
39
+ readonly status: SemanticEditBundleAdmissionStatus;
40
+ readonly action: 'none' | 'admit' | 'skip' | 'review' | 'rerun-semantic-import' | 'block' | string;
41
+ readonly readiness: SemanticMergeReadiness | string;
42
+ readonly reviewRequired: boolean;
43
+ readonly autoApplyCandidate: boolean;
44
+ readonly autoMergeClaim: false;
45
+ readonly semanticEquivalenceClaim: false;
46
+ readonly reasonCodes: readonly string[];
47
+ readonly sourcePaths: readonly string[];
48
+ readonly scriptIds: readonly string[];
49
+ readonly projectionIds: readonly string[];
50
+ readonly replayIds: readonly string[];
51
+ readonly summary: SemanticEditBundleAdmissionSummary;
52
+ readonly metadata?: Record<string, unknown>;
53
+ }
54
+
55
+ export interface CreateSemanticEditBundleAdmissionInput {
56
+ readonly status?: SemanticEditBundleAdmissionStatus;
57
+ readonly action?: string;
58
+ readonly readiness?: SemanticMergeReadiness | string;
59
+ readonly reviewRequired?: boolean;
60
+ readonly autoApplyCandidate?: boolean;
61
+ readonly reasonCodes?: readonly string[] | string;
62
+ readonly semanticEditScript?: SemanticEditScript;
63
+ readonly semanticEditScripts?: readonly SemanticEditScript[] | SemanticEditScript;
64
+ readonly scripts?: readonly SemanticEditScript[] | SemanticEditScript;
65
+ readonly semanticEditProjection?: SemanticEditProjection;
66
+ readonly semanticEditProjections?: readonly SemanticEditProjection[] | SemanticEditProjection;
67
+ readonly projections?: readonly SemanticEditProjection[] | SemanticEditProjection;
68
+ readonly semanticEditReplay?: SemanticEditReplay;
69
+ readonly semanticEditReplays?: readonly SemanticEditReplay[] | SemanticEditReplay;
70
+ readonly replays?: readonly SemanticEditReplay[] | SemanticEditReplay;
71
+ readonly metadata?: Record<string, unknown>;
72
+ }
73
+
74
+ export declare const SemanticEditBundleAdmissionStatuses: readonly SemanticEditBundleAdmissionStatus[];
75
+ export declare function createSemanticEditBundleAdmission(
76
+ input?: CreateSemanticEditBundleAdmissionInput,
77
+ options?: Partial<CreateSemanticEditBundleAdmissionInput>
78
+ ): SemanticEditBundleAdmission;
@@ -18,6 +18,9 @@ export interface SemanticPatchBundleRecordIndex {
18
18
  readonly semanticEditReplayIds: readonly string[];
19
19
  readonly semanticEditReplayStatuses: readonly string[];
20
20
  readonly semanticEditReplayActions: readonly string[];
21
+ readonly semanticEditAdmissionStatuses: readonly string[];
22
+ readonly semanticEditAdmissionActions: readonly string[];
23
+ readonly semanticEditAdmissionReadinesses: readonly string[];
21
24
  readonly semanticEditReplayCurrentHashes: readonly string[];
22
25
  readonly semanticEditReplayOutputHashes: readonly string[];
23
26
  readonly semanticEditKeys: readonly string[];
@@ -7,6 +7,7 @@ import type {
7
7
  SourceSpan
8
8
  } from '@shapeshift-labs/frontier-lang-kernel';
9
9
  import type { NativeSourceChangeKind, NativeSourceChangeSet } from './native-diff.js';
10
+ import type { SemanticEditBundleAdmission } from './semantic-edit-bundle.js';
10
11
  import type { SemanticEditProjection, SemanticEditReplay, SemanticEditScript } from './semantic-edit-script.js';
11
12
  import type { SemanticPatchBundleRecordIndex } from './semantic-patch-bundle-index.js';
12
13
  import type { SemanticTransformIdentityRecord } from './semantic-transform-identity.js';
@@ -88,6 +89,7 @@ export interface SemanticPatchBundleAdmission {
88
89
  readonly autoMergeClaim: false;
89
90
  readonly autoApplyCandidate?: boolean;
90
91
  readonly transformAdmission?: SemanticPatchBundleTransformAdmission;
92
+ readonly semanticEditAdmission?: SemanticEditBundleAdmission;
91
93
  readonly reasonCodes?: readonly string[];
92
94
  readonly conflictKeys?: readonly string[];
93
95
  readonly admittedAt?: number | string;
@@ -150,6 +152,7 @@ export interface SemanticPatchBundleRecord {
150
152
  readonly semanticEditReplays: number;
151
153
  readonly semanticEditProjectionEdits: number;
152
154
  readonly semanticEditReplayEdits: number;
155
+ readonly semanticEditBundleStatus?: string;
153
156
  readonly semanticTransformIdentities: number;
154
157
  readonly reviewRequired: boolean;
155
158
  readonly autoMergeClaim: false;
@@ -185,6 +188,7 @@ export interface CreateSemanticPatchBundleRecordOptions {
185
188
  readonly semanticEditProjections?: readonly SemanticEditProjection[] | SemanticEditProjection;
186
189
  readonly semanticEditReplay?: SemanticEditReplay;
187
190
  readonly semanticEditReplays?: readonly SemanticEditReplay[] | SemanticEditReplay;
191
+ readonly semanticEditAdmission?: Partial<SemanticEditBundleAdmission>;
188
192
  readonly semanticTransformIdentity?: SemanticTransformIdentityRecord | Record<string, unknown>;
189
193
  readonly semanticTransformIdentities?: readonly (SemanticTransformIdentityRecord | Record<string, unknown>)[];
190
194
  readonly targetPortability?: BidirectionalTargetPortabilityRecord | Record<string, unknown>;
@@ -242,6 +246,12 @@ export interface SemanticPatchBundleRecordQuery {
242
246
  readonly semanticEditReplayStatuses?: readonly string[];
243
247
  readonly semanticEditReplayAction?: string | readonly string[];
244
248
  readonly semanticEditReplayActions?: readonly string[];
249
+ readonly semanticEditAdmissionStatus?: string | readonly string[];
250
+ readonly semanticEditAdmissionStatuses?: readonly string[];
251
+ readonly semanticEditAdmissionAction?: string | readonly string[];
252
+ readonly semanticEditAdmissionActions?: readonly string[];
253
+ readonly semanticEditAdmissionReadiness?: string | readonly string[];
254
+ readonly semanticEditAdmissionReadinesses?: readonly string[];
245
255
  readonly semanticEditReplayCurrentHash?: string | readonly string[];
246
256
  readonly semanticEditReplayCurrentHashes?: readonly string[];
247
257
  readonly semanticEditReplayOutputHash?: string | readonly string[];
package/dist/index.d.ts CHANGED
@@ -19,6 +19,7 @@ export * from './declarations/semantic-merge-conflicts.js';
19
19
  export * from './declarations/semantic-edit-script.js';
20
20
  export * from './declarations/semantic-lineage.js';
21
21
  export * from './declarations/semantic-history.js';
22
+ export * from './declarations/semantic-edit-bundle.js';
22
23
  export * from './declarations/semantic-patch-bundle-index.js';
23
24
  export * from './declarations/semantic-patch-bundle.js';
24
25
  export * from './declarations/semantic-patch-bundle-overlaps.js';
package/dist/index.js CHANGED
@@ -67,6 +67,7 @@ export { projectNativeImportToSource } from './internal/index-impl/projectNative
67
67
  export { queryNativeParserFeatureMatrix } from './internal/index-impl/queryNativeParserFeatureMatrix.js';
68
68
  export { queryProjectionReadinessMatrix } from './internal/index-impl/queryProjectionReadinessMatrix.js';
69
69
  export { createSemanticPatchBundleRecord, querySemanticPatchBundleRecords, SemanticPatchBundleAdmissionStatuses } from './internal/index-impl/semanticPatchBundleRecords.js';
70
+ export { createSemanticEditBundleAdmission, SemanticEditBundleAdmissionStatuses } from './internal/index-impl/semanticEditBundleAdmission.js';
70
71
  export { compareSemanticPatchBundleRecords, querySemanticPatchBundleOverlaps, SemanticPatchBundleOverlapKinds, SemanticPatchBundleOverlapStatuses } from './internal/index-impl/semanticPatchBundleOverlaps.js';
71
72
  export { createSemanticTransformIdentityRecord, deriveSemanticTransformIdentityRecords, semanticTransformIdentityFields } from './internal/index-impl/semanticTransformIdentityRecords.js';
72
73
  export { createSemanticMergeCandidateAdmissionRecord, decorateSemanticMergeCandidateForAdmission, querySemanticMergeCandidateAdmissionOverlaps, SemanticMergeCandidateProjectionRisks, semanticMergeCandidateReadinessSortKey, sortSemanticMergeCandidateAdmissionRecords } from './internal/index-impl/semanticMergeCandidateRecords.js';
@@ -0,0 +1,137 @@
1
+ import { normalizeSemanticMergeReadiness, uniqueStrings } from '../../native-import-utils.js';
2
+
3
+ export const SemanticEditBundleAdmissionStatuses = Object.freeze([
4
+ 'none',
5
+ 'ready',
6
+ 'already-applied',
7
+ 'needs-review',
8
+ 'stale',
9
+ 'conflict',
10
+ 'blocked'
11
+ ]);
12
+
13
+ export function createSemanticEditBundleAdmission(input = {}, options = {}) {
14
+ const scripts = array(input.semanticEditScripts ?? input.scripts ?? input.semanticEditScript);
15
+ const projections = array(input.semanticEditProjections ?? input.projections ?? input.semanticEditProjection);
16
+ const replays = array(input.semanticEditReplays ?? input.replays ?? input.semanticEditReplay);
17
+ const summary = summarizeSemanticEditBundle(scripts, projections, replays);
18
+ const status = input.status ?? options.status ?? semanticEditBundleStatus(summary);
19
+ const readiness = normalizeSemanticMergeReadiness(input.readiness ?? options.readiness ?? readinessForStatus(status))
20
+ ?? input.readiness ?? options.readiness ?? readinessForStatus(status);
21
+ return compactRecord({
22
+ status,
23
+ action: input.action ?? options.action ?? actionForStatus(status),
24
+ readiness,
25
+ reviewRequired: input.reviewRequired ?? !['ready', 'already-applied', 'none'].includes(status),
26
+ autoApplyCandidate: input.autoApplyCandidate ?? status === 'ready',
27
+ autoMergeClaim: false,
28
+ semanticEquivalenceClaim: false,
29
+ reasonCodes: uniqueStrings([
30
+ ...strings(input.reasonCodes),
31
+ ...strings(options.reasonCodes),
32
+ ...summary.reasonCodes,
33
+ ...derivedReasonCodes(summary, status)
34
+ ]),
35
+ sourcePaths: summary.sourcePaths,
36
+ scriptIds: summary.scriptIds,
37
+ projectionIds: summary.projectionIds,
38
+ replayIds: summary.replayIds,
39
+ summary,
40
+ metadata: input.metadata ?? options.metadata
41
+ });
42
+ }
43
+
44
+ function summarizeSemanticEditBundle(scripts, projections, replays) {
45
+ const scriptStatusEntries = scripts.map((script) => script.admission?.status);
46
+ const projectionStatusEntries = projections.flatMap((projection) => [projection.status, projection.admission?.status]);
47
+ const replayStatusEntries = replays.map((replay) => replay.status);
48
+ const scriptStatuses = uniqueStrings(strings(scriptStatusEntries));
49
+ const projectionStatuses = uniqueStrings(strings(projectionStatusEntries));
50
+ const replayStatuses = uniqueStrings(strings(replayStatusEntries));
51
+ const replayActions = uniqueStrings(strings(replays.map((replay) => replay.admission?.action)));
52
+ return {
53
+ scripts: scripts.length,
54
+ projections: projections.length,
55
+ replays: replays.length,
56
+ files: sourcePaths(scripts, projections, replays).length,
57
+ acceptedClean: replays.filter((replay) => replay.status === 'accepted-clean').length,
58
+ alreadyApplied: replays.filter((replay) => replay.status === 'already-applied').length,
59
+ conflicts: countStatuses(scriptStatusEntries, replayStatusEntries, ['conflict']),
60
+ stale: countStatuses(scriptStatusEntries, replayStatusEntries, ['stale']),
61
+ blocked: countStatuses(scriptStatusEntries, projectionStatusEntries, replayStatusEntries, ['blocked']),
62
+ needsReview: countStatuses(scriptStatusEntries, replayStatusEntries, ['needs-port', 'evidence-only']),
63
+ projected: projections.filter((projection) => projection.status === 'projected').length,
64
+ projectionBlocked: projections.filter((projection) => projection.status === 'blocked').length,
65
+ scriptStatuses,
66
+ projectionStatuses,
67
+ replayStatuses,
68
+ replayActions,
69
+ sourcePaths: sourcePaths(scripts, projections, replays),
70
+ scriptIds: uniqueStrings(scripts.map((script) => script.id)),
71
+ projectionIds: uniqueStrings(projections.map((projection) => projection.id)),
72
+ replayIds: uniqueStrings(replays.map((replay) => replay.id)),
73
+ reasonCodes: uniqueStrings([
74
+ ...scripts.flatMap((script) => strings(script.admission?.reasonCodes)),
75
+ ...projections.flatMap((projection) => strings(projection.admission?.reasonCodes)),
76
+ ...replays.flatMap((replay) => strings(replay.admission?.reasonCodes))
77
+ ])
78
+ };
79
+ }
80
+
81
+ function semanticEditBundleStatus(summary) {
82
+ const total = summary.scripts + summary.projections + summary.replays;
83
+ if (total === 0) return 'none';
84
+ if (summary.blocked || summary.projectionBlocked) return 'blocked';
85
+ if (summary.conflicts) return 'conflict';
86
+ if (summary.stale) return 'stale';
87
+ if (!summary.replays || summary.needsReview) return 'needs-review';
88
+ if (summary.acceptedClean === 0 && summary.alreadyApplied === summary.replays) return 'already-applied';
89
+ return summary.acceptedClean + summary.alreadyApplied === summary.replays ? 'ready' : 'needs-review';
90
+ }
91
+
92
+ function derivedReasonCodes(summary, status) {
93
+ return [
94
+ summary.scripts && !summary.projections ? 'semantic-edit-projection-missing' : undefined,
95
+ (summary.scripts || summary.projections) && !summary.replays ? 'semantic-edit-replay-missing' : undefined,
96
+ status === 'ready' ? 'semantic-edit-replay-accepted-clean' : undefined,
97
+ status === 'already-applied' ? 'semantic-edit-replay-already-applied' : undefined,
98
+ status === 'blocked' ? 'semantic-edit-blocked' : undefined,
99
+ status === 'conflict' ? 'semantic-edit-conflict' : undefined,
100
+ status === 'stale' ? 'semantic-edit-stale' : undefined
101
+ ];
102
+ }
103
+
104
+ function readinessForStatus(status) {
105
+ if (['ready', 'already-applied'].includes(status)) return 'ready';
106
+ if (['blocked', 'conflict'].includes(status)) return 'blocked';
107
+ return 'needs-review';
108
+ }
109
+
110
+ function actionForStatus(status) {
111
+ if (status === 'ready') return 'admit';
112
+ if (status === 'already-applied') return 'skip';
113
+ if (status === 'none') return 'none';
114
+ if (status === 'stale') return 'rerun-semantic-import';
115
+ if (status === 'blocked' || status === 'conflict') return 'block';
116
+ return 'review';
117
+ }
118
+
119
+ function sourcePaths(scripts, projections, replays) {
120
+ return uniqueStrings(strings([
121
+ ...scripts.map((script) => script.sourcePath),
122
+ ...projections.map((projection) => projection.sourcePath),
123
+ ...projections.flatMap((projection) => array(projection.edits).flatMap((edit) => [edit.sourcePath, edit.targetSourcePath])),
124
+ ...replays.map((replay) => replay.sourcePath),
125
+ ...replays.flatMap((replay) => array(replay.edits).map((edit) => edit.sourcePath))
126
+ ]));
127
+ }
128
+
129
+ function countStatuses(...args) {
130
+ const statuses = args.slice(0, -1).flatMap((value) => strings(value));
131
+ const needles = new Set(args.at(-1));
132
+ return statuses.filter((status) => needles.has(status)).length;
133
+ }
134
+
135
+ function array(value) { if (value === undefined || value === null) return []; return Array.isArray(value) ? value : [value]; }
136
+ function strings(value) { return array(value).map((entry) => String(entry ?? '')).filter(Boolean); }
137
+ function compactRecord(value) { return Object.fromEntries(Object.entries(value ?? {}).filter(([, entry]) => entry !== undefined && (!Array.isArray(entry) || entry.length > 0))); }
@@ -2,10 +2,14 @@ import { normalizeSemanticMergeReadiness, uniqueStrings } from '../../native-imp
2
2
 
3
3
  export function createSemanticPatchBundleAdmission(input = {}, context = {}) {
4
4
  const transformAdmission = semanticTransformAdmission(context);
5
- const fallbackReadiness = transformAdmission.readiness === 'ready' ? 'ready' : context.readiness;
5
+ const semanticEditAdmission = context.semanticEditAdmission ?? { status: 'none', action: 'none', readiness: 'needs-review', reasonCodes: [] };
6
+ const fallbackReadiness = fallbackAdmissionReadiness(transformAdmission, semanticEditAdmission, context.readiness);
6
7
  const readiness = normalizeSemanticMergeReadiness(input.readiness ?? fallbackReadiness) ?? input.readiness ?? fallbackReadiness;
7
- const status = input.status ?? admissionStatusForReadiness(readiness, transformAdmission);
8
- const autoApplyCandidate = input.autoApplyCandidate ?? (status === 'admitted' && transformAdmission.action === 'admit');
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'));
9
13
  return compactRecord({
10
14
  status,
11
15
  readiness,
@@ -13,11 +17,13 @@ export function createSemanticPatchBundleAdmission(input = {}, context = {}) {
13
17
  autoMergeClaim: false,
14
18
  autoApplyCandidate,
15
19
  transformAdmission,
20
+ semanticEditAdmission,
16
21
  reasonCodes: uniqueStrings([
17
22
  ...strings(input.reasonCodes),
18
23
  ...strings(context.source?.reasons),
19
24
  ...strings(context.mergeCandidate?.reasons),
20
- ...transformAdmission.reasonCodes
25
+ ...transformAdmission.reasonCodes,
26
+ ...strings(semanticEditAdmission.reasonCodes)
21
27
  ]),
22
28
  conflictKeys: uniqueStrings([...strings(input.conflictKeys), ...context.conflictKeys]),
23
29
  admittedAt: input.admittedAt,
@@ -81,12 +87,23 @@ function transformReadiness(value) {
81
87
  return undefined;
82
88
  }
83
89
 
84
- function admissionStatusForReadiness(readiness, transformAdmission) {
90
+ function fallbackAdmissionReadiness(transformAdmission, semanticEditAdmission, fallback) {
91
+ if ([transformAdmission.readiness, semanticEditAdmission.readiness].includes('blocked')) return 'blocked';
92
+ if (hasAdmissibleReadyAction(transformAdmission, semanticEditAdmission)) return 'ready';
93
+ return fallback;
94
+ }
95
+
96
+ function admissionStatusForReadiness(readiness, transformAdmission, semanticEditAdmission) {
85
97
  if (readiness === 'blocked') return 'blocked';
86
- if (transformAdmission.action === 'admit' && readiness === 'ready') return 'admitted';
98
+ if (hasAdmissibleReadyAction(transformAdmission, semanticEditAdmission) && readiness === 'ready') return 'admitted';
87
99
  return readiness === 'needs-review' ? 'needs-review' : 'proposed';
88
100
  }
89
101
 
102
+ function hasAdmissibleReadyAction(transformAdmission, semanticEditAdmission) {
103
+ return [transformAdmission.action, semanticEditAdmission.action].includes('admit') ||
104
+ (semanticEditAdmission.action === 'skip' && semanticEditAdmission.readiness === 'ready' && semanticEditAdmission.reviewRequired === false);
105
+ }
106
+
90
107
  function hasCrossLanguageTransform(index) {
91
108
  const source = new Set(strings(index.transformSourceLanguages));
92
109
  return strings(index.transformTargetLanguages).some((target) => !source.has(target));
@@ -1,4 +1,5 @@
1
1
  import{idFragment,normalizeSemanticMergeReadiness,uniqueStrings}from'../../native-import-utils.js';
2
+ import{createSemanticEditBundleAdmission}from'./semanticEditBundleAdmission.js';
2
3
  import{createSemanticPatchBundleAdmission}from'./semanticPatchBundleAdmission.js';
3
4
  import{semanticEditRecordIndex,semanticEditSummary}from'./semanticEditBundleIndex.js';
4
5
  import{normalizeSemanticTransformIdentityRecords,semanticTransformInputs,semanticTransformRecordIndex,semanticTransformSummary}from'./semanticTransformIdentityRecords.js';
@@ -12,7 +13,13 @@ export function createSemanticPatchBundleRecord(input={},options={}){
12
13
  const semanticEditScripts=array(options.semanticEditScripts??source.semanticEditScripts??source.semanticEditScript);
13
14
  const semanticEditProjections=array(options.semanticEditProjections??source.semanticEditProjections??source.semanticEditProjection);
14
15
  const semanticEditReplays=array(options.semanticEditReplays??source.semanticEditReplays??source.semanticEditReplay);
15
- const semanticEditIndex=semanticEditRecordIndex(semanticEditScripts,semanticEditProjections,semanticEditReplays,source);
16
+ const editAdmission=createSemanticEditBundleAdmission({
17
+ semanticEditScripts,semanticEditProjections,semanticEditReplays,
18
+ ...(source.metadata?.semanticEditAdmission??{}),
19
+ ...(source.semanticEditAdmission??{}),
20
+ ...(options.semanticEditAdmission??{})
21
+ });
22
+ const editIndex=semanticEditRecordIndex(semanticEditScripts,semanticEditProjections,semanticEditReplays,source);
16
23
  const transformContext={sourceLanguage:options.sourceLanguage??source.sourceLanguage??source.language,targetLanguage:options.targetLanguage??source.targetLanguage};
17
24
  const semanticTransformIdentities=normalizeSemanticTransformIdentityRecords(semanticTransformInputs(source,options),transformContext);
18
25
  const semanticTransformIndex=semanticTransformRecordIndex(semanticTransformIdentities,source);
@@ -38,7 +45,7 @@ export function createSemanticPatchBundleRecord(input={},options={}){
38
45
  const evidenceIds=uniqueStrings([...strings(options.evidenceIds),...strings(source.evidenceIds),...evidenceRecords.map((record)=>record?.id),...strings(mergeCandidate?.evidenceIds)]);
39
46
  const proofIds=uniqueStrings([...strings(options.proofIds),...strings(source.proofIds),...evidenceRecords.filter((record)=>record?.kind==='proof').map((record)=>record.id),...strings(mergeCandidate?.proofIds)]);
40
47
  const historyIds=uniqueStrings([...strings(options.historyIds),...strings(options.historyId),...strings(source.historyIds),...strings(source.historyId)]);
41
- const semanticOperationIds=uniqueStrings([...strings(options.semanticOperationIds),...strings(options.semanticOperationId),...strings(source.semanticOperationIds),...strings(source.semanticOperationId),...strings(patch?.semanticOperationIds),...strings(mergeCandidate?.semanticOperationIds),...semanticEditIndex.semanticEditOperationIds]);
48
+ const semanticOperationIds=uniqueStrings([...strings(options.semanticOperationIds),...strings(options.semanticOperationId),...strings(source.semanticOperationIds),...strings(source.semanticOperationId),...strings(patch?.semanticOperationIds),...strings(mergeCandidate?.semanticOperationIds),...editIndex.semanticEditOperationIds]);
42
49
  const conflictKeys=uniqueStrings([
43
50
  ...strings(options.conflictKeys),
44
51
  ...strings(source.conflictKeys),
@@ -46,12 +53,12 @@ export function createSemanticPatchBundleRecord(input={},options={}){
46
53
  ...changedRegions.flatMap((region)=>[region.conflictKey,...array(region.admission?.conflictKeys)]),
47
54
  ...(source.metadata?.semanticMergeConflictSummary?.conflictKeys??[])
48
55
  ]);
49
- const admission=createSemanticPatchBundleAdmission(options.admission??source.admission,{readiness,conflictKeys,source,mergeCandidate,semanticTransformIndex,semanticTransformIdentities});
56
+ const admission=createSemanticPatchBundleAdmission(options.admission??source.admission,{readiness,conflictKeys,source,mergeCandidate,semanticTransformIndex,semanticTransformIdentities,semanticEditAdmission:editAdmission});
50
57
  const id=options.id??(source.kind==='frontier.lang.semanticPatchBundleRecord'?source.id:undefined)
51
58
  ??`semantic_patch_bundle_${idFragment(firstString(source.id,patchId,mergeCandidateId,source.sourcePath,source.language,'record'))}`;
52
59
  const language=options.language??source.language??mergeCandidate?.language??sources.find((item)=>item.language)?.language;
53
60
  const sourcePath=options.sourcePath??source.sourcePath??mergeCandidate?.sourcePath??sources.find((item)=>item.sourcePath)?.sourcePath;
54
- const index=recordIndex({baseHash,targetHash,sources,changedRegions,sourceMapLinks,evidenceIds,proofIds,historyIds,semanticOperationIds,patchId,mergeCandidateId,admission,semanticEditIndex,semanticTransformIndex,targetPortability});
61
+ const index=recordIndex({baseHash,targetHash,sources,changedRegions,sourceMapLinks,evidenceIds,proofIds,historyIds,semanticOperationIds,patchId,mergeCandidateId,admission,semanticEditAdmission:editAdmission,semanticEditIndex:editIndex,semanticTransformIndex,targetPortability});
55
62
  return{
56
63
  kind:'frontier.lang.semanticPatchBundleRecord',
57
64
  version:1,
@@ -71,20 +78,21 @@ export function createSemanticPatchBundleRecord(input={},options={}){
71
78
  proofIds,
72
79
  historyIds,
73
80
  semanticOperationIds,
74
- semanticEditScriptIds:semanticEditIndex.semanticEditScriptIds,
75
- semanticEditProjectionIds:semanticEditIndex.semanticEditProjectionIds,
76
- semanticEditReplayIds:semanticEditIndex.semanticEditReplayIds,
81
+ semanticEditScriptIds:editIndex.semanticEditScriptIds,
82
+ semanticEditProjectionIds:editIndex.semanticEditProjectionIds,
83
+ semanticEditReplayIds:editIndex.semanticEditReplayIds,
77
84
  semanticTransformIdentityIds:semanticTransformIndex.semanticTransformIds,
78
85
  admission,
79
86
  index,
80
- summary:{changedRegions:changedRegions.length,sourceMapLinks:sourceMapLinks.length,evidenceIds:evidenceIds.length,proofIds:proofIds.length,historyIds:historyIds.length,semanticOperations:semanticOperationIds.length,semanticEditScripts:semanticEditScripts.length,semanticEditProjections:semanticEditProjections.length,semanticEditReplays:semanticEditReplays.length,semanticEditProjectionEdits:semanticEditIndex.semanticEditProjectionEditCount,semanticEditReplayEdits:semanticEditIndex.semanticEditReplayEditCount,semanticTransformIdentities:semanticTransformIdentities.length,reviewRequired:admission.reviewRequired,autoMergeClaim:admission.autoMergeClaim},
87
+ summary:{changedRegions:changedRegions.length,sourceMapLinks:sourceMapLinks.length,evidenceIds:evidenceIds.length,proofIds:proofIds.length,historyIds:historyIds.length,semanticOperations:semanticOperationIds.length,semanticEditScripts:semanticEditScripts.length,semanticEditProjections:semanticEditProjections.length,semanticEditReplays:semanticEditReplays.length,semanticEditProjectionEdits:editIndex.semanticEditProjectionEditCount,semanticEditReplayEdits:editIndex.semanticEditReplayEditCount,semanticEditBundleStatus:editAdmission.status,semanticTransformIdentities:semanticTransformIdentities.length,reviewRequired:admission.reviewRequired,autoMergeClaim:admission.autoMergeClaim},
81
88
  metadata:compactRecord({
82
89
  sourceChangeSetId:source.kind==='frontier.lang.nativeSourceChangeSet'?source.id:undefined,
83
90
  patchRisk:patch?.risk,
84
91
  nativeChangeSummary:source.summary,
85
92
  changedRegionProjectionSummary:source.metadata?.changedRegionProjectionSummary,
86
93
  semanticMergeConflictSummary:source.metadata?.semanticMergeConflictSummary,
87
- semanticEditSummary:semanticEditSummary(semanticEditIndex),
94
+ semanticEditSummary:semanticEditSummary(editIndex),
95
+ semanticEditAdmission:editAdmission,
88
96
  semanticTransformSummary:semanticTransformSummary(semanticTransformIndex),
89
97
  targetPortability,
90
98
  ...options.metadata
@@ -192,16 +200,17 @@ function normalizeSourceMapLinks(links){
192
200
  }
193
201
 
194
202
  function recordIndex(parts){
195
- const semanticEditIndex=parts.semanticEditIndex??semanticEditRecordIndex([],[],[],parts);
203
+ const editIndex=parts.semanticEditIndex??semanticEditRecordIndex([],[],[],parts);
204
+ const editAdmission=parts.semanticEditAdmission??{};
196
205
  const semanticTransformIndex=parts.semanticTransformIndex??semanticTransformRecordIndex([],parts);
197
206
  return{
198
207
  baseHashes:uniqueStrings([parts.baseHash,...parts.sources.map((item)=>item.baseHash)]),
199
208
  targetHashes:uniqueStrings([parts.targetHash,...parts.sources.map((item)=>item.targetHash)]),
200
209
  sourceHashes:uniqueStrings(parts.sources.map((item)=>item.sourceHash)),
201
- sourcePaths:uniqueStrings([...parts.sources.map((item)=>item.sourcePath),...semanticEditIndex.projectedSourcePaths,...semanticTransformIndex.transformSourcePaths,...semanticTransformIndex.transformTargetPaths]),
202
- regionKeys:uniqueStrings([...parts.changedRegions.map((region)=>region.key),...semanticEditIndex.anchorKeys]),
210
+ sourcePaths:uniqueStrings([...parts.sources.map((item)=>item.sourcePath),...strings(editAdmission.sourcePaths),...editIndex.projectedSourcePaths,...semanticTransformIndex.transformSourcePaths,...semanticTransformIndex.transformTargetPaths]),
211
+ regionKeys:uniqueStrings([...parts.changedRegions.map((region)=>region.key),...editIndex.anchorKeys]),
203
212
  regionKinds:uniqueStrings(parts.changedRegions.map((region)=>region.regionKind)),
204
- conflictKeys:uniqueStrings([...parts.changedRegions.flatMap((region)=>[region.conflictKey,...array(region.admission?.conflictKeys)]),...semanticEditIndex.conflictKeys]),
213
+ conflictKeys:uniqueStrings([...parts.changedRegions.flatMap((region)=>[region.conflictKey,...array(region.admission?.conflictKeys)]),...editIndex.conflictKeys]),
205
214
  sourceMapIds:uniqueStrings([...parts.sourceMapLinks.map((link)=>link.sourceMapId),...parts.changedRegions.flatMap((region)=>region.sourceMapIds??[])]),
206
215
  sourceMapMappingIds:uniqueStrings([...parts.sourceMapLinks.map((link)=>link.sourceMapMappingId),...parts.changedRegions.flatMap((region)=>region.sourceMapMappingIds??[])]),
207
216
  sourceMapLinkIds:uniqueStrings(parts.sourceMapLinks.map((link)=>link.id)),
@@ -209,18 +218,21 @@ function recordIndex(parts){
209
218
  proofIds:parts.proofIds,
210
219
  historyIds:parts.historyIds,
211
220
  semanticOperationIds:uniqueStrings(parts.semanticOperationIds),
212
- semanticEditScriptIds:semanticEditIndex.semanticEditScriptIds,
213
- semanticEditProjectionIds:semanticEditIndex.semanticEditProjectionIds,
214
- semanticEditReplayIds:semanticEditIndex.semanticEditReplayIds,
215
- semanticEditReplayStatuses:semanticEditIndex.semanticEditReplayStatuses,
216
- semanticEditReplayActions:semanticEditIndex.semanticEditReplayActions,
217
- semanticEditReplayCurrentHashes:semanticEditIndex.semanticEditReplayCurrentHashes,
218
- semanticEditReplayOutputHashes:semanticEditIndex.semanticEditReplayOutputHashes,
219
- semanticEditKeys:semanticEditIndex.semanticEditKeys,
220
- semanticIdentityHashes:semanticEditIndex.semanticIdentityHashes,
221
- sourceIdentityHashes:semanticEditIndex.sourceIdentityHashes,
222
- operationContentHashes:semanticEditIndex.operationContentHashes,
223
- editContentHashes:semanticEditIndex.editContentHashes,
221
+ semanticEditScriptIds:editIndex.semanticEditScriptIds,
222
+ semanticEditProjectionIds:editIndex.semanticEditProjectionIds,
223
+ semanticEditReplayIds:editIndex.semanticEditReplayIds,
224
+ semanticEditReplayStatuses:editIndex.semanticEditReplayStatuses,
225
+ semanticEditReplayActions:editIndex.semanticEditReplayActions,
226
+ semanticEditAdmissionStatuses:uniqueStrings([editAdmission.status]),
227
+ semanticEditAdmissionActions:uniqueStrings([editAdmission.action]),
228
+ semanticEditAdmissionReadinesses:uniqueStrings([editAdmission.readiness]),
229
+ semanticEditReplayCurrentHashes:editIndex.semanticEditReplayCurrentHashes,
230
+ semanticEditReplayOutputHashes:editIndex.semanticEditReplayOutputHashes,
231
+ semanticEditKeys:editIndex.semanticEditKeys,
232
+ semanticIdentityHashes:editIndex.semanticIdentityHashes,
233
+ sourceIdentityHashes:editIndex.sourceIdentityHashes,
234
+ operationContentHashes:editIndex.operationContentHashes,
235
+ editContentHashes:editIndex.editContentHashes,
224
236
  semanticTransformIds:semanticTransformIndex.semanticTransformIds,
225
237
  semanticTransformKeys:semanticTransformIndex.semanticTransformKeys,
226
238
  semanticTransformIdentityHashes:semanticTransformIndex.semanticTransformIdentityHashes,
@@ -243,7 +255,7 @@ function recordIndex(parts){
243
255
  }
244
256
 
245
257
  function matchesRecord(record,query){
246
- 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??{},targetPortability:record.metadata?.targetPortability});
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});
247
259
  return matchAny(queryValues(query.id,query.ids),[record.id])
248
260
  &&matchAny(queryValues(query.patchId,query.patchIds),index.patchIds)
249
261
  &&matchAny(queryValues(query.mergeCandidateId,query.mergeCandidateIds),index.mergeCandidateIds)
@@ -266,6 +278,9 @@ function matchesRecord(record,query){
266
278
  &&matchAny(queryValues(query.semanticEditReplayId,query.semanticEditReplayIds),index.semanticEditReplayIds)
267
279
  &&matchAny(queryValues(query.semanticEditReplayStatus,query.semanticEditReplayStatuses),index.semanticEditReplayStatuses)
268
280
  &&matchAny(queryValues(query.semanticEditReplayAction,query.semanticEditReplayActions),index.semanticEditReplayActions)
281
+ &&matchAny(queryValues(query.semanticEditAdmissionStatus,query.semanticEditAdmissionStatuses),index.semanticEditAdmissionStatuses)
282
+ &&matchAny(queryValues(query.semanticEditAdmissionAction,query.semanticEditAdmissionActions),index.semanticEditAdmissionActions)
283
+ &&matchAny(queryValues(query.semanticEditAdmissionReadiness,query.semanticEditAdmissionReadinesses),index.semanticEditAdmissionReadinesses)
269
284
  &&matchAny(queryValues(query.semanticEditReplayCurrentHash,query.semanticEditReplayCurrentHashes),index.semanticEditReplayCurrentHashes)
270
285
  &&matchAny(queryValues(query.semanticEditReplayOutputHash,query.semanticEditReplayOutputHashes),index.semanticEditReplayOutputHashes)
271
286
  &&matchAny(queryValues(query.semanticEditKey,query.semanticEditKeys),index.semanticEditKeys)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shapeshift-labs/frontier-lang-compiler",
3
- "version": "0.2.98",
3
+ "version": "0.2.99",
4
4
  "description": "Compiler facade for Frontier Lang source documents and language projection adapters.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",