- {!summaryData?.success && (
-
- Skip to Integration Code
-
- )}
-
}
- disabled={!summaryData?.success}
- onClick={() => setCurrentStep(1)}
- >
- Preview Results
+
+
} onClick={handleBackToTypeSelection}>
+ Back
+
+ {!summaryData?.success && (
+
+ Skip to Integration Code
+
+ )}
+ }
+ disabled={!summaryData?.success}
+ onClick={() => setCurrentStep(2)}
+ >
+ Preview Results
+
+
)}
- {/* ─── Step 1: Preview & Validate ─── */}
- {currentStep === 1 && !summaryData?.success && (
+ {/* ─── Dep Step 2: Preview & Validate ─── */}
+ {integrationType === 'dependency' && currentStep === 2 && !summaryData?.success && (
{
message="Preview data is no longer available. Please run Test Query again."
style={{ marginBottom: 16 }}
/>
- setCurrentStep(0)}>Back to Configure
+ setCurrentStep(1)}>Back to Configure
)}
- {currentStep === 1 && summaryData?.success && (
+ {integrationType === 'dependency' && currentStep === 2 && summaryData?.success && (
@@ -526,25 +708,18 @@ const AIIntegrationHub: React.FC = () => {
/>
- }
- onClick={() => setCurrentStep(0)}
- >
+ } onClick={() => setCurrentStep(1)}>
Back
- }
- onClick={() => setCurrentStep(2)}
- >
+ } onClick={() => setCurrentStep(3)}>
Integration Code
)}
- {/* ─── Step 2: Integration Code ─── */}
- {currentStep === 2 && !summaryData?.success && !summaryParams && (
+ {/* ─── Dep Step 3: Integration Code ─── */}
+ {integrationType === 'dependency' && currentStep === 3 && !summaryData?.success && !summaryParams && (
{
message="Configuration required. Please set up your query in the Configure step."
style={{ marginBottom: 16 }}
/>
- setCurrentStep(0)}>Back to Configure
+ setCurrentStep(1)}>Back to Configure
)}
- {currentStep === 2 && (summaryData?.success || summaryParams) && (
+ {integrationType === 'dependency' && currentStep === 3 && (summaryData?.success || summaryParams) && (
{!summaryData?.success && (
{
style={{ marginBottom: 16 }}
/>
-
+
Pipeline Platform:
@@ -617,7 +789,7 @@ const AIIntegrationHub: React.FC = () => {
showIcon
icon={ }
message="Pre-deployment risk assessment"
- description="Use this endpoint to assess the impact of deploying changes to a service. Returns a risk score (0-100), affected services count, and actionable recommendations."
+ description={<>Use this endpoint to assess the impact of deploying changes to a service. You can also set up Blast Radius as a dedicated integration type from Step 1.>}
style={{ marginBottom: 16 }}
/>
{
]}
/>
-
+
Test blast radius assessments interactively
@@ -648,26 +820,7 @@ const AIIntegrationHub: React.FC = () => {
]}
/>
-
Authentication}
- size="small"
- style={{ marginTop: 16 }}
- >
-
- All API calls require authentication via API Key . Include the header X-API-Key: fk_your_key in every request.
-
-
- Go to Settings and open the API Keys tab
- Click Generate New API Key and give it a descriptive name (e.g. "azure-devops-pipeline")
- Copy the generated key (starts with fk_ ) and store it securely in your CI/CD platform's secrets/variables
-
-
-
+ {authCard}
@@ -675,10 +828,10 @@ const AIIntegrationHub: React.FC = () => {
Each dependency includes its Kubernetes annotations and labels .
- Your AI agent or pipeline should:
+ Your pipeline should:
- Extract annotations["git-repo"] from each downstream service to identify affected repositories
+ Extract annotations["git-repo"] from each downstream service to identify affected repositories
Check is_critical flag to prioritize critical dependency changes
Use service_category grouping to understand the type of each dependency (database, cache, API, etc.)
Examine callers to understand which services call the changed service
@@ -686,14 +839,144 @@ const AIIntegrationHub: React.FC = () => {
- } onClick={() => setCurrentStep(summaryData?.success ? 1 : 0)}>
+ } onClick={() => setCurrentStep(summaryData?.success ? 2 : 1)}>
{summaryData?.success ? 'Back to Preview' : 'Back to Configure'}
)}
+
+ {/* ═══════════════════════════════════════════════════════════ */}
+ {/* BLAST RADIUS GATE FLOW (Steps 1-2) */}
+ {/* ═══════════════════════════════════════════════════════════ */}
+
+ {/* ─── BR Step 1: Configure ─── */}
+ {integrationType === 'blast_radius' && currentStep === 1 && (
+
+
+ Configure your pre-deployment risk assessment integration. The Blast Radius API evaluates the impact of changes
+ and returns a risk score with recommendations — your pipeline decides what to do.
+
+
+
+
+
+
+ {PIPELINE_PLATFORMS.map(p => {p.label} )}
+
+
+
+
+
+
+ setBrTargetService(e.target.value)}
+ />
+
+
+
+
+ setBrTargetNamespace(e.target.value)}
+ />
+
+
+
+
+
+
+ } onClick={handleBackToTypeSelection}>
+ Back
+
+ } onClick={() => setCurrentStep(2)}>
+ Generate Integration Code
+
+
+
+ )}
+
+ {/* ─── BR Step 2: Integration Code ─── */}
+ {integrationType === 'blast_radius' && currentStep === 2 && (
+
+
+
+
+
+ Pipeline Platform:
+
+ {PIPELINE_PLATFORMS.map(p => {p.label} )}
+
+
+
+
+
{PIPELINE_PLATFORMS.find(p => p.value === platform)?.label || 'Pipeline'},
+ children: ,
+ },
+ {
+ key: 'br-curl',
+ label: curl ,
+ children: ,
+ },
+ ]}
+ />
+
+
+
+ The POST /api/v1/blast-radius/assess endpoint returns a risk assessment:
+
+
+
+
+
+
+ risk_score}>0-100, higher = more risky
+ risk_level}>low / medium / high / critical
+ blast_radius.total_affected}>Total services in impact zone
+ blast_radius.critical_services}>Names of critical downstream services
+ recommendation}>proceed / review_required / delay_suggested
+ advisory_only}>Always true — Flowfish never blocks deployments
+
+
+
+ {authCard}
+
+
+
+ } style={{ padding: 0 }}>
+ Test blast radius assessments interactively
+
+
+
+
+
+ } onClick={() => setCurrentStep(1)}>
+ Back to Configure
+
+
+
+ )}
);
};
-export default AIIntegrationHub;
+export default IntegrationHub;
diff --git a/frontend/src/pages/Map.tsx b/frontend/src/pages/Map.tsx
index 64f76e1..87a58e0 100644
--- a/frontend/src/pages/Map.tsx
+++ b/frontend/src/pages/Map.tsx
@@ -85,7 +85,6 @@ import {
BarChartOutlined,
CheckCircleOutlined,
AlertOutlined,
- RobotOutlined,
CopyOutlined,
} from '@ant-design/icons';
import { useNavigate } from 'react-router-dom';
@@ -7673,25 +7672,25 @@ const MapInner: React.FC = () => {
})() : null,
},
{
- key: 'ai-hub',
- label:
AI Hub,
- children: drawerTab === 'ai-hub' ? (
+ key: 'integration',
+ label:
Integration,
+ children: drawerTab === 'integration' ? (
- Analyze this service's dependencies, impact radius, and generate integration snippets for AI Agents and CI/CD pipelines.
+ Analyze this service's dependencies, impact radius, and generate integration snippets for CI/CD pipelines.
}
+ icon={
}
onClick={() => {
const node = selectedNode as any;
const params = new URLSearchParams();
if (node?.name) params.set('owner_name', node.owner_name || node.name);
if (node?.namespace && node.namespace !== 'external') params.set('namespace', node.namespace);
- navigate(`/integration/ai-hub?${params.toString()}`);
+ navigate(`/integration/hub?${params.toString()}`);
}}
>
- Open AI Integration Hub
+ Open Integration Hub
) : null,