/** * Hand ID Constants - Single Source of Truth * * All Hand-related constants should reference this file. * Do NOT hardcode Hand IDs elsewhere. */ // === Hand IDs (must match backend zclaw-hands) === export const HAND_IDS = { BROWSER: 'browser', RESEARCHER: 'researcher', COLLECTOR: 'collector', PREDICTOR: 'predictor', LEAD: 'lead', TRADER: 'trader', CLIP: 'clip', TWITTER: 'twitter', // Additional hands from backend SLIDESHOW: 'slideshow', SPEECH: 'speech', QUIZ: 'quiz', WHITEBOARD: 'whiteboard', } as const; export type HandIdType = typeof HAND_IDS[keyof typeof HAND_IDS]; // === Hand Categories === export const HAND_CATEGORIES = { RESEARCH: 'research', DATA: 'data', AUTOMATION: 'automation', COMMUNICATION: 'communication', CONTENT: 'content', PRODUCTIVITY: 'productivity', } as const; export type HandCategoryType = typeof HAND_CATEGORIES[keyof typeof HAND_CATEGORIES]; // === Hand ID to Category Mapping === export const HAND_CATEGORY_MAP: Record = { [HAND_IDS.BROWSER]: HAND_CATEGORIES.RESEARCH, [HAND_IDS.RESEARCHER]: HAND_CATEGORIES.RESEARCH, [HAND_IDS.COLLECTOR]: HAND_CATEGORIES.DATA, [HAND_IDS.PREDICTOR]: HAND_CATEGORIES.DATA, [HAND_IDS.TRADER]: HAND_CATEGORIES.DATA, [HAND_IDS.LEAD]: HAND_CATEGORIES.COMMUNICATION, [HAND_IDS.TWITTER]: HAND_CATEGORIES.COMMUNICATION, [HAND_IDS.CLIP]: HAND_CATEGORIES.CONTENT, [HAND_IDS.SLIDESHOW]: HAND_CATEGORIES.CONTENT, [HAND_IDS.SPEECH]: HAND_CATEGORIES.CONTENT, [HAND_IDS.QUIZ]: HAND_CATEGORIES.PRODUCTIVITY, [HAND_IDS.WHITEBOARD]: HAND_CATEGORIES.PRODUCTIVITY, }; // === Helper Functions === /** * Get the category for a Hand ID */ export function getHandCategory(handId: string): HandCategoryType { return HAND_CATEGORY_MAP[handId] || HAND_CATEGORIES.PRODUCTIVITY; } /** * Check if a Hand ID is valid */ export function isValidHandId(id: string): id is HandIdType { return Object.values(HAND_IDS).includes(id as HandIdType); } /** * Get all Hand IDs as an array */ export function getAllHandIds(): string[] { return Object.values(HAND_IDS); }