@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,674 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ ChatPage: () => ChatPage,
24
+ ChatWindow: () => ChatWindow,
25
+ GenerationCard: () => GenerationCard,
26
+ ModelTestPage: () => ModelTestPage,
27
+ ModelTestRunner: () => ModelTestRunner,
28
+ createAI: () => createAI,
29
+ createChat: () => createChat,
30
+ createContentManager: () => createContentManager,
31
+ createImageGeneration: () => createImageGeneration,
32
+ createMemory: () => createMemory,
33
+ createModelTest: () => createModelTest,
34
+ createSkills: () => createSkills,
35
+ createTextToSpeech: () => createTextToSpeech,
36
+ createVideoGeneration: () => createVideoGeneration
37
+ });
38
+ module.exports = __toCommonJS(index_exports);
39
+
40
+ // src/primitives/createAI.ts
41
+ var import_solid_js = require("solid-js");
42
+ function createAI(options = {}) {
43
+ const [isLoading, setIsLoading] = (0, import_solid_js.createSignal)(false);
44
+ const [error, setError] = (0, import_solid_js.createSignal)(null);
45
+ const [lastResult, setLastResult] = (0, import_solid_js.createSignal)(null);
46
+ const [lastType, setLastType] = (0, import_solid_js.createSignal)(null);
47
+ async function wrap(type, fn) {
48
+ setIsLoading(true);
49
+ setError(null);
50
+ try {
51
+ const result = await fn();
52
+ setLastResult(result);
53
+ setLastType(type);
54
+ return result;
55
+ } catch (err) {
56
+ const msg = err instanceof Error ? err.message : `${type} generation failed`;
57
+ setError(msg);
58
+ throw err;
59
+ } finally {
60
+ setIsLoading(false);
61
+ }
62
+ }
63
+ return {
64
+ generateText: (args) => wrap("text", () => {
65
+ if (!options.callGenerateText) throw new Error("callGenerateText not provided");
66
+ return options.callGenerateText(args);
67
+ }),
68
+ generateImage: (prompt, model) => wrap("image", () => {
69
+ if (!options.callGenerateImage) throw new Error("callGenerateImage not provided");
70
+ return options.callGenerateImage({ prompt, model });
71
+ }),
72
+ generateAudio: (prompt, voice) => wrap("audio", () => {
73
+ if (!options.callGenerateAudio) throw new Error("callGenerateAudio not provided");
74
+ return options.callGenerateAudio({ prompt, voice });
75
+ }),
76
+ transcribeAudio: (audio) => wrap("transcription", () => {
77
+ if (!options.callTranscribeAudio) throw new Error("callTranscribeAudio not provided");
78
+ return options.callTranscribeAudio({ audio });
79
+ }),
80
+ generateVideo: (prompt) => wrap("video", () => {
81
+ if (!options.callGenerateVideo) throw new Error("callGenerateVideo not provided");
82
+ return options.callGenerateVideo({ prompt });
83
+ }),
84
+ isLoading,
85
+ error,
86
+ lastResult,
87
+ lastType,
88
+ clearError: () => setError(null)
89
+ };
90
+ }
91
+
92
+ // src/primitives/createChat.ts
93
+ var import_solid_js2 = require("solid-js");
94
+ function createChat(options = {}) {
95
+ const [messages, setMessages] = (0, import_solid_js2.createSignal)([]);
96
+ const [isSending, setIsSending] = (0, import_solid_js2.createSignal)(false);
97
+ const [error, setError] = (0, import_solid_js2.createSignal)(null);
98
+ const [conversationId, setConversationId] = (0, import_solid_js2.createSignal)(null);
99
+ async function sendMessage(content) {
100
+ setIsSending(true);
101
+ setError(null);
102
+ try {
103
+ let activeId = conversationId();
104
+ if (!activeId && options.callCreateConversation) {
105
+ activeId = await options.callCreateConversation({
106
+ title: content.substring(0, 100),
107
+ model: options.model ?? "gpt-4o",
108
+ systemPrompt: options.systemPrompt
109
+ });
110
+ setConversationId(activeId);
111
+ options.onNewConversation?.(activeId);
112
+ }
113
+ const userMsg = {
114
+ id: `msg-${Date.now()}`,
115
+ conversationId: activeId ?? "local",
116
+ userId: "local",
117
+ role: "user",
118
+ content,
119
+ createdAt: Date.now()
120
+ };
121
+ setMessages((prev) => [...prev, userMsg]);
122
+ if (options.callSendMessage && activeId) {
123
+ await options.callSendMessage({ conversationId: activeId, content });
124
+ }
125
+ if (options.callGenerateText) {
126
+ const allMessages = messages();
127
+ const aiResponse = await options.callGenerateText({
128
+ model: options.model ?? "gpt-4o",
129
+ messages: [
130
+ ...options.systemPrompt ? [{ role: "system", content: options.systemPrompt }] : [],
131
+ ...allMessages.map((m) => ({ role: m.role, content: m.content }))
132
+ ],
133
+ caller: "chat"
134
+ });
135
+ const assistantMsg = {
136
+ id: `msg-${Date.now()}-ai`,
137
+ conversationId: activeId ?? "local",
138
+ userId: "ai",
139
+ role: "assistant",
140
+ content: aiResponse,
141
+ model: options.model ?? "gpt-4o",
142
+ createdAt: Date.now()
143
+ };
144
+ setMessages((prev) => [...prev, assistantMsg]);
145
+ }
146
+ } catch (err) {
147
+ setError(err instanceof Error ? err.message : "Failed to send message");
148
+ } finally {
149
+ setIsSending(false);
150
+ }
151
+ }
152
+ return {
153
+ messages,
154
+ isSending,
155
+ error,
156
+ conversationId,
157
+ sendMessage,
158
+ clearError: () => setError(null)
159
+ };
160
+ }
161
+
162
+ // src/primitives/createModelTest.ts
163
+ var import_solid_js3 = require("solid-js");
164
+ function createModelTest(options = {}) {
165
+ const [results, setResults] = (0, import_solid_js3.createSignal)([]);
166
+ const [isRunning, setIsRunning] = (0, import_solid_js3.createSignal)(false);
167
+ async function runTest(model, prompt, type = "text") {
168
+ setIsRunning(true);
169
+ const start = Date.now();
170
+ try {
171
+ let result = "";
172
+ switch (type) {
173
+ case "text":
174
+ if (!options.callGenerateText) throw new Error("callGenerateText not provided");
175
+ result = await options.callGenerateText({ model, messages: [{ role: "user", content: prompt }], caller: "model-test" });
176
+ break;
177
+ case "image":
178
+ if (!options.callGenerateImage) throw new Error("callGenerateImage not provided");
179
+ result = await options.callGenerateImage({ prompt, model });
180
+ break;
181
+ case "audio":
182
+ if (!options.callGenerateAudio) throw new Error("callGenerateAudio not provided");
183
+ result = await options.callGenerateAudio({ prompt });
184
+ break;
185
+ case "video":
186
+ if (!options.callGenerateVideo) throw new Error("callGenerateVideo not provided");
187
+ result = await options.callGenerateVideo({ prompt });
188
+ break;
189
+ default:
190
+ throw new Error(`Unsupported test type: ${type}`);
191
+ }
192
+ const testResult = { model, type, result, durationMs: Date.now() - start, timestamp: Date.now() };
193
+ setResults((prev) => [...prev, testResult]);
194
+ return testResult;
195
+ } catch (err) {
196
+ const testResult = { model, type, result: "", durationMs: Date.now() - start, timestamp: Date.now(), error: err instanceof Error ? err.message : "Test failed" };
197
+ setResults((prev) => [...prev, testResult]);
198
+ return testResult;
199
+ } finally {
200
+ setIsRunning(false);
201
+ }
202
+ }
203
+ async function runBatchTest(models, prompt) {
204
+ setIsRunning(true);
205
+ const batch = [];
206
+ for (const model of models) {
207
+ const r = await runTest(model, prompt);
208
+ batch.push(r);
209
+ }
210
+ setIsRunning(false);
211
+ return batch;
212
+ }
213
+ return { runTest, runBatchTest, results, isRunning, clearResults: () => setResults([]) };
214
+ }
215
+
216
+ // src/primitives/createImageGeneration.ts
217
+ var import_solid_js4 = require("solid-js");
218
+ function createImageGeneration(options) {
219
+ const [images, setImages] = (0, import_solid_js4.createSignal)([]);
220
+ const [isGenerating, setIsGenerating] = (0, import_solid_js4.createSignal)(false);
221
+ const [error, setError] = (0, import_solid_js4.createSignal)(null);
222
+ async function generate(prompt, opts) {
223
+ setIsGenerating(true);
224
+ setError(null);
225
+ try {
226
+ const model = opts?.model ?? options.defaultModel ?? "dall-e-3";
227
+ const result = await options.callGenerateImage({ prompt, model, ...opts });
228
+ const url = result.startsWith("http") ? result : `data:image/png;base64,${result}`;
229
+ setImages((prev) => [{ url, prompt, model, timestamp: Date.now() }, ...prev]);
230
+ return url;
231
+ } catch (err) {
232
+ setError(err instanceof Error ? err.message : "Image generation failed");
233
+ throw err;
234
+ } finally {
235
+ setIsGenerating(false);
236
+ }
237
+ }
238
+ return {
239
+ generate,
240
+ images,
241
+ isGenerating,
242
+ error,
243
+ clearImages: () => setImages([]),
244
+ clearError: () => setError(null)
245
+ };
246
+ }
247
+
248
+ // src/primitives/createTextToSpeech.ts
249
+ var import_solid_js5 = require("solid-js");
250
+ function createTextToSpeech(options) {
251
+ const [isGenerating, setIsGenerating] = (0, import_solid_js5.createSignal)(false);
252
+ const [isSpeaking, setIsSpeaking] = (0, import_solid_js5.createSignal)(false);
253
+ const [error, setError] = (0, import_solid_js5.createSignal)(null);
254
+ const [audioUrl, setAudioUrl] = (0, import_solid_js5.createSignal)(null);
255
+ let currentAudio = null;
256
+ async function speak(text, opts) {
257
+ setIsGenerating(true);
258
+ setError(null);
259
+ try {
260
+ const base64 = await options.callGenerateAudio({
261
+ prompt: text,
262
+ voice: opts?.voice ?? options.defaultVoice ?? "alloy",
263
+ model: opts?.model ?? options.defaultModel,
264
+ speed: opts?.speed
265
+ });
266
+ const url = base64.startsWith("http") ? base64 : `data:audio/mp3;base64,${base64}`;
267
+ setAudioUrl(url);
268
+ if (options.autoPlay !== false) {
269
+ stop();
270
+ const audio = new Audio(url);
271
+ currentAudio = audio;
272
+ setIsSpeaking(true);
273
+ audio.onended = () => setIsSpeaking(false);
274
+ await audio.play();
275
+ }
276
+ return url;
277
+ } catch (err) {
278
+ setError(err instanceof Error ? err.message : "TTS failed");
279
+ throw err;
280
+ } finally {
281
+ setIsGenerating(false);
282
+ }
283
+ }
284
+ function stop() {
285
+ currentAudio?.pause();
286
+ currentAudio = null;
287
+ setIsSpeaking(false);
288
+ }
289
+ return { speak, stop, isGenerating, isSpeaking, error, audioUrl, clearError: () => setError(null) };
290
+ }
291
+
292
+ // src/primitives/createVideoGeneration.ts
293
+ var import_solid_js6 = require("solid-js");
294
+ function createVideoGeneration(options) {
295
+ const [videos, setVideos] = (0, import_solid_js6.createSignal)([]);
296
+ const [isGenerating, setIsGenerating] = (0, import_solid_js6.createSignal)(false);
297
+ const [error, setError] = (0, import_solid_js6.createSignal)(null);
298
+ async function generate(prompt, opts) {
299
+ setIsGenerating(true);
300
+ setError(null);
301
+ try {
302
+ const model = opts?.model ?? options.defaultModel ?? "minimax/video-01";
303
+ const result = await options.callGenerateVideo({ prompt, model, ...opts });
304
+ setVideos((prev) => [{ url: result, prompt, model, timestamp: Date.now() }, ...prev]);
305
+ return result;
306
+ } catch (err) {
307
+ setError(err instanceof Error ? err.message : "Video generation failed");
308
+ throw err;
309
+ } finally {
310
+ setIsGenerating(false);
311
+ }
312
+ }
313
+ return {
314
+ generate,
315
+ videos,
316
+ isGenerating,
317
+ error,
318
+ clearVideos: () => setVideos([]),
319
+ clearError: () => setError(null)
320
+ };
321
+ }
322
+
323
+ // src/primitives/createContentManager.ts
324
+ var import_solid_js7 = require("solid-js");
325
+ function createContentManager(options) {
326
+ const { generateFn, defaultType = "text", defaultTone, defaultModel } = options;
327
+ const [result, setResult] = (0, import_solid_js7.createSignal)(null);
328
+ const [isGenerating, setIsGenerating] = (0, import_solid_js7.createSignal)(false);
329
+ const [error, setError] = (0, import_solid_js7.createSignal)(null);
330
+ const execute = async (action, input, extra) => {
331
+ setIsGenerating(true);
332
+ setError(null);
333
+ try {
334
+ const res = await generateFn({
335
+ action,
336
+ input,
337
+ type: extra?.type ?? defaultType,
338
+ tone: extra?.tone ?? defaultTone,
339
+ model: extra?.model ?? defaultModel,
340
+ ...extra
341
+ });
342
+ setResult(res);
343
+ return res;
344
+ } catch (err) {
345
+ const e = err instanceof Error ? err : new Error(String(err));
346
+ setError(e);
347
+ throw e;
348
+ } finally {
349
+ setIsGenerating(false);
350
+ }
351
+ };
352
+ return {
353
+ generate: (input, opts) => execute("generate", input, opts),
354
+ rewrite: (text, instructions) => execute("rewrite", text, { instructions }),
355
+ translate: (text, language) => execute("translate", text, { language }),
356
+ summarize: (text) => execute("summarize", text),
357
+ variations: (text, count = 3) => execute("variations", text, { variations: count }),
358
+ changeTone: (text, tone) => execute("change-tone", text, { tone }),
359
+ proofread: (text) => execute("proofread", text),
360
+ result,
361
+ isGenerating,
362
+ error,
363
+ reset: () => {
364
+ setResult(null);
365
+ setError(null);
366
+ }
367
+ };
368
+ }
369
+
370
+ // src/primitives/createMemory.ts
371
+ var import_solid_js8 = require("solid-js");
372
+ function createMemory(options) {
373
+ const {
374
+ storeFn,
375
+ searchFn,
376
+ deleteFn,
377
+ clearFn,
378
+ defaultNamespace = "user",
379
+ defaultScopeId = ""
380
+ } = options;
381
+ const [memories, setMemories] = (0, import_solid_js8.createSignal)([]);
382
+ const [isLoading, setIsLoading] = (0, import_solid_js8.createSignal)(false);
383
+ const [error, setError] = (0, import_solid_js8.createSignal)(null);
384
+ const store = async (key, value, opts) => {
385
+ setIsLoading(true);
386
+ setError(null);
387
+ try {
388
+ const entry = await storeFn({
389
+ namespace: opts?.namespace ?? defaultNamespace,
390
+ type: opts?.type ?? "fact",
391
+ importance: opts?.importance ?? "medium",
392
+ key,
393
+ value,
394
+ metadata: opts?.metadata,
395
+ scopeId: opts?.scopeId ?? defaultScopeId
396
+ });
397
+ setMemories((prev) => [...prev, entry]);
398
+ return entry;
399
+ } catch (err) {
400
+ const e = err instanceof Error ? err : new Error(String(err));
401
+ setError(e);
402
+ throw e;
403
+ } finally {
404
+ setIsLoading(false);
405
+ }
406
+ };
407
+ const recall = async (key, namespace) => {
408
+ setIsLoading(true);
409
+ setError(null);
410
+ try {
411
+ const results = await searchFn({
412
+ namespace: namespace ?? defaultNamespace,
413
+ key,
414
+ scopeId: defaultScopeId,
415
+ limit: 1
416
+ });
417
+ return results.length > 0 ? results[0] : null;
418
+ } catch (err) {
419
+ const e = err instanceof Error ? err : new Error(String(err));
420
+ setError(e);
421
+ throw e;
422
+ } finally {
423
+ setIsLoading(false);
424
+ }
425
+ };
426
+ const search = async (query) => {
427
+ setIsLoading(true);
428
+ setError(null);
429
+ try {
430
+ const results = await searchFn({ scopeId: defaultScopeId, ...query });
431
+ setMemories(results);
432
+ return results;
433
+ } catch (err) {
434
+ const e = err instanceof Error ? err : new Error(String(err));
435
+ setError(e);
436
+ throw e;
437
+ } finally {
438
+ setIsLoading(false);
439
+ }
440
+ };
441
+ const remove = async (id) => {
442
+ setError(null);
443
+ try {
444
+ await deleteFn(id);
445
+ setMemories((prev) => prev.filter((m) => m.id !== id));
446
+ } catch (err) {
447
+ const e = err instanceof Error ? err : new Error(String(err));
448
+ setError(e);
449
+ throw e;
450
+ }
451
+ };
452
+ const clear = async (namespace) => {
453
+ setError(null);
454
+ try {
455
+ await clearFn(namespace ?? defaultNamespace, defaultScopeId);
456
+ setMemories([]);
457
+ } catch (err) {
458
+ const e = err instanceof Error ? err : new Error(String(err));
459
+ setError(e);
460
+ throw e;
461
+ }
462
+ };
463
+ return { store, recall, search, remove, clear, memories, isLoading, error };
464
+ }
465
+
466
+ // src/primitives/createSkills.ts
467
+ var import_solid_js9 = require("solid-js");
468
+ var import_ai_shared = require("@geenius/ai-shared");
469
+ function createSkills(options) {
470
+ const { executeFn, customSkills = [], defaultModel, userId } = options;
471
+ const [result, setResult] = (0, import_solid_js9.createSignal)(null);
472
+ const [isExecuting, setIsExecuting] = (0, import_solid_js9.createSignal)(false);
473
+ const [error, setError] = (0, import_solid_js9.createSignal)(null);
474
+ const allSkills = (0, import_solid_js9.createMemo)(() => {
475
+ const map = /* @__PURE__ */ new Map();
476
+ for (const skill of Object.values(import_ai_shared.BUILT_IN_SKILLS)) map.set(skill.id, skill);
477
+ for (const skill of customSkills) map.set(skill.id, skill);
478
+ return Array.from(map.values());
479
+ });
480
+ const byCategory = (category) => allSkills().filter((s) => s.category === category);
481
+ const search = (query) => {
482
+ const q = query.toLowerCase();
483
+ return allSkills().filter(
484
+ (s) => s.name.toLowerCase().includes(q) || s.description.toLowerCase().includes(q) || s.tags?.some((t) => t.toLowerCase().includes(q))
485
+ );
486
+ };
487
+ const getSkill = (id) => allSkills().find((s) => s.id === id);
488
+ const execute = async (skillId, params, context) => {
489
+ setIsExecuting(true);
490
+ setError(null);
491
+ try {
492
+ const res = await executeFn({
493
+ skillId,
494
+ params,
495
+ userId,
496
+ context,
497
+ model: defaultModel
498
+ });
499
+ setResult(res);
500
+ return res;
501
+ } catch (err) {
502
+ const e = err instanceof Error ? err : new Error(String(err));
503
+ setError(e);
504
+ throw e;
505
+ } finally {
506
+ setIsExecuting(false);
507
+ }
508
+ };
509
+ return {
510
+ skills: allSkills,
511
+ byCategory,
512
+ search,
513
+ getSkill,
514
+ execute,
515
+ result,
516
+ isExecuting,
517
+ error,
518
+ reset: () => {
519
+ setResult(null);
520
+ setError(null);
521
+ }
522
+ };
523
+ }
524
+
525
+ // src/components/ChatWindow.tsx
526
+ var import_solid_js10 = require("solid-js");
527
+ var ChatWindow = (props) => {
528
+ const [input, setInput] = (0, import_solid_js10.createSignal)("");
529
+ const chat = createChat(props);
530
+ const handleSubmit = async (e) => {
531
+ e.preventDefault();
532
+ const content = input().trim();
533
+ if (!content || chat.isSending()) return;
534
+ setInput("");
535
+ await chat.sendMessage(content);
536
+ };
537
+ return /* @__PURE__ */ React.createElement("div", { class: props.className, "data-ai-component": "chat-window" }, /* @__PURE__ */ React.createElement("div", { "data-ai-messages": true }, /* @__PURE__ */ React.createElement(import_solid_js10.Show, { when: chat.messages().length === 0 }, /* @__PURE__ */ React.createElement("div", { "data-ai-empty": true }, /* @__PURE__ */ React.createElement("p", null, "Start a conversation"))), /* @__PURE__ */ React.createElement(import_solid_js10.For, { each: chat.messages() }, (msg) => props.renderMessage ? props.renderMessage(msg) : /* @__PURE__ */ React.createElement("div", { "data-ai-message": true, "data-ai-role": msg.role }, /* @__PURE__ */ React.createElement("div", { "data-ai-message-role": true }, msg.role), /* @__PURE__ */ React.createElement("div", { "data-ai-message-content": true }, msg.content))), /* @__PURE__ */ React.createElement(import_solid_js10.Show, { when: chat.isSending() }, /* @__PURE__ */ React.createElement("div", { "data-ai-message": true, "data-ai-role": "assistant", "data-ai-loading": true }, /* @__PURE__ */ React.createElement("span", null, "Thinking\u2026")))), /* @__PURE__ */ React.createElement(import_solid_js10.Show, { when: chat.error() }, /* @__PURE__ */ React.createElement("div", { "data-ai-error": true, role: "alert" }, /* @__PURE__ */ React.createElement("span", null, chat.error()), /* @__PURE__ */ React.createElement("button", { onClick: chat.clearError }, "\xD7"))), /* @__PURE__ */ React.createElement("form", { onSubmit: handleSubmit, "data-ai-input-form": true }, /* @__PURE__ */ React.createElement(
538
+ "textarea",
539
+ {
540
+ value: input(),
541
+ onInput: (e) => setInput(e.currentTarget.value),
542
+ placeholder: "Type a message\u2026",
543
+ disabled: chat.isSending(),
544
+ "data-ai-input": true,
545
+ onKeyDown: (e) => {
546
+ if (e.key === "Enter" && !e.shiftKey) {
547
+ e.preventDefault();
548
+ handleSubmit(e);
549
+ }
550
+ }
551
+ }
552
+ ), /* @__PURE__ */ React.createElement("button", { type: "submit", disabled: chat.isSending() || !input().trim(), "data-ai-send": true }, chat.isSending() ? "Sending\u2026" : "Send")));
553
+ };
554
+
555
+ // src/components/ModelTestRunner.tsx
556
+ var import_solid_js11 = require("solid-js");
557
+ var TABS = [
558
+ { id: "text", label: "Text" },
559
+ { id: "image", label: "Image" },
560
+ { id: "audio", label: "Audio" },
561
+ { id: "transcription", label: "ASR" },
562
+ { id: "video", label: "Video" }
563
+ ];
564
+ var ModelTestRunner = (props) => {
565
+ const [activeTab, setActiveTab] = (0, import_solid_js11.createSignal)(props.defaultTab ?? "text");
566
+ const [prompt, setPrompt] = (0, import_solid_js11.createSignal)("");
567
+ const [selectedModel, setSelectedModel] = (0, import_solid_js11.createSignal)("");
568
+ const [batchMode, setBatchMode] = (0, import_solid_js11.createSignal)(false);
569
+ const test = createModelTest(props);
570
+ const handleSubmit = async (e) => {
571
+ e.preventDefault();
572
+ if (!prompt().trim()) return;
573
+ if (batchMode() && props.availableModels) {
574
+ await test.runBatchTest(props.availableModels, prompt().trim());
575
+ } else if (selectedModel()) {
576
+ await test.runTest(selectedModel(), prompt().trim(), activeTab());
577
+ }
578
+ };
579
+ return /* @__PURE__ */ React.createElement("div", { class: props.className, "data-ai-component": "model-test-runner" }, /* @__PURE__ */ React.createElement("div", { "data-ai-tabs": true, role: "tablist" }, /* @__PURE__ */ React.createElement(import_solid_js11.For, { each: TABS }, (tab) => /* @__PURE__ */ React.createElement(
580
+ "button",
581
+ {
582
+ role: "tab",
583
+ "aria-selected": activeTab() === tab.id,
584
+ onClick: () => setActiveTab(tab.id),
585
+ "data-ai-tab": true
586
+ },
587
+ tab.label
588
+ ))), /* @__PURE__ */ React.createElement("form", { onSubmit: handleSubmit, "data-ai-test-form": true }, /* @__PURE__ */ React.createElement(
589
+ "select",
590
+ {
591
+ value: selectedModel(),
592
+ onChange: (e) => setSelectedModel(e.currentTarget.value),
593
+ disabled: test.isRunning() || batchMode(),
594
+ "data-ai-input": true
595
+ },
596
+ /* @__PURE__ */ React.createElement("option", { value: "" }, "Select model\u2026"),
597
+ /* @__PURE__ */ React.createElement(import_solid_js11.For, { each: props.availableModels ?? [] }, (m) => /* @__PURE__ */ React.createElement("option", { value: m }, m))
598
+ ), /* @__PURE__ */ React.createElement(
599
+ "textarea",
600
+ {
601
+ value: prompt(),
602
+ onInput: (e) => setPrompt(e.currentTarget.value),
603
+ placeholder: "Enter test prompt\u2026",
604
+ disabled: test.isRunning(),
605
+ "data-ai-input": true
606
+ }
607
+ ), /* @__PURE__ */ React.createElement("div", { "data-ai-actions": true }, /* @__PURE__ */ React.createElement("label", null, /* @__PURE__ */ React.createElement(
608
+ "input",
609
+ {
610
+ type: "checkbox",
611
+ checked: batchMode(),
612
+ onChange: (e) => setBatchMode(e.currentTarget.checked)
613
+ }
614
+ ), "Test all models"), /* @__PURE__ */ React.createElement("button", { type: "submit", disabled: test.isRunning() || !prompt().trim(), "data-ai-submit": true }, test.isRunning() ? "Running\u2026" : "Run Test"), /* @__PURE__ */ React.createElement(import_solid_js11.Show, { when: test.results().length > 0 }, /* @__PURE__ */ React.createElement("button", { type: "button", onClick: test.clearResults, "data-ai-clear": true }, "Clear")))), /* @__PURE__ */ React.createElement(import_solid_js11.Show, { when: test.results().length > 0 }, /* @__PURE__ */ React.createElement("div", { "data-ai-test-results": true }, /* @__PURE__ */ React.createElement(import_solid_js11.For, { each: test.results() }, (result) => /* @__PURE__ */ React.createElement("div", { "data-ai-test-result": true, "data-ai-status": result.error ? "error" : "success" }, /* @__PURE__ */ React.createElement("div", { "data-ai-result-header": true }, /* @__PURE__ */ React.createElement("span", null, result.model), /* @__PURE__ */ React.createElement("span", null, result.durationMs, "ms"), /* @__PURE__ */ React.createElement(import_solid_js11.Show, { when: result.error }, /* @__PURE__ */ React.createElement("span", { "data-ai-result-error": true }, result.error))), /* @__PURE__ */ React.createElement(import_solid_js11.Show, { when: !result.error }, /* @__PURE__ */ React.createElement("pre", { "data-ai-result-text": true }, result.result)))))));
615
+ };
616
+
617
+ // src/components/GenerationCard.tsx
618
+ var import_solid_js12 = require("solid-js");
619
+ var GenerationCard = (props) => {
620
+ return /* @__PURE__ */ React.createElement("div", { class: props.className, "data-ai-component": "generation-card", "data-ai-type": props.type }, /* @__PURE__ */ React.createElement("div", { "data-ai-card-header": true }, /* @__PURE__ */ React.createElement("span", { "data-ai-card-type": true }, props.type), /* @__PURE__ */ React.createElement(import_solid_js12.Show, { when: props.model }, /* @__PURE__ */ React.createElement("span", { "data-ai-card-model": true }, props.model)), /* @__PURE__ */ React.createElement(import_solid_js12.Show, { when: props.durationMs != null }, /* @__PURE__ */ React.createElement("span", { "data-ai-card-duration": true }, props.durationMs, "ms"))), /* @__PURE__ */ React.createElement(import_solid_js12.Show, { when: props.error, fallback: /* @__PURE__ */ React.createElement("div", { "data-ai-card-content": true }, /* @__PURE__ */ React.createElement(
621
+ import_solid_js12.Show,
622
+ {
623
+ when: props.type === "image",
624
+ fallback: /* @__PURE__ */ React.createElement(
625
+ import_solid_js12.Show,
626
+ {
627
+ when: props.type === "audio" || props.type === "speech",
628
+ fallback: /* @__PURE__ */ React.createElement("pre", { "data-ai-card-text": true }, props.content)
629
+ },
630
+ /* @__PURE__ */ React.createElement("audio", { controls: true, "data-ai-card-audio": true }, /* @__PURE__ */ React.createElement("source", { src: props.content.startsWith("http") ? props.content : `data:audio/mp3;base64,${props.content}` }))
631
+ )
632
+ },
633
+ /* @__PURE__ */ React.createElement(
634
+ "img",
635
+ {
636
+ src: props.content.startsWith("http") ? props.content : `data:image/png;base64,${props.content}`,
637
+ alt: "AI Generated",
638
+ "data-ai-card-image": true
639
+ }
640
+ )
641
+ )) }, /* @__PURE__ */ React.createElement("div", { "data-ai-card-error": true, role: "alert" }, props.error)), /* @__PURE__ */ React.createElement(import_solid_js12.Show, { when: props.tokens || props.cost != null }, /* @__PURE__ */ React.createElement("div", { "data-ai-card-footer": true }, /* @__PURE__ */ React.createElement(import_solid_js12.Show, { when: props.tokens }, /* @__PURE__ */ React.createElement("span", null, props.tokens, " tokens")), /* @__PURE__ */ React.createElement(import_solid_js12.Show, { when: props.cost != null }, /* @__PURE__ */ React.createElement("span", null, "$", props.cost.toFixed(4))))));
642
+ };
643
+
644
+ // src/pages/ChatPage.tsx
645
+ var import_solid_js13 = require("solid-js");
646
+ var ChatPage = (props) => {
647
+ const [_, setConversationId] = (0, import_solid_js13.createSignal)(void 0);
648
+ return /* @__PURE__ */ React.createElement("div", { class: props.className, "data-ai-page": "chat" }, /* @__PURE__ */ React.createElement("div", { "data-ai-page-header": true }, /* @__PURE__ */ React.createElement("h1", { "data-ai-page-title": true }, "AI Chat"), /* @__PURE__ */ React.createElement("button", { onClick: () => setConversationId(void 0), "data-ai-new-chat": true }, "New Chat")), /* @__PURE__ */ React.createElement(ChatWindow, { ...props }));
649
+ };
650
+
651
+ // src/pages/ModelTestPage.tsx
652
+ var import_ai_shared2 = require("@geenius/ai-shared");
653
+ var ModelTestPage = (props) => {
654
+ const models = props.availableModels ?? import_ai_shared2.DEFAULT_MODELS.map((m) => m.id);
655
+ return /* @__PURE__ */ React.createElement("div", { class: props.className, "data-ai-page": "model-test" }, /* @__PURE__ */ React.createElement("div", { "data-ai-page-header": true }, /* @__PURE__ */ React.createElement("h1", { "data-ai-page-title": true }, props.title ?? "Model Test Lab")), /* @__PURE__ */ React.createElement(ModelTestRunner, { ...props, availableModels: models }));
656
+ };
657
+ // Annotate the CommonJS export names for ESM import in node:
658
+ 0 && (module.exports = {
659
+ ChatPage,
660
+ ChatWindow,
661
+ GenerationCard,
662
+ ModelTestPage,
663
+ ModelTestRunner,
664
+ createAI,
665
+ createChat,
666
+ createContentManager,
667
+ createImageGeneration,
668
+ createMemory,
669
+ createModelTest,
670
+ createSkills,
671
+ createTextToSpeech,
672
+ createVideoGeneration
673
+ });
674
+ //# sourceMappingURL=index.cjs.map