02ff96f74e
Build + Deploy / build-admin-compliance (push) Successful in 2m7s
Build + Deploy / build-backend-compliance (push) Failing after 5m21s
Build + Deploy / build-ai-sdk (push) Successful in 53s
Build + Deploy / build-developer-portal (push) Successful in 1m18s
Build + Deploy / build-tts (push) Successful in 1m42s
Build + Deploy / build-document-crawler (push) Successful in 45s
Build + Deploy / build-dsms-gateway (push) Successful in 27s
Build + Deploy / build-dsms-node (push) Successful in 19s
CI / branch-name (push) Has been skipped
Build + Deploy / trigger-orca (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / loc-budget (push) Failing after 19s
CI / secret-scan (push) Has been skipped
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 3m6s
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / test-go (push) Successful in 55s
CI / test-python-backend (push) Successful in 44s
CI / test-python-document-crawler (push) Successful in 30s
CI / test-python-dsms-gateway (push) Successful in 26s
CI / validate-canonical-controls (push) Successful in 18s
9 files had conflict markers from the branch merge. All resolved keeping the feature branch version. Also split agent_scan_routes.py (534→367 LOC) by extracting Pydantic models to agent_scan_models.py. [guardrail-change] Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
85 lines
1.8 KiB
Python
85 lines
1.8 KiB
Python
"""Pydantic models for the Agent Website Scan API."""
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class ScanRequest(BaseModel):
|
|
url: str
|
|
mode: str = "post_launch"
|
|
recipient: str = "dsb@breakpilot.local"
|
|
|
|
|
|
class ServiceInfo(BaseModel):
|
|
name: str
|
|
category: str
|
|
provider: str
|
|
country: str
|
|
eu_adequate: bool
|
|
requires_consent: bool
|
|
legal_ref: str
|
|
in_dse: bool
|
|
status: str # "ok", "undocumented", "outdated"
|
|
|
|
|
|
class TextReferenceModel(BaseModel):
|
|
found: bool = False
|
|
source_url: str = ""
|
|
document_type: str = "Datenschutzerklaerung"
|
|
section_heading: str = ""
|
|
section_number: str = ""
|
|
parent_section: str = ""
|
|
paragraph_index: int = 0
|
|
original_text: str = ""
|
|
issue: str = ""
|
|
correction_type: str = ""
|
|
correction_text: str = ""
|
|
insert_after: str = ""
|
|
|
|
|
|
class ScanFinding(BaseModel):
|
|
code: str
|
|
severity: str
|
|
text: str
|
|
correction: str = ""
|
|
text_reference: TextReferenceModel | None = None
|
|
|
|
|
|
class DiscoveredDocument(BaseModel):
|
|
title: str
|
|
url: str
|
|
doc_type: str
|
|
language: str = ""
|
|
word_count: int = 0
|
|
completeness_pct: int = 0
|
|
findings_count: int = 0
|
|
|
|
|
|
class ScanResponse(BaseModel):
|
|
url: str
|
|
pages_scanned: int
|
|
pages_list: list[str] = []
|
|
services: list[ServiceInfo]
|
|
findings: list[ScanFinding]
|
|
discovered_documents: list[DiscoveredDocument] = []
|
|
ai_detected: bool
|
|
chatbot_detected: bool
|
|
chatbot_provider: str
|
|
missing_pages: dict
|
|
summary: str
|
|
email_status: str
|
|
scanned_at: str
|
|
|
|
|
|
class ScanStartResponse(BaseModel):
|
|
scan_id: str
|
|
status: str = "running"
|
|
message: str = ""
|
|
|
|
|
|
class ScanStatusResponse(BaseModel):
|
|
scan_id: str
|
|
status: str # "running", "completed", "failed"
|
|
progress: str = ""
|
|
result: ScanResponse | None = None
|
|
error: str = ""
|