From 619ec7b8824e79df1eb98ead9a541994555b527e Mon Sep 17 00:00:00 2001 From: Bryan Frimin Date: Thu, 26 Mar 2026 14:30:04 +0100 Subject: [PATCH] Add AI-powered evidence description generation Introduce a background worker that automatically generates compliance-focused descriptions for uploaded evidence files using configurable LLM providers. Descriptions are surfaced across all interfaces: GraphQL API, MCP API, CLI, and the console UI. Key changes: - Multi-provider LLM config with per-agent settings (pointer types for Temperature/MaxTokens to preserve zero values) - Evidence description worker with bounded concurrency - EvidenceDescriptionStatus typed enum with PostgreSQL enum type - New `prb evidence` CLI commands (list, view, delete) - Evidence description displayed in console table and preview - Migration only marks evidences without files as completed Signed-off-by: Bryan Frimin --- apps/console/src/hooks/graph/EvidenceGraph.ts | 1 + .../measures/dialog/EvidencePreviewDialog.tsx | 43 +-- .../measures/tabs/MeasureEvidencesTab.tsx | 17 +- pkg/bootstrap/builder.go | 53 +++- pkg/bootstrap/builder_test.go | 57 +++- pkg/cmd/evidence/delete/delete.go | 106 ++++++++ pkg/cmd/evidence/evidence.go | 36 +++ pkg/cmd/evidence/list/list.go | 199 ++++++++++++++ pkg/cmd/evidence/view/view.go | 171 ++++++++++++ pkg/cmd/root/root.go | 2 + pkg/coredata/evidence.go | 180 ++++++++++--- pkg/coredata/evidence_description_status.go | 68 +++++ pkg/coredata/migrations/20260326T131816Z.sql | 10 + pkg/evidencedescriber/evidencedescriber.go | 81 ++++++ pkg/evidencedescriber/prompt.txt | 17 ++ pkg/llm/anthropic/provider.go | 25 ++ pkg/llm/openai/provider.go | 25 ++ pkg/llm/part.go | 7 + pkg/probo/evidence_description_worker.go | 255 ++++++++++++++++++ pkg/probo/evidence_service.go | 15 +- pkg/probo/measure_service.go | 17 +- pkg/probod/llm.go | 24 +- pkg/probod/openai_config.go | 52 +++- pkg/probod/probod.go | 54 +++- 24 files changed, 1390 insertions(+), 125 deletions(-) create mode 100644 pkg/cmd/evidence/delete/delete.go create mode 100644 pkg/cmd/evidence/evidence.go create mode 100644 pkg/cmd/evidence/list/list.go create mode 100644 pkg/cmd/evidence/view/view.go create mode 100644 pkg/coredata/evidence_description_status.go create mode 100644 pkg/coredata/migrations/20260326T131816Z.sql create mode 100644 pkg/evidencedescriber/evidencedescriber.go create mode 100644 pkg/evidencedescriber/prompt.txt create mode 100644 pkg/probo/evidence_description_worker.go diff --git a/apps/console/src/hooks/graph/EvidenceGraph.ts b/apps/console/src/hooks/graph/EvidenceGraph.ts index 045c234b1..81d0384d3 100644 --- a/apps/console/src/hooks/graph/EvidenceGraph.ts +++ b/apps/console/src/hooks/graph/EvidenceGraph.ts @@ -7,6 +7,7 @@ export const evidenceFileQuery = graphql` node(id: $evidenceId) { ... on Evidence { id + description file { mimeType fileName diff --git a/apps/console/src/pages/organizations/measures/dialog/EvidencePreviewDialog.tsx b/apps/console/src/pages/organizations/measures/dialog/EvidencePreviewDialog.tsx index 3ea45ac93..65bfd851b 100644 --- a/apps/console/src/pages/organizations/measures/dialog/EvidencePreviewDialog.tsx +++ b/apps/console/src/pages/organizations/measures/dialog/EvidencePreviewDialog.tsx @@ -125,39 +125,48 @@ function EvidencePreviewContent({ ); } + let preview; + if (evidence.file.mimeType?.startsWith("image/")) { - return ( + preview = ( {evidence.file.fileName} ); - } - - if (evidence.file.mimeType?.includes("pdf")) { - return ( + } else if (evidence.file.mimeType?.includes("pdf")) { + preview = (