Part of the frontend audit finding on ~230 any/as any occurrences.
Adds ui/types/asset.d.ts documenting the asset shape actually read
across the grid/sidebar/viewer components (id, filename, kind, tags,
rating, workflow metadata, file_info, etc.) with a permissive index
signature as fallback, and replaces every local ad-hoc asset-like
interface/any prop with it: AssetCardInner, CollectionsPopover,
SidebarFileInfoSection, SidebarGenerationSection,
SidebarWorkflowSection, ViewerMetadataBlock, RatingEditor, TagsEditor,
FolderCard, AssetSidebarContent, SidebarFolderSection,
SidebarHeaderSection, SidebarPreviewSection.
This both removes a chunk of `any` (150 -> 124 in ui/vue) and gives
future components one place to extend the asset shape instead of
re-declaring it. Remaining `any` usage is concentrated in two
legitimate categories, not oversights:
- "glue" refs to sibling components whose defineExpose isn't
individually typed yet (App.vue, HeaderSection.vue, AssetsGrid.vue)
- genuinely dynamic third-party payloads (ComfyUI workflow/node JSON
in SidebarWorkflowSection, context-menu item objects)
Build + full vitest suite (831 tests) pass. Live-verified against the
running ComfyUI instance.