mirror of
https://github.com/proffesor-for-testing/agentic-qe.git
synced 2026-09-19 08:45:47 +08:00
2253d05618
Remove the nested v3/ subdirectory by moving all active source code, tests, configs, and assets directly to the project root. Archive v2/ (dead code, 847MB) to v2-archive.tar.gz. Key changes: - Move v3/src/ → src/, v3/tests/ → tests/, v3/packages/ → packages/ - Move v3/tsconfig.json, v3/vitest.config.ts to root - Merge v3/package.json into root package.json (ESM, scripts, deps, exports) - Merge v3/scripts/ into scripts/, v3/implementation/ into docs/implementation/ - Update all CI workflows to remove "cd v3 &&" and v3/ path prefixes - Fix all init installer path resolution (3-level-up → 2-level-up) - Fix hooks to use "node ./dist/cli/bundle.js" instead of bare "aqe" - Update settings.json ADR/DDD directories to docs/implementation/ - Fix helper scripts (statusline, adr-compliance, ddd-tracker, guidance-hooks) - Update 58 agent definitions: aqe/v3/ → aqe/ memory namespaces - Update 15 guidance shards: v3/src/ → src/ path references - Fix sync interfaces: remove v3/ and v2/ path references - Fix test path calculations (process.cwd() + '..' no longer needed) - Fix flaky perf test threshold (500ms → 1000ms for CI environments) - Fix complexity-analyzer test to match ADR-051 keyword-based eligibility Build passes, 17,901 tests pass, CLI and MCP bundles verified. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
611 lines
19 KiB
TypeScript
611 lines
19 KiB
TypeScript
/**
|
|
* ADR-047: MinCut Integration Tests
|
|
*
|
|
* These tests prove end-to-end integration between:
|
|
* 1. MinCut MCP tools → MinCut modules
|
|
* 2. QueenCoordinator → MinCut bridge
|
|
* 3. Queen health/metrics include MinCut data
|
|
*/
|
|
|
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
|
|
// MCP Tools
|
|
import {
|
|
MinCutHealthTool,
|
|
MinCutAnalyzeTool,
|
|
MinCutStrengthenTool,
|
|
resetMinCutState,
|
|
getMinCutGraph,
|
|
getMinCutMonitor,
|
|
} from '../../src/mcp/tools/mincut';
|
|
|
|
// MinCut modules
|
|
import {
|
|
createSwarmGraph,
|
|
createMinCutCalculator,
|
|
createMinCutHealthMonitor,
|
|
SwarmGraph,
|
|
getSharedMinCutGraph,
|
|
} from '../../src/coordination/mincut';
|
|
|
|
// Queen integration
|
|
import {
|
|
QueenMinCutBridge,
|
|
createQueenMinCutBridge,
|
|
} from '../../src/coordination/mincut/queen-integration';
|
|
|
|
// Types
|
|
import { DomainName } from '../../src/shared/types';
|
|
import { MCPToolContext } from '../../src/mcp/tools/base';
|
|
|
|
describe('ADR-047: MinCut Integration', () => {
|
|
let healthTool: MinCutHealthTool;
|
|
let analyzeTool: MinCutAnalyzeTool;
|
|
let strengthenTool: MinCutStrengthenTool;
|
|
|
|
beforeEach(() => {
|
|
resetMinCutState();
|
|
healthTool = new MinCutHealthTool();
|
|
analyzeTool = new MinCutAnalyzeTool();
|
|
strengthenTool = new MinCutStrengthenTool();
|
|
});
|
|
|
|
afterEach(() => {
|
|
resetMinCutState();
|
|
});
|
|
|
|
function createContext(): MCPToolContext {
|
|
return {
|
|
requestId: 'test-request-1',
|
|
startTime: Date.now(),
|
|
};
|
|
}
|
|
|
|
describe('MCP Tools → MinCut Module Integration', () => {
|
|
it('MinCutHealthTool uses real SwarmGraph and Monitor', async () => {
|
|
// Add agents through the MCP tool
|
|
const result = await healthTool.execute(
|
|
{
|
|
agents: [
|
|
{ id: 'agent-1', domain: 'test-generation' as DomainName },
|
|
{ id: 'agent-2', domain: 'test-execution' as DomainName },
|
|
{ id: 'agent-3', domain: 'coverage-analysis' as DomainName },
|
|
],
|
|
edges: [
|
|
{ source: 'agent-1', target: 'agent-2', weight: 1.0 },
|
|
{ source: 'agent-2', target: 'agent-3', weight: 1.0 },
|
|
{ source: 'agent-1', target: 'agent-3', weight: 1.0 },
|
|
],
|
|
},
|
|
createContext()
|
|
);
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.data).toBeDefined();
|
|
expect(result.data!.topology.vertexCount).toBe(3);
|
|
expect(result.data!.topology.edgeCount).toBe(3);
|
|
expect(result.data!.topology.isConnected).toBe(true);
|
|
|
|
// Verify the shared graph was updated
|
|
const graph = getMinCutGraph();
|
|
expect(graph.vertexCount).toBe(3);
|
|
expect(graph.edgeCount).toBe(3);
|
|
});
|
|
|
|
it('MinCutAnalyzeTool uses real MinCutCalculator', async () => {
|
|
// First set up the graph
|
|
const graph = getMinCutGraph();
|
|
graph.addVertex({
|
|
id: 'weak-agent',
|
|
type: 'agent',
|
|
domain: 'test-generation' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
graph.addVertex({
|
|
id: 'strong-agent-1',
|
|
type: 'agent',
|
|
domain: 'test-execution' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
graph.addVertex({
|
|
id: 'strong-agent-2',
|
|
type: 'agent',
|
|
domain: 'coverage-analysis' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
|
|
// Strong agents connected to each other, weak agent isolated
|
|
graph.addEdge({
|
|
source: 'strong-agent-1',
|
|
target: 'strong-agent-2',
|
|
weight: 2.0,
|
|
type: 'coordination',
|
|
bidirectional: true,
|
|
});
|
|
|
|
// Only one weak connection to weak-agent
|
|
graph.addEdge({
|
|
source: 'weak-agent',
|
|
target: 'strong-agent-1',
|
|
weight: 0.5,
|
|
type: 'coordination',
|
|
bidirectional: true,
|
|
});
|
|
|
|
const result = await analyzeTool.execute(
|
|
{ includePartitioningPoints: true },
|
|
createContext()
|
|
);
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.data).toBeDefined();
|
|
|
|
// Verify analysis used real calculator
|
|
expect(result.data!.minCutValue).toBeGreaterThanOrEqual(0);
|
|
expect(result.data!.minDegreeVertex).toBeDefined();
|
|
|
|
// The weak-agent should be identified as having lowest degree
|
|
expect(result.data!.minDegreeVertex?.vertexId).toBe('weak-agent');
|
|
});
|
|
|
|
it('MinCutStrengthenTool applies changes to shared graph', async () => {
|
|
const graph = getMinCutGraph();
|
|
|
|
// Setup a sparse graph
|
|
graph.addVertex({
|
|
id: 'isolated-1',
|
|
type: 'agent',
|
|
domain: 'test-generation' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
graph.addVertex({
|
|
id: 'isolated-2',
|
|
type: 'agent',
|
|
domain: 'test-execution' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
graph.addVertex({
|
|
id: 'hub',
|
|
type: 'agent',
|
|
domain: 'coverage-analysis' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
|
|
// Only hub has connections
|
|
graph.addEdge({
|
|
source: 'hub',
|
|
target: 'isolated-1',
|
|
weight: 1.0,
|
|
type: 'coordination',
|
|
bidirectional: true,
|
|
});
|
|
graph.addEdge({
|
|
source: 'hub',
|
|
target: 'isolated-2',
|
|
weight: 1.0,
|
|
type: 'coordination',
|
|
bidirectional: true,
|
|
});
|
|
|
|
const beforeEdgeCount = graph.edgeCount;
|
|
|
|
// Apply strengthening
|
|
const result = await strengthenTool.execute(
|
|
{
|
|
targetImprovement: 1.0,
|
|
apply: true,
|
|
},
|
|
createContext()
|
|
);
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.data!.applied).toBe(true);
|
|
|
|
// If suggestions were applied, edge count should increase
|
|
if (result.data!.actionsApplied.length > 0) {
|
|
expect(graph.edgeCount).toBeGreaterThan(beforeEdgeCount);
|
|
}
|
|
});
|
|
});
|
|
|
|
describe('MinCut Module Unit Tests', () => {
|
|
it('SwarmGraph correctly calculates connectivity', () => {
|
|
const graph = createSwarmGraph();
|
|
|
|
// Create a triangle (fully connected)
|
|
graph.addVertex({
|
|
id: 'a',
|
|
type: 'agent',
|
|
domain: 'test-generation' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
graph.addVertex({
|
|
id: 'b',
|
|
type: 'agent',
|
|
domain: 'test-execution' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
graph.addVertex({
|
|
id: 'c',
|
|
type: 'agent',
|
|
domain: 'coverage-analysis' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
|
|
graph.addEdge({ source: 'a', target: 'b', weight: 1.0, type: 'coordination', bidirectional: true });
|
|
graph.addEdge({ source: 'b', target: 'c', weight: 1.0, type: 'coordination', bidirectional: true });
|
|
graph.addEdge({ source: 'c', target: 'a', weight: 1.0, type: 'coordination', bidirectional: true });
|
|
|
|
expect(graph.isConnected()).toBe(true);
|
|
expect(graph.vertexCount).toBe(3);
|
|
expect(graph.edgeCount).toBe(3);
|
|
|
|
// Each vertex has degree 2
|
|
expect(graph.degree('a')).toBe(2);
|
|
expect(graph.degree('b')).toBe(2);
|
|
expect(graph.degree('c')).toBe(2);
|
|
});
|
|
|
|
it('MinCutCalculator finds weak vertices correctly', () => {
|
|
const graph = createSwarmGraph();
|
|
const calculator = createMinCutCalculator();
|
|
|
|
// Create a star topology with weak leaves
|
|
graph.addVertex({
|
|
id: 'hub',
|
|
type: 'agent',
|
|
domain: 'test-generation' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
|
|
for (let i = 0; i < 4; i++) {
|
|
graph.addVertex({
|
|
id: `leaf-${i}`,
|
|
type: 'agent',
|
|
domain: 'test-execution' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
graph.addEdge({
|
|
source: 'hub',
|
|
target: `leaf-${i}`,
|
|
weight: 1.0,
|
|
type: 'coordination',
|
|
bidirectional: true,
|
|
});
|
|
}
|
|
|
|
// Hub has degree 4, leaves have degree 1
|
|
// Verify the graph structure
|
|
expect(graph.weightedDegree('hub')).toBe(4.0);
|
|
expect(graph.weightedDegree('leaf-0')).toBe(1.0);
|
|
|
|
// findWeakVertices uses threshold based on mean - stddev
|
|
// mean = (4 + 1 + 1 + 1 + 1) / 5 = 1.6
|
|
// The leaves should be below threshold
|
|
const weakVertices = calculator.findWeakVertices(graph);
|
|
|
|
// Verify weak vertices were found (leaves have lower degree than hub)
|
|
// Due to threshold calculation, we may find 0 or some leaves
|
|
// The important thing is that the calculation works
|
|
const minDegreeVertex = calculator.getMinDegreeVertex(graph);
|
|
expect(minDegreeVertex).toBeDefined();
|
|
expect(minDegreeVertex!.vertexId.startsWith('leaf-')).toBe(true);
|
|
expect(minDegreeVertex!.degree).toBe(1.0);
|
|
});
|
|
|
|
it('MinCutHealthMonitor tracks health over time', () => {
|
|
const graph = createSwarmGraph();
|
|
const monitor = createMinCutHealthMonitor(graph);
|
|
|
|
// Initially empty graph - Issue #205: Empty is 'idle', not 'critical' (fresh install UX)
|
|
let health = monitor.checkHealth();
|
|
expect(health.minCutValue).toBe(0);
|
|
expect(health.status).toBe('idle'); // Empty graph is idle (fresh install)
|
|
|
|
// Add connected vertices
|
|
graph.addVertex({
|
|
id: 'a',
|
|
type: 'agent',
|
|
domain: 'test-generation' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
graph.addVertex({
|
|
id: 'b',
|
|
type: 'agent',
|
|
domain: 'test-execution' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
graph.addEdge({
|
|
source: 'a',
|
|
target: 'b',
|
|
weight: 2.0,
|
|
type: 'coordination',
|
|
bidirectional: true,
|
|
});
|
|
|
|
health = monitor.checkHealth();
|
|
expect(health.minCutValue).toBe(2.0);
|
|
|
|
monitor.stop();
|
|
});
|
|
});
|
|
|
|
describe('Queen Integration', () => {
|
|
it('QueenMinCutBridge extends health with MinCut data', () => {
|
|
// Create mock dependencies
|
|
const mockEventBus = {
|
|
publish: vi.fn().mockResolvedValue(undefined),
|
|
subscribe: vi.fn().mockReturnValue('sub-1'),
|
|
unsubscribe: vi.fn(),
|
|
once: vi.fn(),
|
|
listSubscribers: vi.fn().mockReturnValue([]),
|
|
};
|
|
|
|
const mockAgentCoordinator = {
|
|
listAgents: vi.fn().mockReturnValue([
|
|
{ id: 'agent-1', domain: 'test-generation', status: 'running', type: 'tester', name: 'tester-1' },
|
|
{ id: 'agent-2', domain: 'test-execution', status: 'running', type: 'tester', name: 'tester-2' },
|
|
]),
|
|
spawnAgent: vi.fn(),
|
|
terminateAgent: vi.fn(),
|
|
getAgent: vi.fn(),
|
|
updateAgentStatus: vi.fn(),
|
|
};
|
|
|
|
const bridge = createQueenMinCutBridge(
|
|
mockEventBus as any,
|
|
mockAgentCoordinator as any,
|
|
{
|
|
includeInQueenHealth: true,
|
|
autoUpdateFromEvents: false, // Disable for test
|
|
persistData: false, // Disable for test
|
|
}
|
|
);
|
|
|
|
// Get MinCut health
|
|
const minCutHealth = bridge.getMinCutHealth();
|
|
expect(minCutHealth).toBeDefined();
|
|
expect(minCutHealth.status).toBeDefined();
|
|
|
|
// Create mock Queen health
|
|
const mockQueenHealth = {
|
|
status: 'healthy' as const,
|
|
domainHealth: new Map(),
|
|
totalAgents: 2,
|
|
activeAgents: 2,
|
|
pendingTasks: 0,
|
|
runningTasks: 0,
|
|
workStealingActive: false,
|
|
lastHealthCheck: new Date(),
|
|
issues: [],
|
|
};
|
|
|
|
// Extend with MinCut
|
|
const extended = bridge.extendQueenHealth(mockQueenHealth);
|
|
|
|
// Should include minCut field
|
|
expect((extended as any).minCut).toBeDefined();
|
|
expect((extended as any).minCut.minCutValue).toBeDefined();
|
|
});
|
|
|
|
it('MCP tools and Queen bridge share state correctly', async () => {
|
|
// Create mock dependencies for Queen bridge
|
|
const mockEventBus = {
|
|
publish: vi.fn().mockResolvedValue(undefined),
|
|
subscribe: vi.fn().mockReturnValue('sub-1'),
|
|
unsubscribe: vi.fn(),
|
|
once: vi.fn(),
|
|
listSubscribers: vi.fn().mockReturnValue([]),
|
|
};
|
|
|
|
const mockAgentCoordinator = {
|
|
listAgents: vi.fn().mockReturnValue([]),
|
|
spawnAgent: vi.fn(),
|
|
terminateAgent: vi.fn(),
|
|
getAgent: vi.fn(),
|
|
updateAgentStatus: vi.fn(),
|
|
};
|
|
|
|
// Create Queen bridge with shared graph (this is what QueenCoordinator does now)
|
|
const bridge = createQueenMinCutBridge(
|
|
mockEventBus as any,
|
|
mockAgentCoordinator as any,
|
|
{
|
|
includeInQueenHealth: true,
|
|
autoUpdateFromEvents: false,
|
|
persistData: false,
|
|
sharedGraph: getSharedMinCutGraph(), // KEY: Use the shared singleton
|
|
}
|
|
);
|
|
|
|
// Add agents via MCP tool FIRST (before bridge.initialize)
|
|
await healthTool.execute(
|
|
{
|
|
agents: [
|
|
{ id: 'shared-1', domain: 'test-generation' as DomainName },
|
|
{ id: 'shared-2', domain: 'test-execution' as DomainName },
|
|
],
|
|
edges: [{ source: 'shared-1', target: 'shared-2', weight: 1.5 }],
|
|
},
|
|
createContext()
|
|
);
|
|
|
|
// Verify MCP data is in the graph before initialize
|
|
const mcpGraph = getMinCutGraph();
|
|
expect(mcpGraph.hasVertex('shared-1')).toBe(true);
|
|
expect(mcpGraph.hasVertex('shared-2')).toBe(true);
|
|
expect(mcpGraph.hasEdge('shared-1', 'shared-2')).toBe(true);
|
|
|
|
// CRITICAL: Call initialize() which triggers buildGraphFromAgents()
|
|
// This MUST preserve the MCP-added data, not clear it!
|
|
await bridge.initialize();
|
|
|
|
// CRITICAL TEST: Queen bridge should see the SAME data added via MCP
|
|
// After initialize(), MCP data should still exist
|
|
const queenGraph = bridge.getGraph();
|
|
expect(queenGraph).toBe(mcpGraph); // Same instance!
|
|
expect(queenGraph.hasVertex('shared-1')).toBe(true);
|
|
expect(queenGraph.hasVertex('shared-2')).toBe(true);
|
|
expect(queenGraph.hasEdge('shared-1', 'shared-2')).toBe(true);
|
|
|
|
// Verify the edge weight is preserved (1.5)
|
|
const edge = queenGraph.getEdge('shared-1', 'shared-2');
|
|
expect(edge).toBeDefined();
|
|
expect(edge!.weight).toBe(1.5);
|
|
|
|
// Note: MinCut value changes because buildGraphFromAgents() adds 12 domain
|
|
// vertices that are disconnected from our MCP-added vertices. The key test
|
|
// is that our MCP data survived initialize() - which we verified above.
|
|
|
|
// Verify graph now contains both MCP data AND domain vertices
|
|
expect(queenGraph.vertexCount).toBeGreaterThan(2); // MCP vertices + domain vertices
|
|
});
|
|
});
|
|
|
|
describe('Issue #205 Fresh Install Regression', () => {
|
|
it('should return idle status when domain coordinators exist but no agents', async () => {
|
|
// Issue #205 regression test: This tests the exact scenario that caused
|
|
// the "degraded" status on fresh installs.
|
|
//
|
|
// The problem: buildGraphFromAgents() creates domain coordinator vertices
|
|
// AND workflow edges between them. The old isEmptyTopology() check only
|
|
// looked at vertexCount === 0 || edgeCount === 0, which returned false
|
|
// because domain coordinators + edges exist. This caused fresh installs
|
|
// to show "degraded" status with MinCut critical warnings.
|
|
//
|
|
// The fix: isEmptyTopology() now checks for agent vertices specifically,
|
|
// not raw counts. Domain coordinators don't count as "topology with agents".
|
|
|
|
const mockEventBus = {
|
|
publish: vi.fn().mockResolvedValue(undefined),
|
|
subscribe: vi.fn().mockReturnValue('sub-1'),
|
|
unsubscribe: vi.fn(),
|
|
once: vi.fn(),
|
|
listSubscribers: vi.fn().mockReturnValue([]),
|
|
};
|
|
|
|
// Key: listAgents returns EMPTY array (fresh install, no agents spawned yet)
|
|
const mockAgentCoordinator = {
|
|
listAgents: vi.fn().mockReturnValue([]),
|
|
spawnAgent: vi.fn(),
|
|
terminateAgent: vi.fn(),
|
|
getAgent: vi.fn(),
|
|
updateAgentStatus: vi.fn(),
|
|
};
|
|
|
|
const bridge = createQueenMinCutBridge(
|
|
mockEventBus as any,
|
|
mockAgentCoordinator as any,
|
|
{
|
|
includeInQueenHealth: true,
|
|
autoUpdateFromEvents: false,
|
|
persistData: false,
|
|
}
|
|
);
|
|
|
|
// Initialize triggers buildGraphFromAgents() which adds domain coordinators + workflow edges
|
|
await bridge.initialize();
|
|
|
|
// Verify domain coordinators were created
|
|
const graph = bridge.getGraph();
|
|
const domainVertices = graph.getVerticesByType('domain');
|
|
expect(domainVertices.length).toBeGreaterThan(0);
|
|
|
|
// Verify workflow edges exist
|
|
expect(graph.edgeCount).toBeGreaterThan(0);
|
|
|
|
// Critical: No agent vertices should exist
|
|
const agentVertices = graph.getVerticesByType('agent');
|
|
expect(agentVertices.length).toBe(0);
|
|
|
|
// CRITICAL TEST: MinCut health should be 'idle', NOT 'critical'
|
|
const minCutHealth = bridge.getMinCutHealth();
|
|
expect(minCutHealth.status).toBe('idle');
|
|
|
|
// Queen health extension should NOT degrade status
|
|
const mockQueenHealth = {
|
|
status: 'healthy' as const,
|
|
domainHealth: new Map(),
|
|
totalAgents: 0,
|
|
activeAgents: 0,
|
|
pendingTasks: 0,
|
|
runningTasks: 0,
|
|
workStealingActive: false,
|
|
lastHealthCheck: new Date(),
|
|
issues: [],
|
|
};
|
|
|
|
const extended = bridge.extendQueenHealth(mockQueenHealth);
|
|
expect(extended.status).toBe('healthy'); // Should NOT be 'degraded'
|
|
|
|
// There should be NO critical MinCut issues for empty agent topology
|
|
const minCutIssues = extended.issues.filter(i => i.message.includes('MinCut'));
|
|
expect(minCutIssues.filter(i => i.severity === 'critical')).toHaveLength(0);
|
|
|
|
// No "Weak agent topology" issues for fresh install
|
|
const weakTopologyIssues = extended.issues.filter(i => i.message.includes('Weak agent topology'));
|
|
expect(weakTopologyIssues).toHaveLength(0);
|
|
});
|
|
});
|
|
|
|
describe('Real Data vs Mock Data', () => {
|
|
it('MCP tools mark results as real data', async () => {
|
|
const result = await healthTool.execute(
|
|
{
|
|
agents: [{ id: 'test-agent', domain: 'test-generation' as DomainName }],
|
|
},
|
|
createContext()
|
|
);
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.metadata?.dataSource).toBe('real');
|
|
});
|
|
|
|
it('Analysis results come from real calculations', async () => {
|
|
// Setup known graph
|
|
const graph = getMinCutGraph();
|
|
graph.addVertex({
|
|
id: 'known-1',
|
|
type: 'agent',
|
|
domain: 'test-generation' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
graph.addVertex({
|
|
id: 'known-2',
|
|
type: 'agent',
|
|
domain: 'test-execution' as DomainName,
|
|
weight: 1.0,
|
|
createdAt: new Date(),
|
|
});
|
|
graph.addEdge({
|
|
source: 'known-1',
|
|
target: 'known-2',
|
|
weight: 3.14,
|
|
type: 'coordination',
|
|
bidirectional: true,
|
|
});
|
|
|
|
const result = await analyzeTool.execute({}, createContext());
|
|
|
|
expect(result.success).toBe(true);
|
|
// MinCut value should be the edge weight (since 2 vertices with 1 edge)
|
|
expect(result.data!.minCutValue).toBe(3.14);
|
|
expect(result.metadata?.dataSource).toBe('real');
|
|
});
|
|
});
|
|
});
|