diff --git a/README.md b/README.md index daac807..7f1403f 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Centralized multi-cluster Kubernetes observability platform — real-time depend - [Change Detection](#change-detection) - [Impact Simulation](#impact-simulation) - [Blast Radius Oracle](#blast-radius-oracle) - - [AI Integration Hub](#ai-integration-hub) + - [Integration Hub](#integration-hub) - [Pod & Deployment Annotations](#pod--deployment-annotations) - [Activity Monitor](#activity-monitor) - [Events Timeline](#events-timeline) @@ -101,8 +101,8 @@ Unlike traditional APM tools that require agent installation or service meshes t - **Role-Based Access Control** — User and role management with Admin, Viewer, and custom roles with granular permissions - **Multi-Tab Dashboard** — Overview, Operations, Security, Network, Changes, and Workloads tabs with real-time metrics - **CI/CD Pipeline Integration** — Blast radius checks for Azure DevOps, GitHub Actions, Jenkins, and GitLab CI -- **AI Integration Hub** — Three-step wizard (Configure → Preview → Integration Code) for dependency data integrations with ready-to-use code snippets for Azure DevOps, GitHub Actions, Jenkins, GitLab CI, Python, JavaScript, and cURL — includes a Blast Radius tab for pre-deployment risk assessment pipeline integration -- **Pod & Deployment Annotations** — Full annotation support including automatic merge of Deployment/StatefulSet annotations into pods, visible across Map, Network Explorer, Application Inventory, Impact Simulation, and AI Integration Hub +- **Integration Hub** — Four-step wizard (Integration Type → Configure → Preview → Integration Code) for dependency data and blast radius gate integrations with ready-to-use code snippets for Azure DevOps, GitHub Actions, Jenkins, GitLab CI, Python, JavaScript, and cURL +- **Pod & Deployment Annotations** — Full annotation support including automatic merge of Deployment/StatefulSet annotations into pods, visible across Map, Network Explorer, Application Inventory, Impact Simulation, and Integration Hub - **API Key Management** — Generate, expire, and revoke API keys for secure programmatic access alongside JWT authentication --- @@ -251,9 +251,9 @@ The analysis wizard guides you through creating a new eBPF data collection sessi ![API Documentation](docs/screenshots/APIs.png) -**AI Integration Hub** — Three-step wizard for dependency data integrations. Configure analysis scope and service identification method, preview dependency results with upstream/downstream statistics, and generate ready-to-use code snippets (Pipeline YAML, cURL, Python, JavaScript) with a dedicated Blast Radius tab for pre-deployment risk assessment: +**Integration Hub** — Four-step wizard for dependency data and blast radius gate integrations. Select integration type, configure analysis scope and service identification method, preview dependency results with upstream/downstream statistics, and generate ready-to-use code snippets (Pipeline YAML, cURL, Python, JavaScript): -![AI Integration Hub](docs/screenshots/ai-integration-hub.png) +![Integration Hub](docs/screenshots/integration-hub.png) --- @@ -644,7 +644,7 @@ The Blast Radius Oracle provides a **pre-deployment impact assessment API** desi ```yaml - script: | RESULT=$(curl -s -X POST "$(FLOWFISH_URL)/api/v1/blast-radius/assess" \ - -H "Authorization: Bearer $(FLOWFISH_TOKEN)" \ + -H "X-API-Key: $(FLOWFISH_API_KEY)" \ -H "Content-Type: application/json" \ -d '{"cluster_id": $(CLUSTER_ID), "change": {"type": "image_update", "target": "payment-service", "namespace": "production"}}') echo "Risk Score: $(echo $RESULT | jq '.risk_score')" @@ -657,7 +657,7 @@ The Blast Radius Oracle provides a **pre-deployment impact assessment API** desi - name: Blast Radius Check run: | RESULT=$(curl -s -X POST "${{ secrets.FLOWFISH_URL }}/api/v1/blast-radius/assess" \ - -H "Authorization: Bearer ${{ secrets.FLOWFISH_TOKEN }}" \ + -H "X-API-Key: ${{ secrets.FLOWFISH_API_KEY }}" \ -H "Content-Type: application/json" \ -d '{"cluster_id": ${{ env.CLUSTER_ID }}, "change": {"type": "image_update", "target": "payment-service", "namespace": "production"}}') echo "Risk: $(echo $RESULT | jq -r '.risk_level')" @@ -671,7 +671,7 @@ stage('Blast Radius Check') { def result = httpRequest( url: "${FLOWFISH_URL}/api/v1/blast-radius/assess", httpMode: 'POST', - customHeaders: [[name: 'Authorization', value: "Bearer ${FLOWFISH_TOKEN}"]], + customHeaders: [[name: 'X-API-Key', value: "${FLOWFISH_API_KEY}"]], requestBody: '{"cluster_id": ' + CLUSTER_ID + ', "change": {"type": "image_update", "target": "payment-service", "namespace": "production"}}' ) def json = readJSON text: result.content @@ -691,13 +691,13 @@ The UI includes a live test runner for ad-hoc assessments: select cluster, analy Full history of all assessments with assessment ID, timestamp, target, namespace, change type, risk score, risk level, affected count, and pipeline source. Click any entry for detailed JSON view. -The Overview tab also includes a cross-link to the **AI Integration Hub** for users who need dependency data integrations alongside blast radius assessments. +The Overview tab also includes a cross-link to the **Integration Hub** for users who need dependency data integrations alongside blast radius assessments. --- -### AI Integration Hub +### Integration Hub -The AI Integration Hub provides a **three-step guided wizard** (Configure → Preview → Integration Code) for setting up dependency data integrations with AI code agents and CI/CD pipelines. It enables cross-project impact analysis by exposing Flowfish dependency data through a compact, categorized JSON API. The wizard also includes a Blast Radius tab for generating pre-deployment risk assessment pipeline snippets, with a cross-link to the Blast Radius Oracle page for interactive testing. +The Integration Hub provides a **four-step guided wizard** (Integration Type → Configure → Preview → Integration Code) for setting up CI/CD pipeline integrations. Users choose between two integration types: **Dependency Analysis** for cross-project impact analysis via categorized dependency data, or **Blast Radius Gate** for pre-deployment risk scoring. The wizard generates ready-to-use pipeline snippets for all major CI/CD platforms with consistent `X-API-Key` authentication. #### Use Case: Cross-Project Impact Analysis @@ -763,7 +763,7 @@ Annotations are visible across: - **Application Inventory** — Searchable annotation column with expandable detail view - **Network Explorer** — Metadata column with annotations included in CSV exports - **Impact Simulation** — Affected service annotations in results and exports -- **AI Integration Hub** — Annotations exposed in dependency summary API responses +- **Integration Hub** — Annotations exposed in dependency summary API responses Internal Kubernetes annotations (`kubectl.kubernetes.io/`, `kubernetes.io/`, `openshift.io/` prefixes) are filtered during ingestion to reduce noise, and values exceeding 500 characters are excluded. @@ -1556,7 +1556,7 @@ Interactive docs at `http://localhost:8000/api/docs` (Swagger) or `http://localh | **Analyses** | `/api/v1/analyses` | Create, start, stop, delete analyses | | **Dependencies** | `/api/v1/dependencies` | Graph queries, upstream/downstream | | **Communications** | `/api/v1/communications` | Network flow data | -| **AI Integration** | `/api/v1/communications/dependencies/*` | Dependency summary, stream, batch, diff, and impact for AI agents and CI/CD pipelines | +| **Integration** | `/api/v1/communications/dependencies/*` | Dependency summary, stream, batch, diff, and impact for CI/CD pipelines | | **Changes** | `/api/v1/changes` | Change detection events | | **Blast Radius** | `/api/v1/blast-radius` | Pre-deployment assessment | | **Simulation** | `/api/v1/simulation` | Impact simulation | diff --git a/api/openapi-spec.yaml b/api/openapi-spec.yaml index 855fb7a..97b5062 100644 --- a/api/openapi-spec.yaml +++ b/api/openapi-spec.yaml @@ -12,7 +12,7 @@ info: - **Real-Time Dependency Map** — Live visualization of service dependency graphs - **Anomaly Detection** — Intelligent anomaly detection powered by statistical analysis - **Multi-Cluster** — Manage multiple clusters from a single interface - - **AI Integration** — Dependency intelligence APIs for AI agents and CI/CD pipeline integration + - **Integration** — Dependency intelligence APIs for CI/CD pipeline integration - **Pod & Deployment Annotations** — Rich metadata enrichment including annotations merged from owning Deployments/StatefulSets - **Import/Export** — Data import and export in multiple formats @@ -57,8 +57,8 @@ tags: description: Kubernetes workload inventory (Pod, Deployment, Service, StatefulSet) with labels and annotations - name: Communications description: Service-to-service communication records and dependency graphs - - name: AI Integration - description: Dependency intelligence APIs for AI agents and CI/CD pipeline integrations — dependency discovery, impact analysis, and cross-project dependency mapping + - name: Integration + description: Dependency intelligence APIs for CI/CD pipeline integrations — dependency discovery, impact analysis, and cross-project dependency mapping - name: Dependencies description: Dependency map and graph queries - name: Anomalies @@ -1231,7 +1231,7 @@ paths: /communications/dependencies/stream: get: tags: - - AI Integration + - Integration - Communications summary: Get pod dependencies as upstream/downstream description: | @@ -1340,7 +1340,7 @@ paths: /communications/dependencies/batch: post: tags: - - AI Integration + - Integration - Communications summary: Batch query dependencies for multiple services requestBody: @@ -1360,7 +1360,7 @@ paths: /communications/dependencies/diff: get: tags: - - AI Integration + - Integration - Communications summary: Get dependency diff between two analyses parameters: @@ -1401,7 +1401,7 @@ paths: /communications/dependencies/impact: get: tags: - - AI Integration + - Integration - Communications summary: Dependency impact analysis by change type parameters: @@ -1469,10 +1469,10 @@ paths: /communications/dependencies/summary: get: tags: - - AI Integration - summary: AI-agent-friendly dependency summary grouped by category + - Integration + summary: Dependency summary grouped by category for CI/CD integration description: | - Returns a compact, grouped dependency summary for AI agents and CI/CD pipelines. + Returns a compact, grouped dependency summary for CI/CD pipelines and automation. Dependencies are grouped by service_category. Annotations and labels are prominently exposed for cross-project impact analysis (e.g. git-repo URLs, team info). Requires at least one analysis_id and one search parameter. diff --git a/backend/main.py b/backend/main.py index 87f86a7..c75410b 100644 --- a/backend/main.py +++ b/backend/main.py @@ -200,7 +200,7 @@ openapi_tags = [ {"name": "Analyses", "description": "Traffic analysis creation, lifecycle, and run management"}, {"name": "Workloads", "description": "Kubernetes workload inventory and metadata"}, {"name": "Communications", "description": "Service-to-service communication graph, dependency map, and topology"}, - {"name": "AI Integration", "description": "AI agent and CI/CD pipeline integration endpoints for dependency discovery, impact analysis, and cross-project dependency mapping"}, + {"name": "Integration", "description": "CI/CD pipeline integration endpoints for dependency discovery, impact analysis, and cross-project dependency mapping"}, {"name": "Impact Analysis", "description": "Blast radius assessment, impact simulation, and pre-deployment risk evaluation"}, {"name": "Events", "description": "eBPF event statistics, queries, and timeline"}, {"name": "Changes", "description": "Change detection and infrastructure drift tracking"}, diff --git a/backend/routers/communications.py b/backend/routers/communications.py index 84b33c6..be3d2cd 100644 --- a/backend/routers/communications.py +++ b/backend/routers/communications.py @@ -1351,7 +1351,7 @@ async def _get_neo4j_error_stats( ) -@router.get("/dependencies/stream", tags=["AI Integration"]) +@router.get("/dependencies/stream", tags=["Integration"]) async def find_pod_dependencies( analysis_id: Optional[int] = Query(None, description="Analysis ID for scope"), cluster_id: Optional[int] = Query(None, description="Cluster ID for scope"), @@ -1431,7 +1431,7 @@ async def find_pod_dependencies( ) -@router.post("/dependencies/batch", tags=["AI Integration"]) +@router.post("/dependencies/batch", tags=["Integration"]) async def batch_find_dependencies( request: dict, current_user: dict = Depends(get_current_user) @@ -1452,7 +1452,7 @@ async def batch_find_dependencies( raise HTTPException(status_code=500, detail=str(e)) -@router.get("/dependencies/diff", tags=["AI Integration"]) +@router.get("/dependencies/diff", tags=["Integration"]) async def diff_dependencies( analysis_id_before: str = Query(..., description="Analysis ID before"), analysis_id_after: str = Query(..., description="Analysis ID after"), @@ -1491,7 +1491,7 @@ async def diff_dependencies( raise HTTPException(status_code=500, detail=str(e)) -@router.get("/dependencies/summary", tags=["AI Integration"]) +@router.get("/dependencies/summary", tags=["Integration"]) async def get_dependency_summary( analysis_ids: List[int] = Query(..., description="Analysis IDs (required, at least one)"), cluster_id: Optional[int] = Query(None, description="Cluster ID"), @@ -1549,7 +1549,7 @@ async def get_dependency_summary( raise HTTPException(status_code=500, detail=str(e)) -@router.get("/dependencies/impact", tags=["AI Integration"]) +@router.get("/dependencies/impact", tags=["Integration"]) async def get_dependency_impact( analysis_id: Optional[int] = Query(None, description="Analysis ID"), cluster_id: Optional[int] = Query(None, description="Cluster ID"), diff --git a/docs/02-feature-list.md b/docs/02-feature-list.md index 38385db..1bfaeb7 100644 --- a/docs/02-feature-list.md +++ b/docs/02-feature-list.md @@ -1255,8 +1255,8 @@ Range: 0-100 - Security events - Audit events -### 2.10. AI Integration Hub -- Three-step guided wizard (Configure → Preview → Integration Code) for dependency data integrations +### 2.10. Integration Hub +- Four-step guided wizard (Integration Type → Configure → Preview → Integration Code) with two integration paths: Dependency Analysis and Blast Radius Gate - Configure step: analysis selection, service identification method (Annotation, Label, Namespace + Deployment, Pod Name, Advanced), search depth, live test query - Preview step: dependency summary with upstream service metadata, downstream/caller statistics, matched services table - Integration Code step: tabbed snippet generation (Pipeline YAML, cURL, Python, JavaScript, Blast Radius) @@ -2105,7 +2105,7 @@ Would you like me to create rollback CR? | **Authentication** | ✅ OAuth/SSO, K8s SA | ✅ | ✅ | | **API Key Management** | ✅ | ✅ | ✅ | | **Pod & Deployment Annotations** | ✅ | ✅ | ✅ | -| **AI Integration Hub** | ❌ | ✅ | ✅ | +| **Integration Hub** | ❌ | ✅ | ✅ | | **Multi-Cluster** | ❌ | ✅ | ✅ | | **Change Detection** | ❌ | ✅ | ✅ | | **Anomaly Detection** | ❌ | ✅ LLM | ✅ LLM + ML models | diff --git a/docs/03-architecture.md b/docs/03-architecture.md index 1c28d30..3c7f9c3 100644 --- a/docs/03-architecture.md +++ b/docs/03-architecture.md @@ -877,7 +877,7 @@ frontend/ │ │ ├── PolicySimulation.tsx │ │ ├── UserManagement.tsx │ │ ├── Settings.tsx -│ │ └── Integrations.tsx +│ │ └── IntegrationHub.tsx │ ├── store/ # Redux store │ │ ├── index.ts │ │ ├── slices/ @@ -978,7 +978,7 @@ frontend/ The HTTP API is organized under `/api/v1/` (see the endpoint tree under **Backend API (FastAPI)** above). **Authentication** supports both **JWT** (standard Bearer tokens) and **API keys** supplied via the **`X-API-Key`** header, so automation, agents, and CI/CD can authenticate without an interactive login flow. -**AI Integration** exposes dependency-oriented endpoints for AI agents and CI/CD pipelines (tagged **AI Integration** in the OpenAPI spec), including: +**Integration** exposes dependency-oriented endpoints for CI/CD pipelines (tagged **Integration** in the OpenAPI spec), including: | Area | Path (relative to `/api/v1`) | |------|------------------------------| diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 27b905b..ccc127f 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -24,7 +24,7 @@ import Settings from './pages/Settings'; import UserManagement from './pages/UserManagement'; import BlastRadiusOracle from './pages/BlastRadiusOracle'; import APIDocumentation from './pages/APIDocumentation'; -import AIIntegrationHub from './pages/AIIntegrationHub'; +import IntegrationHub from './pages/IntegrationHub'; // Build Timestamp forces unique webpack hash on each build const BUILD_TIMESTAMP = process.env.REACT_APP_BUILD_TIMESTAMP || 'dev'; @@ -76,8 +76,9 @@ const App: React.FC = () => { } /> } /> - {/* AI Integration routes */} - } /> + {/* Integration routes */} + } /> + } /> {/* Observability routes */} } /> diff --git a/frontend/src/components/Layout/Sidebar.tsx b/frontend/src/components/Layout/Sidebar.tsx index 0489ec8..f8f4fc5 100644 --- a/frontend/src/components/Layout/Sidebar.tsx +++ b/frontend/src/components/Layout/Sidebar.tsx @@ -18,7 +18,6 @@ import { RadarChartOutlined, AlertOutlined, RocketOutlined, - RobotOutlined, } from '@ant-design/icons'; import FlowfishLogo from '../FlowfishLogo'; import type { MenuProps } from 'antd'; @@ -98,13 +97,13 @@ const Sidebar: React.FC = ({ collapsed }) => { }, { key: 'integration', - icon: , - label: 'AI Integration', + icon: , + label: 'Integration', children: [ { - key: '/integration/ai-hub', - label: 'AI Integration Hub', - onClick: () => navigate('/integration/ai-hub'), + key: '/integration/hub', + label: 'Integration Hub', + onClick: () => navigate('/integration/hub'), }, ], }, diff --git a/frontend/src/constants/index.ts b/frontend/src/constants/index.ts index ee3be74..a6a9199 100644 --- a/frontend/src/constants/index.ts +++ b/frontend/src/constants/index.ts @@ -55,5 +55,5 @@ export const ROUTES = { ANALYSIS_WIZARD: '/analysis/wizard', DEPENDENCY_MAP: '/discovery/map', CLUSTER_MANAGEMENT: '/management/clusters', - AI_INTEGRATION_HUB: '/integration/ai-hub', + INTEGRATION_HUB: '/integration/hub', } as const; diff --git a/frontend/src/pages/APIDocumentation.tsx b/frontend/src/pages/APIDocumentation.tsx index 05074db..f8986ad 100644 --- a/frontend/src/pages/APIDocumentation.tsx +++ b/frontend/src/pages/APIDocumentation.tsx @@ -171,7 +171,7 @@ curl -s -f -H "X-API-Key: fk_your_api_key_here" \\ curl -X GET "${baseUrl}/api/v1/clusters" \\ -H "Authorization: Bearer eyJhbGciOiJIUz..." -# Example: Get dependency summary (AI Integration) +# Example: Get dependency summary (Integration) curl -s -f -H "X-API-Key: fk_your_api_key" \\ "${baseUrl}/api/v1/communications/dependencies/summary?analysis_ids=1&namespace=production" @@ -194,7 +194,7 @@ curl -X GET "${baseUrl}/api/v1/communications/graph?cluster_id=1" \\
  • Workloads - Kubernetes workload inventory and metadata
  • Analyses - Traffic analysis creation, scheduling, and lifecycle
  • Communications - Service-to-service communication and dependency graphs
  • -
  • AI Integration - Dependency discovery, impact analysis, and CI/CD pipeline integration endpoints
  • +
  • Integration - Dependency discovery, impact analysis, and CI/CD pipeline integration endpoints
  • Events & Event Types - eBPF event statistics, queries, and type definitions
  • Changes - Change detection and infrastructure drift tracking
  • Simulation & Blast Radius - Impact simulation and pre-deployment assessment
  • diff --git a/frontend/src/pages/BlastRadiusOracle.tsx b/frontend/src/pages/BlastRadiusOracle.tsx index 0190908..3cf63eb 100644 --- a/frontend/src/pages/BlastRadiusOracle.tsx +++ b/frontend/src/pages/BlastRadiusOracle.tsx @@ -24,18 +24,17 @@ import { Alert, Tabs, Select, - Input, Form, message, Badge, Progress, - Tooltip, Divider, Empty, Spin, Modal, Timeline, List, + Descriptions, theme, } from 'antd'; import { @@ -43,7 +42,6 @@ import { ApiOutlined, HistoryOutlined, PlayCircleOutlined, - CopyOutlined, CheckCircleOutlined, ExclamationCircleOutlined, WarningOutlined, @@ -56,16 +54,19 @@ import { ReloadOutlined, InfoCircleOutlined, FileTextOutlined, - SettingOutlined, - RobotOutlined, } from '@ant-design/icons'; -import { Link } from 'react-router-dom'; +import { Link, useSearchParams } from 'react-router-dom'; import { useGetClustersQuery } from '../store/api/clusterApi'; import { useGetAnalysesQuery } from '../store/api/analysisApi'; import { colors } from '../styles/colors'; +import CodeBlock from '../components/integration/CodeBlock'; +import { + PIPELINE_PLATFORMS, + buildBlastRadiusCurlSnippet, + buildBlastRadiusPipelineSnippet, +} from '../utils/snippetBuilders'; const { Title, Text, Paragraph } = Typography; -const { TabPane } = Tabs; const { Option } = Select; const { useToken } = theme; @@ -121,183 +122,14 @@ interface AssessmentResult { assessment_duration_ms: number; } -// Code snippets for different CI/CD platforms -const codeSnippets = { - azureDevOps: `# Azure DevOps Pipeline - Flowfish Blast Radius Check -- task: Bash@3 - displayName: '🐟 Flowfish Blast Radius Check' - inputs: - targetType: 'inline' - script: | - #!/bin/bash - set -e - - echo "==========================================" - echo "🐟 Flowfish Blast Radius Assessment" - echo "==========================================" - - # Flowfish API çağrısı - RESPONSE=$(curl -s -w "\\n%{http_code}" -X POST \\ - "$(FLOWFISH_URL)/api/v1/blast-radius/assess" \\ - -H "Authorization: Bearer $(FLOWFISH_TOKEN)" \\ - -H "Content-Type: application/json" \\ - -d '{ - "cluster_id": $(CLUSTER_ID), - "change": { - "type": "$(Build.Reason)", - "target": "$(SERVICE_NAME)", - "namespace": "$(NAMESPACE)", - "triggered_by": "$(Build.RequestedFor)", - "pipeline": "$(Build.DefinitionName)", - "commit": "$(Build.SourceVersion)" - } - }') - - # Response ve HTTP code ayır - HTTP_CODE=$(echo "$RESPONSE" | tail -n1) - BODY=$(echo "$RESPONSE" | sed '$d') - - # API erişilemezse devam et - if [ "$HTTP_CODE" != "200" ]; then - echo "⚠️ Flowfish API unreachable. Continuing..." - exit 0 - fi - - # Sonuçları göster - RISK_SCORE=$(echo "$BODY" | jq -r '.risk_score') - RISK_LEVEL=$(echo "$BODY" | jq -r '.risk_level') - AFFECTED=$(echo "$BODY" | jq -r '.blast_radius.total_affected') - - echo "📊 Risk Score: $RISK_SCORE/100" - echo "📊 Risk Level: $RISK_LEVEL" - echo "📊 Affected Services: $AFFECTED" - - # Pipeline variable olarak kaydet - echo "##vso[task.setvariable variable=RISK_SCORE]$RISK_SCORE" - echo "##vso[task.setvariable variable=RISK_LEVEL]$RISK_LEVEL" - continueOnError: true # Flowfish hatası pipeline'ı durdurmaz - env: - FLOWFISH_URL: $(FLOWFISH_URL) - FLOWFISH_TOKEN: $(FLOWFISH_TOKEN)`, - - jenkins: `// Jenkins Pipeline - Flowfish Blast Radius Check -stage('Blast Radius Check') { - steps { - script { - def response = httpRequest( - url: "\${FLOWFISH_URL}/api/v1/blast-radius/assess", - httpMode: 'POST', - contentType: 'APPLICATION_JSON', - customHeaders: [[name: 'Authorization', value: "Bearer \${FLOWFISH_TOKEN}"]], - requestBody: """ - { - "cluster_id": \${CLUSTER_ID}, - "change": { - "type": "image_update", - "target": "\${SERVICE_NAME}", - "namespace": "\${NAMESPACE}", - "triggered_by": "\${BUILD_USER}", - "pipeline": "\${JOB_NAME}" - } - } - """, - validResponseCodes: '200:500' - ) - - if (response.status == 200) { - def result = readJSON(text: response.content) - echo "🐟 Risk Score: \${result.risk_score}/100" - echo "🐟 Risk Level: \${result.risk_level}" - echo "🐟 Affected: \${result.blast_radius.total_affected} services" - - // Takımın kendi kuralı - if (result.risk_score > 80 && env.STRICT_MODE == 'true') { - input message: "High risk! Approve deployment?" - } - } else { - echo "⚠️ Flowfish unavailable, continuing..." - } - } - } -}`, - - githubActions: `# GitHub Actions - Flowfish Blast Radius Check -- name: 🐟 Flowfish Blast Radius Check - id: blast-radius - continue-on-error: true - run: | - RESPONSE=$(curl -s -X POST \\ - "\${{ secrets.FLOWFISH_URL }}/api/v1/blast-radius/assess" \\ - -H "Authorization: Bearer \${{ secrets.FLOWFISH_TOKEN }}" \\ - -H "Content-Type: application/json" \\ - -d '{ - "cluster_id": \${{ vars.CLUSTER_ID }}, - "change": { - "type": "image_update", - "target": "\${{ github.event.repository.name }}", - "namespace": "\${{ vars.NAMESPACE }}", - "triggered_by": "\${{ github.actor }}", - "pipeline": "\${{ github.workflow }}", - "commit": "\${{ github.sha }}" - } - }') - - RISK_SCORE=$(echo "$RESPONSE" | jq -r '.risk_score // 0') - RISK_LEVEL=$(echo "$RESPONSE" | jq -r '.risk_level // "unknown"') - - echo "risk_score=$RISK_SCORE" >> $GITHUB_OUTPUT - echo "risk_level=$RISK_LEVEL" >> $GITHUB_OUTPUT - echo "🐟 Risk: $RISK_SCORE/100 ($RISK_LEVEL)" - -- name: Comment PR with Risk Assessment - if: github.event_name == 'pull_request' - uses: actions/github-script@v6 - with: - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: '🐟 **Flowfish Blast Radius**: \${{ steps.blast-radius.outputs.risk_score }}/100 (\${{ steps.blast-radius.outputs.risk_level }})' - })`, - - curl: `# Simple cURL Example -curl -X POST "https://flowfish.your-domain.com/api/v1/blast-radius/assess" \\ - -H "Authorization: Bearer YOUR_TOKEN" \\ - -H "Content-Type: application/json" \\ - -d '{ - "cluster_id": 1, - "change": { - "type": "image_update", - "target": "payment-service", - "namespace": "production", - "triggered_by": "deploy-bot", - "pipeline": "main-deploy" - } - }' - -# Response: -# { -# "assessment_id": "br-20260117-abc123", -# "risk_score": 72, -# "risk_level": "high", -# "blast_radius": { -# "total_affected": 14, -# "direct_dependencies": 3, -# "critical_services": ["checkout", "order-service"] -# }, -# "recommendation": "review_required", -# "advisory_only": true -# }` -}; - const BlastRadiusOracle: React.FC = () => { const { token } = useToken(); - const [activeTab, setActiveTab] = useState('overview'); + const [searchParams, setSearchParams] = useSearchParams(); + const [activeTab, setActiveTab] = useState(searchParams.get('tab') || 'overview'); const [assessments, setAssessments] = useState([]); const [stats, setStats] = useState(null); const [loading, setLoading] = useState(false); - const [selectedPlatform, setSelectedPlatform] = useState('azureDevOps'); + const [selectedPlatform, setSelectedPlatform] = useState('azure_devops'); // Test form state const [testForm] = Form.useForm(); @@ -389,6 +221,11 @@ const BlastRadiusOracle: React.FC = () => { fetchStats(); }, [fetchAssessments, fetchStats]); + const handleTabChange = (key: string) => { + setActiveTab(key); + setSearchParams({ tab: key }, { replace: true }); + }; + // Run test assessment const runTestAssessment = async (values: any) => { setTesting(true); @@ -418,7 +255,7 @@ const BlastRadiusOracle: React.FC = () => { const result = await response.json(); setTestResult(result); message.success(`Assessment completed: Risk Score ${result.risk_score}/100`); - fetchAssessments(); // Refresh history + fetchAssessments(); fetchStats(); } else { const error = await response.json(); @@ -431,15 +268,6 @@ const BlastRadiusOracle: React.FC = () => { } }; - const copyCode = async (code: string) => { - try { - await navigator.clipboard.writeText(code); - message.success('Code copied to clipboard!'); - } catch { - message.error('Clipboard unavailable'); - } - }; - // View assessment detail const viewAssessmentDetail = async (assessmentId: string) => { try { @@ -499,7 +327,7 @@ const BlastRadiusOracle: React.FC = () => { title: 'Change', dataIndex: 'change_type', key: 'change_type', - render: (type: string) => {type.replace('_', ' ')}, + render: (type: string) => {type.replaceAll('_', ' ')}, }, { title: 'Risk Score', @@ -547,6 +375,515 @@ const BlastRadiusOracle: React.FC = () => { }, ]; + // ─── Overview tab content ─── + const overviewContent = ( + + + + + Flowfish Blast Radius Oracle provides risk assessment and recommendations, + but never blocks deployments. Your pipeline owns the decision. + +
      +
    • Risk score 0-100 with level classification
    • +
    • Affected services list (direct & indirect)
    • +
    • Actionable recommendations
    • +
    • Full history and statistics
    • +
    + + } + type="info" + showIcon + icon={} + style={{ marginBottom: 16 }} + /> + + + + 1. Pipeline calls Flowfish API +
    + POST /api/v1/blast-radius/assess + + ), + }, + { + color: 'cyan', + children: ( +
    + 2. Flowfish analyzes dependencies +
    + Uses existing analysis data and dependency graph +
    + ), + }, + { + color: 'green', + children: ( +
    + 3. Returns risk score & recommendations +
    + JSON response with score, affected services, suggestions +
    + ), + }, + { + color: 'gold', + children: ( +
    + 4. Pipeline decides what to do +
    + Continue, require approval, delay - your rules +
    + ), + }, + ]} + /> +
    + + + + API Endpoint} + size="small" + bordered + style={{ marginBottom: 16 }} + > +
    + POST + /api/v1/blast-radius/assess +
    + + + + Request Body: +
    +{`{
    +  "cluster_id": 1,
    +  "change": {
    +    "type": "image_update",
    +    "target": "payment-service",
    +    "namespace": "production",
    +    "triggered_by": "jenkins",
    +    "pipeline": "main-deploy"
    +  }
    +}`}
    +          
    +
    + + Response Fields} + size="small" + bordered + > + ( + + {item.field} + {item.desc} + + )} + /> + + + + + +
    + Need dependency data for CI/CD pipelines? +
    + + + Integration Hub — generate integration snippets for dependency analysis + + +
    +
    +
    + +
    + ); + + // ─── Integration tab content ─── + const integrationContent = ( +
    + + + + For a complete guided setup wizard with all platforms and authentication docs, visit the{' '} + Integration Hub. + + + } + type="info" + showIcon={false} + style={{ marginBottom: 16 }} + action={ + + + + } + /> + +
    + Platform: + +
    + + {PIPELINE_PLATFORMS.find(p => p.value === selectedPlatform)?.label || 'Pipeline'}, + children: , + }, + { + key: 'br-curl', + label: curl, + children: , + }, + ]} + /> + + + Required Variables + + FLOWFISH_URL}> + Flowfish API base URL + + FLOWFISH_API_KEY}> + + API Key from Settings > API Keys + + + CLUSTER_ID}> + Target cluster ID in Flowfish + + + +
    + ); + + // ─── Test tab content ─── + const testContent = ( + + + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + {!testResult && !testing && ( + + )} + + {testing && ( +
    + +
    + Analyzing dependencies... +
    +
    + )} + + {testResult && ( +
    +
    + ( +
    +
    {p}
    + + {testResult.risk_level.toUpperCase()} + +
    + )} + width={150} + /> +
    + + Confidence: {Math.round(testResult.confidence * 100)}% | + Duration: {testResult.assessment_duration_ms}ms + +
    +
    + + + + + + + + + + + + + + + + {testResult.blast_radius.critical_services.length > 0 && ( +
    + Critical Services: +
    + {testResult.blast_radius.critical_services.map((s, i) => ( + {s} + ))} +
    +
    + )} + + + + Suggested Actions: + ( + + + {action.priority === 'critical' && } + {action.priority === 'high' && } + {action.priority === 'medium' && } + {action.priority === 'low' && } +
    + {action.action} + {action.automatable && Automatable} +
    +
    +
    + )} + /> + + + + + Need deeper analysis with flow diagrams, chaos templates, and network policy generation?{' '} + + Open Impact Simulation + + + } + type="info" + showIcon + icon={} + /> +
    + )} +
    + +
    + ); + + // ─── History tab content ─── + const historyContent = ( +
    +
    + +
    + + + + ); + return (
    {/* Header */} @@ -563,7 +900,7 @@ const BlastRadiusOracle: React.FC = () => {
    {/* Stats Cards */} - {stats && ( + {stats ? ( @@ -589,7 +926,7 @@ const BlastRadiusOracle: React.FC = () => { } /> @@ -605,545 +942,54 @@ const BlastRadiusOracle: React.FC = () => { + ) : ( + + +
    + + Run your first assessment or integrate with a CI/CD pipeline to see statistics here. + +
    )} {/* Main Tabs */} - - {/* Overview Tab */} - Overview} - key="overview" - > - -
    - - - Flowfish Blast Radius Oracle provides risk assessment and recommendations, - but never blocks deployments. Your pipeline owns the decision. - -
      -
    • Risk score 0-100 with level classification
    • -
    • Affected services list (direct & indirect)
    • -
    • Actionable recommendations
    • -
    • Full history and statistics
    • -
    - - } - type="info" - showIcon - icon={} - style={{ marginBottom: 16 }} - /> - - - - 1. Pipeline calls Flowfish API -
    - POST /api/v1/blast-radius/assess - - ), - }, - { - color: 'cyan', - children: ( -
    - 2. Flowfish analyzes dependencies -
    - Uses existing analysis data and dependency graph -
    - ), - }, - { - color: 'green', - children: ( -
    - 3. Returns risk score & recommendations -
    - JSON response with score, affected services, suggestions -
    - ), - }, - { - color: 'gold', - children: ( -
    - 4. Pipeline decides what to do -
    - Continue, require approval, delay - your rules -
    - ), - }, - ]} - /> -
    - - -
    - API Endpoint} - size="small" - bordered - style={{ marginBottom: 16 }} - > -
    - POST - /api/v1/blast-radius/assess -
    - - - - Request Body: -
    -{`{
    -  "cluster_id": 1,
    -  "change": {
    -    "type": "image_update",
    -    "target": "payment-service",
    -    "namespace": "production",
    -    "triggered_by": "jenkins",
    -    "pipeline": "main-deploy"
    -  }
    -}`}
    -                  
    -
    - - Response Fields} - size="small" - bordered - > - ( - - {item.field} - {item.desc} - - )} - /> - - - - - -
    - Need dependency data for AI agents? -
    - - - AI Integration Hub — generate integration snippets for dependency analysis - - -
    -
    -
    - - - - - {/* Integration Tab */} - Integration} - key="integration" - > -
    - Platform: - -
    - - - - - {selectedPlatform === 'azureDevOps' && 'Azure DevOps Pipeline'} - {selectedPlatform === 'jenkins' && 'Jenkins Pipeline'} - {selectedPlatform === 'githubActions' && 'GitHub Actions'} - {selectedPlatform === 'curl' && 'cURL Example'} - - - } - extra={ - - } - > -
    -                {codeSnippets[selectedPlatform as keyof typeof codeSnippets]}
    -              
    -
    - - -
    - FLOWFISH_URL -
    - Flowfish API base URL - - - FLOWFISH_TOKEN -
    - JWT authentication token - - - CLUSTER_ID -
    - Target cluster ID in Flowfish - - - } - type="warning" - showIcon - style={{ marginTop: 16 }} - /> - - - {/* Test Tab */} - Test} - key="test" - > - - - -
    - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - {!testResult && !testing && ( - + Overview, + children: overviewContent, + }, + { + key: 'integration', + label: Integration, + children: integrationContent, + }, + { + key: 'test', + label: Test, + children: testContent, + }, + { + key: 'history', + label: ( + + History + {assessments.length > 0 && ( + )} - - {testing && ( -
    - -
    - Analyzing dependencies... -
    -
    - )} - - {testResult && ( -
    - {/* Risk Score Display */} -
    - ( -
    -
    {p}
    - - {testResult.risk_level.toUpperCase()} - -
    - )} - width={150} - /> -
    - - Confidence: {Math.round(testResult.confidence * 100)}% | - Duration: {testResult.assessment_duration_ms}ms - -
    -
    - - - - {/* Blast Radius */} - -
    - - - - - - - - - - - {/* Critical Services */} - {testResult.blast_radius.critical_services.length > 0 && ( -
    - Critical Services: -
    - {testResult.blast_radius.critical_services.map((s, i) => ( - {s} - ))} -
    -
    - )} - - {/* Recommendation */} - - - {/* Suggested Actions */} - Suggested Actions: - ( - - - {action.priority === 'critical' && } - {action.priority === 'high' && } - {action.priority === 'medium' && } - {action.priority === 'low' && } -
    - {action.action} - {action.automatable && Automatable} -
    -
    -
    - )} - /> - - )} - - - - - - {/* History Tab */} - - History - {assessments.length > 0 && ( - - )} - - } - key="history" - > -
    - -
    - -
    - - + + ), + children: historyContent, + }, + ]} + /> {/* Assessment Detail Modal */} diff --git a/frontend/src/pages/AIIntegrationHub.tsx b/frontend/src/pages/IntegrationHub.tsx similarity index 59% rename from frontend/src/pages/AIIntegrationHub.tsx rename to frontend/src/pages/IntegrationHub.tsx index d4a489b..f25fe4c 100644 --- a/frontend/src/pages/AIIntegrationHub.tsx +++ b/frontend/src/pages/IntegrationHub.tsx @@ -25,7 +25,8 @@ import { theme, } from 'antd'; import { - RobotOutlined, + ApiOutlined, + BranchesOutlined, CodeOutlined, CheckCircleOutlined, ArrowLeftOutlined, @@ -63,9 +64,29 @@ import { const { Text, Title, Paragraph } = Typography; const { Option } = Select; -const AIIntegrationHub: React.FC = () => { +type IntegrationType = 'dependency' | 'blast_radius' | null; + +const EXAMPLE_BR_RESPONSE = `{ + "assessment_id": "br-20260327-abc123", + "risk_score": 42, + "risk_level": "medium", + "blast_radius": { + "total_affected": 8, + "direct_dependencies": 3, + "indirect_dependencies": 5, + "critical_services": ["checkout-service"] + }, + "recommendation": "proceed", + "suggested_actions": [ + { "action": "Notify checkout-service team", "priority": "medium" } + ], + "advisory_only": true +}`; + +const IntegrationHub: React.FC = () => { const { token } = theme.useToken(); const [currentStep, setCurrentStep] = useState(0); + const [integrationType, setIntegrationType] = useState(null); const [form] = Form.useForm(); const [selectedAnalysisIds, setSelectedAnalysisIds] = useState([]); @@ -73,6 +94,10 @@ const AIIntegrationHub: React.FC = () => { const [idMethod, setIdMethod] = useState('annotation'); const [depth, setDepth] = useState(1); + // Blast Radius Gate flow state + const [brTargetService, setBrTargetService] = useState(''); + const [brTargetNamespace, setBrTargetNamespace] = useState(''); + const [triggerSummary, { data: rawSummaryData, isFetching: summaryLoading, error: rawSummaryError }] = useLazyGetDependencySummaryQuery(); const [summaryParams, setSummaryParams] = useState(null); @@ -91,6 +116,8 @@ const AIIntegrationHub: React.FC = () => { const urlAnnotationKey = searchParams.get('annotation_key'); const urlAnnotationValue = searchParams.get('annotation_value'); if (urlOwner || urlNs || urlAnnotationKey) { + setIntegrationType('dependency'); + setCurrentStep(1); if (urlAnnotationKey) setIdMethod('annotation'); else if (urlOwner || urlNs) setIdMethod('namespace_deployment'); setTimeout(() => { @@ -132,7 +159,7 @@ const AIIntegrationHub: React.FC = () => { return raw; }, [summaryError, summaryData]); - const canProceedStep0 = selectedAnalysisIds.length > 0; + const canProceedConfigure = selectedAnalysisIds.length > 0; const buildParamsFromForm = useCallback((): DependencySummaryParams | null => { const values = form.getFieldsValue(); @@ -180,7 +207,7 @@ const AIIntegrationHub: React.FC = () => { return; } setSummaryParams(params); - setCurrentStep(2); + setCurrentStep(3); }, [selectedAnalysisIds, buildParamsFromForm]); const responseSize = useMemo(() => { @@ -191,15 +218,85 @@ const AIIntegrationHub: React.FC = () => { const contextNamespace = summaryParams?.namespace; const contextOwnerName = summaryParams?.owner_name; + const handleSelectType = (type: IntegrationType) => { + setIntegrationType(type); + setCurrentStep(1); + }; + + const handleBackToTypeSelection = () => { + setIntegrationType(null); + setCurrentStep(0); + setBrTargetService(''); + setBrTargetNamespace(''); + resetSummary(); + }; + + const depSteps = [ + { title: 'Integration Type', icon: }, + { title: 'Configure', icon: }, + { title: 'Preview', icon: }, + { title: 'Integration Code', icon: }, + ]; + + const brSteps = [ + { title: 'Integration Type', icon: }, + { title: 'Configure', icon: }, + { title: 'Integration Code', icon: }, + ]; + + const activeSteps = integrationType === 'blast_radius' ? brSteps : depSteps; + + const handleStepClick = (n: number) => { + if (n === 0) { + handleBackToTypeSelection(); + return; + } + if (n < currentStep) { + setCurrentStep(n); + return; + } + if (integrationType === 'dependency') { + if (n === 2 && summaryData?.success) setCurrentStep(n); + else if (n === 3 && (summaryData?.success || summaryParams)) setCurrentStep(n); + } + if (integrationType === 'blast_radius') { + if (n === 2) setCurrentStep(n); + } + }; + + // ─── Shared auth card ─── + const authCard = ( + 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. + +
      +
    1. Go to Settings and open the API Keys tab
    2. +
    3. Click Generate New API Key and give it a descriptive name (e.g. "azure-devops-pipeline")
    4. +
    5. Copy the generated key (starts with fk_) and store it securely in your CI/CD platform's secrets/variables
    6. +
    + +
    + ); + return (
    - <RobotOutlined /> AI Integration Hub + <ApiOutlined /> Integration Hub - Set up CI/CD pipeline and AI agent integrations with Flowfish dependency and impact data. + Set up CI/CD pipeline integrations with Flowfish dependency and impact data.
    @@ -207,24 +304,104 @@ const AIIntegrationHub: React.FC = () => {
    - - { - if (n < currentStep) setCurrentStep(n); - else if (n === 1 && summaryData?.success) setCurrentStep(n); - else if (n === 2 && (summaryData?.success || summaryParams)) setCurrentStep(n); - }} - items={[ - { title: 'Configure', icon: }, - { title: 'Preview', icon: }, - { title: 'Integration Code', icon: }, - ]} - /> - + {integrationType && ( + + + + )} - {/* ─── Step 0: Configure ─── */} + {/* ═══════════════════════════════════════════════════════════ */} + {/* Step 0: Integration Type Selection */} + {/* ═══════════════════════════════════════════════════════════ */} {currentStep === 0 && ( + +
    + handleSelectType('dependency')} + style={{ + height: '100%', + borderColor: token.colorPrimary, + cursor: 'pointer', + transition: 'box-shadow 0.2s', + }} + styles={{ body: { padding: 24 } }} + > +
    +
    + +
    +
    + Dependency Analysis + Most Common +
    +
    + + Expose cross-service dependency data to CI/CD pipelines. Identify affected repositories, critical services, and downstream impact chains. + +
      +
    • Multi-analysis scope with 5 identification methods
    • +
    • Live preview with downstream/caller categorization
    • +
    • Pipeline YAML, curl, Python, and JavaScript snippets
    • +
    • Git-repo annotation extraction for cross-project impact
    • +
    +
    + +
    +
    + + + handleSelectType('blast_radius')} + style={{ + height: '100%', + cursor: 'pointer', + transition: 'box-shadow 0.2s', + }} + styles={{ body: { padding: 24 } }} + > +
    +
    + +
    + Blast Radius Gate +
    + + Add pre-deployment risk scoring to your CI/CD pipeline. Get automated risk assessments, affected service counts, and actionable recommendations. + +
      +
    • Risk score (0-100) with level classification
    • +
    • Blast radius: direct, indirect, and critical services
    • +
    • Advisory-only — Flowfish never blocks deployments
    • +
    • Pipeline snippets for all major CI/CD platforms
    • +
    +
    + +
    +
    + + + )} + + {/* ═══════════════════════════════════════════════════════════ */} + {/* DEPENDENCY ANALYSIS FLOW (Steps 1-3) */} + {/* ═══════════════════════════════════════════════════════════ */} + + {/* ─── Dep Step 1: Configure ─── */} + {integrationType === 'dependency' && currentStep === 1 && ( @@ -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 from Step 1.} style={{ marginBottom: 16 }} /> { ]} />
    - + @@ -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. - -
      -
    1. Go to Settings and open the API Keys tab
    2. -
    3. Click Generate New API Key and give it a descriptive name (e.g. "azure-devops-pipeline")
    4. -
    5. Copy the generated key (starts with fk_) and store it securely in your CI/CD platform's secrets/variables
    6. -
    - -
    + {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:
      -
    1. Extract annotations["git-repo"] from each downstream service to identify affected repositories
    2. +
    3. Extract annotations["git-repo"] from each downstream service to identify affected repositories
    4. Check is_critical flag to prioritize critical dependency changes
    5. Use service_category grouping to understand the type of each dependency (database, cache, API, etc.)
    6. Examine callers to understand which services call the changed service
    7. @@ -686,14 +839,144 @@ const AIIntegrationHub: React.FC = () => {
      -
    )} + + {/* ═══════════════════════════════════════════════════════════ */} + {/* 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. + + + + +
    + + + + + +
    + + setBrTargetService(e.target.value)} + /> + + + + + setBrTargetNamespace(e.target.value)} + /> + + + + + +
    + + +
    + + )} + + {/* ─── BR Step 2: Integration Code ─── */} + {integrationType === 'blast_radius' && currentStep === 2 && ( +
    + + + + + Pipeline Platform: + + + + + {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} + +
    + + + +
    + +
    + +
    +
    + )} ); }; -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.
    ) : null,