steroids-cli 0.8.21 → 0.8.23
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/commands/llm.d.ts.map +1 -1
- package/dist/commands/llm.js +4 -0
- package/dist/commands/llm.js.map +1 -1
- package/dist/commands/loop-phases.d.ts +1 -1
- package/dist/commands/loop-phases.d.ts.map +1 -1
- package/dist/commands/loop-phases.js +3 -3
- package/dist/commands/loop-phases.js.map +1 -1
- package/dist/commands/runners.js +4 -0
- package/dist/commands/runners.js.map +1 -1
- package/dist/commands/tasks.d.ts.map +1 -1
- package/dist/commands/tasks.js +86 -33
- package/dist/commands/tasks.js.map +1 -1
- package/dist/database/queries.d.ts +14 -0
- package/dist/database/queries.d.ts.map +1 -1
- package/dist/database/queries.js +46 -0
- package/dist/database/queries.js.map +1 -1
- package/dist/database/schema.d.ts +2 -2
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +30 -0
- package/dist/database/schema.js.map +1 -1
- package/dist/orchestrator/task-selector.d.ts +7 -2
- package/dist/orchestrator/task-selector.d.ts.map +1 -1
- package/dist/orchestrator/task-selector.js +91 -14
- package/dist/orchestrator/task-selector.js.map +1 -1
- package/dist/parallel/clone.d.ts +41 -0
- package/dist/parallel/clone.d.ts.map +1 -0
- package/dist/parallel/clone.js +176 -0
- package/dist/parallel/clone.js.map +1 -0
- package/dist/parallel/clone.test.d.ts +2 -0
- package/dist/parallel/clone.test.d.ts.map +1 -0
- package/dist/parallel/clone.test.js +252 -0
- package/dist/parallel/clone.test.js.map +1 -0
- package/dist/parallel/merge-conflict.d.ts +22 -0
- package/dist/parallel/merge-conflict.d.ts.map +1 -0
- package/dist/parallel/merge-conflict.js +227 -0
- package/dist/parallel/merge-conflict.js.map +1 -0
- package/dist/parallel/merge-errors.d.ts +10 -0
- package/dist/parallel/merge-errors.d.ts.map +1 -0
- package/dist/parallel/merge-errors.js +16 -0
- package/dist/parallel/merge-errors.js.map +1 -0
- package/dist/parallel/merge-git.d.ts +25 -0
- package/dist/parallel/merge-git.d.ts.map +1 -0
- package/dist/parallel/merge-git.js +134 -0
- package/dist/parallel/merge-git.js.map +1 -0
- package/dist/parallel/merge-lock.d.ts +26 -0
- package/dist/parallel/merge-lock.d.ts.map +1 -0
- package/dist/parallel/merge-lock.js +58 -0
- package/dist/parallel/merge-lock.js.map +1 -0
- package/dist/parallel/merge-progress.d.ts +20 -0
- package/dist/parallel/merge-progress.d.ts.map +1 -0
- package/dist/parallel/merge-progress.js +36 -0
- package/dist/parallel/merge-progress.js.map +1 -0
- package/dist/parallel/merge.d.ts +39 -0
- package/dist/parallel/merge.d.ts.map +1 -0
- package/dist/parallel/merge.js +231 -0
- package/dist/parallel/merge.js.map +1 -0
- package/dist/parallel/merge.test.d.ts +5 -0
- package/dist/parallel/merge.test.d.ts.map +1 -0
- package/dist/parallel/merge.test.js +322 -0
- package/dist/parallel/merge.test.js.map +1 -0
- package/dist/parallel/scheduler.d.ts +43 -0
- package/dist/parallel/scheduler.d.ts.map +1 -0
- package/dist/parallel/scheduler.js +281 -0
- package/dist/parallel/scheduler.js.map +1 -0
- package/dist/runners/daemon.d.ts +11 -1
- package/dist/runners/daemon.d.ts.map +1 -1
- package/dist/runners/daemon.js +18 -4
- package/dist/runners/daemon.js.map +1 -1
- package/dist/runners/global-db.d.ts.map +1 -1
- package/dist/runners/global-db.js +42 -1
- package/dist/runners/global-db.js.map +1 -1
- package/dist/runners/orchestrator-loop.d.ts +3 -0
- package/dist/runners/orchestrator-loop.d.ts.map +1 -1
- package/dist/runners/orchestrator-loop.js +19 -9
- package/dist/runners/orchestrator-loop.js.map +1 -1
- package/dist/runners/wakeup.d.ts.map +1 -1
- package/dist/runners/wakeup.js +2 -1
- package/dist/runners/wakeup.js.map +1 -1
- package/migrations/011_add_merge_locks_and_progress.sql +39 -0
- package/migrations/manifest.json +9 -1
- package/package.json +1 -1
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const globals_1 = require("@jest/globals");
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_os_1 = require("node:os");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const mockStatfsSync = globals_1.jest.fn();
|
|
8
|
+
const mockSymlinkSync = globals_1.jest.fn();
|
|
9
|
+
const mockAccessSync = globals_1.jest.fn();
|
|
10
|
+
globals_1.jest.unstable_mockModule('node:fs', () => {
|
|
11
|
+
const actualFs = globals_1.jest.requireActual('node:fs');
|
|
12
|
+
return {
|
|
13
|
+
...actualFs,
|
|
14
|
+
statfsSync: mockStatfsSync,
|
|
15
|
+
symlinkSync: mockSymlinkSync,
|
|
16
|
+
accessSync: mockAccessSync,
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
globals_1.jest.unstable_mockModule('node:child_process', () => ({
|
|
20
|
+
execFileSync: mockExecFileSync,
|
|
21
|
+
}));
|
|
22
|
+
const mockExecFileSync = globals_1.jest.fn();
|
|
23
|
+
let workspaceRoot = '';
|
|
24
|
+
let forceCloneFailure = false;
|
|
25
|
+
let forceBranchFailure = false;
|
|
26
|
+
let createWorkspaceClone;
|
|
27
|
+
let getProjectHash;
|
|
28
|
+
let getWorkspacePath;
|
|
29
|
+
let isSameFileSystem;
|
|
30
|
+
const tempPaths = [];
|
|
31
|
+
function makeTempDir(prefix) {
|
|
32
|
+
const tempPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), `${prefix}-XXXXXX`));
|
|
33
|
+
tempPaths.push(tempPath);
|
|
34
|
+
return tempPath;
|
|
35
|
+
}
|
|
36
|
+
function cleanupTempPaths() {
|
|
37
|
+
while (tempPaths.length > 0) {
|
|
38
|
+
const tempPath = tempPaths.pop();
|
|
39
|
+
if (tempPath) {
|
|
40
|
+
(0, node_fs_1.rmSync)(tempPath, { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function createProjectFixture() {
|
|
45
|
+
const projectPath = makeTempDir('steroids-clone-project');
|
|
46
|
+
const steroidsDirectory = (0, node_path_1.join)(projectPath, '.steroids');
|
|
47
|
+
(0, node_fs_1.mkdirSync)(steroidsDirectory, { recursive: true });
|
|
48
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(steroidsDirectory, 'steroids.db'), 'ok');
|
|
49
|
+
return projectPath;
|
|
50
|
+
}
|
|
51
|
+
function makeStatFs(id) {
|
|
52
|
+
return { type: id };
|
|
53
|
+
}
|
|
54
|
+
function setFileSystemIds(projectPath, rootPath, projectId, rootId) {
|
|
55
|
+
const resolvedProjectPath = (0, node_path_1.resolve)(projectPath);
|
|
56
|
+
const resolvedRootPath = (0, node_path_1.resolve)(rootPath);
|
|
57
|
+
mockStatfsSync.mockImplementation((targetPath) => {
|
|
58
|
+
const resolvedTarget = (0, node_path_1.resolve)(String(targetPath));
|
|
59
|
+
if (resolvedTarget === resolvedProjectPath) {
|
|
60
|
+
return makeStatFs(projectId);
|
|
61
|
+
}
|
|
62
|
+
if (resolvedTarget === resolvedRootPath) {
|
|
63
|
+
return makeStatFs(rootId);
|
|
64
|
+
}
|
|
65
|
+
return makeStatFs('other');
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function configureExecMock() {
|
|
69
|
+
mockExecFileSync.mockImplementation(((command, args) => {
|
|
70
|
+
if (command !== 'git' || !Array.isArray(args)) {
|
|
71
|
+
return '';
|
|
72
|
+
}
|
|
73
|
+
if (args[0] === 'clone') {
|
|
74
|
+
const workspacePath = args[2];
|
|
75
|
+
if (typeof workspacePath === 'string') {
|
|
76
|
+
const workspaceDirectory = (0, node_path_1.resolve)(workspacePath);
|
|
77
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.resolve)(workspaceDirectory, '..'), { recursive: true });
|
|
78
|
+
(0, node_fs_1.mkdirSync)(workspacePath, { recursive: true });
|
|
79
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(workspacePath, '.git'), { recursive: true });
|
|
80
|
+
}
|
|
81
|
+
if (forceCloneFailure) {
|
|
82
|
+
throw new Error('mocked clone failure');
|
|
83
|
+
}
|
|
84
|
+
return '';
|
|
85
|
+
}
|
|
86
|
+
if (args[2] === 'checkout' && forceBranchFailure) {
|
|
87
|
+
throw new Error('mocked checkout failure');
|
|
88
|
+
}
|
|
89
|
+
return '';
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
(0, globals_1.beforeEach)(async () => {
|
|
93
|
+
workspaceRoot = makeTempDir('steroids-workspace-root');
|
|
94
|
+
forceCloneFailure = false;
|
|
95
|
+
forceBranchFailure = false;
|
|
96
|
+
mockStatfsSync.mockReset();
|
|
97
|
+
configureExecMock();
|
|
98
|
+
mockStatfsSync.mockImplementation(() => makeStatFs('same'));
|
|
99
|
+
({
|
|
100
|
+
createWorkspaceClone,
|
|
101
|
+
getProjectHash,
|
|
102
|
+
getWorkspacePath,
|
|
103
|
+
isSameFileSystem,
|
|
104
|
+
} = await import('./clone.js'));
|
|
105
|
+
});
|
|
106
|
+
(0, globals_1.afterEach)(() => {
|
|
107
|
+
mockExecFileSync.mockClear();
|
|
108
|
+
mockSymlinkSync.mockReset();
|
|
109
|
+
mockAccessSync.mockReset();
|
|
110
|
+
mockStatfsSync.mockReset();
|
|
111
|
+
cleanupTempPaths();
|
|
112
|
+
});
|
|
113
|
+
(0, globals_1.describe)('src/parallel/clone', () => {
|
|
114
|
+
(0, globals_1.it)('creates workspace clones on the same filesystem with git --local', () => {
|
|
115
|
+
const projectPath = createProjectFixture();
|
|
116
|
+
setFileSystemIds(projectPath, workspaceRoot, 'fs-a', 'fs-a');
|
|
117
|
+
const result = createWorkspaceClone({
|
|
118
|
+
projectPath,
|
|
119
|
+
workstreamId: 'stream',
|
|
120
|
+
branchName: 'steroids/ws-stream',
|
|
121
|
+
workspaceRoot,
|
|
122
|
+
});
|
|
123
|
+
const [cloneCommand, cloneArgs] = mockExecFileSync.mock.calls[0] ?? [];
|
|
124
|
+
const [checkoutCommand, checkoutArgs] = mockExecFileSync.mock.calls[1] ?? [];
|
|
125
|
+
(0, globals_1.expect)(cloneCommand).toBe('git');
|
|
126
|
+
(0, globals_1.expect)(cloneArgs).toEqual(['clone', '--local', projectPath, result.workspacePath]);
|
|
127
|
+
(0, globals_1.expect)(checkoutCommand).toBe('git');
|
|
128
|
+
(0, globals_1.expect)(checkoutArgs).toEqual(['-C', result.workspacePath, 'checkout', '-b', 'steroids/ws-stream']);
|
|
129
|
+
(0, globals_1.expect)(result.usedLocalClone).toBe(true);
|
|
130
|
+
(0, globals_1.expect)(mockSymlinkSync).toHaveBeenCalledWith((0, node_fs_1.realpathSync)((0, node_path_1.join)(projectPath, '.steroids')), result.steroidsSymlinkPath);
|
|
131
|
+
(0, globals_1.expect)(mockAccessSync).toHaveBeenCalledWith((0, node_path_1.join)(result.steroidsSymlinkPath, 'steroids.db'), globals_1.expect.any(Number));
|
|
132
|
+
(0, globals_1.expect)(mockAccessSync).toHaveBeenCalledTimes(1);
|
|
133
|
+
});
|
|
134
|
+
(0, globals_1.it)('creates workspace clones on a different filesystem without git --local', () => {
|
|
135
|
+
const projectPath = createProjectFixture();
|
|
136
|
+
setFileSystemIds(projectPath, workspaceRoot, 'fs-a', 'fs-b');
|
|
137
|
+
const result = createWorkspaceClone({
|
|
138
|
+
projectPath,
|
|
139
|
+
workstreamId: 'stream',
|
|
140
|
+
branchName: 'steroids/ws-stream',
|
|
141
|
+
workspaceRoot,
|
|
142
|
+
});
|
|
143
|
+
const [cloneCommand, cloneArgs] = mockExecFileSync.mock.calls[0] ?? [];
|
|
144
|
+
(0, globals_1.expect)(cloneCommand).toBe('git');
|
|
145
|
+
(0, globals_1.expect)(cloneArgs).toEqual(['clone', projectPath, result.workspacePath]);
|
|
146
|
+
(0, globals_1.expect)(result.usedLocalClone).toBe(false);
|
|
147
|
+
});
|
|
148
|
+
(0, globals_1.it)('detects same and different filesystems', () => {
|
|
149
|
+
const projectPath = createProjectFixture();
|
|
150
|
+
setFileSystemIds(projectPath, workspaceRoot, 'fs-a', 'fs-a');
|
|
151
|
+
(0, globals_1.expect)(isSameFileSystem(projectPath, workspaceRoot)).toBe(true);
|
|
152
|
+
setFileSystemIds(projectPath, workspaceRoot, 'fs-a', 'fs-b');
|
|
153
|
+
(0, globals_1.expect)(isSameFileSystem(projectPath, workspaceRoot)).toBe(false);
|
|
154
|
+
});
|
|
155
|
+
(0, globals_1.it)('produces consistent project hashes', () => {
|
|
156
|
+
const projectPath = createProjectFixture();
|
|
157
|
+
const sameFirst = getProjectHash(projectPath);
|
|
158
|
+
const sameSecond = getProjectHash(projectPath);
|
|
159
|
+
const different = getProjectHash(`${projectPath}-other`);
|
|
160
|
+
(0, globals_1.expect)(sameFirst).toBe(sameSecond);
|
|
161
|
+
(0, globals_1.expect)(sameFirst).not.toBe(different);
|
|
162
|
+
(0, globals_1.expect)(sameFirst).toHaveLength(16);
|
|
163
|
+
});
|
|
164
|
+
(0, globals_1.it)('resolves workspace paths with normalized workstream ids', () => {
|
|
165
|
+
const projectPath = createProjectFixture();
|
|
166
|
+
const hash = getWorkspacePath(projectPath, 'stream', workspaceRoot);
|
|
167
|
+
const normalized = getWorkspacePath(projectPath, 'stream', workspaceRoot);
|
|
168
|
+
const prefixed = getWorkspacePath(projectPath, 'ws-prefixed', workspaceRoot);
|
|
169
|
+
const expected = (0, node_path_1.join)(workspaceRoot, getProjectHash(projectPath), 'ws-stream');
|
|
170
|
+
const expectedPrefixed = (0, node_path_1.join)(workspaceRoot, getProjectHash(projectPath), 'ws-prefixed');
|
|
171
|
+
(0, globals_1.expect)(normalized).toBe(expected);
|
|
172
|
+
(0, globals_1.expect)(prefixed).toBe(expectedPrefixed);
|
|
173
|
+
(0, globals_1.expect)(hash).toBe(expected);
|
|
174
|
+
});
|
|
175
|
+
(0, globals_1.it)('throws for missing project paths', () => {
|
|
176
|
+
(0, globals_1.expect)(() => {
|
|
177
|
+
createWorkspaceClone({
|
|
178
|
+
projectPath: (0, node_path_1.join)(workspaceRoot, 'does-not-exist'),
|
|
179
|
+
workstreamId: 'stream',
|
|
180
|
+
branchName: 'steroids/ws-stream',
|
|
181
|
+
workspaceRoot,
|
|
182
|
+
});
|
|
183
|
+
}).toThrow('Project path does not exist');
|
|
184
|
+
(0, globals_1.expect)(mockExecFileSync).not.toHaveBeenCalled();
|
|
185
|
+
});
|
|
186
|
+
(0, globals_1.it)('throws for project paths that are not directories', () => {
|
|
187
|
+
const filePath = (0, node_path_1.join)(workspaceRoot, 'not-a-directory');
|
|
188
|
+
(0, node_fs_1.writeFileSync)(filePath, 'not a directory');
|
|
189
|
+
(0, globals_1.expect)(() => {
|
|
190
|
+
createWorkspaceClone({
|
|
191
|
+
projectPath: filePath,
|
|
192
|
+
workstreamId: 'stream',
|
|
193
|
+
branchName: 'steroids/ws-stream',
|
|
194
|
+
workspaceRoot,
|
|
195
|
+
});
|
|
196
|
+
}).toThrow('Project path is not a directory');
|
|
197
|
+
});
|
|
198
|
+
(0, globals_1.it)('throws when the workspace already exists and force is not set', () => {
|
|
199
|
+
const projectPath = createProjectFixture();
|
|
200
|
+
const workspacePath = getWorkspacePath(projectPath, 'stream', workspaceRoot);
|
|
201
|
+
(0, node_fs_1.mkdirSync)(workspacePath, { recursive: true });
|
|
202
|
+
(0, globals_1.expect)(() => {
|
|
203
|
+
createWorkspaceClone({
|
|
204
|
+
projectPath,
|
|
205
|
+
workstreamId: 'stream',
|
|
206
|
+
branchName: 'steroids/ws-stream',
|
|
207
|
+
workspaceRoot,
|
|
208
|
+
});
|
|
209
|
+
}).toThrow('Workspace already exists');
|
|
210
|
+
});
|
|
211
|
+
(0, globals_1.it)('creates and validates the .steroids symlink in the cloned workspace', () => {
|
|
212
|
+
const projectPath = createProjectFixture();
|
|
213
|
+
setFileSystemIds(projectPath, workspaceRoot, 'fs-a', 'fs-a');
|
|
214
|
+
const result = createWorkspaceClone({
|
|
215
|
+
projectPath,
|
|
216
|
+
workstreamId: 'stream',
|
|
217
|
+
branchName: 'steroids/ws-stream',
|
|
218
|
+
workspaceRoot,
|
|
219
|
+
});
|
|
220
|
+
(0, globals_1.expect)(mockSymlinkSync).toHaveBeenCalledWith((0, node_fs_1.realpathSync)((0, node_path_1.join)(projectPath, '.steroids')), result.steroidsSymlinkPath);
|
|
221
|
+
(0, globals_1.expect)(mockAccessSync).toHaveBeenCalledWith((0, node_path_1.join)(result.steroidsSymlinkPath, 'steroids.db'), globals_1.expect.any(Number));
|
|
222
|
+
});
|
|
223
|
+
(0, globals_1.it)('cleans workspace on clone command failure', () => {
|
|
224
|
+
const projectPath = createProjectFixture();
|
|
225
|
+
const workspacePath = getWorkspacePath(projectPath, 'stream', workspaceRoot);
|
|
226
|
+
forceCloneFailure = true;
|
|
227
|
+
(0, globals_1.expect)(() => {
|
|
228
|
+
createWorkspaceClone({
|
|
229
|
+
projectPath,
|
|
230
|
+
workstreamId: 'stream',
|
|
231
|
+
branchName: 'steroids/ws-stream',
|
|
232
|
+
workspaceRoot,
|
|
233
|
+
});
|
|
234
|
+
}).toThrow('Git clone failed');
|
|
235
|
+
(0, globals_1.expect)((0, node_fs_1.existsSync)(workspacePath)).toBe(false);
|
|
236
|
+
});
|
|
237
|
+
(0, globals_1.it)('cleans workspace on branch creation failure', () => {
|
|
238
|
+
const projectPath = createProjectFixture();
|
|
239
|
+
const workspacePath = getWorkspacePath(projectPath, 'stream', workspaceRoot);
|
|
240
|
+
forceBranchFailure = true;
|
|
241
|
+
(0, globals_1.expect)(() => {
|
|
242
|
+
createWorkspaceClone({
|
|
243
|
+
projectPath,
|
|
244
|
+
workstreamId: 'stream',
|
|
245
|
+
branchName: 'steroids/ws-stream',
|
|
246
|
+
workspaceRoot,
|
|
247
|
+
});
|
|
248
|
+
}).toThrow('Failed to create branch in clone');
|
|
249
|
+
(0, globals_1.expect)((0, node_fs_1.existsSync)(workspacePath)).toBe(false);
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
//# sourceMappingURL=clone.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone.test.js","sourceRoot":"","sources":["../../src/parallel/clone.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge conflict resolution helpers.
|
|
3
|
+
*/
|
|
4
|
+
import type Database from 'better-sqlite3';
|
|
5
|
+
interface ParseReviewDecisionResult {
|
|
6
|
+
decision: 'approve' | 'reject';
|
|
7
|
+
notes: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ConflictRunOptions {
|
|
10
|
+
db: Database.Database;
|
|
11
|
+
projectPath: string;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
workstreamId: string;
|
|
14
|
+
branchName: string;
|
|
15
|
+
position: number;
|
|
16
|
+
commitSha: string;
|
|
17
|
+
existingTaskId?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function parseReviewDecision(raw: string): ParseReviewDecisionResult;
|
|
20
|
+
export declare function runConflictResolutionCycle(options: ConflictRunOptions): Promise<'continued' | 'skipped'>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=merge-conflict.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-conflict.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-conflict.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AA2B3C,UAAU,yBAAyB;IACjC,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB,CAwB1E;AAoLD,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CA6J9G"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Merge conflict resolution helpers.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseReviewDecision = parseReviewDecision;
|
|
7
|
+
exports.runConflictResolutionCycle = runConflictResolutionCycle;
|
|
8
|
+
const node_crypto_1 = require("node:crypto");
|
|
9
|
+
const loader_js_1 = require("../config/loader.js");
|
|
10
|
+
const queries_js_1 = require("../database/queries.js");
|
|
11
|
+
const invocation_logger_js_1 = require("../providers/invocation-logger.js");
|
|
12
|
+
const registry_js_1 = require("../providers/registry.js");
|
|
13
|
+
const merge_git_js_1 = require("./merge-git.js");
|
|
14
|
+
const merge_errors_js_1 = require("./merge-errors.js");
|
|
15
|
+
const merge_progress_js_1 = require("./merge-progress.js");
|
|
16
|
+
function parseReviewDecision(raw) {
|
|
17
|
+
const trimmed = raw.trim();
|
|
18
|
+
const upper = trimmed.toUpperCase();
|
|
19
|
+
const hasApprove = upper.includes('APPROVE');
|
|
20
|
+
const hasReject = upper.includes('REJECT');
|
|
21
|
+
if (hasApprove && !hasReject) {
|
|
22
|
+
return {
|
|
23
|
+
decision: 'approve',
|
|
24
|
+
notes: trimmed || 'APPROVED by merge-conflict reviewer',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (hasReject) {
|
|
28
|
+
return {
|
|
29
|
+
decision: 'reject',
|
|
30
|
+
notes: trimmed || 'Please review and correct conflict resolution',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
decision: 'reject',
|
|
35
|
+
notes: trimmed || 'Decision was not clear. Please provide explicit APPROVE/REJECT.',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function buildMergeConflictSectionName() {
|
|
39
|
+
return 'merge-conflicts';
|
|
40
|
+
}
|
|
41
|
+
function getNowISOString() {
|
|
42
|
+
return new Date().toISOString();
|
|
43
|
+
}
|
|
44
|
+
function createMergeConflictSection(db) {
|
|
45
|
+
const sectionName = buildMergeConflictSectionName();
|
|
46
|
+
const existing = db
|
|
47
|
+
.prepare('SELECT id FROM sections WHERE name = ? LIMIT 1')
|
|
48
|
+
.get(sectionName);
|
|
49
|
+
if (existing) {
|
|
50
|
+
return existing.id;
|
|
51
|
+
}
|
|
52
|
+
const maxPosRow = db
|
|
53
|
+
.prepare('SELECT MAX(position) as maxPos FROM sections')
|
|
54
|
+
.get();
|
|
55
|
+
const position = (maxPosRow?.maxPos ?? -1) + 1;
|
|
56
|
+
const sectionId = (0, node_crypto_1.createHash)('sha1').update(sectionName + position).digest('hex');
|
|
57
|
+
db.prepare(`INSERT INTO sections (id, name, position, priority, skipped, created_at)
|
|
58
|
+
VALUES (?, ?, ?, ?, ?, ?)`).run(sectionId, sectionName, position, 80, 0, getNowISOString());
|
|
59
|
+
return sectionId;
|
|
60
|
+
}
|
|
61
|
+
function ensureMergeConflictTask(db, workstreamId, shortSha, branchName, commitMessage, conflictedFiles, conflictPatch, forceNew = false) {
|
|
62
|
+
const sectionId = createMergeConflictSection(db);
|
|
63
|
+
if (!forceNew) {
|
|
64
|
+
const existing = db
|
|
65
|
+
.prepare(`SELECT t.id
|
|
66
|
+
FROM tasks t
|
|
67
|
+
INNER JOIN sections s ON s.id = t.section_id
|
|
68
|
+
WHERE s.name = ? AND t.title LIKE ?
|
|
69
|
+
ORDER BY t.created_at DESC
|
|
70
|
+
LIMIT 1`)
|
|
71
|
+
.get(buildMergeConflictSectionName(), `Merge conflict: cherry-pick ${shortSha}%`);
|
|
72
|
+
if (existing?.id) {
|
|
73
|
+
return existing.id;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const title = `Merge conflict: cherry-pick ${shortSha} from ${branchName}`;
|
|
77
|
+
const created = (0, queries_js_1.createTask)(db, title, {
|
|
78
|
+
sectionId,
|
|
79
|
+
sourceFile: `merge-conflict (${workstreamId})`,
|
|
80
|
+
filePath: conflictedFiles.join(', '),
|
|
81
|
+
status: 'pending',
|
|
82
|
+
fileContentHash: conflictPatch.substring(0, 2048),
|
|
83
|
+
fileCommitSha: commitMessage,
|
|
84
|
+
});
|
|
85
|
+
(0, queries_js_1.addAuditEntry)(db, created.id, 'null', 'pending', 'merge', {
|
|
86
|
+
actorType: 'orchestrator',
|
|
87
|
+
notes: `Generated from conflict while cherry-picking ${shortSha} from ${branchName}:\n${commitMessage}`,
|
|
88
|
+
});
|
|
89
|
+
return created.id;
|
|
90
|
+
}
|
|
91
|
+
function createPromptForConflictCoder(options) {
|
|
92
|
+
const notesSection = options.rejectionNotes
|
|
93
|
+
? `\n\nLatest review note from the resolver:\n${options.rejectionNotes}\n`
|
|
94
|
+
: '';
|
|
95
|
+
return `You are resolving a merge conflict for a cherry-pick during parallel merge.\n\n## Conflict context\nWorkstream: ${options.workstreamId}\nBranch: ${options.branchName}\nCommit: ${options.shortSha}\nCommit Message:\n${options.commitMessage}\n\nConflicted files:\n${options.conflictedFiles.map((file) => `- ${file}`).join('\n')}\n\nIntended patch:\n${options.conflictPatch}\n\nRules:\n1) Edit conflicted files to a correct resolution.\n2) Remove ALL conflict markers (<<<<<<, =======, >>>>>>) in resolved files.\n3) Stage only the resolved files using git add.\n4) Do NOT commit.\n5) Be surgical; change only files required for this commit.\n${notesSection}\n\nRespond with a short confirmation when done.`;
|
|
96
|
+
}
|
|
97
|
+
function createPromptForConflictReviewer(options) {
|
|
98
|
+
const files = options.stagedFiles.length > 0
|
|
99
|
+
? options.stagedFiles.map((file) => `- ${file}`).join('\n')
|
|
100
|
+
: 'No files staged yet';
|
|
101
|
+
return `You are reviewing a staged resolution for a cherry-pick conflict in parallel merge.\n\nWorkstream: ${options.workstreamId}\nBranch: ${options.branchName}\nCommit: ${options.shortSha}\nOriginal message: ${options.commitMessage}\n\nCurrent staged diff to be committed by cherry-pick --continue:\n${options.stagedDiff || '(empty diff)'}\n\nFiles staged:\n${files}\n\nDecision rules:\n- Reply with APPROVE if the resolution is correct.\n- Reply with REJECT and actionable notes if any conflict marker remains or logic is incorrect.\n\nFormat:\nAPPROVE - <optional note> or\nREJECT - <checklist itemized note>`;
|
|
102
|
+
}
|
|
103
|
+
async function invokeModel(role, projectPath, taskId, prompt) {
|
|
104
|
+
const config = (0, loader_js_1.loadConfig)(projectPath);
|
|
105
|
+
const modelConfig = role === 'coder' ? config.ai?.coder : config.ai?.reviewer;
|
|
106
|
+
if (!modelConfig?.provider || !modelConfig?.model) {
|
|
107
|
+
throw new merge_errors_js_1.ParallelMergeError(`Missing AI ${role} configuration. Configure via config.ai.${role}.`, 'AI_CONFIG_MISSING');
|
|
108
|
+
}
|
|
109
|
+
const providerName = modelConfig.provider;
|
|
110
|
+
const model = modelConfig.model;
|
|
111
|
+
const registry = (0, registry_js_1.getProviderRegistry)();
|
|
112
|
+
const provider = registry.get(providerName);
|
|
113
|
+
const result = await (0, invocation_logger_js_1.logInvocation)(prompt, (ctx) => provider.invoke(prompt, {
|
|
114
|
+
model,
|
|
115
|
+
timeout: 60 * 60 * 1000,
|
|
116
|
+
cwd: projectPath,
|
|
117
|
+
role,
|
|
118
|
+
streamOutput: false,
|
|
119
|
+
onActivity: ctx?.onActivity,
|
|
120
|
+
}), {
|
|
121
|
+
role,
|
|
122
|
+
provider: providerName,
|
|
123
|
+
model,
|
|
124
|
+
taskId,
|
|
125
|
+
projectPath,
|
|
126
|
+
});
|
|
127
|
+
if (!result.success) {
|
|
128
|
+
const details = result.stderr || result.stdout || 'model returned non-zero exit code';
|
|
129
|
+
throw new merge_errors_js_1.ParallelMergeError(`${role.toUpperCase()} invocation failed during merge conflict handling: ${details}`, 'AI_INVOCATION_FAILED');
|
|
130
|
+
}
|
|
131
|
+
if (result.timedOut) {
|
|
132
|
+
throw new merge_errors_js_1.ParallelMergeError(`${role} invocation timed out`, 'AI_INVOKE_TIMEOUT');
|
|
133
|
+
}
|
|
134
|
+
return result.stdout;
|
|
135
|
+
}
|
|
136
|
+
async function runConflictResolutionCycle(options) {
|
|
137
|
+
const { db, projectPath, sessionId, workstreamId, branchName, position, commitSha, existingTaskId, } = options;
|
|
138
|
+
const shortSha = options.commitSha.slice(0, 7);
|
|
139
|
+
const conflictedFiles = (0, merge_git_js_1.getConflictedFiles)(projectPath);
|
|
140
|
+
const conflictPatch = (0, merge_git_js_1.getCommitPatch)(projectPath, commitSha);
|
|
141
|
+
const commitMessage = (0, merge_git_js_1.getCommitMessage)(projectPath, commitSha);
|
|
142
|
+
const taskId = ensureMergeConflictTask(db, workstreamId, shortSha, branchName, commitMessage, conflictedFiles, conflictPatch, !existingTaskId);
|
|
143
|
+
let conflictTaskId = existingTaskId ?? taskId;
|
|
144
|
+
if (conflictTaskId !== taskId) {
|
|
145
|
+
conflictTaskId = taskId;
|
|
146
|
+
}
|
|
147
|
+
(0, merge_progress_js_1.upsertProgressEntry)(db, sessionId, workstreamId, position, commitSha, 'conflict', conflictTaskId);
|
|
148
|
+
const currentConflictTask = (0, queries_js_1.getTask)(db, conflictTaskId);
|
|
149
|
+
if (!currentConflictTask) {
|
|
150
|
+
throw new merge_errors_js_1.ParallelMergeError('Created merge-conflict task not found', 'TASK_MISSING');
|
|
151
|
+
}
|
|
152
|
+
if (currentConflictTask.status === 'completed') {
|
|
153
|
+
(0, merge_progress_js_1.upsertProgressEntry)(db, sessionId, workstreamId, position, commitSha, 'applied', conflictTaskId);
|
|
154
|
+
return 'continued';
|
|
155
|
+
}
|
|
156
|
+
(0, queries_js_1.updateTaskStatus)(db, currentConflictTask.id, 'in_progress', 'merge-conflict-orchestrator');
|
|
157
|
+
while (true) {
|
|
158
|
+
const existingTask = (0, queries_js_1.getTask)(db, currentConflictTask.id);
|
|
159
|
+
const lastNotes = existingTask?.rejection_count
|
|
160
|
+
? `After ${existingTask.rejection_count} rejection(s).`
|
|
161
|
+
: undefined;
|
|
162
|
+
const coderPrompt = createPromptForConflictCoder({
|
|
163
|
+
workstreamId,
|
|
164
|
+
shortSha,
|
|
165
|
+
branchName,
|
|
166
|
+
commitMessage,
|
|
167
|
+
conflictedFiles,
|
|
168
|
+
conflictPatch,
|
|
169
|
+
rejectionNotes: lastNotes,
|
|
170
|
+
});
|
|
171
|
+
await invokeModel('coder', projectPath, currentConflictTask.id, coderPrompt);
|
|
172
|
+
const remaining = (0, merge_git_js_1.getConflictedFiles)(projectPath);
|
|
173
|
+
if (remaining.length > 0) {
|
|
174
|
+
(0, queries_js_1.updateTaskStatus)(db, currentConflictTask.id, 'in_progress', 'merge-conflict-orchestrator', `Conflict markers still present: ${remaining.join(', ')}`);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const stagedFiles = (0, merge_git_js_1.getCachedFiles)(projectPath);
|
|
178
|
+
const stagedDiff = (0, merge_git_js_1.getCachedDiff)(projectPath);
|
|
179
|
+
if (stagedFiles.length === 0 || stagedDiff.trim().length === 0) {
|
|
180
|
+
(0, queries_js_1.updateTaskStatus)(db, currentConflictTask.id, 'in_progress', 'merge-conflict-orchestrator', 'No staged diff found. Stage resolved files before requesting review.');
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
(0, queries_js_1.updateTaskStatus)(db, currentConflictTask.id, 'review', 'merge-conflict-orchestrator');
|
|
184
|
+
const reviewerPrompt = createPromptForConflictReviewer({
|
|
185
|
+
workstreamId,
|
|
186
|
+
shortSha,
|
|
187
|
+
branchName,
|
|
188
|
+
commitMessage,
|
|
189
|
+
stagedDiff,
|
|
190
|
+
stagedFiles,
|
|
191
|
+
});
|
|
192
|
+
const decisionText = await invokeModel('reviewer', projectPath, currentConflictTask.id, reviewerPrompt);
|
|
193
|
+
const decision = parseReviewDecision(decisionText);
|
|
194
|
+
if (decision.decision === 'reject') {
|
|
195
|
+
(0, queries_js_1.rejectTask)(db, currentConflictTask.id, 'merge-conflict-reviewer', decision.notes);
|
|
196
|
+
if ((0, merge_git_js_1.cleanTreeHasConflicts)(projectPath)) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
// If no explicit conflict markers remain but reviewer still rejects, keep iterating.
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if ((0, merge_git_js_1.hasUnmergedFiles)(projectPath)) {
|
|
203
|
+
(0, queries_js_1.rejectTask)(db, currentConflictTask.id, 'merge-conflict-reviewer', 'Conflict markers still present. Please fix.');
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (!(0, merge_git_js_1.hasCherryPickInProgress)(projectPath)) {
|
|
207
|
+
throw new merge_errors_js_1.ParallelMergeError('Cherry-pick no longer in progress while resolving conflict', 'CHERRY_PICK_CONTEXT_LOST');
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
(0, merge_git_js_1.runGitCommand)(projectPath, ['-c', 'core.editor=true', 'cherry-pick', '--continue']);
|
|
211
|
+
(0, queries_js_1.approveTask)(db, currentConflictTask.id, 'merge-conflict-reviewer', decision.notes);
|
|
212
|
+
(0, merge_progress_js_1.upsertProgressEntry)(db, sessionId, workstreamId, position, commitSha, 'applied', currentConflictTask.id);
|
|
213
|
+
return 'continued';
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
217
|
+
if (/nothing to commit|previous cherry-pick is empty/i.test(message)) {
|
|
218
|
+
(0, merge_git_js_1.runGitCommand)(projectPath, ['cherry-pick', '--skip']);
|
|
219
|
+
(0, merge_progress_js_1.upsertProgressEntry)(db, sessionId, workstreamId, position, commitSha, 'skipped', currentConflictTask.id);
|
|
220
|
+
(0, queries_js_1.updateTaskStatus)(db, currentConflictTask.id, 'completed', 'merge-conflict-reviewer', 'Cherry-pick is now empty after resolution; skipped this commit.');
|
|
221
|
+
return 'skipped';
|
|
222
|
+
}
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=merge-conflict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-conflict.js","sourceRoot":"","sources":["../../src/parallel/merge-conflict.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-errors.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,IAAI,SAAyB,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAK1F"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Merge orchestration error type.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ParallelMergeError = void 0;
|
|
7
|
+
class ParallelMergeError extends Error {
|
|
8
|
+
code;
|
|
9
|
+
constructor(message, code = 'PARALLEL_MERGE_ERROR', options) {
|
|
10
|
+
super(message, options);
|
|
11
|
+
this.name = 'ParallelMergeError';
|
|
12
|
+
this.code = code;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.ParallelMergeError = ParallelMergeError;
|
|
16
|
+
//# sourceMappingURL=merge-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-errors.js","sourceRoot":"","sources":["../../src/parallel/merge-errors.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,MAAa,kBAAmB,SAAQ,KAAK;IAC3B,IAAI,CAAS;IAE7B,YAAY,OAAe,EAAE,IAAI,GAAG,sBAAsB,EAAE,OAA6B;QACvF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AARD,gDAQC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git helper operations used by parallel merge orchestration.
|
|
3
|
+
*/
|
|
4
|
+
export interface GitCommandOptions {
|
|
5
|
+
allowFailure?: boolean;
|
|
6
|
+
maxBuffer?: number;
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function runGitCommand(cwd: string, args: string[], options?: GitCommandOptions): string;
|
|
10
|
+
export declare function cleanTreeHasConflicts(projectPath: string): boolean;
|
|
11
|
+
export declare function hasUnmergedFiles(projectPath: string): boolean;
|
|
12
|
+
export declare function gitStatusLines(projectPath: string): string[];
|
|
13
|
+
export declare function hasCherryPickInProgress(projectPath: string): boolean;
|
|
14
|
+
export declare function getWorkstreamCommitList(projectPath: string, remote: string, workstreamBranch: string, mainBranch: string): string[];
|
|
15
|
+
export declare function getCommitPatch(projectPath: string, commitSha: string): string;
|
|
16
|
+
export declare function getCommitMessage(projectPath: string, commitSha: string): string;
|
|
17
|
+
export declare function getCommitShortSha(commitSha: string): string;
|
|
18
|
+
export declare function getConflictedFiles(projectPath: string): string[];
|
|
19
|
+
export declare function getCachedDiff(projectPath: string): string;
|
|
20
|
+
export declare function getCachedFiles(projectPath: string): string[];
|
|
21
|
+
export declare function isNonFatalFetchResult(output: string): boolean;
|
|
22
|
+
export declare function isMissingRemoteBranchFailure(output: string): boolean;
|
|
23
|
+
export declare function safeRunMergeCommand(projectPath: string, remote: string, branchName: string): void;
|
|
24
|
+
export declare function isNoPushError(output: string): boolean;
|
|
25
|
+
//# sourceMappingURL=merge-git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-git.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-git.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CA8BR;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAGlE;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAG5D;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAuBV;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAGhE;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAG5D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAO7D;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CASpE;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAajG;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGrD"}
|