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.
Files changed (81) hide show
  1. package/dist/commands/llm.d.ts.map +1 -1
  2. package/dist/commands/llm.js +4 -0
  3. package/dist/commands/llm.js.map +1 -1
  4. package/dist/commands/loop-phases.d.ts +1 -1
  5. package/dist/commands/loop-phases.d.ts.map +1 -1
  6. package/dist/commands/loop-phases.js +3 -3
  7. package/dist/commands/loop-phases.js.map +1 -1
  8. package/dist/commands/runners.js +4 -0
  9. package/dist/commands/runners.js.map +1 -1
  10. package/dist/commands/tasks.d.ts.map +1 -1
  11. package/dist/commands/tasks.js +86 -33
  12. package/dist/commands/tasks.js.map +1 -1
  13. package/dist/database/queries.d.ts +14 -0
  14. package/dist/database/queries.d.ts.map +1 -1
  15. package/dist/database/queries.js +46 -0
  16. package/dist/database/queries.js.map +1 -1
  17. package/dist/database/schema.d.ts +2 -2
  18. package/dist/database/schema.d.ts.map +1 -1
  19. package/dist/database/schema.js +30 -0
  20. package/dist/database/schema.js.map +1 -1
  21. package/dist/orchestrator/task-selector.d.ts +7 -2
  22. package/dist/orchestrator/task-selector.d.ts.map +1 -1
  23. package/dist/orchestrator/task-selector.js +91 -14
  24. package/dist/orchestrator/task-selector.js.map +1 -1
  25. package/dist/parallel/clone.d.ts +41 -0
  26. package/dist/parallel/clone.d.ts.map +1 -0
  27. package/dist/parallel/clone.js +176 -0
  28. package/dist/parallel/clone.js.map +1 -0
  29. package/dist/parallel/clone.test.d.ts +2 -0
  30. package/dist/parallel/clone.test.d.ts.map +1 -0
  31. package/dist/parallel/clone.test.js +252 -0
  32. package/dist/parallel/clone.test.js.map +1 -0
  33. package/dist/parallel/merge-conflict.d.ts +22 -0
  34. package/dist/parallel/merge-conflict.d.ts.map +1 -0
  35. package/dist/parallel/merge-conflict.js +227 -0
  36. package/dist/parallel/merge-conflict.js.map +1 -0
  37. package/dist/parallel/merge-errors.d.ts +10 -0
  38. package/dist/parallel/merge-errors.d.ts.map +1 -0
  39. package/dist/parallel/merge-errors.js +16 -0
  40. package/dist/parallel/merge-errors.js.map +1 -0
  41. package/dist/parallel/merge-git.d.ts +25 -0
  42. package/dist/parallel/merge-git.d.ts.map +1 -0
  43. package/dist/parallel/merge-git.js +134 -0
  44. package/dist/parallel/merge-git.js.map +1 -0
  45. package/dist/parallel/merge-lock.d.ts +26 -0
  46. package/dist/parallel/merge-lock.d.ts.map +1 -0
  47. package/dist/parallel/merge-lock.js +58 -0
  48. package/dist/parallel/merge-lock.js.map +1 -0
  49. package/dist/parallel/merge-progress.d.ts +20 -0
  50. package/dist/parallel/merge-progress.d.ts.map +1 -0
  51. package/dist/parallel/merge-progress.js +36 -0
  52. package/dist/parallel/merge-progress.js.map +1 -0
  53. package/dist/parallel/merge.d.ts +39 -0
  54. package/dist/parallel/merge.d.ts.map +1 -0
  55. package/dist/parallel/merge.js +231 -0
  56. package/dist/parallel/merge.js.map +1 -0
  57. package/dist/parallel/merge.test.d.ts +5 -0
  58. package/dist/parallel/merge.test.d.ts.map +1 -0
  59. package/dist/parallel/merge.test.js +322 -0
  60. package/dist/parallel/merge.test.js.map +1 -0
  61. package/dist/parallel/scheduler.d.ts +43 -0
  62. package/dist/parallel/scheduler.d.ts.map +1 -0
  63. package/dist/parallel/scheduler.js +281 -0
  64. package/dist/parallel/scheduler.js.map +1 -0
  65. package/dist/runners/daemon.d.ts +11 -1
  66. package/dist/runners/daemon.d.ts.map +1 -1
  67. package/dist/runners/daemon.js +18 -4
  68. package/dist/runners/daemon.js.map +1 -1
  69. package/dist/runners/global-db.d.ts.map +1 -1
  70. package/dist/runners/global-db.js +42 -1
  71. package/dist/runners/global-db.js.map +1 -1
  72. package/dist/runners/orchestrator-loop.d.ts +3 -0
  73. package/dist/runners/orchestrator-loop.d.ts.map +1 -1
  74. package/dist/runners/orchestrator-loop.js +19 -9
  75. package/dist/runners/orchestrator-loop.js.map +1 -1
  76. package/dist/runners/wakeup.d.ts.map +1 -1
  77. package/dist/runners/wakeup.js +2 -1
  78. package/dist/runners/wakeup.js.map +1 -1
  79. package/migrations/011_add_merge_locks_and_progress.sql +39 -0
  80. package/migrations/manifest.json +9 -1
  81. package/package.json +1 -1
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * Git helper operations used by parallel merge orchestration.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runGitCommand = runGitCommand;
7
+ exports.cleanTreeHasConflicts = cleanTreeHasConflicts;
8
+ exports.hasUnmergedFiles = hasUnmergedFiles;
9
+ exports.gitStatusLines = gitStatusLines;
10
+ exports.hasCherryPickInProgress = hasCherryPickInProgress;
11
+ exports.getWorkstreamCommitList = getWorkstreamCommitList;
12
+ exports.getCommitPatch = getCommitPatch;
13
+ exports.getCommitMessage = getCommitMessage;
14
+ exports.getCommitShortSha = getCommitShortSha;
15
+ exports.getConflictedFiles = getConflictedFiles;
16
+ exports.getCachedDiff = getCachedDiff;
17
+ exports.getCachedFiles = getCachedFiles;
18
+ exports.isNonFatalFetchResult = isNonFatalFetchResult;
19
+ exports.isMissingRemoteBranchFailure = isMissingRemoteBranchFailure;
20
+ exports.safeRunMergeCommand = safeRunMergeCommand;
21
+ exports.isNoPushError = isNoPushError;
22
+ const node_child_process_1 = require("node:child_process");
23
+ const node_fs_1 = require("node:fs");
24
+ const node_path_1 = require("node:path");
25
+ const merge_errors_js_1 = require("./merge-errors.js");
26
+ function runGitCommand(cwd, args, options = {}) {
27
+ const { allowFailure = false, timeoutMs = 120_000 } = options;
28
+ try {
29
+ return (0, node_child_process_1.execFileSync)('git', args, {
30
+ cwd,
31
+ encoding: 'utf-8',
32
+ stdio: ['pipe', 'pipe', 'pipe'],
33
+ timeout: timeoutMs,
34
+ maxBuffer: options.maxBuffer,
35
+ }).trim();
36
+ }
37
+ catch (error) {
38
+ if (allowFailure) {
39
+ if (error instanceof Error) {
40
+ const err = error;
41
+ return [err.stdout, err.stderr]
42
+ .map((value) => (typeof value === 'string' ? value : value?.toString()))
43
+ .filter(Boolean)
44
+ .join('\n')
45
+ .trim();
46
+ }
47
+ return '';
48
+ }
49
+ const err = error;
50
+ const stderr = err.stderr ? err.stderr.toString() : '';
51
+ const stdout = err.stdout ? err.stdout.toString() : '';
52
+ const details = [stderr, stdout].filter(Boolean).join('\n') || err.message || 'Unknown git error';
53
+ throw new merge_errors_js_1.ParallelMergeError(`Git command failed: git ${args.join(' ')}\n${details}`, 'GIT_ERROR');
54
+ }
55
+ }
56
+ function cleanTreeHasConflicts(projectPath) {
57
+ const status = runGitCommand(projectPath, ['status', '--porcelain']);
58
+ return status.split('\n').some((line) => line.startsWith('UU') || line.includes('U'));
59
+ }
60
+ function hasUnmergedFiles(projectPath) {
61
+ const unmerged = runGitCommand(projectPath, ['diff', '--name-only', '--diff-filter=U']);
62
+ return unmerged.trim().length > 0;
63
+ }
64
+ function gitStatusLines(projectPath) {
65
+ const status = runGitCommand(projectPath, ['status', '--porcelain']);
66
+ return status.split('\n').filter(Boolean);
67
+ }
68
+ function hasCherryPickInProgress(projectPath) {
69
+ return (0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectPath, '.git', 'CHERRY_PICK_HEAD'));
70
+ }
71
+ function getWorkstreamCommitList(projectPath, remote, workstreamBranch, mainBranch) {
72
+ const arg = `${mainBranch}..${remote}/${workstreamBranch}`;
73
+ const output = runGitCommand(projectPath, ['log', arg, '--format=%H', '--reverse'], { allowFailure: true });
74
+ if (/error:|fatal:|error /.test(output.toLowerCase()) && !isMissingRemoteBranchFailure(output)) {
75
+ throw new merge_errors_js_1.ParallelMergeError(`Failed to list commits from ${remote}/${workstreamBranch}: ${output}`, 'COMMIT_LIST_FAILED');
76
+ }
77
+ if (isMissingRemoteBranchFailure(output)) {
78
+ return [];
79
+ }
80
+ return output
81
+ .split('\n')
82
+ .map((line) => line.trim())
83
+ .filter(Boolean);
84
+ }
85
+ function getCommitPatch(projectPath, commitSha) {
86
+ return runGitCommand(projectPath, ['show', commitSha, '--']);
87
+ }
88
+ function getCommitMessage(projectPath, commitSha) {
89
+ return runGitCommand(projectPath, ['log', '-1', '--format=%s%n%b', commitSha]);
90
+ }
91
+ function getCommitShortSha(commitSha) {
92
+ return commitSha.length > 7 ? commitSha.slice(0, 7) : commitSha;
93
+ }
94
+ function getConflictedFiles(projectPath) {
95
+ const output = runGitCommand(projectPath, ['diff', '--name-only', '--diff-filter=U']);
96
+ return output.split('\n').filter(Boolean);
97
+ }
98
+ function getCachedDiff(projectPath) {
99
+ return runGitCommand(projectPath, ['diff', '--cached']);
100
+ }
101
+ function getCachedFiles(projectPath) {
102
+ const output = runGitCommand(projectPath, ['diff', '--cached', '--name-only']);
103
+ return output.split('\n').filter(Boolean);
104
+ }
105
+ function isNonFatalFetchResult(output) {
106
+ const lower = output.toLowerCase();
107
+ return (lower.includes('couldn\'t find remote ref') ||
108
+ lower.includes('does not exist') ||
109
+ lower.includes('fatal: remote ref does not exist'));
110
+ }
111
+ function isMissingRemoteBranchFailure(output) {
112
+ const lower = output.toLowerCase();
113
+ return (lower.includes('couldn\'t find remote ref') ||
114
+ (lower.includes('remote branch') && lower.includes('not found')) ||
115
+ lower.includes('unknown revision or path not in the working tree') ||
116
+ lower.includes('does not exist') ||
117
+ lower.includes('fatal: remote ref does not exist'));
118
+ }
119
+ function safeRunMergeCommand(projectPath, remote, branchName) {
120
+ const output = runGitCommand(projectPath, ['fetch', '--prune', remote, branchName], { allowFailure: true });
121
+ const lower = output.toLowerCase();
122
+ if (!/error:|fatal:/.test(lower)) {
123
+ return;
124
+ }
125
+ if (isNonFatalFetchResult(lower)) {
126
+ return;
127
+ }
128
+ throw new merge_errors_js_1.ParallelMergeError(`Failed to fetch ${branchName} from ${remote}: ${output}`, 'FETCH_FAILED');
129
+ }
130
+ function isNoPushError(output) {
131
+ const lower = output.toLowerCase();
132
+ return lower.includes('error:') || lower.includes('fatal:');
133
+ }
134
+ //# sourceMappingURL=merge-git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-git.js","sourceRoot":"","sources":["../../src/parallel/merge-git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Merge lock management for concurrent merge workers.
3
+ */
4
+ import type Database from 'better-sqlite3';
5
+ export interface MergeLockRecord {
6
+ id: number;
7
+ session_id: string;
8
+ runner_id: string;
9
+ acquired_at: string;
10
+ expires_at: string;
11
+ heartbeat_at: string;
12
+ }
13
+ export interface MergeLockOptions {
14
+ sessionId: string;
15
+ runnerId: string;
16
+ timeoutMinutes: number;
17
+ }
18
+ export declare function isLockExpired(lock: MergeLockRecord): boolean;
19
+ export declare function getLatestMergeLock(db: Database.Database, sessionId: string): MergeLockRecord | null;
20
+ export declare function acquireMergeLock(db: Database.Database, options: MergeLockOptions): {
21
+ acquired: boolean;
22
+ lock?: MergeLockRecord;
23
+ };
24
+ export declare function refreshMergeLock(db: Database.Database, sessionId: string, runnerId: string, timeoutMinutes: number): MergeLockRecord;
25
+ export declare function releaseMergeLock(db: Database.Database, sessionId: string, runnerId: string): void;
26
+ //# sourceMappingURL=merge-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-lock.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-lock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAUD,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAE5D;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CASnG;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,gBAAgB,GACxB;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,eAAe,CAAA;CAAE,CA6B/C;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACrB,eAAe,CAajB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEjG"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ /**
3
+ * Merge lock management for concurrent merge workers.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isLockExpired = isLockExpired;
7
+ exports.getLatestMergeLock = getLatestMergeLock;
8
+ exports.acquireMergeLock = acquireMergeLock;
9
+ exports.refreshMergeLock = refreshMergeLock;
10
+ exports.releaseMergeLock = releaseMergeLock;
11
+ const merge_errors_js_1 = require("./merge-errors.js");
12
+ function getNowISOString() {
13
+ return new Date().toISOString();
14
+ }
15
+ function utcExpiresAt(timeoutMinutes) {
16
+ return new Date(Date.now() + timeoutMinutes * 60_000).toISOString();
17
+ }
18
+ function isLockExpired(lock) {
19
+ return new Date(lock.expires_at).getTime() < Date.now();
20
+ }
21
+ function getLatestMergeLock(db, sessionId) {
22
+ return db
23
+ .prepare(`SELECT * FROM merge_locks
24
+ WHERE session_id = ?
25
+ ORDER BY acquired_at DESC
26
+ LIMIT 1`)
27
+ .get(sessionId);
28
+ }
29
+ function acquireMergeLock(db, options) {
30
+ const lock = getLatestMergeLock(db, options.sessionId);
31
+ if (lock && !isLockExpired(lock)) {
32
+ if (lock.runner_id === options.runnerId) {
33
+ const refreshed = refreshMergeLock(db, lock.session_id, options.runnerId, options.timeoutMinutes);
34
+ return { acquired: true, lock: refreshed };
35
+ }
36
+ return { acquired: false, lock };
37
+ }
38
+ db.prepare('DELETE FROM merge_locks WHERE session_id = ?').run(options.sessionId);
39
+ const inserted = db.prepare('INSERT INTO merge_locks (session_id, runner_id, acquired_at, expires_at, heartbeat_at) VALUES (?, ?, ?, ?, ?)').run(options.sessionId, options.runnerId, getNowISOString(), utcExpiresAt(options.timeoutMinutes), getNowISOString());
40
+ if (inserted.changes !== 1) {
41
+ return { acquired: false };
42
+ }
43
+ return { acquired: true, lock: getLatestMergeLock(db, options.sessionId) ?? undefined };
44
+ }
45
+ function refreshMergeLock(db, sessionId, runnerId, timeoutMinutes) {
46
+ db.prepare(`UPDATE merge_locks
47
+ SET heartbeat_at = ?, expires_at = ?
48
+ WHERE session_id = ? AND runner_id = ?`).run(getNowISOString(), utcExpiresAt(timeoutMinutes), sessionId, runnerId);
49
+ const lock = getLatestMergeLock(db, sessionId);
50
+ if (!lock) {
51
+ throw new merge_errors_js_1.ParallelMergeError('Lost merge lock unexpectedly', 'MERGE_LOCK_NOT_FOUND');
52
+ }
53
+ return lock;
54
+ }
55
+ function releaseMergeLock(db, sessionId, runnerId) {
56
+ db.prepare('DELETE FROM merge_locks WHERE session_id = ? AND runner_id = ?').run(sessionId, runnerId);
57
+ }
58
+ //# sourceMappingURL=merge-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-lock.js","sourceRoot":"","sources":["../../src/parallel/merge-lock.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA4BH,sCAEC;AAED,gDASC;AAED,4CAgCC;AAED,4CAkBC;AAED,4CAEC;AAhGD,uDAAuD;AAiBvD,SAAS,eAAe;IACtB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,cAAsB;IAC1C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;AACtE,CAAC;AAED,SAAgB,aAAa,CAAC,IAAqB;IACjD,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC1D,CAAC;AAED,SAAgB,kBAAkB,CAAC,EAAqB,EAAE,SAAiB;IACzE,OAAO,EAAE;SACN,OAAO,CACN;;;eAGS,CACV;SACA,GAAG,CAAC,SAAS,CAA2B,CAAC;AAC9C,CAAC;AAED,SAAgB,gBAAgB,CAC9B,EAAqB,EACrB,OAAyB;IAEzB,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAEvD,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;YAClG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7C,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAElF,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,+GAA+G,CAChH,CAAC,GAAG,CACH,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,QAAQ,EAChB,eAAe,EAAE,EACjB,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,EACpC,eAAe,EAAE,CAClB,CAAC;IAEF,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,EAAE,CAAC;AAC1F,CAAC;AAED,SAAgB,gBAAgB,CAC9B,EAAqB,EACrB,SAAiB,EACjB,QAAgB,EAChB,cAAsB;IAEtB,EAAE,CAAC,OAAO,CACR;;4CAEwC,CACzC,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE5E,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,oCAAkB,CAAC,8BAA8B,EAAE,sBAAsB,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,gBAAgB,CAAC,EAAqB,EAAE,SAAiB,EAAE,QAAgB;IACzF,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACxG,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Merge progress persistence for crash recovery.
3
+ */
4
+ import type Database from 'better-sqlite3';
5
+ export interface MergeProgressRow {
6
+ id: number;
7
+ session_id: string;
8
+ workstream_id: string;
9
+ position: number;
10
+ commit_sha: string;
11
+ status: 'applied' | 'conflict' | 'skipped';
12
+ conflict_task_id: string | null;
13
+ created_at: string;
14
+ applied_at: string | null;
15
+ }
16
+ export declare function listMergeProgress(db: Database.Database, sessionId: string): MergeProgressRow[];
17
+ export declare function clearProgressEntry(db: Database.Database, sessionId: string, workstreamId: string, position: number): void;
18
+ export declare function upsertProgressEntry(db: Database.Database, sessionId: string, workstreamId: string, position: number, commitSha: string, status: MergeProgressRow['status'], conflictTaskId?: string | null): void;
19
+ export declare function getMergeProgressForWorkstream(rows: MergeProgressRow[], workstreamId: string): MergeProgressRow[];
20
+ //# sourceMappingURL=merge-progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-progress.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAMD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAS9F;AAED,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,IAAI,CAIN;AAED,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAClC,cAAc,GAAE,MAAM,GAAG,IAAW,GACnC,IAAI,CASN;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,gBAAgB,EAAE,EACxB,YAAY,EAAE,MAAM,GACnB,gBAAgB,EAAE,CAIpB"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * Merge progress persistence for crash recovery.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.listMergeProgress = listMergeProgress;
7
+ exports.clearProgressEntry = clearProgressEntry;
8
+ exports.upsertProgressEntry = upsertProgressEntry;
9
+ exports.getMergeProgressForWorkstream = getMergeProgressForWorkstream;
10
+ function getNowISOString() {
11
+ return new Date().toISOString();
12
+ }
13
+ function listMergeProgress(db, sessionId) {
14
+ return db
15
+ .prepare(`SELECT id, session_id, workstream_id, position, commit_sha, status, conflict_task_id, created_at, applied_at
16
+ FROM merge_progress
17
+ WHERE session_id = ?
18
+ ORDER BY workstream_id, position ASC`)
19
+ .all(sessionId);
20
+ }
21
+ function clearProgressEntry(db, sessionId, workstreamId, position) {
22
+ db.prepare('DELETE FROM merge_progress WHERE session_id = ? AND workstream_id = ? AND position = ?').run(sessionId, workstreamId, position);
23
+ }
24
+ function upsertProgressEntry(db, sessionId, workstreamId, position, commitSha, status, conflictTaskId = null) {
25
+ const payloadApplied = status === 'applied' ? getNowISOString() : null;
26
+ clearProgressEntry(db, sessionId, workstreamId, position);
27
+ db.prepare(`INSERT INTO merge_progress
28
+ (session_id, workstream_id, position, commit_sha, status, conflict_task_id, applied_at)
29
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(sessionId, workstreamId, position, commitSha, status, conflictTaskId, payloadApplied);
30
+ }
31
+ function getMergeProgressForWorkstream(rows, workstreamId) {
32
+ return rows
33
+ .filter((row) => row.workstream_id === workstreamId)
34
+ .sort((left, right) => left.position - right.position);
35
+ }
36
+ //# sourceMappingURL=merge-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-progress.js","sourceRoot":"","sources":["../../src/parallel/merge-progress.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,8CASC;AAED,gDASC;AAED,kDAiBC;AAED,sEAOC;AApDD,SAAS,eAAe;IACtB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAgB,iBAAiB,CAAC,EAAqB,EAAE,SAAiB;IACxE,OAAO,EAAE;SACN,OAAO,CACN;;;4CAGsC,CACvC;SACA,GAAG,CAAC,SAAS,CAAuB,CAAC;AAC1C,CAAC;AAED,SAAgB,kBAAkB,CAChC,EAAqB,EACrB,SAAiB,EACjB,YAAoB,EACpB,QAAgB;IAEhB,EAAE,CAAC,OAAO,CACR,wFAAwF,CACzF,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED,SAAgB,mBAAmB,CACjC,EAAqB,EACrB,SAAiB,EACjB,YAAoB,EACpB,QAAgB,EAChB,SAAiB,EACjB,MAAkC,EAClC,iBAAgC,IAAI;IAEpC,MAAM,cAAc,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvE,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC1D,EAAE,CAAC,OAAO,CACR;;kCAE8B,CAC/B,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AAC9F,CAAC;AAED,SAAgB,6BAA6B,CAC3C,IAAwB,EACxB,YAAoB;IAEpB,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,KAAK,YAAY,CAAC;SACnD,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Parallel merge orchestration
3
+ * Cherry-picks completed workstream branches into main with crash-safe progress tracking.
4
+ */
5
+ import { MergeLockRecord } from './merge-lock.js';
6
+ import { ParallelMergeError } from './merge-errors.js';
7
+ export interface MergeWorkstreamSpec {
8
+ id: string;
9
+ branchName: string;
10
+ }
11
+ export interface MergeOptions {
12
+ projectPath: string;
13
+ sessionId: string;
14
+ runnerId: string;
15
+ workstreams: MergeWorkstreamSpec[];
16
+ remote?: string;
17
+ mainBranch?: string;
18
+ lockTimeoutMinutes?: number;
19
+ heartbeatIntervalMs?: number;
20
+ remoteWorkspaceRoot?: string;
21
+ cleanupOnSuccess?: boolean;
22
+ }
23
+ export interface MergeResult {
24
+ success: boolean;
25
+ completedCommits: number;
26
+ conflicts: number;
27
+ skipped: number;
28
+ errors: string[];
29
+ }
30
+ declare function getNowISOString(): string;
31
+ declare function cleanupWorkspaceState(projectPath: string, workspaceRoot: string, workstreamIds: string[], options: {
32
+ cleanupOnSuccess: boolean;
33
+ }): void;
34
+ /**
35
+ * Run cherry-pick merge loop across completed workstreams.
36
+ */
37
+ export declare function runParallelMerge(options: MergeOptions): Promise<MergeResult>;
38
+ export { MergeLockRecord, ParallelMergeError, getNowISOString, cleanupWorkspaceState, };
39
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/parallel/merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,EACL,eAAe,EAIhB,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,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;CAC5B;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;CAClB;AAOD,iBAAS,eAAe,IAAI,MAAM,CAEjC;AAcD,iBAAS,qBAAqB,CAC5B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,gBAAgB,EAAE,OAAO,CAAA;CAAE,GACrC,IAAI,CAqBN;AAqGD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA+HlF;AAED,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,qBAAqB,GACtB,CAAC"}
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ /**
3
+ * Parallel merge orchestration
4
+ * Cherry-picks completed workstream branches into main with crash-safe progress tracking.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ParallelMergeError = void 0;
8
+ exports.runParallelMerge = runParallelMerge;
9
+ exports.getNowISOString = getNowISOString;
10
+ exports.cleanupWorkspaceState = cleanupWorkspaceState;
11
+ const node_path_1 = require("node:path");
12
+ const node_fs_1 = require("node:fs");
13
+ const clone_js_1 = require("./clone.js");
14
+ const clone_js_2 = require("./clone.js");
15
+ const connection_js_1 = require("../database/connection.js");
16
+ const merge_git_js_1 = require("./merge-git.js");
17
+ const merge_lock_js_1 = require("./merge-lock.js");
18
+ const merge_progress_js_1 = require("./merge-progress.js");
19
+ const merge_conflict_js_1 = require("./merge-conflict.js");
20
+ const merge_errors_js_1 = require("./merge-errors.js");
21
+ Object.defineProperty(exports, "ParallelMergeError", { enumerable: true, get: function () { return merge_errors_js_1.ParallelMergeError; } });
22
+ const DEFAULT_REMOTE = 'origin';
23
+ const DEFAULT_MAIN_BRANCH = 'main';
24
+ const DEFAULT_LOCK_TIMEOUT_MINUTES = 120;
25
+ const DEFAULT_HEARTBEAT_INTERVAL_MS = 30_000;
26
+ function getNowISOString() {
27
+ return new Date().toISOString();
28
+ }
29
+ function ensureMergeWorkingTree(projectPath) {
30
+ const lines = (0, merge_git_js_1.gitStatusLines)(projectPath);
31
+ if (lines.length === 0)
32
+ return;
33
+ if (!(0, merge_git_js_1.hasCherryPickInProgress)(projectPath)) {
34
+ throw new merge_errors_js_1.ParallelMergeError('Working tree is dirty. Commit or stash changes before merging.', 'DIRTY_WORKTREE');
35
+ }
36
+ }
37
+ function cleanupWorkspaceState(projectPath, workspaceRoot, workstreamIds, options) {
38
+ if (!options.cleanupOnSuccess)
39
+ return;
40
+ const baseRoot = (0, node_path_1.resolve)(workspaceRoot);
41
+ const hash = (0, clone_js_2.getProjectHash)(projectPath);
42
+ const projectWorkspaceRoot = (0, node_path_1.resolve)(baseRoot, hash);
43
+ if (!projectWorkspaceRoot.startsWith(baseRoot)) {
44
+ return;
45
+ }
46
+ for (const workstreamId of workstreamIds) {
47
+ const folder = (0, node_path_1.resolve)(projectWorkspaceRoot, workstreamId.startsWith('ws-') ? workstreamId : `ws-${workstreamId}`);
48
+ if ((0, node_path_1.resolve)(folder).startsWith(projectWorkspaceRoot)) {
49
+ (0, node_fs_1.rmSync)(folder, { recursive: true, force: true });
50
+ }
51
+ }
52
+ }
53
+ async function processWorkstream(db, projectPath, sessionId, workstream, mainBranch, remote, progressRows, heartbeat) {
54
+ const summary = { applied: 0, skipped: 0, conflicts: 0 };
55
+ const commits = (0, merge_git_js_1.getWorkstreamCommitList)(projectPath, remote, workstream.branchName, mainBranch);
56
+ if (commits.length === 0) {
57
+ return summary;
58
+ }
59
+ const workstreamProgress = (0, merge_progress_js_1.getMergeProgressForWorkstream)(progressRows, workstream.id);
60
+ const workstreamLookup = new Map();
61
+ for (const row of workstreamProgress) {
62
+ workstreamLookup.set(row.position, row);
63
+ }
64
+ for (let position = 0; position < commits.length; position += 1) {
65
+ const commitSha = commits[position];
66
+ const shortSha = (0, merge_git_js_1.getCommitShortSha)(commitSha);
67
+ const prior = workstreamLookup.get(position);
68
+ if (prior?.status === 'applied' && prior.commit_sha === commitSha) {
69
+ summary.applied += 1;
70
+ continue;
71
+ }
72
+ if (prior?.status === 'skipped' && prior.commit_sha === commitSha) {
73
+ summary.skipped += 1;
74
+ continue;
75
+ }
76
+ if (prior?.status === 'conflict' && prior.commit_sha === commitSha) {
77
+ if ((0, merge_git_js_1.hasCherryPickInProgress)(projectPath)) {
78
+ const outcome = await (0, merge_conflict_js_1.runConflictResolutionCycle)({
79
+ db,
80
+ projectPath,
81
+ sessionId,
82
+ workstreamId: workstream.id,
83
+ branchName: workstream.branchName,
84
+ position,
85
+ commitSha,
86
+ existingTaskId: prior.conflict_task_id ?? undefined,
87
+ });
88
+ if (outcome === 'skipped')
89
+ summary.skipped += 1;
90
+ else
91
+ summary.applied += 1;
92
+ summary.conflicts += 1;
93
+ continue;
94
+ }
95
+ (0, merge_progress_js_1.clearProgressEntry)(db, sessionId, workstream.id, position);
96
+ }
97
+ if (prior && prior.commit_sha !== commitSha) {
98
+ (0, merge_progress_js_1.clearProgressEntry)(db, sessionId, workstream.id, position);
99
+ }
100
+ try {
101
+ (0, merge_git_js_1.runGitCommand)(projectPath, ['cherry-pick', commitSha]);
102
+ (0, merge_progress_js_1.upsertProgressEntry)(db, sessionId, workstream.id, position, commitSha, 'applied');
103
+ summary.applied += 1;
104
+ }
105
+ catch (error) {
106
+ const message = error instanceof Error ? error.message : String(error);
107
+ if (!/CONFLICT|merge conflict|could not apply|needs merge/i.test(message)) {
108
+ throw error;
109
+ }
110
+ const outcome = await (0, merge_conflict_js_1.runConflictResolutionCycle)({
111
+ db,
112
+ projectPath,
113
+ sessionId,
114
+ workstreamId: workstream.id,
115
+ branchName: workstream.branchName,
116
+ position,
117
+ commitSha,
118
+ });
119
+ if (outcome === 'skipped') {
120
+ summary.skipped += 1;
121
+ }
122
+ else {
123
+ summary.applied += 1;
124
+ }
125
+ summary.conflicts += 1;
126
+ }
127
+ (0, merge_lock_js_1.refreshMergeLock)(db, heartbeat.sessionId, heartbeat.runnerId, heartbeat.timeoutMinutes);
128
+ }
129
+ return summary;
130
+ }
131
+ /**
132
+ * Run cherry-pick merge loop across completed workstreams.
133
+ */
134
+ async function runParallelMerge(options) {
135
+ const projectPath = (0, node_path_1.resolve)(options.projectPath);
136
+ const sessionId = options.sessionId;
137
+ const runnerId = options.runnerId;
138
+ const workstreams = options.workstreams;
139
+ const remote = options.remote ?? DEFAULT_REMOTE;
140
+ const mainBranch = options.mainBranch ?? DEFAULT_MAIN_BRANCH;
141
+ const lockTimeoutMinutes = options.lockTimeoutMinutes ?? DEFAULT_LOCK_TIMEOUT_MINUTES;
142
+ const heartbeatIntervalMs = options.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS;
143
+ const workspaceRoot = options.remoteWorkspaceRoot ?? (0, clone_js_1.getDefaultWorkspaceRoot)();
144
+ const cleanupOnSuccess = options.cleanupOnSuccess ?? true;
145
+ const { db, close } = (0, connection_js_1.openDatabase)(projectPath);
146
+ const summary = {
147
+ success: false,
148
+ completedCommits: 0,
149
+ conflicts: 0,
150
+ skipped: 0,
151
+ errors: [],
152
+ };
153
+ let heartbeatTimer = null;
154
+ try {
155
+ const lock = (0, merge_lock_js_1.acquireMergeLock)(db, {
156
+ sessionId,
157
+ runnerId,
158
+ timeoutMinutes: lockTimeoutMinutes,
159
+ });
160
+ if (!lock.acquired) {
161
+ summary.errors.push(`Could not acquire merge lock (held by ${lock.lock?.runner_id ?? 'another process'})`);
162
+ return summary;
163
+ }
164
+ const recoveringFromCherryPick = (0, merge_git_js_1.hasCherryPickInProgress)(projectPath);
165
+ heartbeatTimer = setInterval(() => {
166
+ try {
167
+ (0, merge_lock_js_1.refreshMergeLock)(db, sessionId, runnerId, lockTimeoutMinutes);
168
+ }
169
+ catch {
170
+ // If heartbeat fails, merge keeps running until lock-dependent operations fail.
171
+ }
172
+ }, heartbeatIntervalMs);
173
+ ensureMergeWorkingTree(projectPath);
174
+ for (const stream of workstreams) {
175
+ (0, merge_git_js_1.safeRunMergeCommand)(projectPath, remote, stream.branchName);
176
+ }
177
+ if (!recoveringFromCherryPick) {
178
+ const pullOutput = (0, merge_git_js_1.runGitCommand)(projectPath, ['pull', '--ff-only', remote, mainBranch], { allowFailure: true });
179
+ const pullOutputLower = pullOutput.toLowerCase();
180
+ if (pullOutputLower.includes('fatal:') || pullOutputLower.includes('error:') || pullOutputLower.includes('error ')) {
181
+ if (pullOutputLower.includes('could not apply') ||
182
+ pullOutputLower.includes('not possible to fast-forward')) {
183
+ throw new merge_errors_js_1.ParallelMergeError('main is behind; local commits detected. Run "git pull --rebase" before merge.', 'NON_FAST_FORWARD');
184
+ }
185
+ throw new merge_errors_js_1.ParallelMergeError(`Failed to refresh main from ${remote}/${mainBranch}: ${pullOutput}`, 'PULL_FAILED');
186
+ }
187
+ }
188
+ const progressRows = (0, merge_progress_js_1.listMergeProgress)(db, sessionId);
189
+ for (const workstream of workstreams) {
190
+ const stats = await processWorkstream(db, projectPath, sessionId, workstream, mainBranch, remote, progressRows, { sessionId, runnerId, timeoutMinutes: lockTimeoutMinutes });
191
+ summary.completedCommits += stats.applied;
192
+ summary.skipped += stats.skipped;
193
+ summary.conflicts += stats.conflicts;
194
+ }
195
+ const pushResult = (0, merge_git_js_1.runGitCommand)(projectPath, ['push', remote, mainBranch], { allowFailure: true });
196
+ if ((0, merge_git_js_1.isNoPushError)(pushResult)) {
197
+ summary.errors.push('Push to main failed.');
198
+ throw new merge_errors_js_1.ParallelMergeError(pushResult, 'PUSH_FAILED');
199
+ }
200
+ for (const stream of workstreams) {
201
+ try {
202
+ (0, merge_git_js_1.runGitCommand)(projectPath, ['push', remote, '--delete', stream.branchName]);
203
+ }
204
+ catch {
205
+ // Ignore branch delete failures; branch may already be deleted.
206
+ }
207
+ }
208
+ (0, merge_git_js_1.runGitCommand)(projectPath, ['remote', 'prune', remote]);
209
+ cleanupWorkspaceState(projectPath, workspaceRoot, workstreams.map((stream) => stream.id), {
210
+ cleanupOnSuccess,
211
+ });
212
+ summary.success = true;
213
+ return summary;
214
+ }
215
+ catch (error) {
216
+ const message = error instanceof Error ? error.message : String(error);
217
+ if (!summary.errors.includes(message)) {
218
+ summary.errors.push(message);
219
+ }
220
+ return summary;
221
+ }
222
+ finally {
223
+ if (heartbeatTimer) {
224
+ clearInterval(heartbeatTimer);
225
+ heartbeatTimer = null;
226
+ }
227
+ (0, merge_lock_js_1.releaseMergeLock)(db, sessionId, runnerId);
228
+ close();
229
+ }
230
+ }
231
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/parallel/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for parallel merge orchestration and conflict recovery.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=merge.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.test.d.ts","sourceRoot":"","sources":["../../src/parallel/merge.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}