import { defineStore } from 'pinia'; export interface EffectivePolicy { categories: Record< string, { label: string; tools: string[]; default_enabled?: boolean; locked?: boolean; locked_state?: boolean | null; } >; forced_category_states: Record; disabled_models: string[]; ui_blocks: Record; updated_at?: string; } interface PolicyState { loaded: boolean; loading: boolean; error: string; policy: EffectivePolicy | null; } const DEFAULT_POLICY: EffectivePolicy = { categories: {}, forced_category_states: {}, disabled_models: [], ui_blocks: {} }; export const usePolicyStore = defineStore('policy', { state: (): PolicyState => ({ loaded: false, loading: false, error: '', policy: null }), getters: { disabledModelSet(state): Set { return new Set(state.policy?.disabled_models || []); }, forcedCategoryStates(state): Record { return state.policy?.forced_category_states || {}; }, uiBlocks(state): Record { return state.policy?.ui_blocks || {}; } }, actions: { async fetchPolicy() { if (this.loading) return; this.loading = true; this.error = ''; try { const resp = await fetch('/api/effective-policy'); const result = await resp.json(); if (!resp.ok || !result.success) { throw new Error(result.error || '加载策略失败'); } this.policy = result.data || DEFAULT_POLICY; this.loaded = true; } catch (error: any) { this.error = error?.message || '加载策略失败'; } finally { this.loading = false; } }, isModelDisabled(key: string): boolean { return this.disabledModelSet.has(key); }, isCategoryLocked(id: string): boolean { const states = this.forcedCategoryStates; return typeof states[id] === 'boolean'; }, categoryLockedState(id: string): boolean | null { const states = this.forcedCategoryStates; if (typeof states[id] === 'boolean') return states[id] as boolean; return null; }, isBlocked(action: string): boolean { return !!this.uiBlocks[action]; } } });