@promptwheel/core 0.7.22 → 0.7.34

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 (91) hide show
  1. package/dist/codebase-index/ast-analysis.d.ts +33 -2
  2. package/dist/codebase-index/ast-analysis.d.ts.map +1 -1
  3. package/dist/codebase-index/ast-analysis.js +457 -2
  4. package/dist/codebase-index/ast-analysis.js.map +1 -1
  5. package/dist/codebase-index/ast-cache.d.ts +9 -1
  6. package/dist/codebase-index/ast-cache.d.ts.map +1 -1
  7. package/dist/codebase-index/ast-cache.js.map +1 -1
  8. package/dist/codebase-index/ast-patterns.d.ts +24 -4
  9. package/dist/codebase-index/ast-patterns.d.ts.map +1 -1
  10. package/dist/codebase-index/ast-patterns.js +274 -10
  11. package/dist/codebase-index/ast-patterns.js.map +1 -1
  12. package/dist/codebase-index/dead-code.d.ts +37 -4
  13. package/dist/codebase-index/dead-code.d.ts.map +1 -1
  14. package/dist/codebase-index/dead-code.js +152 -17
  15. package/dist/codebase-index/dead-code.js.map +1 -1
  16. package/dist/codebase-index/index.d.ts +4 -2
  17. package/dist/codebase-index/index.d.ts.map +1 -1
  18. package/dist/codebase-index/index.js +129 -14
  19. package/dist/codebase-index/index.js.map +1 -1
  20. package/dist/codebase-index/shared.d.ts +31 -0
  21. package/dist/codebase-index/shared.d.ts.map +1 -1
  22. package/dist/codebase-index/shared.js +50 -0
  23. package/dist/codebase-index/shared.js.map +1 -1
  24. package/dist/dedup/shared.d.ts +14 -0
  25. package/dist/dedup/shared.d.ts.map +1 -1
  26. package/dist/dedup/shared.js +40 -0
  27. package/dist/dedup/shared.js.map +1 -1
  28. package/dist/learnings/shared.d.ts +1 -1
  29. package/dist/learnings/shared.d.ts.map +1 -1
  30. package/dist/learnings/shared.js.map +1 -1
  31. package/dist/proposals/blueprint.d.ts +68 -0
  32. package/dist/proposals/blueprint.d.ts.map +1 -0
  33. package/dist/proposals/blueprint.js +292 -0
  34. package/dist/proposals/blueprint.js.map +1 -0
  35. package/dist/proposals/shared.d.ts +30 -2
  36. package/dist/proposals/shared.d.ts.map +1 -1
  37. package/dist/proposals/shared.js +58 -11
  38. package/dist/proposals/shared.js.map +1 -1
  39. package/dist/proposals/step-classifier.d.ts +32 -0
  40. package/dist/proposals/step-classifier.d.ts.map +1 -0
  41. package/dist/proposals/step-classifier.js +49 -0
  42. package/dist/proposals/step-classifier.js.map +1 -0
  43. package/dist/proposals/trajectory-critic.d.ts +35 -0
  44. package/dist/proposals/trajectory-critic.d.ts.map +1 -0
  45. package/dist/proposals/trajectory-critic.js +211 -0
  46. package/dist/proposals/trajectory-critic.js.map +1 -0
  47. package/dist/repos/tickets.d.ts +2 -0
  48. package/dist/repos/tickets.d.ts.map +1 -1
  49. package/dist/repos/tickets.js.map +1 -1
  50. package/dist/scout/index.d.ts.map +1 -1
  51. package/dist/scout/index.js +10 -1
  52. package/dist/scout/index.js.map +1 -1
  53. package/dist/scout/prompt.d.ts.map +1 -1
  54. package/dist/scout/prompt.js +7 -1
  55. package/dist/scout/prompt.js.map +1 -1
  56. package/dist/scout/runner.d.ts.map +1 -1
  57. package/dist/scout/runner.js +1 -0
  58. package/dist/scout/runner.js.map +1 -1
  59. package/dist/scout/types.d.ts +20 -1
  60. package/dist/scout/types.d.ts.map +1 -1
  61. package/dist/scout/types.js +4 -2
  62. package/dist/scout/types.js.map +1 -1
  63. package/dist/sectors/shared.d.ts +17 -0
  64. package/dist/sectors/shared.d.ts.map +1 -1
  65. package/dist/sectors/shared.js +65 -0
  66. package/dist/sectors/shared.js.map +1 -1
  67. package/dist/services/scout.d.ts +2 -0
  68. package/dist/services/scout.d.ts.map +1 -1
  69. package/dist/services/scout.js +1 -0
  70. package/dist/services/scout.js.map +1 -1
  71. package/dist/trajectory/io.d.ts +32 -0
  72. package/dist/trajectory/io.d.ts.map +1 -0
  73. package/dist/trajectory/io.js +201 -0
  74. package/dist/trajectory/io.js.map +1 -0
  75. package/dist/trajectory/shared.d.ts +50 -0
  76. package/dist/trajectory/shared.d.ts.map +1 -1
  77. package/dist/trajectory/shared.js +178 -0
  78. package/dist/trajectory/shared.js.map +1 -1
  79. package/dist/waves/conflict.d.ts +130 -0
  80. package/dist/waves/conflict.d.ts.map +1 -0
  81. package/dist/waves/conflict.js +400 -0
  82. package/dist/waves/conflict.js.map +1 -0
  83. package/dist/waves/merge.d.ts +75 -0
  84. package/dist/waves/merge.d.ts.map +1 -0
  85. package/dist/waves/merge.js +305 -0
  86. package/dist/waves/merge.js.map +1 -0
  87. package/dist/waves/shared.d.ts +6 -102
  88. package/dist/waves/shared.d.ts.map +1 -1
  89. package/dist/waves/shared.js +16 -346
  90. package/dist/waves/shared.js.map +1 -1
  91. package/package.json +17 -1
@@ -0,0 +1,400 @@
1
+ /**
2
+ * Conflict detection — pure functions that determine whether two proposals
3
+ * can safely execute in parallel or risk merge conflicts.
4
+ *
5
+ * Checks file path overlap, sibling files, directory proximity, import chains,
6
+ * call-graph edges, and monorepo package boundaries.
7
+ *
8
+ * No filesystem, git, or child_process I/O.
9
+ */
10
+ // ---------------------------------------------------------------------------
11
+ // Constants
12
+ // ---------------------------------------------------------------------------
13
+ /**
14
+ * Files that frequently cause merge conflicts when multiple tickets
15
+ * touch the same directory. These are "hub" files that re-export or
16
+ * aggregate content from sibling files.
17
+ */
18
+ export const CONFLICT_PRONE_FILENAMES = new Set([
19
+ 'index.ts',
20
+ 'index.tsx',
21
+ 'index.js',
22
+ 'index.jsx',
23
+ 'index.mjs',
24
+ 'index.cjs',
25
+ 'mod.ts', // Deno convention
26
+ 'mod.js',
27
+ 'package.json',
28
+ 'tsconfig.json',
29
+ 'vite.config.ts',
30
+ 'vitest.config.ts',
31
+ 'jest.config.js',
32
+ 'jest.config.ts',
33
+ '.eslintrc.js',
34
+ '.eslintrc.json',
35
+ 'eslint.config.js',
36
+ 'eslint.config.mjs',
37
+ '__init__.py', // Python
38
+ 'Cargo.toml', // Rust
39
+ 'go.mod', // Go
40
+ 'build.gradle', // Java/Kotlin
41
+ 'pom.xml', // Maven
42
+ 'Gemfile', // Ruby
43
+ 'mix.exs', // Elixir
44
+ 'Package.swift', // Swift
45
+ 'pubspec.yaml', // Dart/Flutter
46
+ 'build.sbt', // Scala
47
+ 'stack.yaml', // Haskell
48
+ 'build.zig', // Zig
49
+ 'CMakeLists.txt', // C/C++
50
+ ]);
51
+ /**
52
+ * Directory patterns that indicate shared/common code.
53
+ * Files in these directories are more likely to be touched by multiple tickets.
54
+ */
55
+ export const SHARED_DIRECTORY_PATTERNS = [
56
+ /\/shared\//,
57
+ /\/common\//,
58
+ /\/utils\//,
59
+ /\/helpers\//,
60
+ /\/lib\//,
61
+ /\/types\//,
62
+ /\/interfaces\//,
63
+ /\/constants\//,
64
+ /\/config\//,
65
+ ];
66
+ /** Monorepo top-level directory patterns. */
67
+ export const PACKAGE_PATTERN = /^(packages|apps|libs|modules)\/([^/]+)/;
68
+ /** Default directory overlap threshold for normal mode. */
69
+ export const DIRECTORY_OVERLAP_NORMAL = 0.3;
70
+ /** Default directory overlap threshold for strict mode. */
71
+ export const DIRECTORY_OVERLAP_STRICT = 0.2;
72
+ // ---------------------------------------------------------------------------
73
+ // Path helpers
74
+ // ---------------------------------------------------------------------------
75
+ /** Extract the directory and filename from a path. */
76
+ export function parsePath(filePath) {
77
+ const normalized = filePath.replace(/^\.\//, '').replace(/\/$/, '');
78
+ const lastSlash = normalized.lastIndexOf('/');
79
+ if (lastSlash === -1) {
80
+ return { dir: '.', filename: normalized };
81
+ }
82
+ return {
83
+ dir: normalized.slice(0, lastSlash),
84
+ filename: normalized.slice(lastSlash + 1),
85
+ };
86
+ }
87
+ /**
88
+ * Check if two file paths overlap: exact match, directory containment,
89
+ * or glob pattern overlap.
90
+ */
91
+ export function pathsOverlap(pathA, pathB) {
92
+ // Normalize paths (remove trailing slashes, handle ./prefix)
93
+ const normA = pathA.replace(/^\.\//, '').replace(/\/$/, '');
94
+ const normB = pathB.replace(/^\.\//, '').replace(/\/$/, '');
95
+ // Exact match
96
+ if (normA === normB) {
97
+ return true;
98
+ }
99
+ // One is prefix of other (directory containment)
100
+ if (normA.startsWith(normB + '/') || normB.startsWith(normA + '/')) {
101
+ return true;
102
+ }
103
+ // Check for glob pattern overlaps
104
+ const hasGlobA = normA.includes('*');
105
+ const hasGlobB = normB.includes('*');
106
+ if (hasGlobA || hasGlobB) {
107
+ const baseA = normA.split('*')[0].replace(/\/$/, '');
108
+ const baseB = normB.split('*')[0].replace(/\/$/, '');
109
+ if (baseA === baseB || baseA.startsWith(baseB + '/') || baseB.startsWith(baseA + '/')) {
110
+ return true;
111
+ }
112
+ }
113
+ return false;
114
+ }
115
+ /**
116
+ * Check if two sets of file paths share directories above a threshold.
117
+ * Used for semantic conflict detection in wave scheduling.
118
+ */
119
+ export function directoriesOverlap(pathsA, pathsB, threshold = 0.3) {
120
+ const dirsA = new Set(pathsA.map(p => parsePath(p).dir));
121
+ const dirsB = new Set(pathsB.map(p => parsePath(p).dir));
122
+ if (dirsA.size === 0 || dirsB.size === 0)
123
+ return false;
124
+ let n = 0;
125
+ for (const d of dirsA) {
126
+ if (dirsB.has(d))
127
+ n++;
128
+ }
129
+ return (n / Math.min(dirsA.size, dirsB.size)) >= threshold;
130
+ }
131
+ // ---------------------------------------------------------------------------
132
+ // Conflict detection helpers
133
+ // ---------------------------------------------------------------------------
134
+ /** Check if a file is conflict-prone (index files, configs, etc.) */
135
+ export function isConflictProneFile(filePath) {
136
+ const { filename } = parsePath(filePath);
137
+ return CONFLICT_PRONE_FILENAMES.has(filename);
138
+ }
139
+ /** Check if a path is in a shared/common directory. */
140
+ export function isInSharedDirectory(filePath) {
141
+ return SHARED_DIRECTORY_PATTERNS.some(pattern => pattern.test(filePath));
142
+ }
143
+ /** Get all unique directories from a list of file paths, including parent hierarchy. */
144
+ export function getDirectories(files) {
145
+ const dirs = new Set();
146
+ for (const file of files) {
147
+ const { dir } = parsePath(file);
148
+ dirs.add(dir);
149
+ // Also add parent directories for hierarchical conflict detection
150
+ const parts = dir.split('/');
151
+ for (let i = 1; i < parts.length; i++) {
152
+ dirs.add(parts.slice(0, i).join('/'));
153
+ }
154
+ }
155
+ return dirs;
156
+ }
157
+ /**
158
+ * Check if two proposals have sibling files (different files in the same directory).
159
+ */
160
+ export function hasSiblingFiles(filesA, filesB) {
161
+ const dirsA = new Set(filesA.map(f => parsePath(f).dir));
162
+ const dirsB = new Set(filesB.map(f => parsePath(f).dir));
163
+ for (const dir of dirsA) {
164
+ if (dirsB.has(dir)) {
165
+ return true;
166
+ }
167
+ }
168
+ return false;
169
+ }
170
+ /**
171
+ * Check if either proposal touches conflict-prone files in overlapping directories.
172
+ */
173
+ export function hasConflictProneOverlap(filesA, filesB) {
174
+ const dirsA = new Set(filesA.map(f => parsePath(f).dir));
175
+ const dirsB = new Set(filesB.map(f => parsePath(f).dir));
176
+ for (const file of [...filesA, ...filesB]) {
177
+ if (isConflictProneFile(file)) {
178
+ const { dir } = parsePath(file);
179
+ if (dirsA.has(dir) && dirsB.has(dir)) {
180
+ return true;
181
+ }
182
+ }
183
+ }
184
+ return false;
185
+ }
186
+ /**
187
+ * Check if proposals share a common parent directory that might have
188
+ * configuration or index files affected by both changes.
189
+ */
190
+ export function hasSharedParentConflict(filesA, filesB) {
191
+ const dirsA = getDirectories(filesA);
192
+ const dirsB = getDirectories(filesB);
193
+ for (const dir of dirsA) {
194
+ if (dirsB.has(dir) && isInSharedDirectory(dir + '/')) {
195
+ return true;
196
+ }
197
+ }
198
+ return false;
199
+ }
200
+ /**
201
+ * Monorepo-aware: check if both proposals touch the same package.
202
+ * Common patterns: packages/*, apps/*, libs/*, modules/*
203
+ */
204
+ export function touchesSamePackage(filesA, filesB) {
205
+ const packagesA = new Set();
206
+ const packagesB = new Set();
207
+ for (const file of filesA) {
208
+ const match = file.match(PACKAGE_PATTERN);
209
+ if (match)
210
+ packagesA.add(match[0]);
211
+ }
212
+ for (const file of filesB) {
213
+ const match = file.match(PACKAGE_PATTERN);
214
+ if (match)
215
+ packagesB.add(match[0]);
216
+ }
217
+ for (const pkg of packagesA) {
218
+ if (packagesB.has(pkg))
219
+ return true;
220
+ }
221
+ return false;
222
+ }
223
+ // ---------------------------------------------------------------------------
224
+ // Main conflict detection
225
+ // ---------------------------------------------------------------------------
226
+ /**
227
+ * Resolve files to their containing module path in the dependency graph.
228
+ * A file `src/core/index.ts` matches module `src/core` if that key exists in edges.
229
+ */
230
+ function resolveModules(files, edges) {
231
+ const mods = new Set();
232
+ for (const f of files) {
233
+ const parts = f.split('/');
234
+ for (let i = parts.length - 1; i >= 1; i--) {
235
+ const candidate = parts.slice(0, i).join('/');
236
+ if (candidate in edges) {
237
+ mods.add(candidate);
238
+ break; // most-specific match
239
+ }
240
+ }
241
+ }
242
+ return mods;
243
+ }
244
+ /**
245
+ * Check if two sets of modules are connected by a direct import edge.
246
+ * Returns true if any module in A imports any module in B, or vice versa.
247
+ */
248
+ export function hasImportChainConflict(filesA, filesB, edges) {
249
+ const modsA = resolveModules(filesA, edges);
250
+ const modsB = resolveModules(filesB, edges);
251
+ if (modsA.size === 0 || modsB.size === 0)
252
+ return false;
253
+ // Check: does any module in A import any module in B?
254
+ for (const modA of modsA) {
255
+ const deps = edges[modA];
256
+ if (deps) {
257
+ for (const dep of deps) {
258
+ if (modsB.has(dep))
259
+ return true;
260
+ }
261
+ }
262
+ }
263
+ // Check reverse: does any module in B import any module in A?
264
+ for (const modB of modsB) {
265
+ const deps = edges[modB];
266
+ if (deps) {
267
+ for (const dep of deps) {
268
+ if (modsA.has(dep))
269
+ return true;
270
+ }
271
+ }
272
+ }
273
+ return false;
274
+ }
275
+ /**
276
+ * Check if two sets of target symbols are connected by a caller→callee edge.
277
+ * Returns true if any symbol in A calls any symbol in B, or vice versa.
278
+ */
279
+ export function hasCallGraphConflict(symbolsA, symbolsB, callEdges) {
280
+ if (symbolsA.length === 0 || symbolsB.length === 0)
281
+ return false;
282
+ const setA = new Set(symbolsA);
283
+ const setB = new Set(symbolsB);
284
+ for (const edge of callEdges) {
285
+ // A calls B or B calls A
286
+ if ((setA.has(edge.caller) && setB.has(edge.callee)) ||
287
+ (setB.has(edge.caller) && setA.has(edge.callee))) {
288
+ return true;
289
+ }
290
+ }
291
+ return false;
292
+ }
293
+ /**
294
+ * Check if two proposals have a potential conflict based on their file lists.
295
+ *
296
+ * When both proposals provide `target_symbols` and their file paths overlap,
297
+ * an AST-aware escape hatch checks whether the targeted symbols are disjoint.
298
+ * If symbols don't overlap, the proposals can safely run in parallel even
299
+ * though they touch the same file.
300
+ */
301
+ export function proposalsConflict(a, b, options = {}) {
302
+ const { sensitivity = 'normal' } = options;
303
+ // Always check: direct file path overlap (exact match or containment)
304
+ const hasPathOverlap = a.files.some(fA => b.files.some(fB => pathsOverlap(fA, fB)));
305
+ if (hasPathOverlap) {
306
+ // AST-aware escape hatch: if both proposals declare which symbols they
307
+ // modify and those symbol sets are disjoint, they can run in parallel.
308
+ if (a.target_symbols?.length && b.target_symbols?.length) {
309
+ const symbolsA = new Set(a.target_symbols);
310
+ const hasSymbolOverlap = b.target_symbols.some(s => symbolsA.has(s));
311
+ if (!hasSymbolOverlap) {
312
+ // Different symbols in same file — safe to parallelize
313
+ return false;
314
+ }
315
+ }
316
+ return true;
317
+ }
318
+ if (sensitivity === 'relaxed') {
319
+ return false;
320
+ }
321
+ // Normal and strict: check sibling files in same directory
322
+ if (hasSiblingFiles(a.files, b.files)) {
323
+ if (sensitivity === 'strict') {
324
+ return true;
325
+ }
326
+ // Normal: sibling + (conflict-prone OR same category)
327
+ if (hasConflictProneOverlap(a.files, b.files)) {
328
+ return true;
329
+ }
330
+ if (a.category && b.category && a.category === b.category) {
331
+ // AST-aware escape: same category but disjoint symbols → safe
332
+ if (a.target_symbols?.length && b.target_symbols?.length) {
333
+ const symbolsA = new Set(a.target_symbols);
334
+ if (!b.target_symbols.some(s => symbolsA.has(s))) {
335
+ // Different symbols, same category — not a real conflict
336
+ // (skip returning true, fall through to remaining checks)
337
+ }
338
+ else {
339
+ return true;
340
+ }
341
+ }
342
+ else {
343
+ return true;
344
+ }
345
+ }
346
+ }
347
+ // Normal and strict: check directory overlap threshold
348
+ if (directoriesOverlap(a.files, b.files, sensitivity === 'strict' ? DIRECTORY_OVERLAP_STRICT : DIRECTORY_OVERLAP_NORMAL)) {
349
+ return true;
350
+ }
351
+ // Normal and strict: import-chain conflict (dependency graph)
352
+ if (options.edges && hasImportChainConflict(a.files, b.files, options.edges)) {
353
+ return true;
354
+ }
355
+ // Normal and strict: call-graph conflict (cross-file caller→callee)
356
+ if (options.callEdges && a.target_symbols?.length && b.target_symbols?.length) {
357
+ if (hasCallGraphConflict(a.target_symbols, b.target_symbols, options.callEdges)) {
358
+ return true;
359
+ }
360
+ }
361
+ // Strict only: same package in monorepo
362
+ if (sensitivity === 'strict' && touchesSamePackage(a.files, b.files)) {
363
+ return true;
364
+ }
365
+ // Strict only: shared parent directory
366
+ if (sensitivity === 'strict' && hasSharedParentConflict(a.files, b.files)) {
367
+ return true;
368
+ }
369
+ return false;
370
+ }
371
+ /**
372
+ * Partition proposals into conflict-free waves.
373
+ * Proposals with overlapping file paths go into separate waves
374
+ * so they run sequentially, avoiding merge conflicts.
375
+ *
376
+ * Uses a greedy first-fit bin-packing algorithm.
377
+ *
378
+ * @param proposals - List of proposals with file paths
379
+ * @param options - Conflict detection options
380
+ * @returns Array of waves, each containing non-conflicting proposals
381
+ */
382
+ export function partitionIntoWaves(proposals, options = {}) {
383
+ const waves = [];
384
+ for (const proposal of proposals) {
385
+ let placed = false;
386
+ for (const wave of waves) {
387
+ const conflicts = wave.some(existing => proposalsConflict(existing, proposal, options));
388
+ if (!conflicts) {
389
+ wave.push(proposal);
390
+ placed = true;
391
+ break;
392
+ }
393
+ }
394
+ if (!placed) {
395
+ waves.push([proposal]);
396
+ }
397
+ }
398
+ return waves;
399
+ }
400
+ //# sourceMappingURL=conflict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict.js","sourceRoot":"","sources":["../../src/waves/conflict.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Merge resolution and symbol enrichment — pure functions for AST-aware
3
+ * merge conflict prediction, structural merge, and scout escalation.
4
+ *
5
+ * No filesystem, git, or child_process I/O.
6
+ */
7
+ import type { CodebaseIndex, SymbolRange } from '../codebase-index/shared.js';
8
+ import type { SectorState } from '../sectors/shared.js';
9
+ /**
10
+ * Map from relative file path to its top-level symbols.
11
+ * Typically loaded from the AST cache.
12
+ */
13
+ export type SymbolMap = Record<string, SymbolRange[]>;
14
+ /**
15
+ * Enrich proposals with target_symbols from a pre-loaded AST symbol map.
16
+ *
17
+ * For each proposal that lacks target_symbols, looks up its files in the
18
+ * symbol map and collects all symbol names. This makes symbol-aware conflict
19
+ * detection work automatically without relying on scout LLM compliance.
20
+ *
21
+ * Only sets target_symbols when ALL of a proposal's files have symbol data.
22
+ * If any file is missing from the map, we leave target_symbols unset so
23
+ * conflict detection falls back to the conservative path-based check.
24
+ *
25
+ * Mutates proposals in place for efficiency.
26
+ */
27
+ export declare function enrichWithSymbols<T extends {
28
+ files: string[];
29
+ target_symbols?: string[];
30
+ }>(proposals: T[], symbolMap: SymbolMap): void;
31
+ /**
32
+ * Predict whether merging two sets of file changes will conflict,
33
+ * based on symbol-level line ranges.
34
+ *
35
+ * For each file both branches modified, checks if the modified symbol ranges
36
+ * overlap. Returns:
37
+ * - 'safe' — all shared files have disjoint symbol ranges (merge likely succeeds)
38
+ * - 'risky' — at least one shared file has overlapping symbol ranges (merge may conflict)
39
+ * - 'unknown' — symbol data missing for one or more shared files (can't predict)
40
+ */
41
+ export declare function predictMergeConflict(filesA: string[], filesB: string[], symbolsA: Record<string, string[]>, symbolsB: Record<string, string[]>, symbolMap: SymbolMap): 'safe' | 'risky' | 'unknown';
42
+ /**
43
+ * Reorder a list of ticket branches for merge, placing "safe" merges first
44
+ * and "risky" ones last. This minimizes the chance of early merge failures
45
+ * blocking later safe merges.
46
+ *
47
+ * Takes already-merged files (from the milestone) and each candidate's files+symbols.
48
+ * Returns indices sorted from safest to riskiest.
49
+ */
50
+ export declare function orderMergeSequence(candidates: Array<{
51
+ files: string[];
52
+ targetSymbols: Record<string, string[]>;
53
+ }>, symbolMap: SymbolMap): number[];
54
+ /**
55
+ * Build escalation prompt text for scout retries.
56
+ * Suggests unexplored modules and fresh angles when previous attempts found nothing.
57
+ */
58
+ export declare function buildScoutEscalation(retryCount: number, scoutedDirs: string[], codebaseIndex: CodebaseIndex | null, sectorState?: SectorState): string;
59
+ /**
60
+ * Attempt to structurally resolve a merge conflict for a single file.
61
+ *
62
+ * Given three versions (base, ours, theirs) and symbol ranges for each,
63
+ * splits each version into symbol-aligned blocks. If modifications from
64
+ * "ours" and "theirs" affect disjoint symbols, produces a resolved version
65
+ * that includes both sets of changes.
66
+ *
67
+ * Returns the resolved content as a string, or null if:
68
+ * - Symbol data is unavailable for any version
69
+ * - Both sides modified the same symbol (true conflict)
70
+ * - Block structure doesn't align across versions (structural shift)
71
+ *
72
+ * Conservative by design: returns null on any ambiguity.
73
+ */
74
+ export declare function tryStructuralMerge(baseContent: string, oursContent: string, theirsContent: string, baseSymbols: SymbolRange[], oursSymbols: SymbolRange[], theirsSymbols: SymbolRange[]): string | null;
75
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/waves/merge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMxD;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EACxF,SAAS,EAAE,CAAC,EAAE,EACd,SAAS,EAAE,SAAS,GACnB,IAAI,CA6BN;AAMD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAClC,SAAS,EAAE,SAAS,GACnB,MAAM,GAAG,OAAO,GAAG,SAAS,CA6C9B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,KAAK,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACzC,CAAC,EACF,SAAS,EAAE,SAAS,GACnB,MAAM,EAAE,CAmBV;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,EACrB,aAAa,EAAE,aAAa,GAAG,IAAI,EACnC,WAAW,CAAC,EAAE,WAAW,GACxB,MAAM,CAsDR;AAwFD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,WAAW,EAAE,EAC1B,WAAW,EAAE,WAAW,EAAE,EAC1B,aAAa,EAAE,WAAW,EAAE,GAC3B,MAAM,GAAG,IAAI,CAiDf"}