@geenius/ai 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/package.json +15 -2
  2. package/packages/convex/dist/index.d.ts +1 -0
  3. package/packages/convex/dist/index.js +42 -0
  4. package/packages/convex/dist/index.js.map +1 -0
  5. package/packages/react/README.md +1 -1
  6. package/packages/react-css/README.md +1 -1
  7. package/packages/react-css/dist/index.cjs +1544 -0
  8. package/packages/react-css/dist/index.cjs.map +1 -0
  9. package/packages/react-css/dist/index.d.cts +454 -0
  10. package/packages/react-css/dist/index.d.ts +454 -0
  11. package/packages/react-css/dist/index.js +1495 -0
  12. package/packages/react-css/dist/index.js.map +1 -0
  13. package/packages/shared/README.md +1 -1
  14. package/packages/solidjs/README.md +1 -1
  15. package/packages/solidjs-css/README.md +1 -1
  16. package/packages/solidjs-css/dist/index.cjs +674 -0
  17. package/packages/solidjs-css/dist/index.cjs.map +1 -0
  18. package/packages/solidjs-css/dist/index.d.cts +254 -0
  19. package/packages/solidjs-css/dist/index.d.ts +254 -0
  20. package/packages/solidjs-css/dist/index.js +634 -0
  21. package/packages/solidjs-css/dist/index.js.map +1 -0
  22. package/.changeset/config.json +0 -11
  23. package/.env.example +0 -2
  24. package/.github/CODEOWNERS +0 -1
  25. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
  26. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
  27. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  28. package/.github/dependabot.yml +0 -11
  29. package/.github/workflows/ci.yml +0 -23
  30. package/.github/workflows/release.yml +0 -29
  31. package/.node-version +0 -1
  32. package/.nvmrc +0 -1
  33. package/.prettierrc +0 -7
  34. package/.project/ACCOUNT.yaml +0 -4
  35. package/.project/IDEAS.yaml +0 -7
  36. package/.project/PROJECT.yaml +0 -11
  37. package/.project/ROADMAP.yaml +0 -15
  38. package/CODE_OF_CONDUCT.md +0 -26
  39. package/CONTRIBUTING.md +0 -61
  40. package/SECURITY.md +0 -18
  41. package/SUPPORT.md +0 -14
  42. package/packages/convex/package.json +0 -42
  43. package/packages/convex/src/index.ts +0 -8
  44. package/packages/convex/src/mutations/messages.ts +0 -29
  45. package/packages/convex/src/queries/messages.ts +0 -24
  46. package/packages/convex/src/schema.ts +0 -20
  47. package/packages/convex/tsconfig.json +0 -11
  48. package/packages/convex/tsup.config.ts +0 -17
  49. package/packages/react/package.json +0 -60
  50. package/packages/react/src/components/AILogTable.tsx +0 -90
  51. package/packages/react/src/components/ChatWindow.tsx +0 -118
  52. package/packages/react/src/components/GenerationCard.tsx +0 -73
  53. package/packages/react/src/components/ImageGenerator.tsx +0 -103
  54. package/packages/react/src/components/ModelSelector.tsx +0 -44
  55. package/packages/react/src/components/ModelTestRunner.tsx +0 -148
  56. package/packages/react/src/components/VoiceSelector.tsx +0 -51
  57. package/packages/react/src/components/index.ts +0 -9
  58. package/packages/react/src/hooks/index.ts +0 -12
  59. package/packages/react/src/hooks/useAI.ts +0 -158
  60. package/packages/react/src/hooks/useAILogs.ts +0 -40
  61. package/packages/react/src/hooks/useAIModels.ts +0 -53
  62. package/packages/react/src/hooks/useChat.ts +0 -141
  63. package/packages/react/src/hooks/useContentManager.ts +0 -108
  64. package/packages/react/src/hooks/useImageGeneration.ts +0 -82
  65. package/packages/react/src/hooks/useMemory.ts +0 -161
  66. package/packages/react/src/hooks/useModelTest.ts +0 -126
  67. package/packages/react/src/hooks/useRealtimeAudio.ts +0 -203
  68. package/packages/react/src/hooks/useSkills.ts +0 -114
  69. package/packages/react/src/hooks/useTextToSpeech.ts +0 -99
  70. package/packages/react/src/hooks/useTranscription.ts +0 -119
  71. package/packages/react/src/hooks/useVideoGeneration.ts +0 -79
  72. package/packages/react/src/index.ts +0 -42
  73. package/packages/react/src/pages/AILogsPage.tsx +0 -98
  74. package/packages/react/src/pages/ChatPage.tsx +0 -42
  75. package/packages/react/src/pages/ModelTestPage.tsx +0 -33
  76. package/packages/react/src/pages/index.ts +0 -5
  77. package/packages/react/tsconfig.json +0 -26
  78. package/packages/react/tsup.config.ts +0 -22
  79. package/packages/react-css/package.json +0 -45
  80. package/packages/react-css/src/ai.css +0 -857
  81. package/packages/react-css/src/components/AILogTable.tsx +0 -90
  82. package/packages/react-css/src/components/ChatWindow.tsx +0 -118
  83. package/packages/react-css/src/components/GenerationCard.tsx +0 -73
  84. package/packages/react-css/src/components/ImageGenerator.tsx +0 -103
  85. package/packages/react-css/src/components/ModelSelector.tsx +0 -44
  86. package/packages/react-css/src/components/ModelTestRunner.tsx +0 -148
  87. package/packages/react-css/src/components/VoiceSelector.tsx +0 -51
  88. package/packages/react-css/src/components/index.ts +0 -9
  89. package/packages/react-css/src/hooks/index.ts +0 -12
  90. package/packages/react-css/src/hooks/useAI.ts +0 -153
  91. package/packages/react-css/src/hooks/useAILogs.ts +0 -40
  92. package/packages/react-css/src/hooks/useAIModels.ts +0 -51
  93. package/packages/react-css/src/hooks/useChat.ts +0 -145
  94. package/packages/react-css/src/hooks/useContentManager.ts +0 -108
  95. package/packages/react-css/src/hooks/useImageGeneration.ts +0 -82
  96. package/packages/react-css/src/hooks/useMemory.ts +0 -161
  97. package/packages/react-css/src/hooks/useModelTest.ts +0 -122
  98. package/packages/react-css/src/hooks/useRealtimeAudio.ts +0 -203
  99. package/packages/react-css/src/hooks/useSkills.ts +0 -114
  100. package/packages/react-css/src/hooks/useTextToSpeech.ts +0 -99
  101. package/packages/react-css/src/hooks/useTranscription.ts +0 -119
  102. package/packages/react-css/src/hooks/useVideoGeneration.ts +0 -79
  103. package/packages/react-css/src/index.ts +0 -35
  104. package/packages/react-css/src/pages/AILogsPage.tsx +0 -98
  105. package/packages/react-css/src/pages/ChatPage.tsx +0 -42
  106. package/packages/react-css/src/pages/ModelTestPage.tsx +0 -33
  107. package/packages/react-css/src/pages/index.ts +0 -5
  108. package/packages/react-css/src/styles.css +0 -127
  109. package/packages/react-css/tsconfig.json +0 -26
  110. package/packages/react-css/tsup.config.ts +0 -2
  111. package/packages/shared/package.json +0 -71
  112. package/packages/shared/src/__tests__/ai.test.ts +0 -67
  113. package/packages/shared/src/ai-client.ts +0 -243
  114. package/packages/shared/src/config.ts +0 -235
  115. package/packages/shared/src/content.ts +0 -249
  116. package/packages/shared/src/convex/helpers.ts +0 -163
  117. package/packages/shared/src/convex/index.ts +0 -16
  118. package/packages/shared/src/convex/schemas.ts +0 -146
  119. package/packages/shared/src/convex/validators.ts +0 -136
  120. package/packages/shared/src/index.ts +0 -107
  121. package/packages/shared/src/memory.ts +0 -197
  122. package/packages/shared/src/providers/base.ts +0 -103
  123. package/packages/shared/src/providers/elevenlabs.ts +0 -155
  124. package/packages/shared/src/providers/index.ts +0 -28
  125. package/packages/shared/src/providers/openai-compatible.ts +0 -286
  126. package/packages/shared/src/providers/registry.ts +0 -113
  127. package/packages/shared/src/providers/replicate-fal.ts +0 -230
  128. package/packages/shared/src/skills.ts +0 -273
  129. package/packages/shared/src/types.ts +0 -501
  130. package/packages/shared/tsconfig.json +0 -25
  131. package/packages/shared/tsup.config.ts +0 -22
  132. package/packages/shared/vitest.config.ts +0 -4
  133. package/packages/solidjs/package.json +0 -59
  134. package/packages/solidjs/src/components/ChatWindow.tsx +0 -78
  135. package/packages/solidjs/src/components/GenerationCard.tsx +0 -62
  136. package/packages/solidjs/src/components/ModelTestRunner.tsx +0 -119
  137. package/packages/solidjs/src/components/index.ts +0 -5
  138. package/packages/solidjs/src/index.ts +0 -32
  139. package/packages/solidjs/src/pages/ChatPage.tsx +0 -22
  140. package/packages/solidjs/src/pages/ModelTestPage.tsx +0 -22
  141. package/packages/solidjs/src/pages/index.ts +0 -4
  142. package/packages/solidjs/src/primitives/createAI.ts +0 -79
  143. package/packages/solidjs/src/primitives/createChat.ts +0 -100
  144. package/packages/solidjs/src/primitives/createContentManager.ts +0 -61
  145. package/packages/solidjs/src/primitives/createImageGeneration.ts +0 -46
  146. package/packages/solidjs/src/primitives/createMemory.ts +0 -127
  147. package/packages/solidjs/src/primitives/createModelTest.ts +0 -89
  148. package/packages/solidjs/src/primitives/createSkills.ts +0 -83
  149. package/packages/solidjs/src/primitives/createTextToSpeech.ts +0 -56
  150. package/packages/solidjs/src/primitives/createVideoGeneration.ts +0 -46
  151. package/packages/solidjs/src/primitives/index.ts +0 -8
  152. package/packages/solidjs/tsconfig.json +0 -27
  153. package/packages/solidjs/tsup.config.ts +0 -21
  154. package/packages/solidjs-css/package.json +0 -44
  155. package/packages/solidjs-css/src/ai.css +0 -857
  156. package/packages/solidjs-css/src/components/ChatWindow.tsx +0 -78
  157. package/packages/solidjs-css/src/components/GenerationCard.tsx +0 -62
  158. package/packages/solidjs-css/src/components/ModelTestRunner.tsx +0 -119
  159. package/packages/solidjs-css/src/components/index.ts +0 -5
  160. package/packages/solidjs-css/src/index.ts +0 -26
  161. package/packages/solidjs-css/src/pages/ChatPage.tsx +0 -22
  162. package/packages/solidjs-css/src/pages/ModelTestPage.tsx +0 -22
  163. package/packages/solidjs-css/src/pages/index.ts +0 -4
  164. package/packages/solidjs-css/src/primitives/createAI.ts +0 -79
  165. package/packages/solidjs-css/src/primitives/createChat.ts +0 -100
  166. package/packages/solidjs-css/src/primitives/createContentManager.ts +0 -61
  167. package/packages/solidjs-css/src/primitives/createImageGeneration.ts +0 -46
  168. package/packages/solidjs-css/src/primitives/createMemory.ts +0 -127
  169. package/packages/solidjs-css/src/primitives/createModelTest.ts +0 -89
  170. package/packages/solidjs-css/src/primitives/createSkills.ts +0 -83
  171. package/packages/solidjs-css/src/primitives/createTextToSpeech.ts +0 -56
  172. package/packages/solidjs-css/src/primitives/createVideoGeneration.ts +0 -46
  173. package/packages/solidjs-css/src/primitives/index.ts +0 -1
  174. package/packages/solidjs-css/src/styles.css +0 -127
  175. package/packages/solidjs-css/tsconfig.json +0 -27
  176. package/packages/solidjs-css/tsup.config.ts +0 -2
  177. package/pnpm-workspace.yaml +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useAI.ts","../src/hooks/useChat.ts","../src/hooks/useAILogs.ts","../src/hooks/useModelTest.ts","../src/hooks/useAIModels.ts","../src/hooks/useImageGeneration.ts","../src/hooks/useTextToSpeech.ts","../src/hooks/useVideoGeneration.ts","../src/hooks/useTranscription.ts","../src/hooks/useRealtimeAudio.ts","../src/hooks/useContentManager.ts","../src/hooks/useMemory.ts","../src/hooks/useSkills.ts","../src/components/ChatWindow.tsx","../src/components/ModelSelector.tsx","../src/components/AILogTable.tsx","../src/components/ModelTestRunner.tsx","../src/components/GenerationCard.tsx","../src/components/ImageGenerator.tsx","../src/components/VoiceSelector.tsx","../src/pages/ChatPage.tsx","../src/pages/ModelTestPage.tsx","../src/pages/AILogsPage.tsx"],"sourcesContent":["// @geenius/ai-react — src/hooks/useAI.ts\n\n/**\n * Core AI hook — generate text/image/audio/video with loading state.\n */\n\nimport { useState, useCallback } from 'react'\nimport { useAction } from 'convex/react'\nimport type { AIGenerationType } from '@geenius/ai-shared'\n\nexport interface UseAIOptions {\n /** Convex action reference for text generation (api.ai.generateText) */\n generateTextAction?: any\n /** Convex action reference for image generation */\n generateImageAction?: any\n /** Convex action reference for audio generation */\n generateAudioAction?: any\n /** Convex action reference for transcription */\n transcribeAudioAction?: any\n /** Convex action reference for video generation */\n generateVideoAction?: any\n}\n\nexport interface UseAIReturn {\n generateText: (args: {\n model: string\n messages: any[]\n temperature?: number\n maxTokens?: number\n caller?: string\n }) => Promise<string>\n generateImage: (prompt: string, model?: string) => Promise<string>\n generateAudio: (prompt: string, voice?: string) => Promise<string>\n transcribeAudio: (audio: string) => Promise<string>\n generateVideo: (prompt: string) => Promise<string>\n isLoading: boolean\n error: string | null\n lastResult: string | null\n lastType: AIGenerationType | null\n clearError: () => void\n}\n\nexport function useAI(options: UseAIOptions = {}): UseAIReturn {\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [lastResult, setLastResult] = useState<string | null>(null)\n const [lastType, setLastType] = useState<AIGenerationType | null>(null)\n\n const textAction = options.generateTextAction ? useAction(options.generateTextAction) : null\n const imageAction = options.generateImageAction ? useAction(options.generateImageAction) : null\n const audioAction = options.generateAudioAction ? useAction(options.generateAudioAction) : null\n const transcribeAction = options.transcribeAudioAction ? useAction(options.transcribeAudioAction) : null\n const videoAction = options.generateVideoAction ? useAction(options.generateVideoAction) : null\n\n const generateText = useCallback(async (args: {\n model: string; messages: any[]; temperature?: number; maxTokens?: number; caller?: string\n }) => {\n if (!textAction) throw new Error('generateTextAction not provided')\n setIsLoading(true)\n setError(null)\n try {\n const result = await textAction(args)\n setLastResult(result)\n setLastType('text')\n return result\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Text generation failed'\n setError(msg)\n throw err\n } finally {\n setIsLoading(false)\n }\n }, [textAction])\n\n const generateImage = useCallback(async (prompt: string, model?: string) => {\n if (!imageAction) throw new Error('generateImageAction not provided')\n setIsLoading(true)\n setError(null)\n try {\n const result = await imageAction({ prompt, model })\n setLastResult(result)\n setLastType('image')\n return result\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Image generation failed'\n setError(msg)\n throw err\n } finally {\n setIsLoading(false)\n }\n }, [imageAction])\n\n const generateAudio = useCallback(async (prompt: string, voice?: string) => {\n if (!audioAction) throw new Error('generateAudioAction not provided')\n setIsLoading(true)\n setError(null)\n try {\n const result = await audioAction({ prompt, voice })\n setLastResult(result)\n setLastType('audio')\n return result\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Audio generation failed'\n setError(msg)\n throw err\n } finally {\n setIsLoading(false)\n }\n }, [audioAction])\n\n const transcribeAudio = useCallback(async (audio: string) => {\n if (!transcribeAction) throw new Error('transcribeAudioAction not provided')\n setIsLoading(true)\n setError(null)\n try {\n const result = await transcribeAction({ audio })\n setLastResult(result)\n setLastType('transcription')\n return result\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Transcription failed'\n setError(msg)\n throw err\n } finally {\n setIsLoading(false)\n }\n }, [transcribeAction])\n\n const generateVideo = useCallback(async (prompt: string) => {\n if (!videoAction) throw new Error('generateVideoAction not provided')\n setIsLoading(true)\n setError(null)\n try {\n const result = await videoAction({ prompt })\n setLastResult(result)\n setLastType('video')\n return result\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Video generation failed'\n setError(msg)\n throw err\n } finally {\n setIsLoading(false)\n }\n }, [videoAction])\n\n const clearError = useCallback(() => setError(null), [])\n\n return {\n generateText, generateImage, generateAudio, transcribeAudio, generateVideo,\n isLoading, error, lastResult, lastType, clearError,\n }\n}\n","// @geenius/ai-react — src/hooks/useChat.ts\n\n/**\n * Chat conversation hook — manages messages, sends messages,\n * and tracks conversation state.\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport { useQuery, useMutation, useAction } from 'convex/react'\nimport type { AIChatMessage, AIMessageRole } from '@geenius/ai-shared'\n\nexport interface UseChatOptions {\n conversationId?: string\n /** Query reference: api.ai.getConversation */\n getConversationQuery?: any\n /** Query reference: api.ai.listMessages */\n listMessagesQuery?: any\n /** Mutation reference: api.ai.sendMessage */\n sendMessageMutation?: any\n /** Action reference: api.ai.generateText (for AI response) */\n generateTextAction?: any\n /** Mutation reference: api.ai.createConversation */\n createConversationMutation?: any\n model?: string\n systemPrompt?: string\n onNewConversation?: (id: string) => void\n}\n\nexport interface UseChatReturn {\n messages: AIChatMessage[]\n isLoading: boolean\n isSending: boolean\n error: string | null\n sendMessage: (content: string) => Promise<void>\n conversationId: string | null\n clearError: () => void\n}\n\nexport function useChat(options: UseChatOptions = {}): UseChatReturn {\n const [localMessages, setLocalMessages] = useState<AIChatMessage[]>([])\n const [isSending, setIsSending] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [conversationId, setConversationId] = useState<string | null>(options.conversationId ?? null)\n\n // Convex hooks (conditional — only used if references are provided)\n const convexMessages = options.listMessagesQuery && conversationId\n ? useQuery(options.listMessagesQuery, { conversationId })\n : undefined\n\n const sendMutation = options.sendMessageMutation\n ? useMutation(options.sendMessageMutation)\n : null\n\n const createConversation = options.createConversationMutation\n ? useMutation(options.createConversationMutation)\n : null\n\n const textAction = options.generateTextAction\n ? useAction(options.generateTextAction)\n : null\n\n const messages = convexMessages ?? localMessages\n\n const sendMessage = useCallback(async (content: string) => {\n setIsSending(true)\n setError(null)\n\n try {\n let activeConversationId = conversationId\n\n // Create conversation if needed\n if (!activeConversationId && createConversation) {\n activeConversationId = await createConversation({\n title: content.substring(0, 100),\n model: options.model ?? 'gpt-4o',\n systemPrompt: options.systemPrompt,\n })\n setConversationId(activeConversationId)\n if (activeConversationId) options.onNewConversation?.(activeConversationId)\n }\n\n // Add user message\n if (sendMutation && activeConversationId) {\n await sendMutation({ conversationId: activeConversationId, content })\n } else {\n // Local-only mode\n const userMsg: AIChatMessage = {\n id: `msg-${Date.now()}`,\n conversationId: activeConversationId ?? 'local',\n userId: 'local',\n role: 'user',\n content,\n createdAt: Date.now(),\n }\n setLocalMessages(prev => [...prev, userMsg])\n }\n\n // Generate AI response if action provided\n if (textAction) {\n const aiResponse = await textAction({\n model: options.model ?? 'gpt-4o',\n messages: [\n ...(options.systemPrompt\n ? [{ role: 'system', content: options.systemPrompt }]\n : []),\n ...(messages as AIChatMessage[]).map((m: AIChatMessage) => ({ role: m.role, content: m.content })),\n { role: 'user', content },\n ],\n caller: 'chat',\n })\n\n // If local-only, add the response too\n if (!sendMutation) {\n const assistantMsg: AIChatMessage = {\n id: `msg-${Date.now()}-ai`,\n conversationId: activeConversationId ?? 'local',\n userId: 'ai',\n role: 'assistant',\n content: aiResponse,\n model: options.model ?? 'gpt-4o',\n createdAt: Date.now(),\n }\n setLocalMessages(prev => [...prev, assistantMsg])\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Failed to send message'\n setError(msg)\n } finally {\n setIsSending(false)\n }\n }, [conversationId, sendMutation, createConversation, textAction, messages, options])\n\n const clearError = useCallback(() => setError(null), [])\n\n return {\n messages: messages as AIChatMessage[],\n isLoading: convexMessages === undefined && !!options.listMessagesQuery,\n isSending,\n error,\n sendMessage,\n conversationId,\n clearError,\n }\n}\n","// @geenius/ai-react — src/hooks/useAILogs.ts\n\n/**\n * Hook for querying AI logs with filters.\n */\n\nimport { useQuery } from 'convex/react'\nimport type { AILogEntry, AIRequestStatus } from '@geenius/ai-shared'\n\nexport interface UseAILogsOptions {\n /** Query reference: api.ai.listLogs */\n listLogsQuery: any\n filters?: {\n model?: string\n provider?: string\n status?: AIRequestStatus\n caller?: string\n }\n limit?: number\n}\n\nexport interface UseAILogsReturn {\n logs: AILogEntry[]\n isLoading: boolean\n}\n\nexport function useAILogs(options: UseAILogsOptions): UseAILogsReturn {\n const logs = useQuery(options.listLogsQuery, {\n model: options.filters?.model,\n provider: options.filters?.provider,\n status: options.filters?.status,\n caller: options.filters?.caller,\n limit: options.limit ?? 50,\n })\n\n return {\n logs: (logs ?? []) as AILogEntry[],\n isLoading: logs === undefined,\n }\n}\n","// @geenius/ai-react — src/hooks/useModelTest.ts\n\n/**\n * Hook for testing AI models with prompts.\n */\n\nimport { useState, useCallback } from 'react'\nimport { useAction } from 'convex/react'\nimport type { AIGenerationType } from '@geenius/ai-shared'\n\nexport interface UseModelTestOptions {\n /** Action reference for text: api.ai.generateText */\n generateTextAction?: any\n /** Action reference for image: api.ai.generateImage */\n generateImageAction?: any\n /** Action reference for audio: api.ai.generateAudio */\n generateAudioAction?: any\n /** Action reference for transcription: api.ai.transcribeAudio */\n transcribeAudioAction?: any\n /** Action reference for video: api.ai.generateVideo */\n generateVideoAction?: any\n}\n\nexport interface ModelTestResult {\n model: string\n type: AIGenerationType\n result: string\n durationMs: number\n timestamp: number\n error?: string\n}\n\nexport interface UseModelTestReturn {\n runTest: (model: string, prompt: string, type?: AIGenerationType) => Promise<ModelTestResult>\n runBatchTest: (models: string[], prompt: string) => Promise<ModelTestResult[]>\n results: ModelTestResult[]\n isRunning: boolean\n clearResults: () => void\n}\n\nexport function useModelTest(options: UseModelTestOptions = {}): UseModelTestReturn {\n const [results, setResults] = useState<ModelTestResult[]>([])\n const [isRunning, setIsRunning] = useState(false)\n\n const textAction = options.generateTextAction ? useAction(options.generateTextAction) : null\n const imageAction = options.generateImageAction ? useAction(options.generateImageAction) : null\n const audioAction = options.generateAudioAction ? useAction(options.generateAudioAction) : null\n const transcribeAction = options.transcribeAudioAction ? useAction(options.transcribeAudioAction) : null\n const videoAction = options.generateVideoAction ? useAction(options.generateVideoAction) : null\n\n const runTest = useCallback(async (\n model: string,\n prompt: string,\n type: AIGenerationType = 'text',\n ): Promise<ModelTestResult> => {\n setIsRunning(true)\n const start = Date.now()\n\n try {\n let result = ''\n switch (type) {\n case 'text':\n if (!textAction) throw new Error('generateTextAction not provided')\n result = await textAction({\n model,\n messages: [{ role: 'user', content: prompt }],\n caller: 'model-test',\n })\n break\n case 'image':\n if (!imageAction) throw new Error('generateImageAction not provided')\n result = await imageAction({ prompt, model })\n break\n case 'audio':\n if (!audioAction) throw new Error('generateAudioAction not provided')\n result = await audioAction({ prompt })\n break\n case 'video':\n if (!videoAction) throw new Error('generateVideoAction not provided')\n result = await videoAction({ prompt })\n break\n default:\n throw new Error(`Unsupported test type: ${type}`)\n }\n\n const testResult: ModelTestResult = {\n model, type, result, durationMs: Date.now() - start, timestamp: Date.now(),\n }\n setResults(prev => [...prev, testResult])\n return testResult\n } catch (err) {\n const testResult: ModelTestResult = {\n model, type, result: '',\n durationMs: Date.now() - start,\n timestamp: Date.now(),\n error: err instanceof Error ? err.message : 'Test failed',\n }\n setResults(prev => [...prev, testResult])\n return testResult\n } finally {\n setIsRunning(false)\n }\n }, [textAction, imageAction, audioAction, videoAction])\n\n const runBatchTest = useCallback(async (\n models: string[],\n prompt: string,\n ): Promise<ModelTestResult[]> => {\n setIsRunning(true)\n const batchResults: ModelTestResult[] = []\n for (const model of models) {\n const result = await runTest(model, prompt)\n batchResults.push(result)\n }\n setIsRunning(false)\n return batchResults\n }, [runTest])\n\n const clearResults = useCallback(() => setResults([]), [])\n\n return { runTest, runBatchTest, results, isRunning, clearResults }\n}\n","// @geenius/ai-react — src/hooks/useAIModels.ts\n\n/**\n * Hook for managing AI models and providers.\n */\n\nimport { useQuery, useMutation } from 'convex/react'\nimport { useCallback } from 'react'\nimport type { AIModel } from '@geenius/ai-shared'\n\nexport interface UseAIModelsOptions {\n /** Query reference: api.ai.listModels */\n listModelsQuery: any\n /** Mutation reference: api.ai.upsertModel */\n upsertModelMutation?: any\n}\n\nexport interface UseAIModelsReturn {\n models: AIModel[]\n isLoading: boolean\n upsertModel: (model: Partial<AIModel> & { id: string; provider: string }) => Promise<void>\n}\n\nexport function useAIModels(options: UseAIModelsOptions): UseAIModelsReturn {\n const models = useQuery(options.listModelsQuery, {})\n const upsertMutation = options.upsertModelMutation\n ? useMutation(options.upsertModelMutation)\n : null\n\n const upsertModel = useCallback(async (\n model: Partial<AIModel> & { id: string; provider: string },\n ) => {\n if (!upsertMutation) throw new Error('upsertModelMutation not provided')\n await upsertMutation({\n model: model.id,\n provider: model.provider,\n displayName: model.displayName,\n inputCostPer1k: model.inputCostPer1k ?? 0,\n outputCostPer1k: model.outputCostPer1k ?? 0,\n capabilities: model.capabilities,\n contextWindow: model.contextWindow,\n isActive: model.isActive,\n })\n }, [upsertMutation])\n\n return {\n models: (models ?? []) as AIModel[],\n isLoading: models === undefined,\n upsertModel,\n }\n}\n","// @geenius/ai-react — src/hooks/useImageGeneration.ts\n\n/**\n * Image generation hook (DALL-E, SDXL, Flux, etc.)\n */\n\nimport { useState, useCallback } from 'react'\nimport { useAction } from 'convex/react'\n\nexport interface GeneratedImage {\n url: string\n prompt: string\n model: string\n timestamp: number\n}\n\nexport interface UseImageGenerationOptions {\n generateImageAction: any\n defaultModel?: string\n}\n\nexport interface UseImageGenerationReturn {\n generate: (prompt: string, options?: {\n model?: string\n negativePrompt?: string\n size?: string\n quality?: 'standard' | 'hd'\n style?: 'natural' | 'vivid'\n n?: number\n seed?: number\n }) => Promise<string>\n images: GeneratedImage[]\n isGenerating: boolean\n error: string | null\n clearImages: () => void\n clearError: () => void\n}\n\nexport function useImageGeneration(options: UseImageGenerationOptions): UseImageGenerationReturn {\n const [images, setImages] = useState<GeneratedImage[]>([])\n const [isGenerating, setIsGenerating] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const action = useAction(options.generateImageAction)\n\n const generate = useCallback(async (prompt: string, opts?: {\n model?: string; negativePrompt?: string; size?: string\n quality?: 'standard' | 'hd'; style?: 'natural' | 'vivid'; n?: number; seed?: number\n }) => {\n setIsGenerating(true)\n setError(null)\n try {\n const model = opts?.model ?? options.defaultModel ?? 'dall-e-3'\n const result = await action({\n prompt, model,\n negativePrompt: opts?.negativePrompt,\n size: opts?.size ?? '1024x1024',\n quality: opts?.quality,\n style: opts?.style,\n n: opts?.n ?? 1,\n seed: opts?.seed,\n })\n const img: GeneratedImage = {\n url: result.startsWith('http') ? result : `data:image/png;base64,${result}`,\n prompt, model, timestamp: Date.now(),\n }\n setImages(prev => [img, ...prev])\n return img.url\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Image generation failed'\n setError(msg)\n throw err\n } finally {\n setIsGenerating(false)\n }\n }, [action, options.defaultModel])\n\n return {\n generate, images, isGenerating, error,\n clearImages: () => setImages([]),\n clearError: () => setError(null),\n }\n}\n","// @geenius/ai-react — src/hooks/useTextToSpeech.ts\n\n/**\n * TTS hook — OpenAI TTS, ElevenLabs, etc.\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { useAction } from 'convex/react'\n\nexport interface UseTextToSpeechOptions {\n generateAudioAction: any\n defaultVoice?: string\n defaultModel?: string\n autoPlay?: boolean\n}\n\nexport interface UseTextToSpeechReturn {\n speak: (text: string, options?: {\n voice?: string; model?: string; speed?: number\n voiceSettings?: {\n stability?: number; similarityBoost?: number; style?: number\n }\n }) => Promise<string>\n stop: () => void\n isSpeaking: boolean\n isGenerating: boolean\n error: string | null\n audioUrl: string | null\n clearError: () => void\n}\n\nexport function useTextToSpeech(options: UseTextToSpeechOptions): UseTextToSpeechReturn {\n const [isGenerating, setIsGenerating] = useState(false)\n const [isSpeaking, setIsSpeaking] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [audioUrl, setAudioUrl] = useState<string | null>(null)\n const audioRef = useRef<HTMLAudioElement | null>(null)\n const action = useAction(options.generateAudioAction)\n\n const speak = useCallback(async (text: string, opts?: {\n voice?: string; model?: string; speed?: number\n voiceSettings?: { stability?: number; similarityBoost?: number; style?: number }\n }) => {\n setIsGenerating(true)\n setError(null)\n try {\n const base64 = await action({\n prompt: text,\n voice: opts?.voice ?? options.defaultVoice ?? 'alloy',\n model: opts?.model ?? options.defaultModel,\n speed: opts?.speed,\n voiceSettings: opts?.voiceSettings,\n })\n\n const url = base64.startsWith('http')\n ? base64\n : `data:audio/mp3;base64,${base64}`\n\n setAudioUrl(url)\n\n // Auto-play if enabled\n if (options.autoPlay !== false) {\n if (audioRef.current) {\n audioRef.current.pause()\n }\n const audio = new Audio(url)\n audioRef.current = audio\n setIsSpeaking(true)\n audio.onended = () => setIsSpeaking(false)\n audio.onerror = () => {\n setIsSpeaking(false)\n setError('Audio playback failed')\n }\n await audio.play()\n }\n\n return url\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'TTS generation failed'\n setError(msg)\n throw err\n } finally {\n setIsGenerating(false)\n }\n }, [action, options])\n\n const stop = useCallback(() => {\n if (audioRef.current) {\n audioRef.current.pause()\n audioRef.current = null\n }\n setIsSpeaking(false)\n }, [])\n\n return {\n speak, stop, isSpeaking, isGenerating, error, audioUrl,\n clearError: () => setError(null),\n }\n}\n","// @geenius/ai-react — src/hooks/useVideoGeneration.ts\n\n/**\n * Video generation hook (Replicate, Fal, etc.)\n */\n\nimport { useState, useCallback } from 'react'\nimport { useAction } from 'convex/react'\n\nexport interface GeneratedVideo {\n url: string\n prompt: string\n model: string\n timestamp: number\n}\n\nexport interface UseVideoGenerationOptions {\n generateVideoAction: any\n defaultModel?: string\n}\n\nexport interface UseVideoGenerationReturn {\n generate: (prompt: string, options?: {\n model?: string\n duration?: number\n aspectRatio?: '16:9' | '9:16' | '1:1'\n resolution?: '720p' | '1080p' | '4k'\n startImage?: string\n endImage?: string\n }) => Promise<string>\n videos: GeneratedVideo[]\n isGenerating: boolean\n error: string | null\n clearVideos: () => void\n clearError: () => void\n}\n\nexport function useVideoGeneration(options: UseVideoGenerationOptions): UseVideoGenerationReturn {\n const [videos, setVideos] = useState<GeneratedVideo[]>([])\n const [isGenerating, setIsGenerating] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const action = useAction(options.generateVideoAction)\n\n const generate = useCallback(async (prompt: string, opts?: {\n model?: string; duration?: number\n aspectRatio?: '16:9' | '9:16' | '1:1'\n resolution?: '720p' | '1080p' | '4k'\n startImage?: string; endImage?: string\n }) => {\n setIsGenerating(true)\n setError(null)\n try {\n const model = opts?.model ?? options.defaultModel ?? 'minimax/video-01'\n const result = await action({\n prompt, model,\n duration: opts?.duration,\n aspectRatio: opts?.aspectRatio,\n resolution: opts?.resolution,\n startImage: opts?.startImage,\n endImage: opts?.endImage,\n })\n const vid: GeneratedVideo = { url: result, prompt, model, timestamp: Date.now() }\n setVideos(prev => [vid, ...prev])\n return result\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Video generation failed'\n setError(msg)\n throw err\n } finally {\n setIsGenerating(false)\n }\n }, [action, options.defaultModel])\n\n return {\n generate, videos, isGenerating, error,\n clearVideos: () => setVideos([]),\n clearError: () => setError(null),\n }\n}\n","// @geenius/ai-react — src/hooks/useTranscription.ts\n\n/**\n * Audio transcription hook (Whisper, Groq ASR, etc.)\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { useAction } from 'convex/react'\n\nexport interface TranscriptionResult {\n text: string\n timestamp: number\n durationMs: number\n}\n\nexport interface UseTranscriptionOptions {\n transcribeAction: any\n defaultModel?: string\n /** Enable browser microphone recording */\n enableMicrophone?: boolean\n}\n\nexport interface UseTranscriptionReturn {\n transcribe: (audioBase64: string, options?: {\n model?: string\n language?: string\n prompt?: string\n }) => Promise<string>\n startRecording: () => Promise<void>\n stopRecording: () => Promise<string>\n isTranscribing: boolean\n isRecording: boolean\n lastResult: TranscriptionResult | null\n error: string | null\n clearError: () => void\n}\n\nexport function useTranscription(options: UseTranscriptionOptions): UseTranscriptionReturn {\n const [isTranscribing, setIsTranscribing] = useState(false)\n const [isRecording, setIsRecording] = useState(false)\n const [lastResult, setLastResult] = useState<TranscriptionResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n const mediaRecorderRef = useRef<MediaRecorder | null>(null)\n const chunksRef = useRef<Blob[]>([])\n const action = useAction(options.transcribeAction)\n\n const transcribe = useCallback(async (audioBase64: string, opts?: {\n model?: string; language?: string; prompt?: string\n }) => {\n setIsTranscribing(true)\n setError(null)\n const start = Date.now()\n try {\n const text = await action({\n audio: audioBase64,\n model: opts?.model ?? options.defaultModel,\n language: opts?.language,\n prompt: opts?.prompt,\n })\n setLastResult({ text, timestamp: Date.now(), durationMs: Date.now() - start })\n return text\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Transcription failed'\n setError(msg)\n throw err\n } finally {\n setIsTranscribing(false)\n }\n }, [action, options.defaultModel])\n\n const startRecording = useCallback(async () => {\n if (!options.enableMicrophone) throw new Error('Microphone not enabled')\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true })\n const mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/webm' })\n chunksRef.current = []\n mediaRecorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunksRef.current.push(e.data)\n }\n mediaRecorder.start()\n mediaRecorderRef.current = mediaRecorder\n setIsRecording(true)\n }, [options.enableMicrophone])\n\n const stopRecording = useCallback(async () => {\n return new Promise<string>((resolve, reject) => {\n const recorder = mediaRecorderRef.current\n if (!recorder) { reject(new Error('Not recording')); return }\n\n recorder.onstop = async () => {\n setIsRecording(false)\n const blob = new Blob(chunksRef.current, { type: 'audio/webm' })\n const arrayBuffer = await blob.arrayBuffer()\n const bytes = new Uint8Array(arrayBuffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!)\n }\n const base64 = btoa(binary)\n\n // Stop all tracks\n recorder.stream.getTracks().forEach(t => t.stop())\n\n try {\n const text = await transcribe(base64)\n resolve(text)\n } catch (err) {\n reject(err)\n }\n }\n recorder.stop()\n })\n }, [transcribe])\n\n return {\n transcribe, startRecording, stopRecording,\n isTranscribing, isRecording, lastResult, error,\n clearError: () => setError(null),\n }\n}\n","// @geenius/ai-react — src/hooks/useRealtimeAudio.ts\n\n/**\n * Realtime audio conversation hook — OpenAI Realtime API.\n * Uses WebSocket for bidirectional audio streaming.\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport type { AIRealtimeConfig, AIRealtimeEvent } from '@geenius/ai-shared'\n\nexport interface UseRealtimeAudioOptions extends AIRealtimeConfig {\n /** WebSocket URL for the realtime API session */\n wsUrl?: string\n /** Gets a session token/URL from your backend */\n getSessionAction?: any\n /** Called when AI responds with text */\n onResponse?: (text: string) => void\n /** Called when user's speech is transcribed */\n onTranscript?: (text: string) => void\n /** Called on any realtime event */\n onEvent?: (event: AIRealtimeEvent) => void\n}\n\nexport interface UseRealtimeAudioReturn {\n connect: () => Promise<void>\n disconnect: () => void\n isConnected: boolean\n isSpeaking: boolean\n isListening: boolean\n error: string | null\n transcript: string\n response: string\n clearError: () => void\n}\n\nexport function useRealtimeAudio(options: UseRealtimeAudioOptions): UseRealtimeAudioReturn {\n const [isConnected, setIsConnected] = useState(false)\n const [isSpeaking, setIsSpeaking] = useState(false)\n const [isListening, setIsListening] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [transcript, setTranscript] = useState('')\n const [response, setResponse] = useState('')\n const wsRef = useRef<WebSocket | null>(null)\n const audioContextRef = useRef<AudioContext | null>(null)\n const streamRef = useRef<MediaStream | null>(null)\n const processorRef = useRef<ScriptProcessorNode | null>(null)\n\n const connect = useCallback(async () => {\n try {\n setError(null)\n\n // Get the WebSocket URL from backend if action provided\n let wsUrl = options.wsUrl ?? 'wss://api.openai.com/v1/realtime'\n if (options.getSessionAction) {\n const session = await options.getSessionAction({\n model: options.model ?? 'gpt-4o-realtime-preview',\n voice: options.voice ?? 'alloy',\n instructions: options.instructions,\n })\n wsUrl = session.url ?? wsUrl\n }\n\n // Connect WebSocket\n const ws = new WebSocket(wsUrl)\n wsRef.current = ws\n\n ws.onopen = () => {\n setIsConnected(true)\n\n // Send session config\n ws.send(JSON.stringify({\n type: 'session.update',\n session: {\n model: options.model ?? 'gpt-4o-realtime-preview',\n voice: options.voice ?? 'alloy',\n instructions: options.instructions ?? 'You are a helpful assistant.',\n input_audio_format: options.inputAudioFormat ?? 'pcm16',\n output_audio_format: options.outputAudioFormat ?? 'pcm16',\n turn_detection: options.turnDetection ?? {\n type: 'server_vad',\n threshold: 0.5,\n prefix_padding_ms: 300,\n silence_duration_ms: 500,\n },\n tools: options.tools ?? [],\n },\n }))\n\n // Start capturing microphone audio\n startAudioCapture(ws)\n }\n\n ws.onmessage = (event) => {\n const data = JSON.parse(event.data) as AIRealtimeEvent\n options.onEvent?.(data)\n\n switch (data.type) {\n case 'input_audio_buffer.speech_started':\n setIsSpeaking(true)\n break\n case 'input_audio_buffer.speech_stopped':\n setIsSpeaking(false)\n break\n case 'response.text.delta':\n setResponse(prev => prev + data.delta)\n break\n case 'response.text.done':\n options.onResponse?.(data.text)\n setResponse('')\n break\n case 'response.audio.delta':\n playAudioDelta(data.delta)\n break\n case 'error':\n setError(data.error.message)\n break\n }\n }\n\n ws.onerror = () => setError('WebSocket connection error')\n ws.onclose = () => {\n setIsConnected(false)\n setIsListening(false)\n stopAudioCapture()\n }\n\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to connect')\n }\n }, [options])\n\n const startAudioCapture = useCallback(async (ws: WebSocket) => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: { sampleRate: 24000, channelCount: 1 } })\n streamRef.current = stream\n const audioCtx = new AudioContext({ sampleRate: 24000 })\n audioContextRef.current = audioCtx\n const source = audioCtx.createMediaStreamSource(stream)\n const processor = audioCtx.createScriptProcessor(4096, 1, 1)\n processorRef.current = processor\n\n processor.onaudioprocess = (e) => {\n if (ws.readyState !== WebSocket.OPEN) return\n const inputData = e.inputBuffer.getChannelData(0)\n const pcm16 = new Int16Array(inputData.length)\n for (let i = 0; i < inputData.length; i++) {\n const s = Math.max(-1, Math.min(1, inputData[i]!))\n pcm16[i] = s < 0 ? s * 0x8000 : s * 0x7FFF\n }\n const bytes = new Uint8Array(pcm16.buffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!)\n }\n ws.send(JSON.stringify({\n type: 'input_audio_buffer.append',\n audio: btoa(binary),\n }))\n }\n\n source.connect(processor)\n processor.connect(audioCtx.destination)\n setIsListening(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Microphone access denied')\n }\n }, [])\n\n const stopAudioCapture = useCallback(() => {\n processorRef.current?.disconnect()\n processorRef.current = null\n streamRef.current?.getTracks().forEach(t => t.stop())\n streamRef.current = null\n audioContextRef.current?.close()\n audioContextRef.current = null\n setIsListening(false)\n }, [])\n\n const playAudioDelta = useCallback((_delta: string) => {\n // In production, queue PCM16 deltas and pipe to AudioWorklet\n // Simplified: uses browser Audio element with base64 chunks\n // Full implementation would use AudioContext + AudioWorkletNode\n }, [])\n\n const disconnect = useCallback(() => {\n wsRef.current?.close()\n wsRef.current = null\n stopAudioCapture()\n setIsConnected(false)\n }, [stopAudioCapture])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => { disconnect() }\n }, [])\n\n return {\n connect, disconnect,\n isConnected, isSpeaking, isListening,\n error, transcript, response,\n clearError: () => setError(null),\n }\n}\n","// @geenius/ai-react — src/hooks/useContentManager.ts\n\nimport { useState, useCallback } from 'react'\nimport type {\n ContentAction,\n ContentTone,\n ContentType,\n ContentGenerateOptions,\n ContentResult,\n ContentTemplate,\n} from '@geenius/ai-shared'\n\nexport interface UseContentManagerOptions {\n /** Convex action for content generation */\n generateFn: (options: ContentGenerateOptions) => Promise<ContentResult>\n /** Default content type */\n defaultType?: ContentType\n /** Default tone */\n defaultTone?: ContentTone\n /** Default model */\n defaultModel?: string\n}\n\nexport interface UseContentManagerReturn {\n /** Generate content */\n generate: (input: string, options?: Partial<ContentGenerateOptions>) => Promise<ContentResult>\n /** Rewrite content */\n rewrite: (text: string, instructions?: string) => Promise<ContentResult>\n /** Translate content */\n translate: (text: string, language: string) => Promise<ContentResult>\n /** Summarize content */\n summarize: (text: string) => Promise<ContentResult>\n /** Generate variations */\n variations: (text: string, count?: number) => Promise<ContentResult>\n /** Change tone */\n changeTone: (text: string, tone: ContentTone) => Promise<ContentResult>\n /** Proofread */\n proofread: (text: string) => Promise<ContentResult>\n /** Current result */\n result: ContentResult | null\n /** Loading state */\n isGenerating: boolean\n /** Error state */\n error: Error | null\n /** Clear state */\n reset: () => void\n}\n\nexport function useContentManager(options: UseContentManagerOptions): UseContentManagerReturn {\n const { generateFn, defaultType = 'text', defaultTone, defaultModel } = options\n const [result, setResult] = useState<ContentResult | null>(null)\n const [isGenerating, setIsGenerating] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const execute = useCallback(async (action: ContentAction, input: string, extra?: Partial<ContentGenerateOptions>) => {\n setIsGenerating(true)\n setError(null)\n try {\n const res = await generateFn({\n action,\n input,\n type: extra?.type ?? defaultType,\n tone: extra?.tone ?? defaultTone,\n model: extra?.model ?? defaultModel,\n ...extra,\n })\n setResult(res)\n return res\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n throw e\n } finally {\n setIsGenerating(false)\n }\n }, [generateFn, defaultType, defaultTone, defaultModel])\n\n const generate = useCallback((input: string, opts?: Partial<ContentGenerateOptions>) =>\n execute('generate', input, opts), [execute])\n\n const rewrite = useCallback((text: string, instructions?: string) =>\n execute('rewrite', text, { instructions }), [execute])\n\n const translate = useCallback((text: string, language: string) =>\n execute('translate', text, { language }), [execute])\n\n const summarize = useCallback((text: string) =>\n execute('summarize', text), [execute])\n\n const variations = useCallback((text: string, count: number = 3) =>\n execute('variations', text, { variations: count }), [execute])\n\n const changeTone = useCallback((text: string, tone: ContentTone) =>\n execute('change-tone', text, { tone }), [execute])\n\n const proofread = useCallback((text: string) =>\n execute('proofread', text), [execute])\n\n const reset = useCallback(() => {\n setResult(null)\n setError(null)\n }, [])\n\n return {\n generate, rewrite, translate, summarize, variations, changeTone, proofread,\n result, isGenerating, error, reset,\n }\n}\n","// @geenius/ai-react — src/hooks/useMemory.ts\n\nimport { useState, useCallback, useRef } from 'react'\nimport type {\n MemoryEntry,\n MemoryQuery,\n MemoryNamespace,\n MemoryImportance,\n MemoryType,\n} from '@geenius/ai-shared'\n\nexport interface UseMemoryOptions {\n /** Convex mutation to store a memory */\n storeFn: (entry: Omit<MemoryEntry, 'id' | 'accessCount' | 'lastAccessedAt' | 'createdAt' | 'updatedAt'>) => Promise<MemoryEntry>\n /** Convex query to search memories */\n searchFn: (query: MemoryQuery) => Promise<MemoryEntry[]>\n /** Convex mutation to delete a memory */\n deleteFn: (id: string) => Promise<void>\n /** Convex mutation to clear memories */\n clearFn: (namespace: MemoryNamespace, scopeId: string) => Promise<void>\n /** Default namespace */\n defaultNamespace?: MemoryNamespace\n /** Default scope ID (e.g., current user ID) */\n defaultScopeId?: string\n}\n\nexport interface UseMemoryReturn {\n /** Store a memory */\n store: (key: string, value: string, options?: {\n namespace?: MemoryNamespace\n type?: MemoryType\n importance?: MemoryImportance\n metadata?: Record<string, unknown>\n scopeId?: string\n }) => Promise<MemoryEntry>\n /** Recall a specific memory by key */\n recall: (key: string, namespace?: MemoryNamespace) => Promise<MemoryEntry | null>\n /** Search memories */\n search: (query: MemoryQuery) => Promise<MemoryEntry[]>\n /** Delete a memory */\n remove: (id: string) => Promise<void>\n /** Clear all memories in a namespace/scope */\n clear: (namespace?: MemoryNamespace) => Promise<void>\n /** Currently loaded memories */\n memories: MemoryEntry[]\n /** Loading state */\n isLoading: boolean\n /** Error state */\n error: Error | null\n}\n\nexport function useMemory(options: UseMemoryOptions): UseMemoryReturn {\n const {\n storeFn, searchFn, deleteFn, clearFn,\n defaultNamespace = 'user',\n defaultScopeId = '',\n } = options\n\n const [memories, setMemories] = useState<MemoryEntry[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const store = useCallback(async (\n key: string,\n value: string,\n opts?: {\n namespace?: MemoryNamespace\n type?: MemoryType\n importance?: MemoryImportance\n metadata?: Record<string, unknown>\n scopeId?: string\n },\n ) => {\n setIsLoading(true)\n setError(null)\n try {\n const entry = await storeFn({\n namespace: opts?.namespace ?? defaultNamespace,\n type: opts?.type ?? 'fact',\n importance: opts?.importance ?? 'medium',\n key,\n value,\n metadata: opts?.metadata,\n scopeId: opts?.scopeId ?? defaultScopeId,\n })\n setMemories(prev => [...prev, entry])\n return entry\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n throw e\n } finally {\n setIsLoading(false)\n }\n }, [storeFn, defaultNamespace, defaultScopeId])\n\n const recall = useCallback(async (key: string, namespace?: MemoryNamespace) => {\n setIsLoading(true)\n setError(null)\n try {\n const results = await searchFn({\n namespace: namespace ?? defaultNamespace,\n key,\n scopeId: defaultScopeId,\n limit: 1,\n })\n return results.length > 0 ? results[0] : null\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n throw e\n } finally {\n setIsLoading(false)\n }\n }, [searchFn, defaultNamespace, defaultScopeId])\n\n const search = useCallback(async (query: MemoryQuery) => {\n setIsLoading(true)\n setError(null)\n try {\n const results = await searchFn({\n scopeId: defaultScopeId,\n ...query,\n })\n setMemories(results)\n return results\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n throw e\n } finally {\n setIsLoading(false)\n }\n }, [searchFn, defaultScopeId])\n\n const remove = useCallback(async (id: string) => {\n setError(null)\n try {\n await deleteFn(id)\n setMemories(prev => prev.filter(m => m.id !== id))\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n throw e\n }\n }, [deleteFn])\n\n const clear = useCallback(async (namespace?: MemoryNamespace) => {\n setError(null)\n try {\n await clearFn(namespace ?? defaultNamespace, defaultScopeId)\n setMemories([])\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n throw e\n }\n }, [clearFn, defaultNamespace, defaultScopeId])\n\n return { store, recall, search, remove, clear, memories, isLoading, error }\n}\n","// @geenius/ai-react — src/hooks/useSkills.ts\n\nimport { useState, useCallback, useMemo } from 'react'\nimport type {\n SkillDefinition,\n SkillContext,\n SkillResult,\n SkillCategory,\n} from '@geenius/ai-shared'\nimport { BUILT_IN_SKILLS } from '@geenius/ai-shared'\n\nexport interface UseSkillsOptions {\n /** Convex action to execute a skill */\n executeFn: (context: SkillContext) => Promise<SkillResult>\n /** Additional custom skills to register */\n customSkills?: SkillDefinition[]\n /** Default model */\n defaultModel?: string\n /** User ID for personalization */\n userId?: string\n}\n\nexport interface UseSkillsReturn {\n /** List all available skills */\n skills: SkillDefinition[]\n /** List skills by category */\n byCategory: (category: SkillCategory) => SkillDefinition[]\n /** Search skills */\n search: (query: string) => SkillDefinition[]\n /** Get a skill by ID */\n getSkill: (id: string) => SkillDefinition | undefined\n /** Execute a skill */\n execute: (skillId: string, params: Record<string, unknown>, context?: Record<string, unknown>) => Promise<SkillResult>\n /** Last result */\n result: SkillResult | null\n /** Loading state */\n isExecuting: boolean\n /** Error */\n error: Error | null\n /** Reset state */\n reset: () => void\n}\n\nexport function useSkills(options: UseSkillsOptions): UseSkillsReturn {\n const { executeFn, customSkills = [], defaultModel, userId } = options\n const [result, setResult] = useState<SkillResult | null>(null)\n const [isExecuting, setIsExecuting] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const allSkills = useMemo(() => {\n const map = new Map<string, SkillDefinition>()\n for (const skill of Object.values(BUILT_IN_SKILLS)) map.set(skill.id, skill)\n for (const skill of customSkills) map.set(skill.id, skill)\n return Array.from(map.values())\n }, [customSkills])\n\n const byCategory = useCallback((category: SkillCategory) =>\n allSkills.filter(s => s.category === category), [allSkills])\n\n const searchSkills = useCallback((query: string) => {\n const q = query.toLowerCase()\n return allSkills.filter(s =>\n s.name.toLowerCase().includes(q) ||\n s.description.toLowerCase().includes(q) ||\n s.tags?.some(t => t.toLowerCase().includes(q))\n )\n }, [allSkills])\n\n const getSkill = useCallback((id: string) =>\n allSkills.find(s => s.id === id), [allSkills])\n\n const execute = useCallback(async (\n skillId: string,\n params: Record<string, unknown>,\n context?: Record<string, unknown>,\n ) => {\n setIsExecuting(true)\n setError(null)\n try {\n const res = await executeFn({\n skillId,\n params,\n userId,\n context,\n model: defaultModel,\n })\n setResult(res)\n return res\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n throw e\n } finally {\n setIsExecuting(false)\n }\n }, [executeFn, userId, defaultModel])\n\n const reset = useCallback(() => {\n setResult(null)\n setError(null)\n }, [])\n\n return {\n skills: allSkills,\n byCategory,\n search: searchSkills,\n getSkill,\n execute,\n result,\n isExecuting,\n error,\n reset,\n }\n}\n","// @geenius/ai-react — src/components/ChatWindow.tsx\n\n/**\n * Headless chat window: message list + input.\n * Unstyled with data-* attributes for easy CSS targeting.\n */\n\nimport { useState, useRef, useEffect, type FormEvent } from 'react'\nimport type { AIChatMessage, ChatWindowProps } from '@geenius/ai-shared'\nimport { useChat, type UseChatOptions } from '../hooks/useChat'\n\nexport interface ChatWindowComponentProps extends ChatWindowProps, UseChatOptions {\n renderMessage?: (message: AIChatMessage) => React.ReactNode\n renderInput?: (props: { value: string; onChange: (v: string) => void; onSubmit: () => void; isSending: boolean }) => React.ReactNode\n}\n\nexport function ChatWindow(props: ChatWindowComponentProps) {\n const [input, setInput] = useState('')\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const chat = useChat(props)\n\n // Auto-scroll to bottom\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [chat.messages.length])\n\n const handleSubmit = async (e?: FormEvent) => {\n e?.preventDefault()\n if (!input.trim() || chat.isSending) return\n const content = input.trim()\n setInput('')\n await chat.sendMessage(content)\n }\n\n return (\n <div className={props.className} data-ai-component=\"chat-window\">\n {/* Messages */}\n <div data-ai-messages>\n {chat.messages.length === 0 && (\n <div data-ai-empty>\n <p>Start a conversation</p>\n </div>\n )}\n\n {chat.messages.map((msg: AIChatMessage) =>\n props.renderMessage ? (\n props.renderMessage(msg)\n ) : (\n <div\n key={msg.id}\n data-ai-message\n data-ai-role={msg.role}\n >\n <div data-ai-message-role>{msg.role}</div>\n <div data-ai-message-content>{msg.content}</div>\n {msg.tokens && (\n <span data-ai-message-tokens>\n {msg.tokens} tokens\n </span>\n )}\n </div>\n )\n )}\n\n {chat.isSending && (\n <div data-ai-message data-ai-role=\"assistant\" data-ai-loading>\n <div data-ai-typing-indicator>\n <span /><span /><span />\n </div>\n </div>\n )}\n\n <div ref={messagesEndRef} />\n </div>\n\n {/* Error */}\n {chat.error && (\n <div data-ai-error role=\"alert\">\n <span>{chat.error}</span>\n <button onClick={chat.clearError} data-ai-dismiss>×</button>\n </div>\n )}\n\n {/* Input */}\n {props.renderInput ? (\n props.renderInput({\n value: input,\n onChange: setInput,\n onSubmit: handleSubmit,\n isSending: chat.isSending,\n })\n ) : (\n <form onSubmit={handleSubmit} data-ai-input-form>\n <textarea\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type a message…\"\n disabled={chat.isSending}\n data-ai-input\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit()\n }\n }}\n />\n <button\n type=\"submit\"\n disabled={chat.isSending || !input.trim()}\n data-ai-send\n >\n {chat.isSending ? 'Sending…' : 'Send'}\n </button>\n </form>\n )}\n </div>\n )\n}\n","// @geenius/ai-react — src/components/ModelSelector.tsx\n\n/**\n * Model selector dropdown / list.\n * Unstyled with data-* attributes.\n */\n\nimport type { AIModel, AIProviderType } from '@geenius/ai-shared'\n\nexport interface ModelSelectorProps {\n models: AIModel[]\n selectedModel?: string\n onSelect: (modelId: string) => void\n className?: string\n filterProvider?: AIProviderType\n showCost?: boolean\n disabled?: boolean\n}\n\nexport function ModelSelector(props: ModelSelectorProps) {\n const filtered = props.filterProvider\n ? props.models.filter(m => m.provider === props.filterProvider)\n : props.models\n\n const activeModels = filtered.filter(m => m.isActive)\n\n return (\n <select\n className={props.className}\n value={props.selectedModel ?? ''}\n onChange={(e) => props.onSelect(e.target.value)}\n disabled={props.disabled}\n data-ai-component=\"model-selector\"\n >\n <option value=\"\" disabled>Select a model…</option>\n {activeModels.map(model => (\n <option key={model.id} value={model.id} data-ai-provider={model.provider}>\n {model.displayName ?? model.name}\n {props.showCost ? ` ($${model.inputCostPer1k}/$${model.outputCostPer1k}/1k)` : ''}\n </option>\n ))}\n </select>\n )\n}\n","// @geenius/ai-react — src/components/AILogTable.tsx\n\n/**\n * AI log table — paginated, filterable.\n */\n\nimport type { AILogEntry, AILogTableProps as BaseProps } from '@geenius/ai-shared'\n\nexport interface AILogTableComponentProps extends BaseProps {\n logs: AILogEntry[]\n isLoading: boolean\n onRowClick?: (log: AILogEntry) => void\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n return `${(ms / 1000).toFixed(1)}s`\n}\n\nfunction formatCost(usd?: number): string {\n if (!usd) return '—'\n if (usd < 0.01) return `$${usd.toFixed(4)}`\n return `$${usd.toFixed(2)}`\n}\n\nfunction StatusBadge({ status }: { status: string }) {\n return (\n <span data-ai-status={status}>\n {status === 'success' ? '✓' : '✗'} {status}\n </span>\n )\n}\n\nexport function AILogTable(props: AILogTableComponentProps) {\n if (props.isLoading) {\n return <div data-ai-component=\"log-table\" data-ai-loading>Loading logs…</div>\n }\n\n if (props.logs.length === 0) {\n return <div data-ai-component=\"log-table\" data-ai-empty>No AI logs yet</div>\n }\n\n return (\n <div className={props.className} data-ai-component=\"log-table\">\n <table data-ai-table>\n <thead>\n <tr>\n <th>Time</th>\n <th>Model</th>\n <th>Provider</th>\n <th>Caller</th>\n <th>Status</th>\n <th>Duration</th>\n <th>Tokens</th>\n <th>Cost</th>\n </tr>\n </thead>\n <tbody>\n {props.logs.map((log) => (\n <tr\n key={log.requestId}\n onClick={() => props.onRowClick?.(log)}\n data-ai-log-row\n data-ai-status={log.status}\n >\n <td data-ai-cell=\"time\">\n {new Date(log.timestamp).toLocaleTimeString()}\n </td>\n <td data-ai-cell=\"model\">{log.model}</td>\n <td data-ai-cell=\"provider\">{log.provider}</td>\n <td data-ai-cell=\"caller\">{log.caller}</td>\n <td data-ai-cell=\"status\">\n <StatusBadge status={log.status} />\n </td>\n <td data-ai-cell=\"duration\">\n {formatDuration(log.durationMs)}\n </td>\n <td data-ai-cell=\"tokens\">\n {log.totalTokens ?? '—'}\n </td>\n <td data-ai-cell=\"cost\">\n {formatCost(log.totalCostUsd)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n","// @geenius/ai-react — src/components/ModelTestRunner.tsx\n\n/**\n * Multi-tab model test runner.\n * Extracted from ModelTestPage.tsx pattern found in 15+ apps.\n */\n\nimport { useState, type FormEvent } from 'react'\nimport type { AIGenerationType } from '@geenius/ai-shared'\nimport { useModelTest, type UseModelTestOptions, type ModelTestResult } from '../hooks/useModelTest'\n\nexport interface ModelTestRunnerProps extends UseModelTestOptions {\n className?: string\n availableModels?: string[]\n defaultTab?: AIGenerationType\n renderResult?: (result: ModelTestResult) => React.ReactNode\n}\n\nconst TABS: { id: AIGenerationType; label: string }[] = [\n { id: 'text', label: 'Text Generation' },\n { id: 'image', label: 'Image Generation' },\n { id: 'audio', label: 'Text-to-Speech' },\n { id: 'transcription', label: 'Audio-to-Text' },\n { id: 'video', label: 'Video Generation' },\n]\n\nexport function ModelTestRunner(props: ModelTestRunnerProps) {\n const [activeTab, setActiveTab] = useState<AIGenerationType>(props.defaultTab ?? 'text')\n const [prompt, setPrompt] = useState('')\n const [selectedModel, setSelectedModel] = useState('')\n const [batchMode, setBatchMode] = useState(false)\n\n const test = useModelTest(props)\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault()\n if (!prompt.trim()) return\n\n if (batchMode && props.availableModels) {\n await test.runBatchTest(props.availableModels, prompt.trim())\n } else if (selectedModel) {\n await test.runTest(selectedModel, prompt.trim(), activeTab)\n }\n }\n\n return (\n <div className={props.className} data-ai-component=\"model-test-runner\">\n {/* Tabs */}\n <div data-ai-tabs role=\"tablist\">\n {TABS.map(tab => (\n <button\n key={tab.id}\n role=\"tab\"\n aria-selected={activeTab === tab.id}\n onClick={() => setActiveTab(tab.id)}\n data-ai-tab\n data-ai-tab-active={activeTab === tab.id ? '' : undefined}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit} data-ai-test-form>\n <div data-ai-field=\"model\">\n <label htmlFor=\"test-model\">Model</label>\n <select\n id=\"test-model\"\n value={selectedModel}\n onChange={(e) => setSelectedModel(e.target.value)}\n disabled={test.isRunning || batchMode}\n data-ai-input\n >\n <option value=\"\">Select model…</option>\n {(props.availableModels ?? []).map(m => (\n <option key={m} value={m}>{m}</option>\n ))}\n </select>\n </div>\n\n <div data-ai-field=\"prompt\">\n <label htmlFor=\"test-prompt\">Prompt</label>\n <textarea\n id=\"test-prompt\"\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n placeholder=\"Enter your test prompt…\"\n disabled={test.isRunning}\n data-ai-input\n />\n </div>\n\n <div data-ai-actions>\n <label data-ai-toggle>\n <input\n type=\"checkbox\"\n checked={batchMode}\n onChange={(e) => setBatchMode(e.target.checked)}\n disabled={test.isRunning}\n />\n Test all models\n </label>\n <button type=\"submit\" disabled={test.isRunning || !prompt.trim()} data-ai-submit>\n {test.isRunning ? 'Running…' : (batchMode ? 'Run All' : 'Run Test')}\n </button>\n {test.results.length > 0 && (\n <button type=\"button\" onClick={test.clearResults} data-ai-clear>\n Clear Results\n </button>\n )}\n </div>\n </form>\n\n {/* Results */}\n {test.results.length > 0 && (\n <div data-ai-test-results>\n {test.results.map((result, i) => (\n props.renderResult ? props.renderResult(result) : (\n <div key={i} data-ai-test-result data-ai-status={result.error ? 'error' : 'success'}>\n <div data-ai-result-header>\n <span data-ai-result-model>{result.model}</span>\n <span data-ai-result-duration>{result.durationMs}ms</span>\n {result.error && (\n <span data-ai-result-error>{result.error}</span>\n )}\n </div>\n {!result.error && (\n <div data-ai-result-content>\n {result.type === 'image' ? (\n <img\n src={result.result.startsWith('http') ? result.result : `data:image/png;base64,${result.result}`}\n alt=\"Generated\"\n data-ai-result-image\n />\n ) : (\n <pre data-ai-result-text>{result.result}</pre>\n )}\n </div>\n )}\n </div>\n )\n ))}\n </div>\n )}\n </div>\n )\n}\n","// @geenius/ai-react — src/components/GenerationCard.tsx\n\n/**\n * Card displaying a generation result (text, image, audio, video).\n */\n\nimport type { AIGenerationType } from '@geenius/ai-shared'\n\nexport interface GenerationCardProps {\n type: AIGenerationType\n content: string\n model?: string\n durationMs?: number\n tokens?: number\n cost?: number\n error?: string\n className?: string\n}\n\nexport function GenerationCard(props: GenerationCardProps) {\n return (\n <div className={props.className} data-ai-component=\"generation-card\" data-ai-type={props.type}>\n {/* Header */}\n <div data-ai-card-header>\n <span data-ai-card-type>{props.type}</span>\n {props.model && <span data-ai-card-model>{props.model}</span>}\n {props.durationMs != null && (\n <span data-ai-card-duration>{props.durationMs}ms</span>\n )}\n </div>\n\n {/* Content */}\n {props.error ? (\n <div data-ai-card-error role=\"alert\">{props.error}</div>\n ) : (\n <div data-ai-card-content>\n {props.type === 'image' ? (\n <img\n src={props.content.startsWith('http') ? props.content : `data:image/png;base64,${props.content}`}\n alt=\"AI Generated\"\n data-ai-card-image\n />\n ) : props.type === 'audio' || props.type === 'speech' ? (\n <audio controls data-ai-card-audio>\n <source\n src={props.content.startsWith('http') ? props.content : `data:audio/mp3;base64,${props.content}`}\n type=\"audio/mp3\"\n />\n </audio>\n ) : props.type === 'video' ? (\n <video controls data-ai-card-video>\n <source src={props.content} type=\"video/mp4\" />\n </video>\n ) : (\n <pre data-ai-card-text>{props.content}</pre>\n )}\n </div>\n )}\n\n {/* Footer */}\n {(props.tokens || props.cost != null) && (\n <div data-ai-card-footer>\n {props.tokens && <span data-ai-card-tokens>{props.tokens} tokens</span>}\n {props.cost != null && (\n <span data-ai-card-cost>\n ${props.cost < 0.01 ? props.cost.toFixed(4) : props.cost.toFixed(2)}\n </span>\n )}\n </div>\n )}\n </div>\n )\n}\n","// @geenius/ai-react — src/components/ImageGenerator.tsx\n\n/**\n * Image generation UI — prompt, model selector, gallery.\n */\n\nimport { useState, type FormEvent } from 'react'\nimport type { AIGenerationType } from '@geenius/ai-shared'\nimport { useImageGeneration, type UseImageGenerationOptions } from '../hooks/useImageGeneration'\n\nexport interface ImageGeneratorComponentProps extends UseImageGenerationOptions {\n className?: string\n availableModels?: string[]\n}\n\nexport function ImageGenerator(props: ImageGeneratorComponentProps) {\n const [prompt, setPrompt] = useState('')\n const [selectedModel, setSelectedModel] = useState(props.defaultModel ?? '')\n const [size, setSize] = useState('1024x1024')\n const [quality, setQuality] = useState<'standard' | 'hd'>('standard')\n\n const { generate, images, isGenerating, error, clearImages, clearError } = useImageGeneration(props)\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault()\n if (!prompt.trim() || isGenerating) return\n await generate(prompt.trim(), { model: selectedModel || undefined, size, quality })\n }\n\n return (\n <div className={props.className} data-ai-component=\"image-generator\">\n <form onSubmit={handleSubmit} data-ai-image-form>\n <div data-ai-field=\"prompt\">\n <textarea\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n placeholder=\"Describe the image you want to create…\"\n disabled={isGenerating}\n data-ai-input\n />\n </div>\n\n <div data-ai-image-options>\n {props.availableModels && (\n <select\n value={selectedModel}\n onChange={(e) => setSelectedModel(e.target.value)}\n disabled={isGenerating}\n data-ai-select\n >\n <option value=\"\">Default model</option>\n {props.availableModels.map(m => (\n <option key={m} value={m}>{m}</option>\n ))}\n </select>\n )}\n\n <select value={size} onChange={(e) => setSize(e.target.value)} disabled={isGenerating} data-ai-select>\n <option value=\"1024x1024\">1024×1024</option>\n <option value=\"1792x1024\">1792×1024</option>\n <option value=\"1024x1792\">1024×1792</option>\n <option value=\"512x512\">512×512</option>\n </select>\n\n <select value={quality} onChange={(e) => setQuality(e.target.value as 'standard' | 'hd')} disabled={isGenerating} data-ai-select>\n <option value=\"standard\">Standard</option>\n <option value=\"hd\">HD</option>\n </select>\n </div>\n\n <div data-ai-actions>\n <button type=\"submit\" disabled={isGenerating || !prompt.trim()} data-ai-submit>\n {isGenerating ? 'Generating…' : 'Generate Image'}\n </button>\n {images.length > 0 && (\n <button type=\"button\" onClick={clearImages} data-ai-clear>Clear Gallery</button>\n )}\n </div>\n </form>\n\n {error && (\n <div data-ai-error role=\"alert\">\n <span>{error}</span>\n <button onClick={clearError}>×</button>\n </div>\n )}\n\n {images.length > 0 && (\n <div data-ai-image-gallery>\n {images.map((img, i) => (\n <div key={i} data-ai-image-card>\n <img src={img.url} alt={img.prompt} data-ai-generated-image />\n <div data-ai-image-meta>\n <span data-ai-image-model>{img.model}</span>\n <span data-ai-image-time>{new Date(img.timestamp).toLocaleTimeString()}</span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","// @geenius/ai-react — src/components/VoiceSelector.tsx\n\n/**\n * Voice selector for TTS — works with OpenAI and ElevenLabs voices.\n */\n\nimport type { AIVoiceOption } from '@geenius/ai-shared'\n\nexport interface VoiceSelectorComponentProps {\n voices: AIVoiceOption[]\n selectedVoice?: string\n onSelect: (voiceId: string) => void\n className?: string\n disabled?: boolean\n showProvider?: boolean\n showPreview?: boolean\n onPreview?: (voiceId: string) => void\n}\n\nexport function VoiceSelector(props: VoiceSelectorComponentProps) {\n return (\n <div className={props.className} data-ai-component=\"voice-selector\">\n {props.voices.map(voice => (\n <button\n key={voice.id}\n onClick={() => props.onSelect(voice.id)}\n disabled={props.disabled}\n data-ai-voice\n data-ai-voice-selected={props.selectedVoice === voice.id ? '' : undefined}\n data-ai-provider={voice.provider}\n >\n <span data-ai-voice-name>{voice.name}</span>\n {voice.gender && <span data-ai-voice-gender>{voice.gender}</span>}\n {voice.language && <span data-ai-voice-language>{voice.language}</span>}\n {props.showProvider && <span data-ai-voice-provider>{voice.provider}</span>}\n {props.showPreview && voice.preview && (\n <button\n data-ai-voice-preview\n onClick={(e) => {\n e.stopPropagation()\n props.onPreview?.(voice.id)\n }}\n >\n ▶\n </button>\n )}\n </button>\n ))}\n </div>\n )\n}\n","// @geenius/ai-react — src/pages/ChatPage.tsx\n\n/**\n * Full chatbot page — sidebar + conversation.\n * Compose with your own layout and styling.\n */\n\nimport { useState } from 'react'\nimport { ChatWindow, type ChatWindowComponentProps } from '../components/ChatWindow'\n\nexport interface ChatPageProps extends Omit<ChatWindowComponentProps, 'conversationId'> {\n className?: string\n /** Initial conversation ID */\n conversationId?: string\n}\n\nexport function ChatPage(props: ChatPageProps) {\n const [activeConversationId, setActiveConversationId] = useState<string | undefined>(props.conversationId)\n\n return (\n <div className={props.className} data-ai-page=\"chat\">\n <div data-ai-page-header>\n <h1 data-ai-page-title>AI Chat</h1>\n <button\n onClick={() => setActiveConversationId(undefined)}\n data-ai-new-chat\n >\n New Chat\n </button>\n </div>\n\n <ChatWindow\n {...props}\n conversationId={activeConversationId}\n onNewConversation={(id) => {\n setActiveConversationId(id)\n props.onNewConversation?.(id)\n }}\n />\n </div>\n )\n}\n","// @geenius/ai-react — src/pages/ModelTestPage.tsx\n\n/**\n * Model test page — extracted from the pattern used in 15+ apps.\n */\n\nimport { ModelTestRunner, type ModelTestRunnerProps } from '../components/ModelTestRunner'\nimport { DEFAULT_MODELS } from '@geenius/ai-shared'\nimport type { AIGenerationType } from '@geenius/ai-shared'\n\nexport interface ModelTestPageProps extends ModelTestRunnerProps {\n title?: string\n}\n\nexport function ModelTestPage(props: ModelTestPageProps) {\n const models = props.availableModels ?? DEFAULT_MODELS.map(m => m.id)\n\n return (\n <div className={props.className} data-ai-page=\"model-test\">\n <div data-ai-page-header>\n <h1 data-ai-page-title>{props.title ?? 'Model Test Lab'}</h1>\n <p data-ai-page-subtitle>\n Test AI models individually or compare them side-by-side\n </p>\n </div>\n\n <ModelTestRunner\n {...props}\n availableModels={models}\n />\n </div>\n )\n}\n","// @geenius/ai-react — src/pages/AILogsPage.tsx\n\n/**\n * AI logs dashboard page with stats and log table.\n */\n\nimport { useState } from 'react'\nimport { AILogTable } from '../components/AILogTable'\nimport { useAILogs, type UseAILogsOptions } from '../hooks/useAILogs'\nimport type { AIRequestStatus, AILogEntry } from '@geenius/ai-shared'\n\nexport interface AILogsPageProps {\n /** Query reference: api.ai.listLogs */\n listLogsQuery: any\n className?: string\n title?: string\n onRowClick?: (log: AILogEntry) => void\n}\n\nexport function AILogsPage(props: AILogsPageProps) {\n const [modelFilter, setModelFilter] = useState('')\n const [statusFilter, setStatusFilter] = useState<AIRequestStatus | ''>('')\n\n const { logs, isLoading } = useAILogs({\n listLogsQuery: props.listLogsQuery,\n filters: {\n model: modelFilter || undefined,\n status: (statusFilter || undefined) as AIRequestStatus | undefined,\n },\n limit: 100,\n })\n\n // Calculate quick stats\n const totalCalls = logs.length\n const successCalls = logs.filter(l => l.status === 'success').length\n const errorCalls = totalCalls - successCalls\n const totalCost = logs.reduce((sum, l) => sum + (l.totalCostUsd ?? 0), 0)\n const totalTokens = logs.reduce((sum, l) => sum + (l.totalTokens ?? 0), 0)\n\n return (\n <div className={props.className} data-ai-page=\"logs\">\n <div data-ai-page-header>\n <h1 data-ai-page-title>{props.title ?? 'AI Logs'}</h1>\n </div>\n\n {/* Stats cards */}\n <div data-ai-stats-grid>\n <div data-ai-stat>\n <span data-ai-stat-label>Total Calls</span>\n <span data-ai-stat-value>{totalCalls}</span>\n </div>\n <div data-ai-stat data-ai-status=\"success\">\n <span data-ai-stat-label>Success</span>\n <span data-ai-stat-value>{successCalls}</span>\n </div>\n <div data-ai-stat data-ai-status=\"error\">\n <span data-ai-stat-label>Errors</span>\n <span data-ai-stat-value>{errorCalls}</span>\n </div>\n <div data-ai-stat>\n <span data-ai-stat-label>Total Cost</span>\n <span data-ai-stat-value>${totalCost.toFixed(2)}</span>\n </div>\n <div data-ai-stat>\n <span data-ai-stat-label>Total Tokens</span>\n <span data-ai-stat-value>{totalTokens.toLocaleString()}</span>\n </div>\n </div>\n\n {/* Filters */}\n <div data-ai-filters>\n <input\n type=\"text\"\n placeholder=\"Filter by model…\"\n value={modelFilter}\n onChange={(e) => setModelFilter(e.target.value)}\n data-ai-filter-input\n />\n <select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value as AIRequestStatus | '')}\n data-ai-filter-select\n >\n <option value=\"\">All statuses</option>\n <option value=\"success\">Success</option>\n <option value=\"error\">Error</option>\n </select>\n </div>\n\n {/* Log table */}\n <AILogTable\n logs={logs}\n isLoading={isLoading}\n onRowClick={props.onRowClick}\n />\n </div>\n )\n}\n"],"mappings":"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","names":["useState","useCallback","useAction","useQuery","useState","useCallback","useAction","useQuery","useMutation","useCallback","useState","useCallback","useAction","useState","useCallback","useRef","useAction","useState","useCallback","useAction","useState","useCallback","useRef","useAction","useState","useCallback","useRef","useEffect","useState","useCallback","useState","useCallback","useState","useCallback","useState","useRef","useEffect","useState","useRef","useEffect","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState"]}
@@ -1 +1 @@
1
- # ✦ @geenius-ai/shared\n\n> Framework-agnostic AI types, config, provider abstraction, and Convex backend for geenius-ai\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius-ai/shared\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius-ai/shared';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
1
+ # ✦ @geenius/ai-shared\n\n> Framework-agnostic AI types, config, provider abstraction, and Convex backend for geenius-ai\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius/ai-shared\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius/ai-shared';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
@@ -1 +1 @@
1
- # ✦ @geenius-ai/solidjs\n\n> SolidJS primitives, components, and pages for geenius-ai\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius-ai/solidjs\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius-ai/solidjs';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
1
+ # ✦ @geenius/ai-solidjs\n\n> SolidJS primitives, components, and pages for geenius-ai\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius/ai-solidjs\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius/ai-solidjs';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
@@ -1 +1 @@
1
- # ✦ @geenius-ai/solidjs-css\n\n> Geenius AI — SolidJS primitives and components (vanilla CSS variant)\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius-ai/solidjs-css\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius-ai/solidjs-css';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
1
+ # ✦ @geenius/ai-solidjs-css\n\n> Geenius AI — SolidJS primitives and components (vanilla CSS variant)\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius/ai-solidjs-css\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius/ai-solidjs-css';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n