Two editor features that were in flight alongside the sound work: - FontSize TipTap extension (rides on textStyle) with Small/Normal/Large/ Title presets in the toolbar; StatusBar + CSS support - Image handling: internal/images handler, upload route + config, client API, EditorCore wiring, and md/html/docx export support for images Claude-Session: https://claude.ai/code/session_016Yr6jELuRc7hyzYLccQKZd
66 lines
1.8 KiB
Go
66 lines
1.8 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
// Config holds all runtime configuration, loaded from environment variables.
|
|
// See .env.example for the full list and defaults.
|
|
type Config struct {
|
|
Port string
|
|
BaseURL string
|
|
DatabasePath string
|
|
ImageDir string // on-disk store for editor image uploads
|
|
|
|
// LLM
|
|
LLMBackend string // "vllm" | "ollama"
|
|
LLMEndpoint string
|
|
LLMModel string // checkpoint model (small, fast)
|
|
LLMChatModel string // Ask Petal model; falls back to LLMModel if empty
|
|
LLMTimeout time.Duration
|
|
|
|
// Auth (deferred — not wired in the local-dev build, kept for later)
|
|
AuthentikURL string
|
|
AuthentikClientID string
|
|
AuthentikClientSecret string
|
|
SessionSecret string
|
|
}
|
|
|
|
// Load reads configuration from the environment, applying sane local-dev defaults.
|
|
func Load() *Config {
|
|
return &Config{
|
|
Port: env("PORT", "8080"),
|
|
BaseURL: env("BASE_URL", "http://localhost:8080"),
|
|
DatabasePath: env("DATABASE_PATH", "./data/petal.db"),
|
|
ImageDir: env("IMAGE_DIR", "./data/images"),
|
|
|
|
LLMBackend: env("LLM_BACKEND", "vllm"),
|
|
LLMEndpoint: env("LLM_ENDPOINT", "http://localhost:8000"),
|
|
LLMModel: env("LLM_MODEL", ""),
|
|
LLMChatModel: env("LLM_CHAT_MODEL", ""),
|
|
LLMTimeout: envDuration("LLM_TIMEOUT", 30*time.Second),
|
|
|
|
AuthentikURL: env("AUTHENTIK_URL", ""),
|
|
AuthentikClientID: env("AUTHENTIK_CLIENT_ID", ""),
|
|
AuthentikClientSecret: env("AUTHENTIK_CLIENT_SECRET", ""),
|
|
SessionSecret: env("SESSION_SECRET", "dev-insecure-secret-change-me"),
|
|
}
|
|
}
|
|
|
|
func env(key, fallback string) string {
|
|
if v := os.Getenv(key); v != "" {
|
|
return v
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
func envDuration(key string, fallback time.Duration) time.Duration {
|
|
if v := os.Getenv(key); v != "" {
|
|
if d, err := time.ParseDuration(v); err == nil {
|
|
return d
|
|
}
|
|
}
|
|
return fallback
|
|
}
|