File size: 3,947 Bytes
b701455
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import { create } from 'zustand';
import type { GenerationSettings, ModelInfo, PreviewMessage, SettingsSnapshot } from '../types';

interface AppState {
    settings: GenerationSettings;
    availableModels: ModelInfo[];
    availableControlNets: string[];
    status: 'idle' | 'generating' | 'error';
    currentImage: string | null; // Latest generated image
    gallery: string[]; // History of generated images
    preview: PreviewMessage | null;
    serverStatus: boolean; // Is server reachable?

    // Settings history (for UI snapshots)
    settingsHistory: SettingsSnapshot[];
    setSettingsHistory: (arr: SettingsSnapshot[]) => void;
    appendSettingsSnapshot: (snap: SettingsSnapshot) => void;

    setSettings: (settings: Partial<GenerationSettings>) => void;
    setModels: (models: ModelInfo[]) => void;
    setControlNets: (models: string[]) => void;
    setStatus: (status: 'idle' | 'generating' | 'error') => void;
    setCurrentImage: (image: string | null) => void;
    addToGallery: (image: string) => void;
    addManyToGallery: (images: string[]) => void;
    setPreview: (preview: PreviewMessage | null) => void;
    setServerStatus: (status: boolean) => void;
}

export const useStore = create<AppState>((set) => ({
    settings: {
        prompt: "",
        negative_prompt: "",
        width: 512,
        height: 512,
        num_images: 1,
        batch_size: 1,
        steps: 20,
        cfg_scale: 7.0,
        seed: -1,
        scheduler: "ays",
        sampler: "dpmpp_sde_cfgpp",
        model_path: "", // Default empty, user must select
        refiner_model_path: "",
        refiner_switch_step: 15,
        img2img_mode: false,
        img2img_denoise: 0.75,
        img2img_image: undefined,
        controlnet_enabled: false,
        controlnet_strength: 1.0,
        controlnet_type: "canny",
        hiresfix: false,
        adetailer: false,
        enhance_prompt: false,
        stable_fast: false,
        reuse_seed: false,
        keep_models_loaded: true,
        enable_preview: true,
        // Default to the improved/balanced preview fidelity
        preview_fidelity: 'balanced',
        // By default do NOT persist prompts to server history (opt-in)
        persist_prompt_history: false,
        enable_multiscale: false,
        multiscale_preset: "disabled",
        multiscale_factor: 0.5,
        multiscale_fullres_start: 10,
        multiscale_fullres_end: 8,
        multiscale_intermittent_fullres: true,
        deepcache_enabled: false,
        deepcache_interval: 3,
        deepcache_depth: 2,
        cfg_free_enabled: false,
        cfg_free_start_percent: 70.0,
        tome_enabled: false,
        tome_ratio: 0.5,
        torch_compile: false,
        vae_autotune: false,
        fp8_inference: false,
        weight_quantization: null,
    },
    availableModels: [],
    availableControlNets: [],
    status: 'idle',
    currentImage: null,
    gallery: [],
    preview: null,
    serverStatus: false,

    // Settings history
    settingsHistory: [],
    setSettingsHistory: (arr: SettingsSnapshot[]) => set({ settingsHistory: arr }),
    appendSettingsSnapshot: (snap: SettingsSnapshot) => set((s) => ({ settingsHistory: [snap, ...s.settingsHistory] })),

    setSettings: (newSettings) => set((state) => ({ settings: { ...state.settings, ...newSettings } })),
    setModels: (models) => set({ availableModels: models }),
    setControlNets: (models) => set({ availableControlNets: models }),
    setStatus: (status) => set({ status }),
    setCurrentImage: (image) => set({ currentImage: image }),
    addToGallery: (image) => set((state) => ({ gallery: [image, ...state.gallery] })),
    addManyToGallery: (images) =>
        set((state) => ({
            gallery: images.length > 0 ? [...images, ...state.gallery] : state.gallery,
        })),
    setPreview: (preview) => set({ preview }),
    setServerStatus: (status) => set({ serverStatus: status }),
}));