package artifacts import ( "encoding/json" "time" "gitea.maximumdirect.net/eric/notarius/internal/core/source" ) type ArtifactCandidate struct { Index int `json:"index"` ExtractorKey string `json:"extractor_key"` ArtifactType string `json:"artifact_type"` SchemaVersion string `json:"schema_version"` Payload json.RawMessage `json:"payload"` SourceRefs []source.SourceRef `json:"source_refs,omitempty"` Metadata map[string]any `json:"metadata,omitempty"` } type Artifact struct { ExtractorKey string `json:"extractor_key"` ArtifactType string `json:"artifact_type"` SchemaVersion string `json:"schema_version"` Payload json.RawMessage `json:"payload"` SourceRefs []source.SourceRef `json:"source_refs,omitempty"` Metadata map[string]any `json:"metadata,omitempty"` } type RejectedArtifact struct { Candidate ArtifactCandidate `json:"candidate"` ValidatorName string `json:"validator_name"` ReasonCode string `json:"reason_code"` Message string `json:"message"` } type ArtifactLaneManifest struct { ID string `json:"id"` Extractor string `json:"extractor"` Merger string `json:"merger"` Normalizer string `json:"normalizer"` Validators []string `json:"validators,omitempty"` Metadata map[string]any `json:"metadata,omitempty"` } type LLMProfileManifest struct { ID string `json:"id"` Provider string `json:"provider,omitempty"` Model string `json:"model,omitempty"` } type ReferenceProvenance struct { LaneID string `json:"lane_id"` SlotName string `json:"slot_name"` OriginType string `json:"origin_type"` OriginURI string `json:"origin_uri,omitempty"` Digest string `json:"digest,omitempty"` MediaType string `json:"media_type,omitempty"` SizeBytes int64 `json:"size_bytes,omitempty"` BindingSource string `json:"binding_source,omitempty"` } type RunManifest struct { RunID string `json:"run_id,omitempty"` PipelineID string `json:"pipeline_id,omitempty"` PipelineDigest string `json:"pipeline_digest,omitempty"` InputModule string `json:"input_module,omitempty"` Chunker string `json:"chunker,omitempty"` SourceDigests []string `json:"source_digests,omitempty"` Extractors []string `json:"extractors,omitempty"` Merger string `json:"merger,omitempty"` Normalizer string `json:"normalizer,omitempty"` OutputEncoder string `json:"output_encoder,omitempty"` ModuleMetadata map[string]map[string]any `json:"module_metadata,omitempty"` ArtifactLanes []ArtifactLaneManifest `json:"artifact_lanes,omitempty"` References []ReferenceProvenance `json:"references,omitempty"` LLMProfiles []LLMProfileManifest `json:"llm_profiles,omitempty"` SchemaVersion string `json:"schema_version,omitempty"` ValidationStatus string `json:"validation_status,omitempty"` StartedAt *time.Time `json:"started_at,omitempty"` CompletedAt *time.Time `json:"completed_at,omitempty"` } func ArtifactFromCandidate(candidate ArtifactCandidate) Artifact { return Artifact{ ExtractorKey: candidate.ExtractorKey, ArtifactType: candidate.ArtifactType, SchemaVersion: candidate.SchemaVersion, Payload: append(json.RawMessage(nil), candidate.Payload...), SourceRefs: append([]source.SourceRef(nil), candidate.SourceRefs...), Metadata: copyMetadata(candidate.Metadata), } } func copyMetadata(metadata map[string]any) map[string]any { if len(metadata) == 0 { return nil } copied := make(map[string]any, len(metadata)) for key, value := range metadata { copied[key] = value } return copied }