nexus-prime 0.2.0

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 (134) hide show
  1. package/README.md +253 -0
  2. package/dist/agents/adapters/mcp.d.ts +21 -0
  3. package/dist/agents/adapters/mcp.d.ts.map +1 -0
  4. package/dist/agents/adapters/mcp.js +447 -0
  5. package/dist/agents/adapters/mcp.js.map +1 -0
  6. package/dist/agents/adapters.d.ts +57 -0
  7. package/dist/agents/adapters.d.ts.map +1 -0
  8. package/dist/agents/adapters.js +151 -0
  9. package/dist/agents/adapters.js.map +1 -0
  10. package/dist/agents/coordinator.d.ts +75 -0
  11. package/dist/agents/coordinator.d.ts.map +1 -0
  12. package/dist/agents/coordinator.js +339 -0
  13. package/dist/agents/coordinator.js.map +1 -0
  14. package/dist/agents/core/types.d.ts +157 -0
  15. package/dist/agents/core/types.d.ts.map +1 -0
  16. package/dist/agents/core/types.js +5 -0
  17. package/dist/agents/core/types.js.map +1 -0
  18. package/dist/agents/learner.d.ts +25 -0
  19. package/dist/agents/learner.d.ts.map +1 -0
  20. package/dist/agents/learner.js +88 -0
  21. package/dist/agents/learner.js.map +1 -0
  22. package/dist/cli.d.ts +6 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +237 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/config.d.ts +74 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +73 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/core/evolution.d.ts +122 -0
  31. package/dist/core/evolution.d.ts.map +1 -0
  32. package/dist/core/evolution.js +319 -0
  33. package/dist/core/evolution.js.map +1 -0
  34. package/dist/core/memory.d.ts +96 -0
  35. package/dist/core/memory.d.ts.map +1 -0
  36. package/dist/core/memory.js +304 -0
  37. package/dist/core/memory.js.map +1 -0
  38. package/dist/core/optimize.d.ts +100 -0
  39. package/dist/core/optimize.d.ts.map +1 -0
  40. package/dist/core/optimize.js +263 -0
  41. package/dist/core/optimize.js.map +1 -0
  42. package/dist/core/types.d.ts +155 -0
  43. package/dist/core/types.d.ts.map +1 -0
  44. package/dist/core/types.js +5 -0
  45. package/dist/core/types.js.map +1 -0
  46. package/dist/core/wave.d.ts +55 -0
  47. package/dist/core/wave.d.ts.map +1 -0
  48. package/dist/core/wave.js +119 -0
  49. package/dist/core/wave.js.map +1 -0
  50. package/dist/engines/benchmark.d.ts +76 -0
  51. package/dist/engines/benchmark.d.ts.map +1 -0
  52. package/dist/engines/benchmark.js +167 -0
  53. package/dist/engines/benchmark.js.map +1 -0
  54. package/dist/engines/cache-manager.d.ts +75 -0
  55. package/dist/engines/cache-manager.d.ts.map +1 -0
  56. package/dist/engines/cache-manager.js +200 -0
  57. package/dist/engines/cache-manager.js.map +1 -0
  58. package/dist/engines/context.d.ts +50 -0
  59. package/dist/engines/context.d.ts.map +1 -0
  60. package/dist/engines/context.js +99 -0
  61. package/dist/engines/context.js.map +1 -0
  62. package/dist/engines/embedder.d.ts +55 -0
  63. package/dist/engines/embedder.d.ts.map +1 -0
  64. package/dist/engines/embedder.js +223 -0
  65. package/dist/engines/embedder.js.map +1 -0
  66. package/dist/engines/guardrails-bridge.d.ts +64 -0
  67. package/dist/engines/guardrails-bridge.d.ts.map +1 -0
  68. package/dist/engines/guardrails-bridge.js +251 -0
  69. package/dist/engines/guardrails-bridge.js.map +1 -0
  70. package/dist/engines/index.d.ts +14 -0
  71. package/dist/engines/index.d.ts.map +1 -0
  72. package/dist/engines/index.js +14 -0
  73. package/dist/engines/index.js.map +1 -0
  74. package/dist/engines/memory.d.ts +76 -0
  75. package/dist/engines/memory.d.ts.map +1 -0
  76. package/dist/engines/memory.js +431 -0
  77. package/dist/engines/memory.js.map +1 -0
  78. package/dist/engines/meta-learner.d.ts +87 -0
  79. package/dist/engines/meta-learner.d.ts.map +1 -0
  80. package/dist/engines/meta-learner.js +214 -0
  81. package/dist/engines/meta-learner.js.map +1 -0
  82. package/dist/engines/orchestrator.d.ts +69 -0
  83. package/dist/engines/orchestrator.d.ts.map +1 -0
  84. package/dist/engines/orchestrator.js +175 -0
  85. package/dist/engines/orchestrator.js.map +1 -0
  86. package/dist/engines/pod-network.d.ts +31 -0
  87. package/dist/engines/pod-network.d.ts.map +1 -0
  88. package/dist/engines/pod-network.js +108 -0
  89. package/dist/engines/pod-network.js.map +1 -0
  90. package/dist/engines/token-optimizer.d.ts +53 -0
  91. package/dist/engines/token-optimizer.d.ts.map +1 -0
  92. package/dist/engines/token-optimizer.js +115 -0
  93. package/dist/engines/token-optimizer.js.map +1 -0
  94. package/dist/engines/token-supremacy.d.ts +86 -0
  95. package/dist/engines/token-supremacy.d.ts.map +1 -0
  96. package/dist/engines/token-supremacy.js +403 -0
  97. package/dist/engines/token-supremacy.js.map +1 -0
  98. package/dist/index.d.ts +99 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +302 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/nexus-prime.d.ts +15 -0
  103. package/dist/nexus-prime.d.ts.map +1 -0
  104. package/dist/nexus-prime.js +15 -0
  105. package/dist/nexus-prime.js.map +1 -0
  106. package/dist/phantom/index.d.ts +135 -0
  107. package/dist/phantom/index.d.ts.map +1 -0
  108. package/dist/phantom/index.js +286 -0
  109. package/dist/phantom/index.js.map +1 -0
  110. package/dist/phantom/merge-oracle.d.ts +35 -0
  111. package/dist/phantom/merge-oracle.d.ts.map +1 -0
  112. package/dist/phantom/merge-oracle.js +189 -0
  113. package/dist/phantom/merge-oracle.js.map +1 -0
  114. package/dist/phantom/phase4-orchestrator.d.ts +14 -0
  115. package/dist/phantom/phase4-orchestrator.d.ts.map +1 -0
  116. package/dist/phantom/phase4-orchestrator.js +488 -0
  117. package/dist/phantom/phase4-orchestrator.js.map +1 -0
  118. package/dist/verify-guardrails.d.ts +2 -0
  119. package/dist/verify-guardrails.d.ts.map +1 -0
  120. package/dist/verify-guardrails.js +48 -0
  121. package/dist/verify-guardrails.js.map +1 -0
  122. package/dist/verify-pod-sync.d.ts +2 -0
  123. package/dist/verify-pod-sync.d.ts.map +1 -0
  124. package/dist/verify-pod-sync.js +41 -0
  125. package/dist/verify-pod-sync.js.map +1 -0
  126. package/dist/verify-substrate.d.ts +2 -0
  127. package/dist/verify-substrate.d.ts.map +1 -0
  128. package/dist/verify-substrate.js +41 -0
  129. package/dist/verify-substrate.js.map +1 -0
  130. package/dist/verify-token-scoring.d.ts +2 -0
  131. package/dist/verify-token-scoring.d.ts.map +1 -0
  132. package/dist/verify-token-scoring.js +37 -0
  133. package/dist/verify-token-scoring.js.map +1 -0
  134. package/package.json +80 -0
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Phantom Workers — Parallel Git Worktree Agents
3
+ *
4
+ * Beyond sub-agents: each Phantom Worker gets an isolated git worktree,
5
+ * works in parallel, and the Merge Oracle picks the best result.
6
+ *
7
+ * Pattern:
8
+ * GhostPass (read-only analysis)
9
+ * → N PhantomWorkers (parallel, git worktrees)
10
+ * → MergeOracle (Byzantine vote, synthesize best)
11
+ * → LiveNexus (self-improvement trigger)
12
+ */
13
+ import { exec as execCallback } from 'child_process';
14
+ import { promisify } from 'util';
15
+ import * as path from 'path';
16
+ import * as fs from 'fs';
17
+ import * as os from 'os';
18
+ import { randomUUID } from 'crypto';
19
+ import { MergeOracle } from './merge-oracle.js';
20
+ export { MergeOracle };
21
+ import { TokenSupremacyEngine } from '../engines/token-supremacy.js';
22
+ import { podNetwork } from '../engines/pod-network.js';
23
+ const exec = promisify(execCallback);
24
+ // ─────────────────────────────────────────────────────────────────────────────
25
+ // Ghost Pass — Read-Only Pre-Flight Analysis
26
+ // ─────────────────────────────────────────────────────────────────────────────
27
+ export class GhostPass {
28
+ tokenEngine;
29
+ repoRoot;
30
+ constructor(repoRoot) {
31
+ this.tokenEngine = new TokenSupremacyEngine();
32
+ this.repoRoot = repoRoot ?? process.cwd();
33
+ }
34
+ /**
35
+ * Analyze the codebase WITHOUT touching anything.
36
+ * Returns a reading plan + worker assignments.
37
+ */
38
+ async analyze(goal, targetFiles) {
39
+ const taskId = randomUUID();
40
+ // Generate token-efficient reading plan
41
+ const readingPlan = this.tokenEngine.plan(goal, targetFiles);
42
+ // Identify risk areas from goal keywords
43
+ const riskAreas = this.detectRiskAreas(goal, targetFiles);
44
+ // Generate 2-3 different approach assignments
45
+ const workerAssignments = this.generateApproaches(goal, targetFiles, readingPlan, taskId);
46
+ return {
47
+ taskId,
48
+ riskAreas,
49
+ workerAssignments,
50
+ totalEstimatedTokens: readingPlan.totalEstimatedTokens,
51
+ readingPlan
52
+ };
53
+ }
54
+ detectRiskAreas(goal, files) {
55
+ const risks = [];
56
+ const goalLower = goal.toLowerCase();
57
+ if (goalLower.includes('auth') || goalLower.includes('security')) {
58
+ risks.push('Security-sensitive area: validate all changes carefully');
59
+ }
60
+ if (goalLower.includes('database') || goalLower.includes('schema')) {
61
+ risks.push('Schema change: ensure migration exists, check backward compat');
62
+ }
63
+ if (goalLower.includes('delete') || goalLower.includes('remove')) {
64
+ risks.push('Destructive operation: verify no dependents before removing');
65
+ }
66
+ if (files.some(f => f.path.includes('package.json'))) {
67
+ risks.push('Dependency change: run npm install after, check for version conflicts');
68
+ }
69
+ return risks;
70
+ }
71
+ generateApproaches(goal, files, readingPlan, taskId) {
72
+ const approaches = ['minimal', 'standard', 'thorough'];
73
+ const budgetPerWorker = Math.floor(readingPlan.totalEstimatedTokens * 1.5 / approaches.length);
74
+ return approaches.map((approach, i) => ({
75
+ id: `${taskId}-worker-${i}`,
76
+ goal,
77
+ files,
78
+ approach,
79
+ tokenBudget: budgetPerWorker,
80
+ readingPlan
81
+ }));
82
+ }
83
+ }
84
+ // ─────────────────────────────────────────────────────────────────────────────
85
+ // Phantom Worker — Isolated Git Worktree
86
+ // ─────────────────────────────────────────────────────────────────────────────
87
+ export class PhantomWorker {
88
+ workerId;
89
+ repoRoot;
90
+ worktreeDir;
91
+ branch;
92
+ constructor(repoRoot) {
93
+ this.workerId = `phantom-${randomUUID().slice(0, 8)}`;
94
+ this.repoRoot = repoRoot ?? process.cwd();
95
+ this.worktreeDir = path.join(os.tmpdir(), 'nexus-phantom', this.workerId);
96
+ this.branch = `phantom/${this.workerId}`;
97
+ }
98
+ get id() { return this.workerId; }
99
+ /** Sync a finding to the POD Network mid-execution */
100
+ broadcast(content, confidence = 0.8, tags = []) {
101
+ return podNetwork.publish(this.workerId, content, confidence, [...tags, `#worker-${this.workerId}`]);
102
+ }
103
+ /** Receive relevant findings from other workers from the POD */
104
+ receive(tags = []) {
105
+ return podNetwork.recall(tags);
106
+ }
107
+ /**
108
+ * Spawn this worker in an isolated git worktree.
109
+ * The executor function receives the worktree path and operates within it.
110
+ */
111
+ async spawn(task, executor) {
112
+ const startTime = Date.now();
113
+ try {
114
+ // Create isolated worktree
115
+ await this.createWorktree();
116
+ // Execute the task in isolation
117
+ // Pass the worker instance itself so the executor can call .broadcast()
118
+ const { learnings, confidence } = await executor(this.worktreeDir, task, this);
119
+ // Capture the diff (what changed vs main)
120
+ const diff = await this.captureDiff();
121
+ return {
122
+ workerId: this.workerId,
123
+ taskId: task.id,
124
+ approach: task.approach,
125
+ diff,
126
+ outcome: diff.trim().length > 0 ? 'success' : 'partial',
127
+ confidence,
128
+ tokensUsed: Math.round((Date.now() - startTime) / 100), // approx
129
+ learnings
130
+ };
131
+ }
132
+ catch (err) {
133
+ return {
134
+ workerId: this.workerId,
135
+ taskId: task.id,
136
+ approach: task.approach,
137
+ diff: '',
138
+ outcome: 'failed',
139
+ confidence: 0,
140
+ tokensUsed: 0,
141
+ learnings: [`Worker ${this.workerId} failed: ${String(err)}`]
142
+ };
143
+ }
144
+ finally {
145
+ await this.cleanup();
146
+ }
147
+ }
148
+ async createWorktree() {
149
+ fs.mkdirSync(path.dirname(this.worktreeDir), { recursive: true });
150
+ // Create a new branch and worktree from current HEAD
151
+ await exec(`git worktree add -b "${this.branch}" "${this.worktreeDir}"`, { cwd: this.repoRoot });
152
+ }
153
+ async captureDiff() {
154
+ try {
155
+ const { stdout } = await exec(`git diff HEAD`, { cwd: this.worktreeDir });
156
+ return stdout;
157
+ }
158
+ catch {
159
+ return '';
160
+ }
161
+ }
162
+ async cleanup() {
163
+ try {
164
+ await exec(`git worktree remove "${this.worktreeDir}" --force`, { cwd: this.repoRoot });
165
+ await exec(`git branch -D "${this.branch}"`, { cwd: this.repoRoot });
166
+ }
167
+ catch {
168
+ // Best effort cleanup
169
+ }
170
+ }
171
+ /** List all active phantom worktrees (for test/debug verification) */
172
+ static async getWorktreeList(repoRoot = process.cwd()) {
173
+ try {
174
+ const { stdout } = await exec('git worktree list --porcelain', { cwd: repoRoot });
175
+ return stdout
176
+ .split('\n')
177
+ .filter(line => line.startsWith('worktree '))
178
+ .map(line => line.replace('worktree ', '').trim())
179
+ .filter(p => p.includes('nexus-phantom'));
180
+ }
181
+ catch {
182
+ return [];
183
+ }
184
+ }
185
+ /** Force-remove any leftover phantom worktrees (emergency cleanup) */
186
+ static async purgeOrphanedWorktrees(repoRoot = process.cwd()) {
187
+ const list = await PhantomWorker.getWorktreeList(repoRoot);
188
+ let removed = 0;
189
+ for (const dir of list) {
190
+ try {
191
+ await exec(`git worktree remove "${dir}" --force`, { cwd: repoRoot });
192
+ removed++;
193
+ }
194
+ catch { /* skip */ }
195
+ }
196
+ return removed;
197
+ }
198
+ }
199
+ // ─────────────────────────────────────────────────────────────────────────────
200
+ // PhantomOrchestrator — High-level entry point
201
+ // ─────────────────────────────────────────────────────────────────────────────
202
+ export class PhantomOrchestrator {
203
+ ghost;
204
+ oracle;
205
+ repoRoot;
206
+ constructor(memory, repoRoot) {
207
+ this.repoRoot = repoRoot ?? process.cwd();
208
+ this.ghost = new GhostPass(this.repoRoot);
209
+ this.oracle = new MergeOracle(memory);
210
+ }
211
+ /**
212
+ * Full phantom run: Ghost → Workers → Oracle → Decision
213
+ *
214
+ * @param goal What to accomplish
215
+ * @param files Files relevant to the task
216
+ * @param executor Function that executes in a worker's isolated worktree
217
+ * @param nWorkers Number of parallel workers (default 3)
218
+ */
219
+ async run(goal, files, executor, nWorkers = 2) {
220
+ // Phase 1: Ghost Pass
221
+ const report = await this.ghost.analyze(goal, files);
222
+ // Phase 2: Parallel Phantom Workers
223
+ const tasks = report.workerAssignments.slice(0, nWorkers);
224
+ const workerPromises = tasks.map(task => {
225
+ const worker = new PhantomWorker(this.repoRoot);
226
+ return worker.spawn(task, executor);
227
+ });
228
+ const results = await Promise.allSettled(workerPromises);
229
+ const workerResults = results
230
+ .filter((r) => r.status === 'fulfilled')
231
+ .map(r => r.value);
232
+ // Phase 3: Merge Oracle
233
+ const decision = await this.oracle.merge(workerResults);
234
+ return { report, decision };
235
+ }
236
+ }
237
+ export class LiveNexus {
238
+ hotFunctions = new Map();
239
+ memory;
240
+ orchestrator;
241
+ repoRoot;
242
+ constructor(memory, repoRoot) {
243
+ this.memory = memory;
244
+ this.repoRoot = repoRoot ?? process.cwd();
245
+ this.orchestrator = new PhantomOrchestrator(memory, repoRoot);
246
+ }
247
+ /** Record a function call outcome for monitoring */
248
+ record(fnName, sourceFile, success, tokensWasted = 0) {
249
+ const existing = this.hotFunctions.get(fnName) ?? {
250
+ name: fnName,
251
+ sourceFile,
252
+ callCount: 0,
253
+ failureRate: 0,
254
+ avgTokensWasted: 0
255
+ };
256
+ const newCallCount = existing.callCount + 1;
257
+ const newFailureRate = (existing.failureRate * existing.callCount + (success ? 0 : 1)) / newCallCount;
258
+ const newTokensWasted = (existing.avgTokensWasted * existing.callCount + tokensWasted) / newCallCount;
259
+ this.hotFunctions.set(fnName, {
260
+ ...existing,
261
+ callCount: newCallCount,
262
+ failureRate: newFailureRate,
263
+ avgTokensWasted: newTokensWasted
264
+ });
265
+ }
266
+ /** Get functions that need improvement */
267
+ getCandidatesForEvolution() {
268
+ return [...this.hotFunctions.values()].filter(fn => fn.failureRate > 0.15 || fn.avgTokensWasted > 2000);
269
+ }
270
+ /** Check if evolution should trigger, store report to memory */
271
+ async checkAndEvolve() {
272
+ const candidates = this.getCandidatesForEvolution();
273
+ for (const fn of candidates) {
274
+ const summary = `Evolution candidate: ${fn.name} in ${fn.sourceFile} — ` +
275
+ `failure rate: ${(fn.failureRate * 100).toFixed(1)}%, ` +
276
+ `avg tokens wasted: ${fn.avgTokensWasted.toFixed(0)}`;
277
+ this.memory.store(summary, 0.85, ['#evolution-candidate', '#live-nexus']);
278
+ }
279
+ if (candidates.length > 0) {
280
+ const report = candidates.map(c => `${c.name}: ${(c.failureRate * 100).toFixed(1)}% failure, ${c.avgTokensWasted.toFixed(0)} tokens wasted`).join('\n');
281
+ this.memory.store(`Live Nexus evolution report:\n${report}`, 0.9, ['#live-nexus', '#evolution']);
282
+ }
283
+ }
284
+ }
285
+ // All classes exported inline above via `export class`.
286
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/phantom/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Merge Oracle — Byzantine Consensus & Hierarchical Synthesis
3
+ *
4
+ * Beyond simple voting: the Oracle analyzes code hierarchy and
5
+ * resolves conflicts by favoring structurally consistent changes.
6
+ */
7
+ import type { WorkerResult, MergeDecision } from './index.js';
8
+ import type { MemoryEngine } from '../engines/memory.js';
9
+ export declare class MergeOracle {
10
+ private memory;
11
+ constructor(memory: MemoryEngine);
12
+ /**
13
+ * Evaluate all worker results and produce a merge decision.
14
+ * Uses Byzantine-inspired voting: 2/3 agreement = high confidence.
15
+ */
16
+ merge(workers: WorkerResult[]): Promise<MergeDecision>;
17
+ private scoreWorker;
18
+ /**
19
+ * Parse a unified diff string into individual hunks.
20
+ * Each hunk has: file, startLine, endLine, content.
21
+ */
22
+ private parseHunks;
23
+ /**
24
+ * Detect overlapping hunks between two sets.
25
+ * Returns: { overlapping: string[], nonOverlapping: string[] }
26
+ */
27
+ private detectOverlaps;
28
+ /**
29
+ * Synthesize diffs by respecting hierarchy.
30
+ * Parses unified diff hunks, detects file/line overlaps,
31
+ * and favors the higher-scored worker on conflicts.
32
+ */
33
+ private hierarchicalSynthesize;
34
+ }
35
+ //# sourceMappingURL=merge-oracle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-oracle.d.ts","sourceRoot":"","sources":["../../src/phantom/merge-oracle.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAIhC;;;OAGG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IA2E5D,OAAO,CAAC,WAAW;IAKnB;;;OAGG;IACH,OAAO,CAAC,UAAU;IA0ClB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAoCtB;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;CAwBjC"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Merge Oracle — Byzantine Consensus & Hierarchical Synthesis
3
+ *
4
+ * Beyond simple voting: the Oracle analyzes code hierarchy and
5
+ * resolves conflicts by favoring structurally consistent changes.
6
+ */
7
+ export class MergeOracle {
8
+ memory;
9
+ constructor(memory) {
10
+ this.memory = memory;
11
+ }
12
+ /**
13
+ * Evaluate all worker results and produce a merge decision.
14
+ * Uses Byzantine-inspired voting: 2/3 agreement = high confidence.
15
+ */
16
+ async merge(workers) {
17
+ if (workers.length === 0) {
18
+ return {
19
+ action: 'reject',
20
+ rationale: 'No worker results to merge',
21
+ confidence: 0,
22
+ learnings: [],
23
+ conflicts: [],
24
+ recommendedStrategy: 'Retry with different approach'
25
+ };
26
+ }
27
+ // Score each worker based on outcome, confidence, and internal metrics
28
+ const scored = workers.map(w => ({
29
+ worker: w,
30
+ score: this.scoreWorker(w)
31
+ })).sort((a, b) => b.score - a.score);
32
+ const best = scored[0];
33
+ const allLearnings = workers.flatMap(w => w.learnings);
34
+ // Byzantine check: do a majority of workers agree on the core logic?
35
+ // We use approach as a proxy for the 'logic path' taken.
36
+ const approachCounts = new Map();
37
+ for (const w of workers) {
38
+ approachCounts.set(w.approach, (approachCounts.get(w.approach) ?? 0) + 1);
39
+ }
40
+ const majorityApproach = [...approachCounts.entries()].sort((a, b) => b[1] - a[1])[0];
41
+ const consensusRatio = majorityApproach[1] / workers.length;
42
+ // Perform Hierarchical Diff Analysis (Pseudo-logic for MVP)
43
+ // If workers disagree, try to synthesize changes that affect different AST levels
44
+ let action = 'reject';
45
+ let synthesized;
46
+ let rationale = '';
47
+ if (best.score > 0.8 && (consensusRatio >= 0.6 || workers.length === 1)) {
48
+ action = 'apply';
49
+ rationale = `High confidence consensus on "${best.worker.approach}" (${(consensusRatio * 100).toFixed(0)}%)`;
50
+ }
51
+ else if (workers.length >= 2 && scored[0].score > 0.6 && scored[1].score > 0.6) {
52
+ action = 'synthesize';
53
+ synthesized = this.hierarchicalSynthesize(scored[0].worker, scored[1].worker);
54
+ rationale = `Consensus low (${(consensusRatio * 100).toFixed(0)}%). Performing hierarchical synthesis of top approaches.`;
55
+ }
56
+ else {
57
+ action = 'reject';
58
+ rationale = `Insufficient consensus or score (Best score: ${best.score.toFixed(2)}, Consensus: ${(consensusRatio * 100).toFixed(0)}%)`;
59
+ }
60
+ // Tiered learning storage
61
+ for (const learning of allLearnings) {
62
+ await this.memory.store(learning, 0.7, ['#phantom-learning', '#swarm']);
63
+ }
64
+ // Extract conflicts from synthesis if it occurred
65
+ const conflicts = [];
66
+ if (action === 'synthesize' && scored.length >= 2) {
67
+ const hunksA = this.parseHunks(scored[0].worker.diff);
68
+ const hunksB = this.parseHunks(scored[1].worker.diff);
69
+ const overlap = this.detectOverlaps(hunksA, hunksB);
70
+ conflicts.push(...overlap.conflicts);
71
+ }
72
+ return {
73
+ action,
74
+ winner: best.worker,
75
+ synthesized,
76
+ rationale,
77
+ confidence: best.score,
78
+ learnings: allLearnings,
79
+ conflicts,
80
+ recommendedStrategy: action === 'apply' ? 'Direct apply of best result' : (conflicts.length > 0 ? 'Conflict-aware synthesis (primary approach favored)' : 'Clean AST-level synthesis')
81
+ };
82
+ }
83
+ scoreWorker(worker) {
84
+ const outcomeScore = worker.outcome === 'success' ? 1.0 : (worker.outcome === 'partial' ? 0.5 : 0.0);
85
+ return (worker.confidence * 0.5) + (outcomeScore * 0.5);
86
+ }
87
+ /**
88
+ * Parse a unified diff string into individual hunks.
89
+ * Each hunk has: file, startLine, endLine, content.
90
+ */
91
+ parseHunks(diff) {
92
+ if (!diff || diff.trim().length === 0)
93
+ return [];
94
+ const hunks = [];
95
+ const lines = diff.split('\n');
96
+ let currentFile = 'unknown';
97
+ let currentHunkStart = 0;
98
+ let currentHunkEnd = 0;
99
+ let currentContent = [];
100
+ for (const line of lines) {
101
+ // Detect file header: +++ b/path/to/file.ts
102
+ if (line.startsWith('+++ b/') || line.startsWith('+++ ')) {
103
+ currentFile = line.replace(/^\+\+\+ [ab]\//, '').trim();
104
+ }
105
+ // Detect hunk header: @@ -10,5 +10,7 @@
106
+ else if (line.startsWith('@@')) {
107
+ // Save previous hunk if exists
108
+ if (currentContent.length > 0) {
109
+ hunks.push({ file: currentFile, startLine: currentHunkStart, endLine: currentHunkEnd, content: currentContent.join('\n') });
110
+ }
111
+ // Parse new hunk range
112
+ const match = line.match(/@@ -(\d+),?\d* \+(\d+),?(\d*) @@/);
113
+ if (match) {
114
+ currentHunkStart = parseInt(match[2], 10);
115
+ currentHunkEnd = currentHunkStart + parseInt(match[3] || '1', 10);
116
+ }
117
+ currentContent = [line];
118
+ }
119
+ else if (currentContent.length > 0) {
120
+ currentContent.push(line);
121
+ }
122
+ }
123
+ // Push last hunk
124
+ if (currentContent.length > 0) {
125
+ hunks.push({ file: currentFile, startLine: currentHunkStart, endLine: currentHunkEnd, content: currentContent.join('\n') });
126
+ }
127
+ return hunks;
128
+ }
129
+ /**
130
+ * Detect overlapping hunks between two sets.
131
+ * Returns: { overlapping: string[], nonOverlapping: string[] }
132
+ */
133
+ detectOverlaps(hunksA, hunksB) {
134
+ const conflicts = [];
135
+ const usedB = new Set();
136
+ const resultParts = [];
137
+ for (const hunkA of hunksA) {
138
+ let hasConflict = false;
139
+ for (let i = 0; i < hunksB.length; i++) {
140
+ const hunkB = hunksB[i];
141
+ // Same file + overlapping line range = conflict
142
+ if (hunkA.file === hunkB.file &&
143
+ hunkA.startLine <= hunkB.endLine &&
144
+ hunkA.endLine >= hunkB.startLine) {
145
+ conflicts.push(`${hunkA.file}:${hunkA.startLine}-${hunkA.endLine} (both approaches modify)`);
146
+ // Favor hunkA (higher-scored worker) for conflicts
147
+ hasConflict = true;
148
+ usedB.add(i);
149
+ }
150
+ }
151
+ resultParts.push(hunkA.content);
152
+ }
153
+ // Add non-overlapping hunks from B
154
+ for (let i = 0; i < hunksB.length; i++) {
155
+ if (!usedB.has(i)) {
156
+ resultParts.push(hunksB[i].content);
157
+ }
158
+ }
159
+ return { conflicts, merged: resultParts.join('\n\n') };
160
+ }
161
+ /**
162
+ * Synthesize diffs by respecting hierarchy.
163
+ * Parses unified diff hunks, detects file/line overlaps,
164
+ * and favors the higher-scored worker on conflicts.
165
+ */
166
+ hierarchicalSynthesize(a, b) {
167
+ if (a.diff === b.diff)
168
+ return a.diff;
169
+ if (!a.diff || a.diff.trim().length === 0)
170
+ return b.diff;
171
+ if (!b.diff || b.diff.trim().length === 0)
172
+ return a.diff;
173
+ const hunksA = this.parseHunks(a.diff);
174
+ const hunksB = this.parseHunks(b.diff);
175
+ // If parsing fails (non-standard diff format), fall back to concatenation
176
+ if (hunksA.length === 0 && hunksB.length === 0) {
177
+ return `// SYNTHESIZED BY NEXUS ORACLE\n// Approach A: ${a.approach}\n// Approach B: ${b.approach}\n\n${a.diff}\n\n${b.diff}`;
178
+ }
179
+ const { conflicts, merged } = this.detectOverlaps(hunksA, hunksB);
180
+ const header = [
181
+ '// SYNTHESIZED BY NEXUS ORACLE',
182
+ `// Approach A (primary): ${a.approach}`,
183
+ `// Approach B (secondary): ${b.approach}`,
184
+ conflicts.length > 0 ? `// ⚠️ ${conflicts.length} conflict(s) resolved — favored Approach A` : '// ✅ No conflicts detected',
185
+ ].join('\n');
186
+ return `${header}\n\n${merged}`;
187
+ }
188
+ }
189
+ //# sourceMappingURL=merge-oracle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-oracle.js","sourceRoot":"","sources":["../../src/phantom/merge-oracle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Phase 4 Phantom Orchestrator
4
+ *
5
+ * Uses the Phantom Workers system to build Phase 4 in parallel:
6
+ * - Wire Mindkit guardrails into Nexus Prime MCP adapter
7
+ * - Two workers implement different strategies simultaneously
8
+ * - MergeOracle picks the winner
9
+ * - Winning diff gets applied back to main
10
+ *
11
+ * Run: node dist/phantom/phase4-orchestrator.js
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=phase4-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase4-orchestrator.d.ts","sourceRoot":"","sources":["../../src/phantom/phase4-orchestrator.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}