vibesuite 1.3.3 → 2.0.2

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 (75) hide show
  1. package/README.md +75 -6
  2. package/assets/.agent/skills/avoid-feature-creep/SKILL.md +307 -0
  3. package/assets/.agent/skills/avoid-feature-creep/agents/openai.yaml +3 -0
  4. package/assets/.agent/skills/avoid-feature-creep/assets/large-logo.png +0 -0
  5. package/assets/.agent/skills/avoid-feature-creep/assets/small-logo.svg +17 -0
  6. package/assets/.agent/skills/convex/SKILL.md +62 -0
  7. package/assets/.agent/skills/convex/agents/openai.yaml +3 -0
  8. package/assets/.agent/skills/convex/assets/large-logo.png +0 -0
  9. package/assets/.agent/skills/convex/assets/small-logo.svg +17 -0
  10. package/assets/.agent/skills/convex-agents/SKILL.md +516 -0
  11. package/assets/.agent/skills/convex-agents/agents/openai.yaml +3 -0
  12. package/assets/.agent/skills/convex-agents/assets/large-logo.png +0 -0
  13. package/assets/.agent/skills/convex-agents/assets/small-logo.svg +17 -0
  14. package/assets/.agent/skills/convex-best-practices/SKILL.md +369 -0
  15. package/assets/.agent/skills/convex-best-practices/agents/openai.yaml +3 -0
  16. package/assets/.agent/skills/convex-best-practices/assets/large-logo.png +0 -0
  17. package/assets/.agent/skills/convex-best-practices/assets/small-logo.svg +17 -0
  18. package/assets/.agent/skills/convex-component-authoring/SKILL.md +457 -0
  19. package/assets/.agent/skills/convex-component-authoring/agents/openai.yaml +3 -0
  20. package/assets/.agent/skills/convex-component-authoring/assets/large-logo.png +0 -0
  21. package/assets/.agent/skills/convex-component-authoring/assets/small-logo.svg +17 -0
  22. package/assets/.agent/skills/convex-cron-jobs/SKILL.md +604 -0
  23. package/assets/.agent/skills/convex-cron-jobs/agents/openai.yaml +3 -0
  24. package/assets/.agent/skills/convex-cron-jobs/assets/large-logo.png +0 -0
  25. package/assets/.agent/skills/convex-cron-jobs/assets/small-logo.svg +17 -0
  26. package/assets/.agent/skills/convex-file-storage/SKILL.md +467 -0
  27. package/assets/.agent/skills/convex-file-storage/agents/openai.yaml +3 -0
  28. package/assets/.agent/skills/convex-file-storage/assets/large-logo.png +0 -0
  29. package/assets/.agent/skills/convex-file-storage/assets/small-logo.svg +17 -0
  30. package/assets/.agent/skills/convex-functions/SKILL.md +458 -0
  31. package/assets/.agent/skills/convex-functions/agents/openai.yaml +3 -0
  32. package/assets/.agent/skills/convex-functions/assets/large-logo.png +0 -0
  33. package/assets/.agent/skills/convex-functions/assets/small-logo.svg +17 -0
  34. package/assets/.agent/skills/convex-http-actions/SKILL.md +733 -0
  35. package/assets/.agent/skills/convex-http-actions/agents/openai.yaml +3 -0
  36. package/assets/.agent/skills/convex-http-actions/assets/large-logo.png +0 -0
  37. package/assets/.agent/skills/convex-http-actions/assets/small-logo.svg +17 -0
  38. package/assets/.agent/skills/convex-migrations/SKILL.md +712 -0
  39. package/assets/.agent/skills/convex-migrations/agents/openai.yaml +3 -0
  40. package/assets/.agent/skills/convex-migrations/assets/large-logo.png +0 -0
  41. package/assets/.agent/skills/convex-migrations/assets/small-logo.svg +17 -0
  42. package/assets/.agent/skills/convex-realtime/SKILL.md +443 -0
  43. package/assets/.agent/skills/convex-realtime/agents/openai.yaml +3 -0
  44. package/assets/.agent/skills/convex-realtime/assets/large-logo.png +0 -0
  45. package/assets/.agent/skills/convex-realtime/assets/small-logo.svg +17 -0
  46. package/assets/.agent/skills/convex-schema-validator/SKILL.md +400 -0
  47. package/assets/.agent/skills/convex-schema-validator/agents/openai.yaml +3 -0
  48. package/assets/.agent/skills/convex-schema-validator/assets/large-logo.png +0 -0
  49. package/assets/.agent/skills/convex-schema-validator/assets/small-logo.svg +17 -0
  50. package/assets/.agent/skills/convex-security-audit/SKILL.md +539 -0
  51. package/assets/.agent/skills/convex-security-audit/agents/openai.yaml +3 -0
  52. package/assets/.agent/skills/convex-security-audit/assets/large-logo.png +0 -0
  53. package/assets/.agent/skills/convex-security-audit/assets/small-logo.svg +17 -0
  54. package/assets/.agent/skills/convex-security-check/SKILL.md +378 -0
  55. package/assets/.agent/skills/convex-security-check/agents/openai.yaml +3 -0
  56. package/assets/.agent/skills/convex-security-check/assets/large-logo.png +0 -0
  57. package/assets/.agent/skills/convex-security-check/assets/small-logo.svg +17 -0
  58. package/assets/.agent/skills/github-ops/SKILL.md +4 -4
  59. package/assets/.agent/skills/google-trends/SKILL.md +7 -7
  60. package/assets/.agent/skills/optimize-agent-context/SKILL.md +97 -0
  61. package/assets/.agent/skills/youtube-pipeline/SKILL.md +10 -10
  62. package/assets/.agent/workflows/LEGACY/init_smart_ops.md +2 -2
  63. package/assets/.agent/workflows/agent_reset.md +4 -6
  64. package/assets/.agent/workflows/mode-orchestrator.md +17 -22
  65. package/assets/.agent/workflows/mode-visionary.md +3 -10
  66. package/assets/.agent/workflows/optimize-agent-context.md +54 -0
  67. package/assets/.agent/workflows/remotion-build.md +17 -17
  68. package/assets/.agent/workflows/stitch.md +4 -4
  69. package/assets/VibeCode-Agents/vibe-orchestrator.yaml +14 -33
  70. package/assets/VibeCode-Agents/vibe-visionary.yaml +3 -13
  71. package/package.json +1 -1
  72. package/src/cli.js +416 -20
  73. package/src/harness.js +281 -0
  74. package/src/store.js +239 -0
  75. package/assets/VibeCode-Agents/custom_modes.yaml +0 -979
@@ -0,0 +1,516 @@
1
+ ---
2
+ name: convex-agents
3
+ displayName: Convex Agents
4
+ description: Building AI agents with the Convex Agent component including thread management, tool integration, streaming responses, RAG patterns, and workflow orchestration
5
+ version: 1.0.0
6
+ author: Convex
7
+ tags: [convex, agents, ai, llm, tools, rag, workflows]
8
+ ---
9
+
10
+ # Convex Agents
11
+
12
+ Build persistent, stateful AI agents with Convex including thread management, tool integration, streaming responses, RAG patterns, and workflow orchestration.
13
+
14
+ ## Documentation Sources
15
+
16
+ Before implementing, do not assume; fetch the latest documentation:
17
+
18
+ - Primary: https://docs.convex.dev/ai
19
+ - Convex Agent Component: https://www.npmjs.com/package/@convex-dev/agent
20
+ - For broader context: https://docs.convex.dev/llms.txt
21
+
22
+ ## Instructions
23
+
24
+ ### Why Convex for AI Agents
25
+
26
+ - **Persistent State** - Conversation history survives restarts
27
+ - **Real-time Updates** - Stream responses to clients automatically
28
+ - **Tool Execution** - Run Convex functions as agent tools
29
+ - **Durable Workflows** - Long-running agent tasks with reliability
30
+ - **Built-in RAG** - Vector search for knowledge retrieval
31
+
32
+ ### Setting Up Convex Agent
33
+
34
+ ```bash
35
+ npm install @convex-dev/agent ai openai
36
+ ```
37
+
38
+ ```typescript
39
+ // convex/agent.ts
40
+ import { Agent } from "@convex-dev/agent";
41
+ import { components } from "./_generated/api";
42
+ import { OpenAI } from "openai";
43
+
44
+ const openai = new OpenAI();
45
+
46
+ export const agent = new Agent(components.agent, {
47
+ chat: openai.chat,
48
+ textEmbedding: openai.embeddings,
49
+ });
50
+ ```
51
+
52
+ ### Thread Management
53
+
54
+ ```typescript
55
+ // convex/threads.ts
56
+ import { mutation, query } from "./_generated/server";
57
+ import { v } from "convex/values";
58
+ import { agent } from "./agent";
59
+
60
+ // Create a new conversation thread
61
+ export const createThread = mutation({
62
+ args: {
63
+ userId: v.id("users"),
64
+ title: v.optional(v.string()),
65
+ },
66
+ returns: v.id("threads"),
67
+ handler: async (ctx, args) => {
68
+ const threadId = await agent.createThread(ctx, {
69
+ userId: args.userId,
70
+ metadata: {
71
+ title: args.title ?? "New Conversation",
72
+ createdAt: Date.now(),
73
+ },
74
+ });
75
+ return threadId;
76
+ },
77
+ });
78
+
79
+ // List user's threads
80
+ export const listThreads = query({
81
+ args: { userId: v.id("users") },
82
+ returns: v.array(v.object({
83
+ _id: v.id("threads"),
84
+ title: v.string(),
85
+ lastMessageAt: v.optional(v.number()),
86
+ })),
87
+ handler: async (ctx, args) => {
88
+ return await agent.listThreads(ctx, {
89
+ userId: args.userId,
90
+ });
91
+ },
92
+ });
93
+
94
+ // Get thread messages
95
+ export const getMessages = query({
96
+ args: { threadId: v.id("threads") },
97
+ returns: v.array(v.object({
98
+ role: v.string(),
99
+ content: v.string(),
100
+ createdAt: v.number(),
101
+ })),
102
+ handler: async (ctx, args) => {
103
+ return await agent.getMessages(ctx, {
104
+ threadId: args.threadId,
105
+ });
106
+ },
107
+ });
108
+ ```
109
+
110
+ ### Sending Messages and Streaming Responses
111
+
112
+ ```typescript
113
+ // convex/chat.ts
114
+ import { action } from "./_generated/server";
115
+ import { v } from "convex/values";
116
+ import { agent } from "./agent";
117
+ import { internal } from "./_generated/api";
118
+
119
+ export const sendMessage = action({
120
+ args: {
121
+ threadId: v.id("threads"),
122
+ message: v.string(),
123
+ },
124
+ returns: v.null(),
125
+ handler: async (ctx, args) => {
126
+ // Add user message to thread
127
+ await ctx.runMutation(internal.chat.addUserMessage, {
128
+ threadId: args.threadId,
129
+ content: args.message,
130
+ });
131
+
132
+ // Generate AI response with streaming
133
+ const response = await agent.chat(ctx, {
134
+ threadId: args.threadId,
135
+ messages: [{ role: "user", content: args.message }],
136
+ stream: true,
137
+ onToken: async (token) => {
138
+ // Stream tokens to client via mutation
139
+ await ctx.runMutation(internal.chat.appendToken, {
140
+ threadId: args.threadId,
141
+ token,
142
+ });
143
+ },
144
+ });
145
+
146
+ // Save complete response
147
+ await ctx.runMutation(internal.chat.saveResponse, {
148
+ threadId: args.threadId,
149
+ content: response.content,
150
+ });
151
+
152
+ return null;
153
+ },
154
+ });
155
+ ```
156
+
157
+ ### Tool Integration
158
+
159
+ Define tools that agents can use:
160
+
161
+ ```typescript
162
+ // convex/tools.ts
163
+ import { tool } from "@convex-dev/agent";
164
+ import { v } from "convex/values";
165
+ import { api } from "./_generated/api";
166
+
167
+ // Tool to search knowledge base
168
+ export const searchKnowledge = tool({
169
+ name: "search_knowledge",
170
+ description: "Search the knowledge base for relevant information",
171
+ parameters: v.object({
172
+ query: v.string(),
173
+ limit: v.optional(v.number()),
174
+ }),
175
+ handler: async (ctx, args) => {
176
+ const results = await ctx.runQuery(api.knowledge.search, {
177
+ query: args.query,
178
+ limit: args.limit ?? 5,
179
+ });
180
+ return results;
181
+ },
182
+ });
183
+
184
+ // Tool to create a task
185
+ export const createTask = tool({
186
+ name: "create_task",
187
+ description: "Create a new task for the user",
188
+ parameters: v.object({
189
+ title: v.string(),
190
+ description: v.optional(v.string()),
191
+ dueDate: v.optional(v.string()),
192
+ }),
193
+ handler: async (ctx, args) => {
194
+ const taskId = await ctx.runMutation(api.tasks.create, {
195
+ title: args.title,
196
+ description: args.description,
197
+ dueDate: args.dueDate ? new Date(args.dueDate).getTime() : undefined,
198
+ });
199
+ return { success: true, taskId };
200
+ },
201
+ });
202
+
203
+ // Tool to get weather
204
+ export const getWeather = tool({
205
+ name: "get_weather",
206
+ description: "Get current weather for a location",
207
+ parameters: v.object({
208
+ location: v.string(),
209
+ }),
210
+ handler: async (ctx, args) => {
211
+ const response = await fetch(
212
+ `https://api.weather.com/current?location=${encodeURIComponent(args.location)}`
213
+ );
214
+ return await response.json();
215
+ },
216
+ });
217
+ ```
218
+
219
+ ### Agent with Tools
220
+
221
+ ```typescript
222
+ // convex/assistant.ts
223
+ import { action } from "./_generated/server";
224
+ import { v } from "convex/values";
225
+ import { agent } from "./agent";
226
+ import { searchKnowledge, createTask, getWeather } from "./tools";
227
+
228
+ export const chat = action({
229
+ args: {
230
+ threadId: v.id("threads"),
231
+ message: v.string(),
232
+ },
233
+ returns: v.string(),
234
+ handler: async (ctx, args) => {
235
+ const response = await agent.chat(ctx, {
236
+ threadId: args.threadId,
237
+ messages: [{ role: "user", content: args.message }],
238
+ tools: [searchKnowledge, createTask, getWeather],
239
+ systemPrompt: `You are a helpful assistant. You have access to tools to:
240
+ - Search the knowledge base for information
241
+ - Create tasks for the user
242
+ - Get weather information
243
+ Use these tools when appropriate to help the user.`,
244
+ });
245
+
246
+ return response.content;
247
+ },
248
+ });
249
+ ```
250
+
251
+ ### RAG (Retrieval Augmented Generation)
252
+
253
+ ```typescript
254
+ // convex/knowledge.ts
255
+ import { mutation, query } from "./_generated/server";
256
+ import { v } from "convex/values";
257
+ import { agent } from "./agent";
258
+
259
+ // Add document to knowledge base
260
+ export const addDocument = mutation({
261
+ args: {
262
+ title: v.string(),
263
+ content: v.string(),
264
+ metadata: v.optional(v.object({
265
+ source: v.optional(v.string()),
266
+ category: v.optional(v.string()),
267
+ })),
268
+ },
269
+ returns: v.id("documents"),
270
+ handler: async (ctx, args) => {
271
+ // Generate embedding
272
+ const embedding = await agent.embed(ctx, args.content);
273
+
274
+ return await ctx.db.insert("documents", {
275
+ title: args.title,
276
+ content: args.content,
277
+ embedding,
278
+ metadata: args.metadata ?? {},
279
+ createdAt: Date.now(),
280
+ });
281
+ },
282
+ });
283
+
284
+ // Search knowledge base
285
+ export const search = query({
286
+ args: {
287
+ query: v.string(),
288
+ limit: v.optional(v.number()),
289
+ },
290
+ returns: v.array(v.object({
291
+ _id: v.id("documents"),
292
+ title: v.string(),
293
+ content: v.string(),
294
+ score: v.number(),
295
+ })),
296
+ handler: async (ctx, args) => {
297
+ const results = await agent.search(ctx, {
298
+ query: args.query,
299
+ table: "documents",
300
+ limit: args.limit ?? 5,
301
+ });
302
+
303
+ return results.map((r) => ({
304
+ _id: r._id,
305
+ title: r.title,
306
+ content: r.content,
307
+ score: r._score,
308
+ }));
309
+ },
310
+ });
311
+ ```
312
+
313
+ ### Workflow Orchestration
314
+
315
+ ```typescript
316
+ // convex/workflows.ts
317
+ import { action, internalMutation } from "./_generated/server";
318
+ import { v } from "convex/values";
319
+ import { agent } from "./agent";
320
+ import { internal } from "./_generated/api";
321
+
322
+ // Multi-step research workflow
323
+ export const researchTopic = action({
324
+ args: {
325
+ topic: v.string(),
326
+ userId: v.id("users"),
327
+ },
328
+ returns: v.id("research"),
329
+ handler: async (ctx, args) => {
330
+ // Create research record
331
+ const researchId = await ctx.runMutation(internal.workflows.createResearch, {
332
+ topic: args.topic,
333
+ userId: args.userId,
334
+ status: "searching",
335
+ });
336
+
337
+ // Step 1: Search for relevant documents
338
+ const searchResults = await agent.search(ctx, {
339
+ query: args.topic,
340
+ table: "documents",
341
+ limit: 10,
342
+ });
343
+
344
+ await ctx.runMutation(internal.workflows.updateStatus, {
345
+ researchId,
346
+ status: "analyzing",
347
+ });
348
+
349
+ // Step 2: Analyze and synthesize
350
+ const analysis = await agent.chat(ctx, {
351
+ messages: [{
352
+ role: "user",
353
+ content: `Analyze these sources about "${args.topic}" and provide a comprehensive summary:\n\n${
354
+ searchResults.map((r) => r.content).join("\n\n---\n\n")
355
+ }`,
356
+ }],
357
+ systemPrompt: "You are a research assistant. Provide thorough, well-cited analysis.",
358
+ });
359
+
360
+ // Step 3: Generate key insights
361
+ await ctx.runMutation(internal.workflows.updateStatus, {
362
+ researchId,
363
+ status: "summarizing",
364
+ });
365
+
366
+ const insights = await agent.chat(ctx, {
367
+ messages: [{
368
+ role: "user",
369
+ content: `Based on this analysis, list 5 key insights:\n\n${analysis.content}`,
370
+ }],
371
+ });
372
+
373
+ // Save final results
374
+ await ctx.runMutation(internal.workflows.completeResearch, {
375
+ researchId,
376
+ analysis: analysis.content,
377
+ insights: insights.content,
378
+ sources: searchResults.map((r) => r._id),
379
+ });
380
+
381
+ return researchId;
382
+ },
383
+ });
384
+ ```
385
+
386
+ ## Examples
387
+
388
+ ### Complete Chat Application Schema
389
+
390
+ ```typescript
391
+ // convex/schema.ts
392
+ import { defineSchema, defineTable } from "convex/server";
393
+ import { v } from "convex/values";
394
+
395
+ export default defineSchema({
396
+ threads: defineTable({
397
+ userId: v.id("users"),
398
+ title: v.string(),
399
+ lastMessageAt: v.optional(v.number()),
400
+ metadata: v.optional(v.any()),
401
+ }).index("by_user", ["userId"]),
402
+
403
+ messages: defineTable({
404
+ threadId: v.id("threads"),
405
+ role: v.union(v.literal("user"), v.literal("assistant"), v.literal("system")),
406
+ content: v.string(),
407
+ toolCalls: v.optional(v.array(v.object({
408
+ name: v.string(),
409
+ arguments: v.any(),
410
+ result: v.optional(v.any()),
411
+ }))),
412
+ createdAt: v.number(),
413
+ }).index("by_thread", ["threadId"]),
414
+
415
+ documents: defineTable({
416
+ title: v.string(),
417
+ content: v.string(),
418
+ embedding: v.array(v.float64()),
419
+ metadata: v.object({
420
+ source: v.optional(v.string()),
421
+ category: v.optional(v.string()),
422
+ }),
423
+ createdAt: v.number(),
424
+ }).vectorIndex("by_embedding", {
425
+ vectorField: "embedding",
426
+ dimensions: 1536,
427
+ }),
428
+ });
429
+ ```
430
+
431
+ ### React Chat Component
432
+
433
+ ```typescript
434
+ import { useQuery, useMutation, useAction } from "convex/react";
435
+ import { api } from "../convex/_generated/api";
436
+ import { useState, useRef, useEffect } from "react";
437
+
438
+ function ChatInterface({ threadId }: { threadId: Id<"threads"> }) {
439
+ const messages = useQuery(api.threads.getMessages, { threadId });
440
+ const sendMessage = useAction(api.chat.sendMessage);
441
+ const [input, setInput] = useState("");
442
+ const [sending, setSending] = useState(false);
443
+ const messagesEndRef = useRef<HTMLDivElement>(null);
444
+
445
+ useEffect(() => {
446
+ messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
447
+ }, [messages]);
448
+
449
+ const handleSend = async (e: React.FormEvent) => {
450
+ e.preventDefault();
451
+ if (!input.trim() || sending) return;
452
+
453
+ const message = input.trim();
454
+ setInput("");
455
+ setSending(true);
456
+
457
+ try {
458
+ await sendMessage({ threadId, message });
459
+ } finally {
460
+ setSending(false);
461
+ }
462
+ };
463
+
464
+ return (
465
+ <div className="chat-container">
466
+ <div className="messages">
467
+ {messages?.map((msg, i) => (
468
+ <div key={i} className={`message ${msg.role}`}>
469
+ <strong>{msg.role === "user" ? "You" : "Assistant"}:</strong>
470
+ <p>{msg.content}</p>
471
+ </div>
472
+ ))}
473
+ <div ref={messagesEndRef} />
474
+ </div>
475
+
476
+ <form onSubmit={handleSend} className="input-form">
477
+ <input
478
+ value={input}
479
+ onChange={(e) => setInput(e.target.value)}
480
+ placeholder="Type your message..."
481
+ disabled={sending}
482
+ />
483
+ <button type="submit" disabled={sending || !input.trim()}>
484
+ {sending ? "Sending..." : "Send"}
485
+ </button>
486
+ </form>
487
+ </div>
488
+ );
489
+ }
490
+ ```
491
+
492
+ ## Best Practices
493
+
494
+ - Never run `npx convex deploy` unless explicitly instructed
495
+ - Never run any git commands unless explicitly instructed
496
+ - Store conversation history in Convex for persistence
497
+ - Use streaming for better user experience with long responses
498
+ - Implement proper error handling for tool failures
499
+ - Use vector indexes for efficient RAG retrieval
500
+ - Rate limit agent interactions to control costs
501
+ - Log tool usage for debugging and analytics
502
+
503
+ ## Common Pitfalls
504
+
505
+ 1. **Not persisting threads** - Conversations lost on refresh
506
+ 2. **Blocking on long responses** - Use streaming instead
507
+ 3. **Tool errors crashing agents** - Add proper error handling
508
+ 4. **Large context windows** - Summarize old messages
509
+ 5. **Missing embeddings for RAG** - Generate embeddings on insert
510
+
511
+ ## References
512
+
513
+ - Convex Documentation: https://docs.convex.dev/
514
+ - Convex LLMs.txt: https://docs.convex.dev/llms.txt
515
+ - Convex AI: https://docs.convex.dev/ai
516
+ - Agent Component: https://www.npmjs.com/package/@convex-dev/agent
@@ -0,0 +1,3 @@
1
+ interface:
2
+ icon_small: "./assets/small-logo.svg"
3
+ icon_large: "./assets/large-logo.png"
@@ -0,0 +1,17 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_3_23)">
3
+ <g clip-path="url(#clip1_3_23)">
4
+ <path d="M10.0643 12.5735C12.3769 12.3166 14.5572 11.0843 15.7577 9.02756C15.1892 14.1148 9.62646 17.3302 5.08583 15.356C4.66743 15.1746 4.30728 14.8728 4.06013 14.4848C3.03973 12.8825 2.7043 10.8437 3.18626 8.99344C4.56327 11.37 7.3632 12.8267 10.0643 12.5735Z" fill="#F3B01C"/>
5
+ <path d="M3.1018 7.50072C2.16436 9.66714 2.12376 12.2034 3.27303 14.2907C-0.771507 11.2479 -0.72737 4.7362 3.2236 1.72378C3.58904 1.44535 4.02333 1.2801 4.47881 1.25494C6.3519 1.15614 8.25501 1.88006 9.58963 3.22909C6.87799 3.25604 4.23695 4.99308 3.1018 7.50072Z" fill="#8D2676"/>
6
+ <path d="M10.8974 3.89562C9.52924 1.98794 7.38779 0.68921 5.04156 0.649695C9.57686 -1.40888 15.1555 1.92867 15.7629 6.86314C15.8194 7.32119 15.7452 7.78824 15.5421 8.20138C14.6948 9.92223 13.1236 11.2569 11.2876 11.7508C12.6328 9.25579 12.4668 6.20748 10.8974 3.89562Z" fill="#EE342F"/>
7
+ </g>
8
+ </g>
9
+ <defs>
10
+ <clipPath id="clip0_3_23">
11
+ <rect width="16" height="16" fill="white"/>
12
+ </clipPath>
13
+ <clipPath id="clip1_3_23">
14
+ <rect width="16" height="16" fill="white"/>
15
+ </clipPath>
16
+ </defs>
17
+ </svg>