@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.
- package/dist/declarations/semantic-edit-bundle.d.ts +78 -0
- package/dist/declarations/semantic-patch-bundle-index.d.ts +3 -0
- package/dist/declarations/semantic-patch-bundle.d.ts +10 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/internal/index-impl/semanticEditBundleAdmission.js +137 -0
- package/dist/internal/index-impl/semanticPatchBundleAdmission.js +23 -6
- package/dist/internal/index-impl/semanticPatchBundleRecords.js +41 -26
- package/package.json +1 -1
|
@@ -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
|
|
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' &&
|
|
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
|
|
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
|
|
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
|
|
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),...
|
|
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:
|
|
75
|
-
semanticEditProjectionIds:
|
|
76
|
-
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:
|
|
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(
|
|
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
|
|
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),...
|
|
202
|
-
regionKeys:uniqueStrings([...parts.changedRegions.map((region)=>region.key),...
|
|
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)]),...
|
|
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:
|
|
213
|
-
semanticEditProjectionIds:
|
|
214
|
-
semanticEditReplayIds:
|
|
215
|
-
semanticEditReplayStatuses:
|
|
216
|
-
semanticEditReplayActions:
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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