steroids-cli 0.9.11 → 0.9.13
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/parallel/merge-commit-checks.d.ts +6 -0
- package/dist/parallel/merge-commit-checks.d.ts.map +1 -0
- package/dist/parallel/merge-commit-checks.js +28 -0
- package/dist/parallel/merge-commit-checks.js.map +1 -0
- package/dist/parallel/merge-process.d.ts +21 -0
- package/dist/parallel/merge-process.d.ts.map +1 -0
- package/dist/parallel/merge-process.js +104 -0
- package/dist/parallel/merge-process.js.map +1 -0
- package/dist/parallel/merge-sealing.d.ts +11 -0
- package/dist/parallel/merge-sealing.d.ts.map +1 -0
- package/dist/parallel/merge-sealing.js +64 -0
- package/dist/parallel/merge-sealing.js.map +1 -0
- package/dist/parallel/merge-validation.d.ts +6 -0
- package/dist/parallel/merge-validation.d.ts.map +1 -0
- package/dist/parallel/merge-validation.js +57 -0
- package/dist/parallel/merge-validation.js.map +1 -0
- package/dist/parallel/merge-workspace.d.ts +8 -0
- package/dist/parallel/merge-workspace.d.ts.map +1 -0
- package/dist/parallel/merge-workspace.js +37 -0
- package/dist/parallel/merge-workspace.js.map +1 -0
- package/dist/parallel/merge.d.ts +2 -5
- package/dist/parallel/merge.d.ts.map +1 -1
- package/dist/parallel/merge.js +14 -245
- package/dist/parallel/merge.js.map +1 -1
- package/dist/runners/orchestrator-loop.d.ts.map +1 -1
- package/dist/runners/orchestrator-loop.js +10 -0
- package/dist/runners/orchestrator-loop.js.map +1 -1
- package/dist/runners/wakeup-checks.d.ts +14 -0
- package/dist/runners/wakeup-checks.d.ts.map +1 -0
- package/dist/runners/wakeup-checks.js +85 -0
- package/dist/runners/wakeup-checks.js.map +1 -0
- package/dist/runners/wakeup-reconcile.d.ts +10 -0
- package/dist/runners/wakeup-reconcile.d.ts.map +1 -0
- package/dist/runners/wakeup-reconcile.js +84 -0
- package/dist/runners/wakeup-reconcile.js.map +1 -0
- package/dist/runners/wakeup-runner.d.ts +18 -0
- package/dist/runners/wakeup-runner.d.ts.map +1 -0
- package/dist/runners/wakeup-runner.js +47 -0
- package/dist/runners/wakeup-runner.js.map +1 -0
- package/dist/runners/wakeup-sanitise.d.ts +24 -0
- package/dist/runners/wakeup-sanitise.d.ts.map +1 -0
- package/dist/runners/wakeup-sanitise.js +247 -0
- package/dist/runners/wakeup-sanitise.js.map +1 -0
- package/dist/runners/wakeup-timing.d.ts +12 -0
- package/dist/runners/wakeup-timing.d.ts.map +1 -0
- package/dist/runners/wakeup-timing.js +37 -0
- package/dist/runners/wakeup-timing.js.map +1 -0
- package/dist/runners/wakeup.d.ts +7 -8
- package/dist/runners/wakeup.d.ts.map +1 -1
- package/dist/runners/wakeup.js +26 -464
- package/dist/runners/wakeup.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit integration checks and SHA resolution
|
|
3
|
+
*/
|
|
4
|
+
export declare function isAppliedCommitIntegrated(projectPath: string, commitSha: string | null): boolean;
|
|
5
|
+
export declare function resolveGitSha(output: string): string | null;
|
|
6
|
+
//# sourceMappingURL=merge-commit-checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-commit-checks.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-commit-checks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAiBhG;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK3D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Commit integration checks and SHA resolution
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isAppliedCommitIntegrated = isAppliedCommitIntegrated;
|
|
7
|
+
exports.resolveGitSha = resolveGitSha;
|
|
8
|
+
const merge_git_js_1 = require("./merge-git.js");
|
|
9
|
+
function isAppliedCommitIntegrated(projectPath, commitSha) {
|
|
10
|
+
if (!commitSha) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const output = (0, merge_git_js_1.runGitCommand)(projectPath, ['branch', '--contains', commitSha, '--list', 'HEAD'], { allowFailure: true });
|
|
14
|
+
const lower = output.toLowerCase();
|
|
15
|
+
if (lower.includes('fatal:') || lower.includes('error:')) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return output.trim().length > 0;
|
|
19
|
+
}
|
|
20
|
+
function resolveGitSha(output) {
|
|
21
|
+
const trimmed = output.trim();
|
|
22
|
+
if (!trimmed)
|
|
23
|
+
return null;
|
|
24
|
+
if (/fatal:|error:/i.test(trimmed))
|
|
25
|
+
return null;
|
|
26
|
+
return trimmed.split('\n').at(-1)?.trim() ?? null;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=merge-commit-checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-commit-checks.js","sourceRoot":"","sources":["../../src/parallel/merge-commit-checks.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAIH,8DAiBC;AAED,sCAKC;AA1BD,iDAA+C;AAE/C,SAAgB,yBAAyB,CAAC,WAAmB,EAAE,SAAwB;IACrF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,4BAAa,EAC1B,WAAW,EACX,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,EACrD,EAAE,YAAY,EAAE,IAAI,EAAE,CACvB,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEnC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,aAAa,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-workstream commit processing
|
|
3
|
+
*/
|
|
4
|
+
import { MergeProgressRow } from './merge-progress.js';
|
|
5
|
+
import { openDatabase } from '../database/connection.js';
|
|
6
|
+
interface MergeWorkstreamSpec {
|
|
7
|
+
id: string;
|
|
8
|
+
branchName: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function processWorkstream(db: ReturnType<typeof openDatabase>['db'], projectPath: string, sessionId: string, workstream: MergeWorkstreamSpec, mainBranch: string, remote: string, progressRows: MergeProgressRow[], heartbeat: {
|
|
11
|
+
sessionId: string;
|
|
12
|
+
runnerId: string;
|
|
13
|
+
timeoutMinutes: number;
|
|
14
|
+
lockEpoch: number;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
applied: number;
|
|
17
|
+
skipped: number;
|
|
18
|
+
conflicts: number;
|
|
19
|
+
}>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=merge-process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-process.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-process.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAIL,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,UAAU,mBAAmB;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,IAAI,CAAC,EACzC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,mBAAmB,EAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,gBAAgB,EAAE,EAChC,SAAS,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5F,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAsHlE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Per-workstream commit processing
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.processWorkstream = processWorkstream;
|
|
7
|
+
const merge_git_js_1 = require("./merge-git.js");
|
|
8
|
+
const merge_progress_js_1 = require("./merge-progress.js");
|
|
9
|
+
const merge_conflict_js_1 = require("./merge-conflict.js");
|
|
10
|
+
const merge_commit_checks_js_1 = require("./merge-commit-checks.js");
|
|
11
|
+
const merge_lock_js_1 = require("./merge-lock.js");
|
|
12
|
+
async function processWorkstream(db, projectPath, sessionId, workstream, mainBranch, remote, progressRows, heartbeat) {
|
|
13
|
+
const summary = { applied: 0, skipped: 0, conflicts: 0 };
|
|
14
|
+
const commits = (0, merge_git_js_1.getWorkstreamCommitList)(projectPath, remote, workstream.branchName, mainBranch);
|
|
15
|
+
if (commits.length === 0) {
|
|
16
|
+
return summary;
|
|
17
|
+
}
|
|
18
|
+
const workstreamProgress = (0, merge_progress_js_1.getMergeProgressForWorkstream)(progressRows, workstream.id);
|
|
19
|
+
const workstreamLookup = new Map();
|
|
20
|
+
for (const row of workstreamProgress) {
|
|
21
|
+
workstreamLookup.set(row.position, row);
|
|
22
|
+
}
|
|
23
|
+
for (let position = 0; position < commits.length; position += 1) {
|
|
24
|
+
const commitSha = commits[position];
|
|
25
|
+
const shortSha = (0, merge_git_js_1.getCommitShortSha)(commitSha);
|
|
26
|
+
const prior = workstreamLookup.get(position);
|
|
27
|
+
if (prior?.status === 'applied' && prior.commit_sha === commitSha) {
|
|
28
|
+
if ((0, merge_commit_checks_js_1.isAppliedCommitIntegrated)(projectPath, prior.applied_commit_sha)) {
|
|
29
|
+
summary.applied += 1;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
(0, merge_progress_js_1.clearProgressEntry)(db, sessionId, workstream.id, position);
|
|
33
|
+
}
|
|
34
|
+
if (prior?.status === 'skipped' && prior.commit_sha === commitSha) {
|
|
35
|
+
summary.skipped += 1;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (prior?.status === 'conflict' && prior.commit_sha === commitSha) {
|
|
39
|
+
if ((0, merge_git_js_1.hasCherryPickInProgress)(projectPath)) {
|
|
40
|
+
const outcome = await (0, merge_conflict_js_1.runConflictResolutionCycle)({
|
|
41
|
+
db,
|
|
42
|
+
projectPath,
|
|
43
|
+
sessionId,
|
|
44
|
+
workstreamId: workstream.id,
|
|
45
|
+
runnerId: heartbeat.runnerId,
|
|
46
|
+
mergeLockHeartbeat: {
|
|
47
|
+
lockEpoch: heartbeat.lockEpoch,
|
|
48
|
+
timeoutMinutes: heartbeat.timeoutMinutes,
|
|
49
|
+
},
|
|
50
|
+
branchName: workstream.branchName,
|
|
51
|
+
position,
|
|
52
|
+
commitSha,
|
|
53
|
+
existingTaskId: prior.conflict_task_id ?? undefined,
|
|
54
|
+
});
|
|
55
|
+
if (outcome === 'skipped')
|
|
56
|
+
summary.skipped += 1;
|
|
57
|
+
else
|
|
58
|
+
summary.applied += 1;
|
|
59
|
+
summary.conflicts += 1;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
(0, merge_progress_js_1.clearProgressEntry)(db, sessionId, workstream.id, position);
|
|
63
|
+
}
|
|
64
|
+
if (prior && prior.commit_sha !== commitSha) {
|
|
65
|
+
(0, merge_progress_js_1.clearProgressEntry)(db, sessionId, workstream.id, position);
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
(0, merge_git_js_1.runGitCommand)(projectPath, ['cherry-pick', commitSha]);
|
|
69
|
+
const appliedCommitSha = (0, merge_git_js_1.runGitCommand)(projectPath, ['rev-parse', 'HEAD']).trim();
|
|
70
|
+
(0, merge_progress_js_1.upsertProgressEntry)(db, sessionId, workstream.id, position, commitSha, 'applied', null, appliedCommitSha);
|
|
71
|
+
summary.applied += 1;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
75
|
+
if (!/CONFLICT|merge conflict|could not apply|needs merge/i.test(message)) {
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
const outcome = await (0, merge_conflict_js_1.runConflictResolutionCycle)({
|
|
79
|
+
db,
|
|
80
|
+
projectPath,
|
|
81
|
+
sessionId,
|
|
82
|
+
workstreamId: workstream.id,
|
|
83
|
+
runnerId: heartbeat.runnerId,
|
|
84
|
+
mergeLockHeartbeat: {
|
|
85
|
+
lockEpoch: heartbeat.lockEpoch,
|
|
86
|
+
timeoutMinutes: heartbeat.timeoutMinutes,
|
|
87
|
+
},
|
|
88
|
+
branchName: workstream.branchName,
|
|
89
|
+
position,
|
|
90
|
+
commitSha,
|
|
91
|
+
});
|
|
92
|
+
if (outcome === 'skipped') {
|
|
93
|
+
summary.skipped += 1;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
summary.applied += 1;
|
|
97
|
+
}
|
|
98
|
+
summary.conflicts += 1;
|
|
99
|
+
}
|
|
100
|
+
(0, merge_lock_js_1.refreshMergeLock)(db, heartbeat.sessionId, heartbeat.runnerId, heartbeat.timeoutMinutes, heartbeat.lockEpoch);
|
|
101
|
+
}
|
|
102
|
+
return summary;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=merge-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-process.js","sourceRoot":"","sources":["../../src/parallel/merge-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workstream sealing before cherry-pick merge
|
|
3
|
+
*/
|
|
4
|
+
import { openDatabase } from '../database/connection.js';
|
|
5
|
+
interface MergeWorkstreamSpec {
|
|
6
|
+
id: string;
|
|
7
|
+
branchName: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function sealWorkstreamsForMerge(mergeDb: ReturnType<typeof openDatabase>['db'], sessionId: string, runnerId: string, lockEpoch: number, mergePath: string, remote: string, mainBranch: string, workstreams: MergeWorkstreamSpec[]): void;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=merge-sealing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-sealing.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-sealing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD,UAAU,mBAAmB;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,IAAI,CAAC,EAC9C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,mBAAmB,EAAE,GACjC,IAAI,CA2EN"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Workstream sealing before cherry-pick merge
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.sealWorkstreamsForMerge = sealWorkstreamsForMerge;
|
|
7
|
+
const merge_git_js_1 = require("./merge-git.js");
|
|
8
|
+
const merge_lock_js_1 = require("./merge-lock.js");
|
|
9
|
+
const global_db_js_1 = require("../runners/global-db.js");
|
|
10
|
+
const merge_errors_js_1 = require("./merge-errors.js");
|
|
11
|
+
function resolveGitSha(output) {
|
|
12
|
+
const trimmed = output.trim();
|
|
13
|
+
if (!trimmed)
|
|
14
|
+
return null;
|
|
15
|
+
if (/fatal:|error:/i.test(trimmed))
|
|
16
|
+
return null;
|
|
17
|
+
return trimmed.split('\n').at(-1)?.trim() ?? null;
|
|
18
|
+
}
|
|
19
|
+
function sealWorkstreamsForMerge(mergeDb, sessionId, runnerId, lockEpoch, mergePath, remote, mainBranch, workstreams) {
|
|
20
|
+
const { db, close } = (0, global_db_js_1.openGlobalDatabase)();
|
|
21
|
+
try {
|
|
22
|
+
const sealedEntries = [];
|
|
23
|
+
(0, merge_lock_js_1.assertMergeLockEpoch)(mergeDb, sessionId, runnerId, lockEpoch);
|
|
24
|
+
for (let index = 0; index < workstreams.length; index += 1) {
|
|
25
|
+
(0, merge_lock_js_1.assertMergeLockEpoch)(mergeDb, sessionId, runnerId, lockEpoch);
|
|
26
|
+
const stream = workstreams[index];
|
|
27
|
+
const commits = (0, merge_git_js_1.getWorkstreamCommitList)(mergePath, remote, stream.branchName, mainBranch);
|
|
28
|
+
const sealedHeadSha = resolveGitSha((0, merge_git_js_1.runGitCommand)(mergePath, ['rev-parse', `${remote}/${stream.branchName}`], { allowFailure: true }));
|
|
29
|
+
const sealedBaseSha = resolveGitSha((0, merge_git_js_1.runGitCommand)(mergePath, ['merge-base', `${remote}/${mainBranch}`, `${remote}/${stream.branchName}`], { allowFailure: true }));
|
|
30
|
+
if (!sealedHeadSha || !sealedBaseSha) {
|
|
31
|
+
throw new merge_errors_js_1.ParallelMergeError(`Could not resolve sealed merge SHAs for ${remote}/${stream.branchName}`, 'REMOTE_BRANCH_MISSING');
|
|
32
|
+
}
|
|
33
|
+
sealedEntries.push({
|
|
34
|
+
streamId: stream.id,
|
|
35
|
+
sealedBaseSha,
|
|
36
|
+
sealedHeadSha,
|
|
37
|
+
commits,
|
|
38
|
+
completionOrder: index + 1,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const applySealedUpdates = db.transaction(() => {
|
|
42
|
+
for (const entry of sealedEntries) {
|
|
43
|
+
const update = db.prepare(`UPDATE workstreams
|
|
44
|
+
SET sealed_base_sha = ?,
|
|
45
|
+
sealed_head_sha = ?,
|
|
46
|
+
sealed_commit_shas = ?,
|
|
47
|
+
completion_order = COALESCE(completion_order, ?),
|
|
48
|
+
completed_at = COALESCE(completed_at, datetime('now')),
|
|
49
|
+
status = 'completed'
|
|
50
|
+
WHERE session_id = ?
|
|
51
|
+
AND id = ?
|
|
52
|
+
AND status IN ('running', 'completed')`).run(entry.sealedBaseSha, entry.sealedHeadSha, JSON.stringify(entry.commits), entry.completionOrder, sessionId, entry.streamId);
|
|
53
|
+
if (update.changes !== 1) {
|
|
54
|
+
throw new merge_errors_js_1.ParallelMergeError(`Workstream lease check failed while sealing ${entry.streamId}`, 'LEASE_FENCE_FAILED');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
applySealedUpdates();
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
close();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=merge-sealing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-sealing.js","sourceRoot":"","sources":["../../src/parallel/merge-sealing.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,0DAoFC;AAtGD,iDAAwE;AACxE,mDAAuD;AAEvD,0DAA6D;AAC7D,uDAAuD;AAOvD,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AACpD,CAAC;AAED,SAAgB,uBAAuB,CACrC,OAA8C,EAC9C,SAAiB,EACjB,QAAgB,EAChB,SAAiB,EACjB,SAAiB,EACjB,MAAc,EACd,UAAkB,EAClB,WAAkC;IAElC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,iCAAkB,GAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,aAAa,GAMd,EAAE,CAAC;QAER,IAAA,oCAAoB,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAE9D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC3D,IAAA,oCAAoB,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,IAAA,sCAAuB,EAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC1F,MAAM,aAAa,GAAG,aAAa,CACjC,IAAA,4BAAa,EAAC,SAAS,EAAE,CAAC,WAAW,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAClG,CAAC;YACF,MAAM,aAAa,GAAG,aAAa,CACjC,IAAA,4BAAa,EAAC,SAAS,EAAE,CAAC,YAAY,EAAE,GAAG,MAAM,IAAI,UAAU,EAAE,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAC9H,CAAC;YAEF,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrC,MAAM,IAAI,oCAAkB,CAC1B,2CAA2C,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,EACxE,uBAAuB,CACxB,CAAC;YACJ,CAAC;YAED,aAAa,CAAC,IAAI,CAAC;gBACjB,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,aAAa;gBACb,aAAa;gBACb,OAAO;gBACP,eAAe,EAAE,KAAK,GAAG,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,kBAAkB,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAC7C,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB;;;;;;;;;oDAS0C,CAC3C,CAAC,GAAG,CACH,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,aAAa,EACnB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAC7B,KAAK,CAAC,eAAe,EACrB,SAAS,EACT,KAAK,CAAC,QAAQ,CACf,CAAC;gBAEF,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,oCAAkB,CAC1B,+CAA+C,KAAK,CAAC,QAAQ,EAAE,EAC/D,oBAAoB,CACrB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,kBAAkB,EAAE,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge validation gate and workspace utilities
|
|
3
|
+
*/
|
|
4
|
+
export declare function runValidationGate(mergePath: string, validationCommand?: string): void;
|
|
5
|
+
export declare function snippet(value: string | null | undefined, limit?: number): string;
|
|
6
|
+
//# sourceMappingURL=merge-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-validation.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CA2CrF;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,SAA2B,GAAG,MAAM,CAWlG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Merge validation gate and workspace utilities
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runValidationGate = runValidationGate;
|
|
7
|
+
exports.snippet = snippet;
|
|
8
|
+
const node_child_process_1 = require("node:child_process");
|
|
9
|
+
const merge_errors_js_1 = require("./merge-errors.js");
|
|
10
|
+
const VALIDATION_MAX_BUFFER_BYTES = 20 * 1024 * 1024;
|
|
11
|
+
const VALIDATION_SNIPPET_LIMIT = 8_000;
|
|
12
|
+
function runValidationGate(mergePath, validationCommand) {
|
|
13
|
+
if (!validationCommand || validationCommand.trim().length === 0) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
(0, node_child_process_1.execSync)(validationCommand, {
|
|
18
|
+
cwd: mergePath,
|
|
19
|
+
stdio: 'pipe',
|
|
20
|
+
encoding: 'utf-8',
|
|
21
|
+
maxBuffer: VALIDATION_MAX_BUFFER_BYTES,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
const err = error;
|
|
26
|
+
const stderr = typeof err.stderr === 'string' ? err.stderr : err.stderr?.toString() ?? '';
|
|
27
|
+
const stdout = typeof err.stdout === 'string' ? err.stdout : err.stdout?.toString() ?? '';
|
|
28
|
+
if (err.code === 'ENOBUFS') {
|
|
29
|
+
throw new merge_errors_js_1.ParallelMergeError('Validation gate output exceeded the maximum buffer size. Reduce output verbosity or split the command.', 'VALIDATION_FAILED', {
|
|
30
|
+
details: {
|
|
31
|
+
command: validationCommand.trim(),
|
|
32
|
+
stderr: stderr ?? '',
|
|
33
|
+
stdout: stdout ?? '',
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const message = [stderr, stdout, err.message].filter(Boolean).join('\n') || String(error);
|
|
38
|
+
throw new merge_errors_js_1.ParallelMergeError(`Validation gate failed: ${message}`, 'VALIDATION_FAILED', {
|
|
39
|
+
details: {
|
|
40
|
+
command: validationCommand.trim(),
|
|
41
|
+
stderr,
|
|
42
|
+
stdout,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function snippet(value, limit = VALIDATION_SNIPPET_LIMIT) {
|
|
48
|
+
if (!value) {
|
|
49
|
+
return '';
|
|
50
|
+
}
|
|
51
|
+
const trimmed = value.trim();
|
|
52
|
+
if (trimmed.length <= limit) {
|
|
53
|
+
return trimmed;
|
|
54
|
+
}
|
|
55
|
+
return trimmed.slice(-limit);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=merge-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-validation.js","sourceRoot":"","sources":["../../src/parallel/merge-validation.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAQH,8CA2CC;AAED,0BAWC;AA9DD,2DAA8C;AAC9C,uDAAuD;AAEvD,MAAM,2BAA2B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACrD,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAEvC,SAAgB,iBAAiB,CAAC,SAAiB,EAAE,iBAA0B;IAC7E,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,IAAA,6BAAQ,EAAC,iBAAiB,EAAE;YAC1B,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,2BAA2B;SACvC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,KAAsF,CAAC;QACnG,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1F,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1F,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,oCAAkB,CAC1B,wGAAwG,EACxG,mBAAmB,EACnB;gBACE,OAAO,EAAE;oBACP,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE;oBACjC,MAAM,EAAE,MAAM,IAAI,EAAE;oBACpB,MAAM,EAAE,MAAM,IAAI,EAAE;iBACrB;aACF,CACF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1F,MAAM,IAAI,oCAAkB,CAC1B,2BAA2B,OAAO,EAAE,EACpC,mBAAmB,EACnB;YACE,OAAO,EAAE;gBACP,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE;gBACjC,MAAM;gBACN,MAAM;aACP;SACF,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAgB,OAAO,CAAC,KAAgC,EAAE,KAAK,GAAG,wBAAwB;IACxF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge workspace preparation and cleanup
|
|
3
|
+
*/
|
|
4
|
+
export declare function ensureMergeWorkingTree(projectPath: string): void;
|
|
5
|
+
export declare function cleanupWorkspaceState(projectPath: string, workspaceRoot: string, workstreamIds: string[], options: {
|
|
6
|
+
cleanupOnSuccess: boolean;
|
|
7
|
+
}): void;
|
|
8
|
+
//# sourceMappingURL=merge-workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-workspace.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-workspace.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAUhE;AAED,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,gBAAgB,EAAE,OAAO,CAAA;CAAE,GACrC,IAAI,CAqBN"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Merge workspace preparation and cleanup
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ensureMergeWorkingTree = ensureMergeWorkingTree;
|
|
7
|
+
exports.cleanupWorkspaceState = cleanupWorkspaceState;
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const node_fs_1 = require("node:fs");
|
|
10
|
+
const clone_js_1 = require("./clone.js");
|
|
11
|
+
const merge_git_js_1 = require("./merge-git.js");
|
|
12
|
+
const merge_errors_js_1 = require("./merge-errors.js");
|
|
13
|
+
function ensureMergeWorkingTree(projectPath) {
|
|
14
|
+
const lines = (0, merge_git_js_1.gitStatusLines)(projectPath);
|
|
15
|
+
if (lines.length === 0)
|
|
16
|
+
return;
|
|
17
|
+
if (!(0, merge_git_js_1.hasCherryPickInProgress)(projectPath)) {
|
|
18
|
+
throw new merge_errors_js_1.ParallelMergeError('Working tree is dirty. Commit or stash changes before merging.', 'DIRTY_WORKTREE');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function cleanupWorkspaceState(projectPath, workspaceRoot, workstreamIds, options) {
|
|
22
|
+
if (!options.cleanupOnSuccess)
|
|
23
|
+
return;
|
|
24
|
+
const baseRoot = (0, node_path_1.resolve)(workspaceRoot);
|
|
25
|
+
const hash = (0, clone_js_1.getProjectHash)(projectPath);
|
|
26
|
+
const projectWorkspaceRoot = (0, node_path_1.resolve)(baseRoot, hash);
|
|
27
|
+
if (!projectWorkspaceRoot.startsWith(baseRoot)) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
for (const workstreamId of workstreamIds) {
|
|
31
|
+
const folder = (0, node_path_1.resolve)(projectWorkspaceRoot, workstreamId.startsWith('ws-') ? workstreamId : `ws-${workstreamId}`);
|
|
32
|
+
if ((0, node_path_1.resolve)(folder).startsWith(projectWorkspaceRoot)) {
|
|
33
|
+
(0, node_fs_1.rmSync)(folder, { recursive: true, force: true });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=merge-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-workspace.js","sourceRoot":"","sources":["../../src/parallel/merge-workspace.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAQH,wDAUC;AAED,sDA0BC;AA5CD,yCAAoC;AACpC,qCAAiC;AACjC,yCAA4C;AAC5C,iDAAyE;AACzE,uDAAuD;AAEvD,SAAgB,sBAAsB,CAAC,WAAmB;IACxD,MAAM,KAAK,GAAG,IAAA,6BAAc,EAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE/B,IAAI,CAAC,IAAA,sCAAuB,EAAC,WAAW,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,oCAAkB,CAC1B,gEAAgE,EAChE,gBAAgB,CACjB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAgB,qBAAqB,CACnC,WAAmB,EACnB,aAAqB,EACrB,aAAuB,EACvB,OAAsC;IAEtC,IAAI,CAAC,OAAO,CAAC,gBAAgB;QAAE,OAAO;IAEtC,MAAM,QAAQ,GAAG,IAAA,mBAAO,EAAC,aAAa,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAA,yBAAc,EAAC,WAAW,CAAC,CAAC;IACzC,MAAM,oBAAoB,GAAG,IAAA,mBAAO,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAErD,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAA,mBAAO,EACpB,oBAAoB,EACpB,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,YAAY,EAAE,CACrE,CAAC;QAEF,IAAI,IAAA,mBAAO,EAAC,MAAM,CAAC,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACrD,IAAA,gBAAM,EAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/parallel/merge.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { MergeLockRecord } from './merge-lock.js';
|
|
6
6
|
import { ParallelMergeError } from './merge-errors.js';
|
|
7
|
+
import { cleanupWorkspaceState } from './merge-workspace.js';
|
|
7
8
|
export interface MergeWorkstreamSpec {
|
|
8
9
|
id: string;
|
|
9
10
|
branchName: string;
|
|
@@ -39,13 +40,9 @@ export interface MergeResult {
|
|
|
39
40
|
validationEscalationId?: string;
|
|
40
41
|
validationWorkspacePath?: string;
|
|
41
42
|
}
|
|
42
|
-
declare function getNowISOString(): string;
|
|
43
|
-
declare function cleanupWorkspaceState(projectPath: string, workspaceRoot: string, workstreamIds: string[], options: {
|
|
44
|
-
cleanupOnSuccess: boolean;
|
|
45
|
-
}): void;
|
|
46
43
|
/**
|
|
47
44
|
* Run cherry-pick merge loop across completed workstreams.
|
|
48
45
|
*/
|
|
49
46
|
export declare function runParallelMerge(options: MergeOptions): Promise<MergeResult>;
|
|
50
|
-
export { MergeLockRecord, ParallelMergeError,
|
|
47
|
+
export { MergeLockRecord, ParallelMergeError, cleanupWorkspaceState, };
|
|
51
48
|
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/parallel/merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/parallel/merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,OAAO,EACL,eAAe,EAKhB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAA0B,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAIrF,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAOD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAgOlF;AAED,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,qBAAqB,GACtB,CAAC"}
|