feat(sdk,iace): add Personalized Drafting Pipeline v2 and IACE engine
All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-ai-compliance (push) Successful in 44s
CI / test-python-backend-compliance (push) Successful in 37s
CI / test-python-document-crawler (push) Successful in 22s
CI / test-python-dsms-gateway (push) Successful in 20s
All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-ai-compliance (push) Successful in 44s
CI / test-python-backend-compliance (push) Successful in 37s
CI / test-python-document-crawler (push) Successful in 22s
CI / test-python-dsms-gateway (push) Successful in 20s
Drafting Engine: 7-module pipeline with narrative tags, allowed facts governance, PII sanitizer, prose validator with repair loop, hash-based cache, and terminology guide. v1 fallback via ?v=1 query param. IACE: Initial AI-Act Conformity Engine with risk classifier, completeness checker, hazard library, and PostgreSQL store for AI system assessments. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -20,15 +20,10 @@ import (
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/roadmap"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/ucca"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/whistleblower"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/dsb"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/multitenant"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/reporting"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/sso"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/iace"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/vendor"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/workshop"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/portfolio"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/gci"
|
||||
"github.com/breakpilot/ai-compliance-sdk/internal/training"
|
||||
"github.com/gin-contrib/cors"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
@@ -73,10 +68,7 @@ func main() {
|
||||
whistleblowerStore := whistleblower.NewStore(pool)
|
||||
incidentStore := incidents.NewStore(pool)
|
||||
vendorStore := vendor.NewStore(pool)
|
||||
reportingStore := reporting.NewStore(pool, dsgvoStore, vendorStore, incidentStore, whistleblowerStore, academyStore)
|
||||
ssoStore := sso.NewStore(pool)
|
||||
multitenantStore := multitenant.NewStore(pool, rbacStore, reportingStore)
|
||||
dsbStore := dsb.NewStore(pool, reportingStore)
|
||||
iaceStore := iace.NewStore(pool)
|
||||
|
||||
// Initialize services
|
||||
rbacService := rbac.NewService(rbacStore)
|
||||
@@ -120,24 +112,7 @@ func main() {
|
||||
whistleblowerHandlers := handlers.NewWhistleblowerHandlers(whistleblowerStore)
|
||||
incidentHandlers := handlers.NewIncidentHandlers(incidentStore)
|
||||
vendorHandlers := handlers.NewVendorHandlers(vendorStore)
|
||||
reportingHandlers := handlers.NewReportingHandlers(reportingStore)
|
||||
ssoHandlers := handlers.NewSSOHandlers(ssoStore, cfg.JWTSecret)
|
||||
multitenantHandlers := handlers.NewMultiTenantHandlers(multitenantStore, rbacStore)
|
||||
industryHandlers := handlers.NewIndustryHandlers()
|
||||
dsbHandlers := handlers.NewDSBHandlers(dsbStore)
|
||||
|
||||
// Initialize GCI engine and handlers
|
||||
gciEngine := gci.NewEngine()
|
||||
gciHandlers := handlers.NewGCIHandlers(gciEngine)
|
||||
|
||||
// Initialize Training Engine
|
||||
trainingStore := training.NewStore(pool)
|
||||
ttsClient := training.NewTTSClient(cfg.TTSServiceURL)
|
||||
contentGenerator := training.NewContentGenerator(providerRegistry, piiDetector, trainingStore, ttsClient)
|
||||
trainingHandlers := handlers.NewTrainingHandlers(trainingStore, contentGenerator)
|
||||
|
||||
// Initialize RAG handlers
|
||||
ragHandlers := handlers.NewRAGHandlers()
|
||||
iaceHandler := handlers.NewIACEHandler(iaceStore)
|
||||
|
||||
// Initialize middleware
|
||||
rbacMiddleware := rbac.NewMiddleware(rbacService, policyEngine)
|
||||
@@ -494,7 +469,6 @@ func main() {
|
||||
|
||||
// Certificates
|
||||
academyRoutes.GET("/certificates/:id", academyHandlers.GetCertificate)
|
||||
academyRoutes.GET("/certificates/:id/pdf", academyHandlers.DownloadCertificatePDF)
|
||||
academyRoutes.POST("/enrollments/:id/certificate", academyHandlers.GenerateCertificate)
|
||||
|
||||
// Quiz
|
||||
@@ -600,159 +574,73 @@ func main() {
|
||||
vendorRoutes.GET("/stats", vendorHandlers.GetStatistics)
|
||||
}
|
||||
|
||||
// Reporting routes - Executive Compliance Reporting Dashboard
|
||||
reportingRoutes := v1.Group("/reporting")
|
||||
// IACE routes - Industrial AI Compliance Engine (CE-Risikobeurteilung SW/FW/KI)
|
||||
iaceRoutes := v1.Group("/iace")
|
||||
{
|
||||
reportingRoutes.GET("/executive", reportingHandlers.GetExecutiveReport)
|
||||
reportingRoutes.GET("/score", reportingHandlers.GetComplianceScore)
|
||||
reportingRoutes.GET("/deadlines", reportingHandlers.GetUpcomingDeadlines)
|
||||
reportingRoutes.GET("/risks", reportingHandlers.GetRiskOverview)
|
||||
}
|
||||
// Hazard Library (project-independent)
|
||||
iaceRoutes.GET("/hazard-library", iaceHandler.ListHazardLibrary)
|
||||
|
||||
// SSO routes - Single Sign-On (SAML/OIDC)
|
||||
ssoRoutes := v1.Group("/sso")
|
||||
{
|
||||
// Config CRUD
|
||||
ssoRoutes.POST("/configs", ssoHandlers.CreateConfig)
|
||||
ssoRoutes.GET("/configs", ssoHandlers.ListConfigs)
|
||||
ssoRoutes.GET("/configs/:id", ssoHandlers.GetConfig)
|
||||
ssoRoutes.PUT("/configs/:id", ssoHandlers.UpdateConfig)
|
||||
ssoRoutes.DELETE("/configs/:id", ssoHandlers.DeleteConfig)
|
||||
// Project Management
|
||||
iaceRoutes.POST("/projects", iaceHandler.CreateProject)
|
||||
iaceRoutes.GET("/projects", iaceHandler.ListProjects)
|
||||
iaceRoutes.GET("/projects/:id", iaceHandler.GetProject)
|
||||
iaceRoutes.PUT("/projects/:id", iaceHandler.UpdateProject)
|
||||
iaceRoutes.DELETE("/projects/:id", iaceHandler.ArchiveProject)
|
||||
|
||||
// SSO Users
|
||||
ssoRoutes.GET("/users", ssoHandlers.ListUsers)
|
||||
// Onboarding
|
||||
iaceRoutes.POST("/projects/:id/init-from-profile", iaceHandler.InitFromProfile)
|
||||
iaceRoutes.POST("/projects/:id/completeness-check", iaceHandler.CheckCompleteness)
|
||||
|
||||
// OIDC Flow
|
||||
ssoRoutes.GET("/oidc/login", ssoHandlers.InitiateOIDCLogin)
|
||||
ssoRoutes.GET("/oidc/callback", ssoHandlers.HandleOIDCCallback)
|
||||
}
|
||||
// Components
|
||||
iaceRoutes.POST("/projects/:id/components", iaceHandler.CreateComponent)
|
||||
iaceRoutes.GET("/projects/:id/components", iaceHandler.ListComponents)
|
||||
iaceRoutes.PUT("/projects/:id/components/:cid", iaceHandler.UpdateComponent)
|
||||
iaceRoutes.DELETE("/projects/:id/components/:cid", iaceHandler.DeleteComponent)
|
||||
|
||||
// Multi-Tenant Administration routes
|
||||
mtRoutes := v1.Group("/multi-tenant")
|
||||
{
|
||||
mtRoutes.GET("/overview", multitenantHandlers.GetOverview)
|
||||
mtRoutes.POST("/tenants", multitenantHandlers.CreateTenant)
|
||||
mtRoutes.GET("/tenants/:id", multitenantHandlers.GetTenantDetail)
|
||||
mtRoutes.PUT("/tenants/:id", multitenantHandlers.UpdateTenant)
|
||||
mtRoutes.GET("/tenants/:id/namespaces", multitenantHandlers.ListNamespaces)
|
||||
mtRoutes.POST("/tenants/:id/namespaces", multitenantHandlers.CreateNamespace)
|
||||
mtRoutes.POST("/switch", multitenantHandlers.SwitchTenant)
|
||||
}
|
||||
// Regulatory Classification
|
||||
iaceRoutes.POST("/projects/:id/classify", iaceHandler.Classify)
|
||||
iaceRoutes.GET("/projects/:id/classifications", iaceHandler.GetClassifications)
|
||||
iaceRoutes.POST("/projects/:id/classify/:regulation", iaceHandler.ClassifySingle)
|
||||
|
||||
// Industry-Specific Templates routes (Phase 3.3)
|
||||
industryRoutes := v1.Group("/industry/templates")
|
||||
{
|
||||
industryRoutes.GET("", industryHandlers.ListIndustries)
|
||||
industryRoutes.GET("/:slug", industryHandlers.GetIndustry)
|
||||
industryRoutes.GET("/:slug/vvt", industryHandlers.GetVVTTemplates)
|
||||
industryRoutes.GET("/:slug/tom", industryHandlers.GetTOMRecommendations)
|
||||
industryRoutes.GET("/:slug/risks", industryHandlers.GetRiskScenarios)
|
||||
}
|
||||
// Hazards
|
||||
iaceRoutes.POST("/projects/:id/hazards", iaceHandler.CreateHazard)
|
||||
iaceRoutes.GET("/projects/:id/hazards", iaceHandler.ListHazards)
|
||||
iaceRoutes.PUT("/projects/:id/hazards/:hid", iaceHandler.UpdateHazard)
|
||||
iaceRoutes.POST("/projects/:id/hazards/suggest", iaceHandler.SuggestHazards)
|
||||
|
||||
// DSB-as-a-Service Portal routes (Phase 3.4)
|
||||
dsbRoutes := v1.Group("/dsb")
|
||||
{
|
||||
dsbRoutes.GET("/dashboard", dsbHandlers.GetDashboard)
|
||||
dsbRoutes.POST("/assignments", dsbHandlers.CreateAssignment)
|
||||
dsbRoutes.GET("/assignments", dsbHandlers.ListAssignments)
|
||||
dsbRoutes.GET("/assignments/:id", dsbHandlers.GetAssignment)
|
||||
dsbRoutes.PUT("/assignments/:id", dsbHandlers.UpdateAssignment)
|
||||
dsbRoutes.POST("/assignments/:id/hours", dsbHandlers.CreateHourEntry)
|
||||
dsbRoutes.GET("/assignments/:id/hours", dsbHandlers.ListHours)
|
||||
dsbRoutes.GET("/assignments/:id/hours/summary", dsbHandlers.GetHoursSummary)
|
||||
dsbRoutes.POST("/assignments/:id/tasks", dsbHandlers.CreateTask)
|
||||
dsbRoutes.GET("/assignments/:id/tasks", dsbHandlers.ListTasks)
|
||||
dsbRoutes.PUT("/tasks/:taskId", dsbHandlers.UpdateTask)
|
||||
dsbRoutes.POST("/tasks/:taskId/complete", dsbHandlers.CompleteTask)
|
||||
dsbRoutes.POST("/assignments/:id/communications", dsbHandlers.CreateCommunication)
|
||||
dsbRoutes.GET("/assignments/:id/communications", dsbHandlers.ListCommunications)
|
||||
}
|
||||
// Risk Assessment
|
||||
iaceRoutes.POST("/projects/:id/hazards/:hid/assess", iaceHandler.AssessRisk)
|
||||
iaceRoutes.GET("/projects/:id/risk-summary", iaceHandler.GetRiskSummary)
|
||||
iaceRoutes.POST("/projects/:id/hazards/:hid/reassess", iaceHandler.ReassessRisk)
|
||||
|
||||
// GCI routes - Gesamt-Compliance-Index
|
||||
gciRoutes := v1.Group("/gci")
|
||||
{
|
||||
// Core GCI endpoints
|
||||
gciRoutes.GET("/score", gciHandlers.GetScore)
|
||||
gciRoutes.GET("/score/breakdown", gciHandlers.GetScoreBreakdown)
|
||||
gciRoutes.GET("/score/history", gciHandlers.GetHistory)
|
||||
gciRoutes.GET("/matrix", gciHandlers.GetMatrix)
|
||||
gciRoutes.GET("/audit-trail", gciHandlers.GetAuditTrail)
|
||||
gciRoutes.GET("/profiles", gciHandlers.GetWeightProfiles)
|
||||
// Mitigations
|
||||
iaceRoutes.POST("/projects/:id/hazards/:hid/mitigations", iaceHandler.CreateMitigation)
|
||||
iaceRoutes.PUT("/mitigations/:mid", iaceHandler.UpdateMitigation)
|
||||
iaceRoutes.POST("/mitigations/:mid/verify", iaceHandler.VerifyMitigation)
|
||||
|
||||
// NIS2 sub-routes
|
||||
gciRoutes.GET("/nis2/score", gciHandlers.GetNIS2Score)
|
||||
gciRoutes.GET("/nis2/roles", gciHandlers.ListNIS2Roles)
|
||||
gciRoutes.POST("/nis2/roles/assign", gciHandlers.AssignNIS2Role)
|
||||
// Evidence
|
||||
iaceRoutes.POST("/projects/:id/evidence", iaceHandler.UploadEvidence)
|
||||
iaceRoutes.GET("/projects/:id/evidence", iaceHandler.ListEvidence)
|
||||
|
||||
// ISO 27001 sub-routes
|
||||
gciRoutes.GET("/iso/gap-analysis", gciHandlers.GetISOGapAnalysis)
|
||||
gciRoutes.GET("/iso/mappings", gciHandlers.ListISOMappings)
|
||||
gciRoutes.GET("/iso/mappings/:controlId", gciHandlers.GetISOMapping)
|
||||
}
|
||||
// Verification Plans
|
||||
iaceRoutes.POST("/projects/:id/verification-plan", iaceHandler.CreateVerificationPlan)
|
||||
iaceRoutes.PUT("/verification-plan/:vid", iaceHandler.UpdateVerificationPlan)
|
||||
iaceRoutes.POST("/verification-plan/:vid/complete", iaceHandler.CompleteVerification)
|
||||
|
||||
// CE Technical File
|
||||
iaceRoutes.POST("/projects/:id/tech-file/generate", iaceHandler.GenerateTechFile)
|
||||
iaceRoutes.GET("/projects/:id/tech-file", iaceHandler.ListTechFileSections)
|
||||
iaceRoutes.PUT("/projects/:id/tech-file/:section", iaceHandler.UpdateTechFileSection)
|
||||
iaceRoutes.POST("/projects/:id/tech-file/:section/approve", iaceHandler.ApproveTechFileSection)
|
||||
iaceRoutes.GET("/projects/:id/tech-file/export", iaceHandler.ExportTechFile)
|
||||
|
||||
// Training Engine routes - Compliance Training Management
|
||||
trainingRoutes := v1.Group("/training")
|
||||
{
|
||||
// Modules
|
||||
trainingRoutes.GET("/modules", trainingHandlers.ListModules)
|
||||
trainingRoutes.GET("/modules/:id", trainingHandlers.GetModule)
|
||||
trainingRoutes.POST("/modules", trainingHandlers.CreateModule)
|
||||
trainingRoutes.PUT("/modules/:id", trainingHandlers.UpdateModule)
|
||||
// Monitoring
|
||||
iaceRoutes.POST("/projects/:id/monitoring", iaceHandler.CreateMonitoringEvent)
|
||||
iaceRoutes.GET("/projects/:id/monitoring", iaceHandler.ListMonitoringEvents)
|
||||
iaceRoutes.PUT("/projects/:id/monitoring/:eid", iaceHandler.UpdateMonitoringEvent)
|
||||
|
||||
// Training Matrix (CTM)
|
||||
trainingRoutes.GET("/matrix", trainingHandlers.GetMatrix)
|
||||
trainingRoutes.GET("/matrix/:role", trainingHandlers.GetMatrixForRole)
|
||||
trainingRoutes.POST("/matrix", trainingHandlers.SetMatrixEntry)
|
||||
trainingRoutes.DELETE("/matrix/:role/:moduleId", trainingHandlers.DeleteMatrixEntry)
|
||||
|
||||
// Assignments
|
||||
trainingRoutes.POST("/assignments/compute", trainingHandlers.ComputeAssignments)
|
||||
trainingRoutes.GET("/assignments", trainingHandlers.ListAssignments)
|
||||
trainingRoutes.GET("/assignments/:id", trainingHandlers.GetAssignment)
|
||||
trainingRoutes.POST("/assignments/:id/start", trainingHandlers.StartAssignment)
|
||||
trainingRoutes.POST("/assignments/:id/progress", trainingHandlers.UpdateAssignmentProgress)
|
||||
trainingRoutes.POST("/assignments/:id/complete", trainingHandlers.CompleteAssignment)
|
||||
|
||||
// Quiz
|
||||
trainingRoutes.GET("/quiz/:moduleId", trainingHandlers.GetQuiz)
|
||||
trainingRoutes.POST("/quiz/:moduleId/submit", trainingHandlers.SubmitQuiz)
|
||||
trainingRoutes.GET("/quiz/attempts/:assignmentId", trainingHandlers.GetQuizAttempts)
|
||||
|
||||
// Content Generation
|
||||
trainingRoutes.POST("/content/generate", trainingHandlers.GenerateContent)
|
||||
trainingRoutes.POST("/content/generate-quiz", trainingHandlers.GenerateQuiz)
|
||||
trainingRoutes.POST("/content/generate-all", trainingHandlers.GenerateAllContent)
|
||||
trainingRoutes.POST("/content/generate-all-quiz", trainingHandlers.GenerateAllQuizzes)
|
||||
trainingRoutes.GET("/content/:moduleId", trainingHandlers.GetContent)
|
||||
trainingRoutes.POST("/content/publish/:id", trainingHandlers.PublishContent)
|
||||
|
||||
// Audio/Media
|
||||
trainingRoutes.POST("/content/:moduleId/generate-audio", trainingHandlers.GenerateAudio)
|
||||
trainingRoutes.GET("/media/module/:moduleId", trainingHandlers.GetModuleMedia)
|
||||
trainingRoutes.GET("/media/:id/url", trainingHandlers.GetMediaURL)
|
||||
trainingRoutes.POST("/media/:id/publish", trainingHandlers.PublishMedia)
|
||||
|
||||
// Video
|
||||
trainingRoutes.POST("/content/:moduleId/generate-video", trainingHandlers.GenerateVideo)
|
||||
trainingRoutes.POST("/content/:moduleId/preview-script", trainingHandlers.PreviewVideoScript)
|
||||
|
||||
// Deadlines and Escalation
|
||||
trainingRoutes.GET("/deadlines", trainingHandlers.GetDeadlines)
|
||||
trainingRoutes.GET("/deadlines/overdue", trainingHandlers.GetOverdueDeadlines)
|
||||
trainingRoutes.POST("/escalation/check", trainingHandlers.CheckEscalation)
|
||||
|
||||
// Audit and Stats
|
||||
trainingRoutes.GET("/audit-log", trainingHandlers.GetAuditLog)
|
||||
trainingRoutes.GET("/stats", trainingHandlers.GetStats)
|
||||
trainingRoutes.GET("/certificates/:id/verify", trainingHandlers.VerifyCertificate)
|
||||
}
|
||||
|
||||
// RAG Search routes - Compliance Regulation Corpus
|
||||
ragRoutes := v1.Group("/rag")
|
||||
{
|
||||
ragRoutes.POST("/search", ragHandlers.Search)
|
||||
ragRoutes.GET("/regulations", ragHandlers.ListRegulations)
|
||||
// Audit Trail
|
||||
iaceRoutes.GET("/projects/:id/audit-trail", iaceHandler.GetAuditTrail)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user