/** Shared types + query keys for MITRE ATT&CK browsing. */ export interface MitreTactic { id: string; external_id: string; short_name: string; name: string; description: string | null; url: string | null; } export interface MitreTechnique { id: string; external_id: string; name: string; description: string | null; url: string | null; tactics: Array<{ external_id: string; name: string }>; } export interface MitreSubtechnique { id: string; external_id: string; name: string; description: string | null; url: string | null; technique_id: string; } export interface Paginated { items: T[]; total: number; limit: number; offset: number; } export interface MitreStatus { last_sync: string | null; version: string | null; source_url: string | null; default_url: string; default_version: string; } export type MitreTagKind = 'tactic' | 'technique' | 'subtechnique'; export interface MitreTag { kind: MitreTagKind; id: string; external_id: string; name: string; } export const mitreKeys = { status: ['mitre', 'status'] as const, tactics: (q?: string) => ['mitre', 'tactics', q ?? ''] as const, techniques: (tactic?: string, q?: string) => ['mitre', 'techniques', tactic ?? '', q ?? ''] as const, subtechniques: (technique?: string, q?: string) => ['mitre', 'subtechniques', technique ?? '', q ?? ''] as const, };