// Package state persists report artifacts and metadata. package state import ( "context" "encoding/json" "time" "gitea.maximumdirect.net/eric/weatherreporter/internal/module" "gitea.maximumdirect.net/eric/weatherreporter/internal/promptinput" "gitea.maximumdirect.net/eric/weatherreporter/internal/report" ) type Store interface { Paths(report.Resolved) (ArtifactPaths, error) SaveModuleSnapshot(context.Context, report.Resolved, module.Snapshot) (string, error) SaveDataPackage(context.Context, report.Resolved, promptinput.Package) (string, error) SavePreflight(context.Context, report.Resolved, PreflightArtifact) (string, error) SaveDistributorNotification(context.Context, report.Resolved, DistributorNotificationArtifact) (string, error) SaveBatchDistributorNotification(context.Context, BatchDistributorNotificationRef, BatchDistributorNotificationArtifact) (string, error) SaveGeneratedTextRaw(context.Context, report.Resolved, []byte) (string, error) SaveGeneratedTextResult(context.Context, report.Resolved, any) (string, error) SaveGeneratedText(context.Context, report.Resolved, []byte) (string, error) SaveRenderContext(context.Context, report.Resolved, any) (string, error) PrepareRenderedReport(context.Context, report.Resolved) (string, error) SaveMetadata(context.Context, Metadata) (string, error) FindPriorSnapshot(context.Context, report.Resolved) (*PriorSnapshot, error) LoadModuleSnapshot(context.Context, string) (module.Snapshot, error) LoadGeneratedText(context.Context, string) ([]byte, error) LoadGeneratedTextResult(context.Context, string, any) error LoadRenderContext(context.Context, string, any) error } type PriorSnapshot struct { Metadata Metadata ModuleSnapshotPath string } type PreflightArtifact struct { Command []string `json:"command"` Stdout string `json:"stdout"` Stderr string `json:"stderr"` StdoutTruncated bool `json:"stdoutTruncated,omitempty"` StderrTruncated bool `json:"stderrTruncated,omitempty"` ExitCode int `json:"exitCode"` } const DistributorNotificationSchemaVersion = "weatherreporter.distributor_notification.v1" const BatchDistributorNotificationSchemaVersion = "weatherreporter.batch_distributor_notification.v1" type BatchDistributorNotificationRef struct { Batch string BatchRunID string StartedAt time.Time Location *time.Location } type DistributorNotificationArtifact struct { SchemaVersion string `json:"schemaVersion"` RunID string `json:"runId"` ReportID report.ID `json:"reportId"` AttemptedAt time.Time `json:"attemptedAt"` Endpoint string `json:"endpoint"` PipelineID string `json:"pipelineId,omitempty"` BundleID string `json:"bundleId,omitempty"` IdempotencyKey string `json:"idempotencyKey,omitempty"` SourcePath string `json:"sourcePath,omitempty"` BundlePaths []string `json:"bundlePaths,omitempty"` BundleCreated time.Time `json:"bundleCreated,omitempty"` Status string `json:"status"` Upload *DistributorUploadResult `json:"upload,omitempty"` RunStatus *DistributorRunStatus `json:"runStatus,omitempty"` StatusError string `json:"statusError,omitempty"` Error string `json:"error,omitempty"` } type DistributorUploadResult struct { RunID string `json:"runId,omitempty"` Status string `json:"status,omitempty"` } type DistributorRunStatus struct { RunID string `json:"runId,omitempty"` PipelineID string `json:"pipelineId,omitempty"` Status string `json:"status,omitempty"` AcceptedAt time.Time `json:"acceptedAt,omitempty"` StartedAt *time.Time `json:"startedAt,omitempty"` FinishedAt *time.Time `json:"finishedAt,omitempty"` Report json.RawMessage `json:"report,omitempty"` Error string `json:"error,omitempty"` } type BatchDistributorNotificationArtifact struct { SchemaVersion string `json:"schemaVersion"` Batch string `json:"batch"` BatchRunID string `json:"batchRunId"` AttemptedAt time.Time `json:"attemptedAt"` Endpoint string `json:"endpoint"` PipelineID string `json:"pipelineId,omitempty"` BundleID string `json:"bundleId,omitempty"` IdempotencyKey string `json:"idempotencyKey,omitempty"` BundleCreated time.Time `json:"bundleCreated,omitempty"` Reports []BatchDistributorNotificationReportArtifact `json:"includedReports,omitempty"` Status string `json:"status"` Upload *DistributorUploadResult `json:"upload,omitempty"` RunStatus *DistributorRunStatus `json:"runStatus,omitempty"` StatusError string `json:"statusError,omitempty"` Error string `json:"error,omitempty"` } type BatchDistributorNotificationReportArtifact struct { ReportID report.ID `json:"reportId"` RunID string `json:"runId"` SourcePath string `json:"sourcePath"` BundlePaths []string `json:"bundlePaths"` }