package config import configkit "gitea.maximumdirect.net/eric/ConfigKit" // Config is the resolved combined configuration from pipeline.yml, // campaign.yml, and session.yml. type Config struct { Pipeline *PipelineConfig Campaign *CampaignConfig Session *SessionConfig PipelinePath string CampaignPath string SessionPath string StableInputs ResolvedStableInputs SessionSource SessionSource Party ResolvedParty } // PipelineConfig contains durable pipeline-level settings. type PipelineConfig struct { Workspace WorkspaceConfig `yaml:"workspace" json:"workspace"` Campaigns CampaignsConfig `yaml:"campaigns" json:"campaigns"` Storage StorageConfig `yaml:"storage" json:"storage"` Spool SpoolConfig `yaml:"spool" json:"spool"` Cache CacheConfig `yaml:"cache" json:"cache"` Publish *PublishConfig `yaml:"publish" json:"publish"` WhisperX WhisperXConfig `yaml:"whisperx" json:"whisperx"` Seriatim SeriatimConfig `yaml:"seriatim" json:"seriatim"` Audita AuditaConfig `yaml:"audita" json:"audita"` Normalize *NormalizeConfig `yaml:"normalize" json:"normalize"` Trim *TrimConfig `yaml:"trim" json:"trim"` Render *RenderConfig `yaml:"render" json:"render"` Scriptorium *ScriptoriumConfig `yaml:"scriptorium" json:"scriptorium"` Notarius *NotariusConfig `yaml:"notarius" json:"notarius"` Notification NotificationConfig `yaml:"notification" json:"notification"` resolution *pipelineResolutionMetadata `yaml:"-" json:"-"` familyCatalog ArtifactFamilyCatalog `yaml:"-" json:"-"` } // ArtifactFamilies returns a copy of runtime-only expansion provenance. func ArtifactFamilies(cfg *PipelineConfig) ArtifactFamilyCatalog { if cfg == nil { return ArtifactFamilyCatalog{} } return cloneArtifactFamilyCatalog(cfg.familyCatalog) } // CampaignsConfig configures the local campaign registry. type CampaignsConfig struct { Root string `yaml:"root" json:"root"` DefaultCampaignID string `yaml:"default_campaign_id" json:"default_campaign_id"` } // CampaignConfig contains stable campaign-level identity and input defaults. type CampaignConfig struct { CampaignID string `yaml:"campaign_id" json:"campaign_id"` SessionTemplateFile string `yaml:"session_template_file" json:"session_template_file"` Inputs CampaignInputsConfig `yaml:"inputs" json:"inputs"` } // CampaignInputsConfig contains stable campaign-level input file references. type CampaignInputsConfig struct { SpeakersFile string `yaml:"speakers_file" json:"speakers_file"` AutocorrectFile string `yaml:"autocorrect_file" json:"autocorrect_file"` GlossaryFile string `yaml:"glossary_file" json:"glossary_file"` PartyFile string `yaml:"party_file" json:"party_file"` SpellCatalogFile string `yaml:"spell_catalog_file" json:"spell_catalog_file"` } // SessionConfig contains per-session inputs and metadata. type SessionConfig struct { SessionID string `yaml:"session_id" json:"session_id"` PreviousSessionID string `yaml:"previous_session_id" json:"previous_session_id"` Campaign string `yaml:"campaign" json:"campaign"` Date string `yaml:"date" json:"date"` Title string `yaml:"title" json:"title"` Inputs SessionInputsConfig `yaml:"inputs" json:"inputs"` } // WorkspaceConfig configures local workspace behavior. type WorkspaceConfig struct { Root string `yaml:"root" json:"root"` CleanupAfterPublish bool `yaml:"cleanup_after_publish" json:"cleanup_after_publish"` } // StorageConfig configures storage backends and related parameters. type StorageConfig struct { Backend string `yaml:"backend" json:"backend"` S3 *StorageS3Config `yaml:"s3" json:"s3"` } const ( // StorageBackendLocal disables remote object-store operations. StorageBackendLocal = "local" // StorageBackendS3 enables the configured S3 object store. StorageBackendS3 = "s3" ) // StorageS3Config configures S3 storage coordinates. type StorageS3Config struct { Bucket string `yaml:"bucket" json:"bucket"` RootPrefix string `yaml:"root_prefix" json:"root_prefix"` Region string `yaml:"region" json:"region"` Endpoint string `yaml:"endpoint" json:"endpoint"` ForcePathStyle bool `yaml:"force_path_style" json:"force_path_style"` AccessKeyID *configkit.Secret `yaml:"access_key_id,omitempty" json:"access_key_id,omitempty"` SecretAccessKey *configkit.Secret `yaml:"secret_access_key,omitempty" json:"secret_access_key,omitempty"` } // SpoolConfig configures local spool storage for staged data. type SpoolConfig struct { Root string `yaml:"root" json:"root"` DeleteAudioAfterPublish bool `yaml:"delete_audio_after_publish" json:"delete_audio_after_publish"` } // CacheConfig configures durable local caches for reusable remote inputs. type CacheConfig struct { Root string `yaml:"root" json:"root"` S3Audio *bool `yaml:"s3_audio" json:"s3_audio"` } // PublishConfig configures publish behavior and source-based output uploads. type PublishConfig struct { Enabled *bool `yaml:"enabled" json:"enabled"` UploadRun *bool `yaml:"upload_run" json:"upload_run"` Outputs []PublishOutputRule `yaml:"outputs" json:"outputs"` } // PublishOutputRule configures one source-to-destination publish mapping. type PublishOutputRule struct { Source string `yaml:"source" json:"source"` Dest string `yaml:"dest" json:"dest"` Required *bool `yaml:"required" json:"required"` } // WhisperXConfig configures WhisperX adapter settings. type WhisperXConfig struct { TranscribeURL string `yaml:"transcribe_url" json:"transcribe_url"` Language string `yaml:"language" json:"language"` Timeout string `yaml:"timeout" json:"timeout"` Retries *int `yaml:"retries" json:"retries"` RetryDelay string `yaml:"retry_delay" json:"retry_delay"` Concurrency *int `yaml:"concurrency" json:"concurrency"` } // SeriatimConfig configures seriatim adapter settings. type SeriatimConfig struct { Binary string `yaml:"binary" json:"binary"` Timeout string `yaml:"timeout" json:"timeout"` OutputSchema string `yaml:"output_schema" json:"output_schema"` CoalesceGap *float64 `yaml:"coalesce_gap" json:"coalesce_gap"` Report *bool `yaml:"report" json:"report"` Env SeriatimEnvConfig `yaml:"env" json:"env"` } // SeriatimEnvConfig configures optional advanced seriatim environment tuning. type SeriatimEnvConfig struct { OverlapWordRunGap *float64 `yaml:"overlap_word_run_gap" json:"overlap_word_run_gap"` OverlapWordRunReorderWindow *float64 `yaml:"overlap_word_run_reorder_window" json:"overlap_word_run_reorder_window"` BackchannelMaxDuration *float64 `yaml:"backchannel_max_duration" json:"backchannel_max_duration"` FillerMaxDuration *float64 `yaml:"filler_max_duration" json:"filler_max_duration"` } // AuditaConfig configures audita adapter settings. type AuditaConfig struct { Binary string `yaml:"binary" json:"binary"` Timeout string `yaml:"timeout" json:"timeout"` LLMAPIKey *configkit.Secret `yaml:"llm_api_key,omitempty" json:"llm_api_key,omitempty"` Modules []string `yaml:"modules" json:"modules"` BaseURL string `yaml:"base_url" json:"base_url"` Model string `yaml:"model" json:"model"` TotalLLMConcurrency *int `yaml:"total_llm_concurrency" json:"total_llm_concurrency"` ProposalLLMConcurrency *int `yaml:"proposal_llm_concurrency" json:"proposal_llm_concurrency"` ValidationModel string `yaml:"validation_model" json:"validation_model"` ValidationLLMConcurrency *int `yaml:"validation_llm_concurrency" json:"validation_llm_concurrency"` TranscriptDescription string `yaml:"transcript_description" json:"transcript_description"` ConfigPath string `yaml:"config_path" json:"config_path"` OutputSchema string `yaml:"output_schema" json:"output_schema"` WorkDirRetention string `yaml:"work_dir_retention" json:"work_dir_retention"` Report *bool `yaml:"report" json:"report"` } // NormalizeConfig configures normalize-stage transcript schema/output behavior. type NormalizeConfig struct { OutputPath string `yaml:"output_path" json:"output_path"` OutputSchema string `yaml:"output_schema" json:"output_schema"` Report *bool `yaml:"report" json:"report"` } // TrimConfig configures trim-stage transcript boundary behavior. type TrimConfig struct { Enabled *bool `yaml:"enabled" json:"enabled"` OutputPath string `yaml:"output_path" json:"output_path"` Bounds TrimBoundsConfig `yaml:"bounds" json:"bounds"` Seriatim TrimSeriatimConfig `yaml:"seriatim" json:"seriatim"` } // TrimBoundsConfig configures Scriptorium bounds prompt execution for trim. type TrimBoundsConfig struct { PromptID string `yaml:"prompt_id" json:"prompt_id"` ProfileID string `yaml:"profile_id" json:"profile_id"` TranscriptInputName string `yaml:"transcript_input_name" json:"transcript_input_name"` OutputPath string `yaml:"output_path" json:"output_path"` Timeout string `yaml:"timeout" json:"timeout"` RenderDebug bool `yaml:"render_debug" json:"render_debug"` RenderOutputPath string `yaml:"render_output_path" json:"render_output_path"` } // TrimSeriatimConfig configures Seriatim options for trim output construction. type TrimSeriatimConfig struct { Report *bool `yaml:"report" json:"report"` } // RenderConfig configures render-stage output formatting behavior. type RenderConfig struct { Enabled *bool `yaml:"enabled" json:"enabled"` Format string `yaml:"format" json:"format"` Title string `yaml:"title" json:"title"` IncludeTimestamps *bool `yaml:"include_timestamps" json:"include_timestamps"` IncludeSegmentIDs *bool `yaml:"include_segment_ids" json:"include_segment_ids"` IncludeMetadata bool `yaml:"include_metadata" json:"include_metadata"` } // ScriptoriumConfig configures Scriptorium-backed artifact generation. type ScriptoriumConfig struct { Binary string `yaml:"binary" json:"binary"` ConfigPath string `yaml:"config_path" json:"config_path"` Timeout string `yaml:"timeout" json:"timeout"` RenderDebug bool `yaml:"render_debug" json:"render_debug"` Artifacts map[string]ScriptoriumArtifactConfig `yaml:"artifacts" json:"artifacts"` ArtifactFamilies map[string]ScriptoriumArtifactFamilyConfig `yaml:"artifact_families" json:"artifact_families"` } // ScriptoriumArtifactConfig configures one named output artifact workflow. type ScriptoriumArtifactConfig struct { Enabled bool `yaml:"enabled" json:"enabled"` DependsOn []string `yaml:"depends_on" json:"depends_on"` RenderDebug *bool `yaml:"render_debug" json:"render_debug"` PromptID string `yaml:"prompt_id" json:"prompt_id"` ProfileID string `yaml:"profile_id" json:"profile_id"` OutputPath string `yaml:"output_path" json:"output_path"` Timeout string `yaml:"timeout" json:"timeout"` Inputs map[string]ScriptoriumInputConfig `yaml:"inputs" json:"inputs"` Vars map[string]any `yaml:"vars" json:"vars"` dependencyOrigins map[string][]artifactDependencyOrigin } // ScriptoriumArtifactFamilyConfig declares the shared configuration expanded // into one ordinary artifact for each canonical party character. type ScriptoriumArtifactFamilyConfig struct { Enabled bool `yaml:"enabled" json:"enabled"` ForEach string `yaml:"for_each" json:"for_each"` DependsOn []string `yaml:"depends_on" json:"depends_on"` RenderDebug *bool `yaml:"render_debug" json:"render_debug"` PromptID string `yaml:"prompt_id" json:"prompt_id"` ProfileID string `yaml:"profile_id" json:"profile_id"` OutputPathPattern string `yaml:"output_path_pattern" json:"output_path_pattern"` Timeout string `yaml:"timeout" json:"timeout"` Inputs map[string]ScriptoriumInputConfig `yaml:"inputs" json:"inputs"` Vars map[string]any `yaml:"vars" json:"vars"` MemberVars map[string]string `yaml:"member_vars" json:"member_vars"` MemberDependencies []string `yaml:"member_dependencies" json:"member_dependencies"` Publish *ScriptoriumArtifactFamilyPublishConfig `yaml:"publish" json:"publish"` } // ScriptoriumArtifactFamilyPublishConfig retains the typed declaration for // family publishing. It is resolved by the publish owner. type ScriptoriumArtifactFamilyPublishConfig struct { Enabled bool `yaml:"enabled" json:"enabled"` Required bool `yaml:"required" json:"required"` DestPattern string `yaml:"dest_pattern" json:"dest_pattern"` } // ArtifactFamilyCatalog records the runtime-only origin of expanded artifacts. // It is intentionally kept outside the Scriptorium adapter configuration. type ArtifactFamilyCatalog struct { Families map[string]ArtifactFamilyOrigin Members map[string]ArtifactFamilyMemberOrigin } // ArtifactFamilyOrigin records one declared family and its source ownership. type ArtifactFamilyOrigin struct { Members []string MemberDependencies []string Publish *ScriptoriumArtifactFamilyPublishConfig Source string } // ArtifactFamilyMemberOrigin identifies the canonical party member that // produced one ordinary concrete artifact. type ArtifactFamilyMemberOrigin struct { Family string CharacterID string Source string Dependencies []string Inputs map[string]string } // ScriptoriumInputConfig configures one named prompt input source. type ScriptoriumInputConfig struct { Source string `yaml:"source" json:"source"` Required bool `yaml:"required" json:"required"` } // NotariusConfig configures structured artifact extraction by Notarius. type NotariusConfig struct { Enabled bool `yaml:"enabled" json:"enabled"` Binary string `yaml:"binary" json:"binary"` ConfigPath string `yaml:"config_path" json:"config_path"` PipelineID string `yaml:"pipeline_id" json:"pipeline_id"` Timeout string `yaml:"timeout" json:"timeout"` WorkingDirectory string `yaml:"working_directory" json:"working_directory"` References map[string]string `yaml:"references" json:"references"` Outputs map[string]NotariusOutputConfig `yaml:"outputs" json:"outputs"` } // NotariusOutputConfig declares one required extraction lane contract. type NotariusOutputConfig struct { LaneID string `yaml:"lane_id" json:"lane_id"` MediaType string `yaml:"media_type" json:"media_type"` SchemaID string `yaml:"schema_id" json:"schema_id"` SchemaVersion string `yaml:"schema_version" json:"schema_version"` ModuleKey string `yaml:"module_key" json:"module_key"` } // NotificationConfig configures the supported notification behavior. type NotificationConfig struct { Mode string `yaml:"mode" json:"mode"` } // SessionInputsConfig contains per-session input references. type SessionInputsConfig struct { AudioDir string `yaml:"audio_dir" json:"audio_dir"` AudioFiles []string `yaml:"audio_files" json:"audio_files"` AudioS3 *SessionAudioS3Input `yaml:"audio_s3" json:"audio_s3"` SpeakersFile string `yaml:"speakers_file" json:"speakers_file"` AutocorrectFile string `yaml:"autocorrect_file" json:"autocorrect_file"` GlossaryFile string `yaml:"glossary_file" json:"glossary_file"` SpellCatalogFile string `yaml:"spell_catalog_file" json:"spell_catalog_file"` } // SessionAudioS3Input configures S3 session-audio input discovery. type SessionAudioS3Input struct { Prefix string `yaml:"prefix" json:"prefix"` } // ResolvedStableInputs records where stable input file paths came from after // campaign/session merge. type ResolvedStableInputs struct { SpeakersFile ResolvedInputFile AutocorrectFile ResolvedInputFile GlossaryFile ResolvedInputFile PartyFile ResolvedInputFile SpellCatalogFile ResolvedInputFile } // ResolvedInputFile records one merged config path and its source config file. type ResolvedInputFile struct { Path string ConfigPath string Source string } // ResolvedParty records the campaign-owned canonical party and its non-secret // source provenance. It is runtime-only and must never be copied into manifests // as raw party content. type ResolvedParty struct { Source PartySource Canonical *CanonicalParty } // PartySource identifies the selected party input without retaining its raw // contents. Path is the resolved on-disk source path. type PartySource struct { Path string ConfigPath string Source string } // SessionSource records where session.yml came from before materialization. type SessionSource struct { Source string LocalPath string S3Bucket string S3Key string S3Size int64 S3ETag string }