feat(knowledge-flywheel): add Phase 3 Knowledge Flywheel — AI analysis, review queue, analytics
Phase 3 implementation: - AI session analysis service that generates flow proposals from resolved sessions - APScheduler job for batch processing pending analyses (max_instances=1) - Knowledge gap detection (weak options, high escalation signals) - Flow proposals CRUD with team admin review workflow (approve/edit/dismiss/reject) - FlowPilot analytics dashboard with confidence tiers, PSA metrics, knowledge gaps - In-session script generator component - Review queue page with filtering and proposal detail panel Bug fixes from review (12 total): - Fix "Edit & Publish" navigating to non-existent /editor/new route - Hide Approve button for enhancement proposals (require Edit & Publish) - Add max_instances=1 to scheduler to prevent TOCTOU race - Fix eventual_success case() double-counting failed retries - Add tree_structure validation before creating tree from proposal - Simplify script generator rendering condition - Add severity style fallback, toFixed on rates, Link instead of <a href> - Add toast.warning on dismiss failure, fix dedup for domain-less sessions - Cast Decimal to int in knowledge gap evidence dicts Also updates CLAUDE.md with lessons 67-71 and Phase 3 project structure. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
38
frontend/src/types/flow-proposal.ts
Normal file
38
frontend/src/types/flow-proposal.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
// ── Flow Proposals (Knowledge Flywheel / Review Queue) ──
|
||||
|
||||
export interface FlowProposalSummary {
|
||||
id: string
|
||||
proposal_type: 'new_flow' | 'enhancement' | 'branch_addition' | 'auto_reinforced'
|
||||
title: string
|
||||
description: string | null
|
||||
problem_domain: string | null
|
||||
confidence_score: number
|
||||
supporting_session_count: number
|
||||
status: 'pending' | 'approved' | 'modified' | 'rejected' | 'dismissed' | 'auto_reinforced'
|
||||
target_flow_id: string | null
|
||||
source_session_id: string
|
||||
created_at: string
|
||||
}
|
||||
|
||||
export interface FlowProposalDetail extends FlowProposalSummary {
|
||||
proposed_flow_data: Record<string, unknown>
|
||||
proposed_diff: Record<string, unknown> | null
|
||||
supporting_session_ids: string[]
|
||||
reviewer_notes: string | null
|
||||
reviewed_by: string | null
|
||||
reviewed_at: string | null
|
||||
}
|
||||
|
||||
export interface ReviewProposalRequest {
|
||||
action: 'approve' | 'reject' | 'modify' | 'dismiss'
|
||||
reviewer_notes?: string | null
|
||||
modified_flow_data?: Record<string, unknown> | null
|
||||
}
|
||||
|
||||
export interface FlowProposalStats {
|
||||
pending_count: number
|
||||
approved_this_week: number
|
||||
rejected_this_week: number
|
||||
auto_reinforced_this_week: number
|
||||
top_domains: Array<{ domain: string; count: number }>
|
||||
}
|
||||
79
frontend/src/types/flowpilot-analytics.ts
Normal file
79
frontend/src/types/flowpilot-analytics.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
export interface MTTRDataPoint {
|
||||
date: string
|
||||
mttr_minutes: number
|
||||
session_count: number
|
||||
}
|
||||
|
||||
export interface DomainBreakdown {
|
||||
domain: string
|
||||
total: number
|
||||
resolved: number
|
||||
escalated: number
|
||||
resolution_rate: number
|
||||
}
|
||||
|
||||
export interface ConfidenceBreakdown {
|
||||
guided_sessions: number
|
||||
guided_resolution_rate: number
|
||||
exploring_sessions: number
|
||||
exploring_resolution_rate: number
|
||||
discovery_sessions: number
|
||||
discovery_resolution_rate: number
|
||||
}
|
||||
|
||||
export interface DomainCoverage {
|
||||
domain: string
|
||||
flow_count: number
|
||||
session_count: number
|
||||
guided_rate: number
|
||||
}
|
||||
|
||||
export interface KnowledgeCoverage {
|
||||
total_flows: number
|
||||
ai_generated_flows: number
|
||||
total_proposals_pending: number
|
||||
proposals_approved_this_period: number
|
||||
proposals_rejected_this_period: number
|
||||
coverage_by_domain: DomainCoverage[]
|
||||
}
|
||||
|
||||
export interface PsaMetrics {
|
||||
ticket_link_rate: number
|
||||
auto_push_success_rate: number
|
||||
auto_push_retry_success_rate: number
|
||||
total_time_entries_logged: number
|
||||
total_hours_logged: number
|
||||
}
|
||||
|
||||
export interface FlowPilotDashboard {
|
||||
period: string
|
||||
total_sessions: number
|
||||
resolved_sessions: number
|
||||
escalated_sessions: number
|
||||
abandoned_sessions: number
|
||||
resolution_rate: number
|
||||
avg_steps_to_resolution: number
|
||||
avg_session_duration_minutes: number
|
||||
avg_rating: number | null
|
||||
mttr_minutes: number | null
|
||||
mttr_trend: MTTRDataPoint[]
|
||||
sessions_by_domain: DomainBreakdown[]
|
||||
confidence_breakdown: ConfidenceBreakdown
|
||||
knowledge_coverage: KnowledgeCoverage
|
||||
psa_metrics: PsaMetrics | null
|
||||
}
|
||||
|
||||
export interface KnowledgeGap {
|
||||
gap_type: string
|
||||
domain: string | null
|
||||
severity: 'high' | 'medium' | 'low'
|
||||
title: string
|
||||
description: string
|
||||
evidence: Record<string, unknown>
|
||||
suggested_action: string
|
||||
}
|
||||
|
||||
export interface KnowledgeGapReport {
|
||||
generated_at: string
|
||||
gaps: KnowledgeGap[]
|
||||
}
|
||||
@@ -13,6 +13,8 @@ export * from './analytics'
|
||||
export * from './copilot'
|
||||
export type { AssistantChat, AssistantChatMessage, ChatListItem, ChatMessageResponse, RetentionSettings } from './assistant-chat'
|
||||
export * from './ai-session'
|
||||
export * from './flow-proposal'
|
||||
export * from './flowpilot-analytics'
|
||||
|
||||
// API response wrapper types
|
||||
export interface PaginatedResponse<T> {
|
||||
|
||||
@@ -73,7 +73,8 @@ export interface ScriptTemplateDetail extends ScriptTemplateListItem {
|
||||
export interface ScriptGenerateRequest {
|
||||
template_id: string
|
||||
parameters: Record<string, unknown>
|
||||
session_id?: string // Phase 3: passed when generating inside a session
|
||||
session_id?: string // Legacy tree-based session
|
||||
ai_session_id?: string // FlowPilot AI session
|
||||
}
|
||||
|
||||
export interface ScriptGenerateResponse {
|
||||
|
||||
Reference in New Issue
Block a user