139 lines
4.6 KiB
TypeScript
139 lines
4.6 KiB
TypeScript
/**
|
|
* App Configuration
|
|
*/
|
|
|
|
// App constants
|
|
export const APP_DEFAULTS = Object.freeze({
|
|
// Debug / diagnostics (opt-in)
|
|
DEBUG_SAFE_CALL: false,
|
|
DEBUG_SAFE_LISTENERS: false,
|
|
DEBUG_VIEWER: false,
|
|
|
|
// Viewer
|
|
VIEWER_ALLOW_PAN_AT_ZOOM_1: false,
|
|
VIEWER_DISABLE_WEBGL_VIDEO: false,
|
|
VIEWER_DISABLE_WEBGL_AUDIO: false,
|
|
VIEWER_VIDEO_GRADE_THROTTLE_FPS: 12,
|
|
VIEWER_AUDIO_VISUALIZER_MODE: "artistic", // simple|artistic
|
|
VIEWER_AUDIO_VIS_FPS: 18,
|
|
VIEWER_SCOPES_FPS: 8,
|
|
|
|
// Grid
|
|
GRID_MIN_SIZE: 150,
|
|
FEED_GRID_MIN_SIZE: 120,
|
|
GRID_GAP: 10,
|
|
GRID_SHOW_BADGES_EXTENSION: true,
|
|
GRID_SHOW_BADGES_RATING: true,
|
|
GRID_SHOW_BADGES_TAGS: true,
|
|
GRID_SHOW_DETAILS: true,
|
|
GRID_SHOW_DETAILS_FILENAME: true,
|
|
GRID_SHOW_DETAILS_DATE: true,
|
|
GRID_SHOW_DETAILS_DIMENSIONS: true,
|
|
GRID_SHOW_DETAILS_GENTIME: true,
|
|
GRID_SHOW_HOVER_INFO: true,
|
|
GRID_SHOW_WORKFLOW_DOT: true,
|
|
WORKFLOW_GRID_GROUP_BY: "model", // "none" | "task" | "model" | "category"
|
|
GRID_VIDEO_AUTOPLAY_MODE: "hover", // "off" | "hover" | "always"
|
|
|
|
// Bottom feed card display
|
|
FEED_SHOW_INFO: true,
|
|
FEED_SHOW_FILENAME: false,
|
|
FEED_SHOW_DIMENSIONS: true,
|
|
FEED_SHOW_DATE: true,
|
|
FEED_SHOW_GENTIME: true,
|
|
FEED_SHOW_WORKFLOW_DOT: false,
|
|
FEED_SHOW_BADGES_EXTENSION: true,
|
|
FEED_SHOW_BADGES_RATING: true,
|
|
FEED_SHOW_BADGES_TAGS: true,
|
|
UI_CARD_HOVER_COLOR: "#3D3D3D",
|
|
UI_CARD_SELECTION_COLOR: "#4A90E2",
|
|
UI_RATING_COLOR: "#FF9500",
|
|
UI_TAG_COLOR: "#4A90E2",
|
|
|
|
// Badge colors
|
|
BADGE_STAR_COLOR: "#FFD45A",
|
|
BADGE_IMAGE_COLOR: "#2196F3",
|
|
BADGE_VIDEO_COLOR: "#9C27B0",
|
|
BADGE_AUDIO_COLOR: "#FF9800",
|
|
BADGE_MODEL3D_COLOR: "#4CAF50",
|
|
BADGE_DUPLICATE_ALERT_COLOR: "#FF1744",
|
|
|
|
// Pagination
|
|
DEFAULT_PAGE_SIZE: 80,
|
|
// Upper bound for a single list request. The backend allows more, but very large
|
|
// pages can create huge DOM batches; keep this as a safety cap.
|
|
MAX_PAGE_SIZE: 2000,
|
|
// Prefetch next page after the first paint so initial grid render stays responsive
|
|
PREFETCH_NEXT_PAGE: true,
|
|
PREFETCH_NEXT_PAGE_DELAY_MS: 700,
|
|
// Client-side default for search request limit (user-adjustable in settings)
|
|
SEARCH_DEFAULT_LIMIT: 500,
|
|
INFINITE_SCROLL_ENABLED: true,
|
|
INFINITE_SCROLL_ROOT_MARGIN: "800px",
|
|
INFINITE_SCROLL_THRESHOLD: 0.01,
|
|
// Consider user "at bottom" when within this many pixels of the end.
|
|
BOTTOM_GAP_PX: 80,
|
|
|
|
// Polling
|
|
STATUS_POLL_INTERVAL: 5000, // 5 seconds
|
|
|
|
// Auto-scan on startup
|
|
AUTO_SCAN_ON_STARTUP: false,
|
|
EXECUTION_GROUPING_ENABLED: true,
|
|
EXECUTION_IDLE_GRACE_MS: 6000,
|
|
// Generation/execution must NEVER block panel navigation, scope switches,
|
|
// grid loads, or file I/O. Backend handlers are independent of the prompt
|
|
// queue. Keep this false unless explicitly debugging contention.
|
|
DEFER_GRID_FETCH_DURING_EXECUTION: false,
|
|
VIEWER_PAUSE_DURING_EXECUTION: true,
|
|
FLOATING_VIEWER_PAUSE_DURING_EXECUTION: false,
|
|
MFV_SIDEBAR_POSITION: "right",
|
|
MFV_LIVE_DEFAULT: true,
|
|
MFV_PREVIEW_DEFAULT: true,
|
|
MFV_LIVE_AUTO_OPEN: false,
|
|
MFV_PREVIEW_AUTO_OPEN: false,
|
|
MFV_NODE_STREAM_AUTO_OPEN: false,
|
|
MFV_PREVIEW_METHOD: "auto",
|
|
MFV_KJ_PREVIEW_OVERRIDE_ENABLED: true,
|
|
MFV_TOPBAR_BUTTON: true,
|
|
|
|
// Rating/tags hydration (grid)
|
|
RT_HYDRATE_CONCURRENCY: 2,
|
|
RT_HYDRATE_QUEUE_MAX: 100,
|
|
RT_HYDRATE_SEEN_MAX: 20000,
|
|
RT_HYDRATE_PRUNE_BUDGET: 250,
|
|
RT_HYDRATE_SEEN_TTL_MS: 10 * 60 * 1000,
|
|
|
|
// Viewer metadata cache
|
|
VIEWER_META_TTL_MS: 30_000,
|
|
VIEWER_META_MAX_ENTRIES: 500,
|
|
|
|
// Workflow Minimap
|
|
WORKFLOW_MINIMAP_ENABLED: true,
|
|
WATCHER_DEBOUNCE_MS: 3000,
|
|
WATCHER_DEDUPE_TTL_MS: 3000,
|
|
WATCHER_MAX_PENDING: 500,
|
|
WATCHER_MIN_SIZE: 100,
|
|
WATCHER_MAX_SIZE: 4294967296,
|
|
// DB tuning (user-settable via advanced settings)
|
|
DB_TIMEOUT_MS: 5000,
|
|
DB_MAX_CONNECTIONS: 10,
|
|
DB_QUERY_TIMEOUT_MS: 1000,
|
|
// Search limit (user-settable via settings)
|
|
SEARCH_REQUEST_LIMIT: 500,
|
|
// UI safety knobs
|
|
DELETE_CONFIRMATION: true,
|
|
DEBUG_VERBOSE_ERRORS: false,
|
|
SIDEBAR_ASSET_BADGE_ENABLED: true,
|
|
});
|
|
|
|
// Widen literal types to their base types and strip readonly to allow runtime mutation.
|
|
type WideConfig<T> = { -readonly [K in keyof T]: T[K] extends number ? number : T[K] extends boolean ? boolean : T[K] extends string ? string : T[K] };
|
|
|
|
// Runtime config (some values are user-tunable via settings).
|
|
export const APP_CONFIG: WideConfig<typeof APP_DEFAULTS> & Record<string, any> = {
|
|
...APP_DEFAULTS,
|
|
};
|
|
|
|
export type AppConfig = WideConfig<typeof APP_DEFAULTS>;
|