@chrryai/waffles 2.4.40 → 2.4.42

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.
package/dist/index.mjs CHANGED
@@ -119,6 +119,402 @@ var scheduledJobFactory = {
119
119
  }
120
120
  };
121
121
 
122
+ // src/agent/chopstickExpert.ts
123
+ var modelPricing = {
124
+ "deepseek/deepseek-v3.2": {
125
+ input: 0.28,
126
+ output: 0.4,
127
+ tools: true,
128
+ analyze: false
129
+ },
130
+ "deepseek/deepseek-chat": {
131
+ input: 0.15,
132
+ output: 0.45,
133
+ tools: true,
134
+ analyze: false
135
+ },
136
+ "anthropic/claude-sonnet-4-6": {
137
+ input: 3,
138
+ output: 15,
139
+ tools: true,
140
+ analyze: true
141
+ },
142
+ "google/gemini-3.1-pro-preview": {
143
+ input: 0.35,
144
+ output: 1.05,
145
+ tools: true,
146
+ analyze: true
147
+ },
148
+ "deepseek/deepseek-v3.2-thinking": {
149
+ input: 0.28,
150
+ output: 0.4,
151
+ tools: true,
152
+ analyze: false
153
+ },
154
+ "qwen/qwen3.6-plus": { input: 0.3, output: 0.8, tools: true, analyze: true },
155
+ "minimax/minimax-m2.5": {
156
+ input: 0.3,
157
+ output: 1.1,
158
+ tools: true,
159
+ analyze: false
160
+ },
161
+ "minimax/minimax-m2.7": {
162
+ input: 0.3,
163
+ output: 1.2,
164
+ tools: true,
165
+ analyze: false
166
+ },
167
+ "x-ai/grok-4.1-fast": { input: 0.5, output: 2, tools: true, analyze: true },
168
+ "perplexity/sonar-pro": {
169
+ input: 2,
170
+ output: 8,
171
+ tools: false,
172
+ analyze: false
173
+ },
174
+ "openrouter/free": { input: 0, output: 0, tools: false, analyze: false },
175
+ "openai/gpt-oss-120b:free": {
176
+ input: 0,
177
+ output: 0.073,
178
+ tools: false,
179
+ analyze: true
180
+ },
181
+ "nvidia/nemotron-3-super-120b-a12b:free": {
182
+ input: 0,
183
+ output: 0,
184
+ tools: true,
185
+ analyze: false
186
+ },
187
+ "gpt-4o": { input: 2.5, output: 10, tools: true, analyze: true },
188
+ "gpt-4o-mini": { input: 0.15, output: 0.6, tools: true, analyze: true },
189
+ "openai/gpt-5.4": { input: 2.5, output: 15, tools: true, analyze: true }
190
+ };
191
+ var presets = {
192
+ minimal: {
193
+ join: {
194
+ memories: { user: 1, app: 1, dna: 0, thread: 1 },
195
+ instructions: { user: 1, app: 1, dna: 0, thread: 1 },
196
+ characterProfile: { user: 0, app: 0, dna: 0, thread: 0 },
197
+ placeholders: { user: 1, app: 1, dna: 0, thread: 1 }
198
+ },
199
+ depth: 0,
200
+ model: {
201
+ modelId: "nvidia/nemotron-3-super-120b-a12b:free",
202
+ inputPrice: 0,
203
+ outputPrice: 0,
204
+ hasTools: true,
205
+ canAnalyze: false,
206
+ reason: "Free model, minimal context"
207
+ },
208
+ reasoning: ["Minimal preset"]
209
+ },
210
+ balanced: {
211
+ join: {
212
+ memories: { user: 3, app: 2, dna: 1, thread: 3 },
213
+ instructions: { user: 2, app: 2, dna: 1, thread: 2 },
214
+ characterProfile: { user: 1, app: 1, dna: 0, thread: 1 },
215
+ placeholders: { user: 2, app: 2, dna: 1, thread: 2 }
216
+ },
217
+ depth: 1,
218
+ model: {
219
+ modelId: "deepseek/deepseek-chat",
220
+ inputPrice: 0.15,
221
+ outputPrice: 0.45,
222
+ hasTools: true,
223
+ canAnalyze: false,
224
+ reason: "Balanced cost/performance"
225
+ },
226
+ reasoning: ["Balanced preset"]
227
+ },
228
+ rich: {
229
+ join: {
230
+ memories: { user: 8, app: 5, dna: 3, thread: 6 },
231
+ instructions: { user: 5, app: 4, dna: 2, thread: 4 },
232
+ characterProfile: { user: 2, app: 2, dna: 1, thread: 2 },
233
+ placeholders: { user: 3, app: 3, dna: 2, thread: 3 }
234
+ },
235
+ depth: 2,
236
+ model: {
237
+ modelId: "deepseek/deepseek-v3.2",
238
+ inputPrice: 0.28,
239
+ outputPrice: 0.4,
240
+ hasTools: true,
241
+ canAnalyze: false,
242
+ reason: "Rich context"
243
+ },
244
+ reasoning: ["Rich preset"]
245
+ },
246
+ /** Admin/Sato mode - maximum user context */
247
+ admin: {
248
+ join: {
249
+ memories: { user: 15, app: 5, dna: 3, thread: 8 },
250
+ instructions: { user: 10, app: 4, dna: 2, thread: 5 },
251
+ characterProfile: { user: 3, app: 2, dna: 1, thread: 2 },
252
+ placeholders: { user: 5, app: 3, dna: 2, thread: 4 }
253
+ },
254
+ depth: 2,
255
+ model: {
256
+ modelId: "anthropic/claude-sonnet-4-6",
257
+ inputPrice: 3,
258
+ outputPrice: 15,
259
+ hasTools: true,
260
+ canAnalyze: true,
261
+ reason: "Admin mode: maximum context for Sato reports"
262
+ },
263
+ reasoning: ["Admin preset: Sato mode activated"]
264
+ },
265
+ kanban: {
266
+ join: {
267
+ memories: { user: 4, app: 6, dna: 2, thread: 3 },
268
+ instructions: { user: 3, app: 6, dna: 1, thread: 3 },
269
+ characterProfile: { user: 1, app: 2, dna: 1, thread: 1 },
270
+ placeholders: { user: 2, app: 4, dna: 1, thread: 2 }
271
+ },
272
+ depth: 1,
273
+ model: {
274
+ modelId: "deepseek/deepseek-chat",
275
+ inputPrice: 0.15,
276
+ outputPrice: 0.45,
277
+ hasTools: true,
278
+ canAnalyze: false,
279
+ reason: "Kanban needs tools"
280
+ },
281
+ reasoning: ["Kanban preset"]
282
+ },
283
+ tribe: {
284
+ join: {
285
+ memories: { user: 5, app: 3, dna: 2, thread: 8 },
286
+ instructions: { user: 4, app: 3, dna: 1, thread: 6 },
287
+ characterProfile: { user: 2, app: 2, dna: 1, thread: 2 },
288
+ placeholders: { user: 3, app: 3, dna: 1, thread: 4 }
289
+ },
290
+ depth: 2,
291
+ model: {
292
+ modelId: "deepseek/deepseek-v3.2",
293
+ inputPrice: 0.28,
294
+ outputPrice: 0.4,
295
+ hasTools: true,
296
+ canAnalyze: false,
297
+ reason: "Tribe needs thread context"
298
+ },
299
+ reasoning: ["Tribe preset"]
300
+ },
301
+ retro: {
302
+ join: {
303
+ memories: { user: 8, app: 2, dna: 1, thread: 5 },
304
+ instructions: { user: 6, app: 2, dna: 1, thread: 4 },
305
+ characterProfile: { user: 3, app: 1, dna: 0, thread: 2 },
306
+ placeholders: { user: 4, app: 2, dna: 1, thread: 3 }
307
+ },
308
+ depth: 1,
309
+ model: {
310
+ modelId: "anthropic/claude-sonnet-4-6",
311
+ inputPrice: 3,
312
+ outputPrice: 15,
313
+ hasTools: true,
314
+ canAnalyze: true,
315
+ reason: "Retro benefits from quality"
316
+ },
317
+ reasoning: ["Retro preset"]
318
+ },
319
+ background: {
320
+ join: {
321
+ memories: { user: 8, app: 5, dna: 3, thread: 6 },
322
+ instructions: { user: 5, app: 4, dna: 2, thread: 4 },
323
+ characterProfile: { user: 2, app: 2, dna: 1, thread: 2 },
324
+ placeholders: { user: 3, app: 3, dna: 2, thread: 3 }
325
+ },
326
+ depth: 2,
327
+ model: {
328
+ modelId: "deepseek/deepseek-v3.2",
329
+ inputPrice: 0.28,
330
+ outputPrice: 0.4,
331
+ hasTools: true,
332
+ canAnalyze: false,
333
+ reason: "Background job: more context"
334
+ },
335
+ reasoning: ["Background preset"]
336
+ },
337
+ free: {
338
+ join: {
339
+ memories: { user: 2, app: 1, dna: 0, thread: 2 },
340
+ instructions: { user: 1, app: 1, dna: 0, thread: 1 },
341
+ characterProfile: { user: 0, app: 0, dna: 0, thread: 0 },
342
+ placeholders: { user: 1, app: 1, dna: 0, thread: 1 }
343
+ },
344
+ depth: 0,
345
+ model: {
346
+ modelId: "nvidia/nemotron-3-super-120b-a12b:free",
347
+ inputPrice: 0,
348
+ outputPrice: 0,
349
+ hasTools: true,
350
+ canAnalyze: false,
351
+ reason: "Zero cost"
352
+ },
353
+ reasoning: ["Free preset"]
354
+ }
355
+ };
356
+ var sushiSwaps = {
357
+ "deepseek/deepseek-v3.2": "nvidia/nemotron-3-super-120b-a12b:free",
358
+ "deepseek/deepseek-r1": "qwen/qwen3.6-plus",
359
+ "minimax/minimax-m2.5": "qwen/qwen3.6-plus",
360
+ "minimax/minimax-m2.7": "qwen/qwen3.6-plus"
361
+ };
362
+ function swapModel(modelId, preferFree) {
363
+ if (preferFree) {
364
+ return {
365
+ modelId: "nvidia/nemotron-3-super-120b-a12b:free",
366
+ swapped: modelId !== "nvidia/nemotron-3-super-120b-a12b:free"
367
+ };
368
+ }
369
+ const swapped = sushiSwaps[modelId];
370
+ return swapped ? { modelId: swapped, swapped: true } : { modelId, swapped: false };
371
+ }
372
+ function optimizeChopStick(ctx) {
373
+ const reasoning = [];
374
+ let base = presets.balanced;
375
+ if (ctx.isAdmin || ctx.isSatoMode) {
376
+ base = presets.admin;
377
+ reasoning.push("Admin/Sato mode: maximum user context");
378
+ } else if (ctx.isBackgroundJob) {
379
+ base = presets.background;
380
+ } else if (ctx.hasRetro) {
381
+ base = presets.retro;
382
+ } else if (ctx.appType === "kanban" || ctx.hasKanban) {
383
+ base = presets.kanban;
384
+ } else if (ctx.appType === "tribe") {
385
+ base = presets.tribe;
386
+ }
387
+ if ((ctx.creditsLeft ?? 10) < 3) {
388
+ base = presets.free;
389
+ reasoning.push(`Low credits: ${ctx.creditsLeft}`);
390
+ }
391
+ let depth = base.depth;
392
+ if ((ctx.messageCount ?? 0) > 50) {
393
+ depth = 2;
394
+ reasoning.push(`Deep thread: ${ctx.messageCount}`);
395
+ }
396
+ const join = { ...base.join };
397
+ if (ctx.hasDNA) {
398
+ join.memories.dna = Math.min(5, join.memories.dna + 2);
399
+ join.instructions.dna = Math.min(3, join.instructions.dna + 1);
400
+ reasoning.push("DNA boost");
401
+ }
402
+ if (ctx.hasTimer) {
403
+ join.memories.app = Math.min(10, join.memories.app + 1);
404
+ reasoning.push("Timer boost");
405
+ }
406
+ let modelId = ctx.defaultModelId || base.model.modelId;
407
+ if (ctx.needsTools && !modelPricing[modelId]?.tools) {
408
+ modelId = "deepseek/deepseek-chat";
409
+ reasoning.push("Tool requirement");
410
+ }
411
+ if (ctx.needsAnalysis && !modelPricing[modelId]?.analyze) {
412
+ modelId = "anthropic/claude-sonnet-4-6";
413
+ reasoning.push("Analysis requirement");
414
+ }
415
+ if (ctx.allowsModelSwap) {
416
+ const swap = swapModel(
417
+ modelId,
418
+ ctx.preferFree || (ctx.creditsLeft ?? 10) < 5
419
+ );
420
+ if (swap.swapped) {
421
+ modelId = swap.modelId;
422
+ reasoning.push(`Sushi swap`);
423
+ }
424
+ }
425
+ const pricing = modelPricing[modelId];
426
+ return {
427
+ join,
428
+ depth,
429
+ model: {
430
+ modelId,
431
+ inputPrice: pricing?.input ?? 1,
432
+ outputPrice: pricing?.output ?? 2,
433
+ hasTools: pricing?.tools ?? true,
434
+ canAnalyze: pricing?.analyze ?? false,
435
+ reason: reasoning.join(", ") || "Default"
436
+ },
437
+ reasoning: [...base.reasoning, ...reasoning]
438
+ };
439
+ }
440
+ function buildStoreKnowledgeBase(ctx) {
441
+ const reasoning = [];
442
+ const mainConfig = optimizeChopStick({
443
+ appType: ctx.appType,
444
+ hasDNA: ctx.hasDNA,
445
+ hasTimer: ctx.hasTimer,
446
+ hasKanban: ctx.hasKanban,
447
+ messageCount: ctx.messageCount,
448
+ isBackgroundJob: ctx.isBackgroundJob
449
+ });
450
+ const contextConfig = optimizeChopStick({
451
+ appType: "default",
452
+ isBackgroundJob: true
453
+ // lighter
454
+ });
455
+ const apps = ctx.storeAppIds.map((id, index) => {
456
+ const isMain = id === ctx.mainAppId;
457
+ const config2 = isMain ? mainConfig : contextConfig;
458
+ const limits = isMain ? { memories: 15, instructions: 10, messages: 10 } : { memories: 5, instructions: 3, messages: 3 };
459
+ return {
460
+ app: {
461
+ id,
462
+ name: `App-${index + 1}`,
463
+ // Caller doldurur
464
+ slug: `app-${id.slice(0, 6)}`
465
+ },
466
+ context: {
467
+ join: config2.join,
468
+ depth: config2.depth,
469
+ isMainApp: isMain
470
+ },
471
+ limits
472
+ };
473
+ });
474
+ const mainApp = apps.find((a) => a.app.id === ctx.mainAppId) || apps[0];
475
+ const contextApps = apps.filter((a) => a.app.id !== ctx.mainAppId);
476
+ const estimatedTokens = apps.reduce((sum, app) => {
477
+ const memTokens = app.limits.memories * 100;
478
+ const instTokens = app.limits.instructions * 200;
479
+ const msgTokens = app.limits.messages * 150;
480
+ return sum + memTokens + instTokens + msgTokens;
481
+ }, 0);
482
+ if (ctx.hasDNA) reasoning.push("DNA context included");
483
+ if (ctx.hasTimer) reasoning.push("Timer context included");
484
+ if (ctx.hasKanban) reasoning.push("Kanban context included");
485
+ return {
486
+ apps,
487
+ mainApp,
488
+ contextApps,
489
+ estimatedTokens,
490
+ meta: {
491
+ totalApps: apps.length,
492
+ reasoning,
493
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
494
+ }
495
+ };
496
+ }
497
+ function getPreset(name) {
498
+ return presets[name] ?? presets.balanced;
499
+ }
500
+ function getJoinWeights(ctx) {
501
+ return optimizeChopStick(ctx).join;
502
+ }
503
+ function buildRamenPayload(base, ctx) {
504
+ const opt = optimizeChopStick(ctx);
505
+ const estimatedCost = 2 * (opt.model.inputPrice + opt.model.outputPrice);
506
+ return {
507
+ ...base,
508
+ join: opt.join,
509
+ depth: opt.depth,
510
+ _meta: {
511
+ modelId: opt.model.modelId,
512
+ estimatedCost: Math.round(estimatedCost * 1e3) / 1e3,
513
+ reasoning: opt.reasoning
514
+ }
515
+ };
516
+ }
517
+
122
518
  // src/index.ts
123
519
  dotenv.config();
124
520
  var TEST_GUEST_FINGERPRINTS = (process.env.TEST_GUEST_FINGERPRINTS?.split(",") || []).filter((fp) => fp);
@@ -230,6 +626,6 @@ var log = ({ page }) => {
230
626
  });
231
627
  };
232
628
 
233
- export { APIClient, TEST_GUEST_FINGERPRINTS, TEST_MEMBER_EMAILS, TEST_MEMBER_FINGERPRINTS, TEST_URL, VEX_LIVE_FINGERPRINT, VEX_LIVE_FINGERPRINTS, VEX_LIVE_FINGERPRINT_2, VEX_LIVE_FINGERPRINT_3, VEX_TEST_EMAIL, VEX_TEST_EMAIL_2, VEX_TEST_EMAIL_3, VEX_TEST_EMAIL_4, VEX_TEST_FINGERPRINT, VEX_TEST_FINGERPRINT_2, VEX_TEST_FINGERPRINT_3, VEX_TEST_FINGERPRINT_4, VEX_TEST_PASSWORD, VEX_TEST_PASSWORD_2, VEX_TEST_PASSWORD_3, VEX_TEST_PASSWORD_4, capitalizeFirstLetter, getModelCredits, getURL, isCI, log, scheduledJobFactory, simulateInputPaste, simulatePaste, storeApps, wait };
629
+ export { APIClient, TEST_GUEST_FINGERPRINTS, TEST_MEMBER_EMAILS, TEST_MEMBER_FINGERPRINTS, TEST_URL, VEX_LIVE_FINGERPRINT, VEX_LIVE_FINGERPRINTS, VEX_LIVE_FINGERPRINT_2, VEX_LIVE_FINGERPRINT_3, VEX_TEST_EMAIL, VEX_TEST_EMAIL_2, VEX_TEST_EMAIL_3, VEX_TEST_EMAIL_4, VEX_TEST_FINGERPRINT, VEX_TEST_FINGERPRINT_2, VEX_TEST_FINGERPRINT_3, VEX_TEST_FINGERPRINT_4, VEX_TEST_PASSWORD, VEX_TEST_PASSWORD_2, VEX_TEST_PASSWORD_3, VEX_TEST_PASSWORD_4, buildRamenPayload, buildStoreKnowledgeBase, capitalizeFirstLetter, getJoinWeights, getModelCredits, getPreset, getURL, isCI, log, modelPricing, optimizeChopStick, presets, scheduledJobFactory, simulateInputPaste, simulatePaste, storeApps, wait };
234
630
  //# sourceMappingURL=index.mjs.map
235
631
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/client.ts","../src/fixtures/api/scheduledJobs.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { type APIRequestContext, request } from \"@playwright/test\"\n\nexport class APIClient {\n private context: APIRequestContext | null = null\n private baseURL: string\n private token?: string\n\n constructor(baseURL: string) {\n this.baseURL = baseURL\n }\n\n async init() {\n this.context = await request.newContext({\n baseURL: this.baseURL,\n })\n }\n\n async authenticate(email: string, password: string) {\n if (!this.context) {\n throw new Error(\"Client not initialized. Call init() first.\")\n }\n\n const response = await this.context.post(\"/api/auth/signin/password\", {\n data: { email, password },\n })\n\n if (!response.ok()) {\n const error = await response.text()\n throw new Error(`Authentication failed: ${error}`)\n }\n\n const data = await response.json()\n this.token = data.token\n return data\n }\n\n async get(path: string, options?: { params?: Record<string, string> }) {\n if (!this.context) {\n throw new Error(\"Client not initialized. Call init() first.\")\n }\n\n return this.context.get(path, {\n headers: this.token ? { Authorization: `Bearer ${this.token}` } : {},\n params: options?.params,\n })\n }\n\n async post(path: string, data?: unknown) {\n if (!this.context) {\n throw new Error(\"Client not initialized. Call init() first.\")\n }\n\n return this.context.post(path, {\n data,\n headers: this.token\n ? {\n Authorization: `Bearer ${this.token}`,\n \"Content-Type\": \"application/json\",\n }\n : { \"Content-Type\": \"application/json\" },\n })\n }\n\n async patch(path: string, data: unknown) {\n if (!this.context) {\n throw new Error(\"Client not initialized. Call init() first.\")\n }\n\n return this.context.patch(path, {\n data,\n headers: this.token\n ? {\n Authorization: `Bearer ${this.token}`,\n \"Content-Type\": \"application/json\",\n }\n : { \"Content-Type\": \"application/json\" },\n })\n }\n\n async delete(path: string) {\n if (!this.context) {\n throw new Error(\"Client not initialized. Call init() first.\")\n }\n\n return this.context.delete(path, {\n headers: this.token ? { Authorization: `Bearer ${this.token}` } : {},\n })\n }\n\n async dispose() {\n if (this.context) {\n await this.context.dispose()\n this.context = null\n }\n }\n}\n","import { faker } from \"@faker-js/faker\"\n\n/**\n * Tribe Schedule Fixture\n * Matches tribeScheduleSchema from @chrryai/chrry/schemas/tribeScheduleSchema\n */\n\n// Alias for backward compatibility\nexport type ScheduledJob = TribeScheduleInput\n\nexport interface TribeScheduleInput {\n sessionId?: string\n appId?: string\n schedule: Array<{\n time: string\n postType: string\n model: string\n charLimit: number\n credits: number\n intervalMinutes?: number\n generateImage?: boolean\n generateVideo?: boolean\n fetchNews?: boolean\n }>\n frequency: \"once\" | \"daily\" | \"weekly\" | \"custom\"\n startDate: string // ISO date string\n endDate?: string // ISO date string\n contentTemplate?: string\n contentRules?: {\n tone?: string\n length?: string\n topics?: string[]\n hashtags?: string[]\n }\n totalCredits: number\n totalPrice: number\n timezone: string\n}\n\nexport const scheduledJobFactory = {\n build(overrides?: Partial<TribeScheduleInput>): TribeScheduleInput {\n const startDate = new Date()\n const endDate = new Date(startDate)\n endDate.setDate(endDate.getDate() + 7)\n\n return {\n // Required fields per tribeScheduleSchema\n frequency: \"daily\",\n schedule: [\n {\n time: \"09:00\",\n postType: \"post\",\n model: \"sushi\",\n charLimit: 500,\n credits: 10,\n intervalMinutes: 60,\n },\n ],\n timezone: \"Europe/Istanbul\",\n startDate: startDate.toISOString(),\n endDate: endDate.toISOString(),\n totalCredits: 10,\n totalPrice: 500, // Minimum €5 (500 cents)\n\n // Optional fields\n appId: undefined,\n contentTemplate: faker.lorem.paragraph(),\n contentRules: {\n tone: \"friendly\",\n length: \"medium\",\n topics: [\"tech\", \"ai\"],\n hashtags: [\"#test\"],\n },\n\n ...overrides,\n }\n },\n\n buildMany(\n count: number,\n overrides?: Partial<TribeScheduleInput>,\n ): TribeScheduleInput[] {\n return Array.from({ length: count }, () => this.build(overrides))\n },\n}\n","import type { Page } from \"@playwright/test\"\nimport * as dotenv from \"dotenv\"\n\ndotenv.config()\n\n// API Test Utilitiels\nexport { APIClient } from \"./api/client\"\nexport type { ScheduledJob } from \"./fixtures/api/scheduledJobs\"\nexport { scheduledJobFactory } from \"./fixtures/api/scheduledJobs\"\n\nexport type modelName = \"chatGPT\" | \"claude\" | \"gemini\" | \"sushi\" | \"perplexity\"\n\nexport const TEST_GUEST_FINGERPRINTS = (\n process.env.TEST_GUEST_FINGERPRINTS?.split(\",\") || []\n).filter((fp) => fp)\nexport const TEST_MEMBER_FINGERPRINTS = (\n process.env.TEST_MEMBER_FINGERPRINTS?.split(\",\") || []\n).filter((fp) => fp)\nexport const TEST_MEMBER_EMAILS = (\n process.env.TEST_MEMBER_EMAILS?.split(\",\") || []\n).filter((email) => email)\n\nexport const VEX_TEST_EMAIL = process.env.VEX_TEST_EMAIL!\n\nexport const VEX_TEST_PASSWORD = process.env.VEX_TEST_PASSWORD!\nexport const VEX_TEST_FINGERPRINT = TEST_MEMBER_FINGERPRINTS?.[0] || \"\"\nexport const VEX_TEST_EMAIL_2 = process.env.VEX_TEST_EMAIL_2!\nexport const VEX_TEST_PASSWORD_2 = process.env.VEX_TEST_PASSWORD_2!\nexport const VEX_TEST_FINGERPRINT_2 = TEST_MEMBER_FINGERPRINTS?.[1] || \"\"\nexport const VEX_TEST_EMAIL_3 = process.env.VEX_TEST_EMAIL_3!\nexport const VEX_TEST_PASSWORD_3 = process.env.VEX_TEST_PASSWORD_3!\nexport const VEX_TEST_PASSWORD_4 = process.env.VEX_TEST_PASSWORD_4!\n\nexport const VEX_TEST_EMAIL_4 = process.env.VEX_TEST_EMAIL_4!\n\nexport const VEX_TEST_FINGERPRINT_3 = TEST_MEMBER_FINGERPRINTS?.[2] || \"\"\nexport const VEX_TEST_FINGERPRINT_4 = TEST_MEMBER_FINGERPRINTS?.[3] || \"\"\n\nexport const VEX_LIVE_FINGERPRINTS = (\n process.env.VEX_LIVE_FINGERPRINTS?.split(\",\") || []\n).filter((fp) => fp)\n\nexport const VEX_LIVE_FINGERPRINT = VEX_LIVE_FINGERPRINTS[0] || \"\"\nexport const VEX_LIVE_FINGERPRINT_2 = VEX_LIVE_FINGERPRINTS[1] || \"\"\nexport const VEX_LIVE_FINGERPRINT_3 = VEX_LIVE_FINGERPRINTS[2] || \"\"\n\nexport const TEST_URL =\n process.env.TEST_URL! || process.env.PLAYWRIGHT_BASE_URL!\n\nexport const wait = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms))\nexport const isCI = process.env.VITE_CI || process.env.CI\n\nconst getURL = (\n {\n isLive = false,\n isMember = false,\n path = \"\",\n fingerprint = \"\",\n app = \"\",\n }: {\n isLive?: boolean\n isMember?: boolean\n path?: string\n fingerprint?: string\n app?: string\n } = {\n isLive: false,\n isMember: false,\n path: \"\",\n fingerprint: \"\",\n app: \"\",\n },\n) => {\n const base = TEST_URL\n const fp = isMember\n ? isLive\n ? VEX_LIVE_FINGERPRINT_2\n : fingerprint || TEST_MEMBER_FINGERPRINTS[0] || \"\"\n : isLive\n ? VEX_LIVE_FINGERPRINT\n : fingerprint || TEST_GUEST_FINGERPRINTS[0] || \"\"\n\n const appParam = app ? `&app=${app}` : \"\"\n const url = `${base}${path}?fp=${fp}${appParam}`\n\n return url\n}\n\nexport const getModelCredits = (model: string) =>\n model === \"chatGPT\" || model === \"gemini\"\n ? 4\n : model === \"claude\" || model === \"perplexity\"\n ? 3\n : 2\n\nexport const storeApps = [\n \"vex\",\n \"chrry\",\n \"atlas\",\n \"vault\",\n \"claude\",\n \"search\",\n \"sushi\",\n \"zarathustra\",\n \"popcorn\",\n]\n\nconst simulateInputPaste = async (page: Page, text: string) => {\n await page.evaluate((content) => {\n const textarea = document.querySelector(\n 'textarea[data-testid=\"chat-textarea\"]',\n ) as HTMLTextAreaElement\n if (!textarea) return\n\n // Create a basic event\n const pasteEvent = new Event(\"paste\", {\n bubbles: true,\n cancelable: true,\n })\n\n // Add clipboardData getter\n Object.defineProperty(pasteEvent, \"clipboardData\", {\n value: {\n getData: () => content,\n types: [\"text/plain\"],\n files: [],\n items: [\n {\n kind: \"string\",\n type: \"text/plain\",\n getAsString: (callback: (text: string) => void) =>\n callback(content),\n },\n ],\n },\n writable: false,\n })\n\n // Dispatch the event\n textarea.dispatchEvent(pasteEvent)\n\n // Set the value directly after the paste event\n textarea.value = content\n\n // Trigger input event to simulate actual typing\n const inputEvent = new Event(\"input\", { bubbles: true })\n textarea.dispatchEvent(inputEvent)\n }, text)\n}\n\nconst simulatePaste = async (page: Page, text: string) => {\n // Use Playwright's built-in clipboard API\n await page.evaluate(async (content) => {\n // Write to clipboard\n await navigator.clipboard.writeText(content)\n\n // Find the paste button and click it\n const pasteButton = document.querySelector(\n '[data-testid*=\"artifacts-paste-button\"]',\n ) as HTMLButtonElement\n if (pasteButton) {\n pasteButton.click()\n }\n }, text)\n}\n\nfunction capitalizeFirstLetter(val: string) {\n return String(val).charAt(0).toUpperCase() + String(val).slice(1)\n}\n\nconst logs = new Map<string, number>() // msg → timestamp\nexport const log = ({ page }: { page: Page }) => {\n page.on(\"console\", (msg) => {\n const now = Date.now()\n const lastSeen = logs.get(msg.text())\n\n // Only skip if seen within last 5 seconds\n if (lastSeen && now - lastSeen < 5000) return\n\n msg.type() !== \"warning\" &&\n !msg.text().includes(\"token\") &&\n !msg.text().includes(\"fp\") &&\n console.log(`[browser][${msg.type()}] ${msg.text()}`)\n logs.set(msg.text(), now)\n })\n}\n\nexport { capitalizeFirstLetter, getURL, simulateInputPaste, simulatePaste }\n"]}
1
+ {"version":3,"sources":["../src/api/client.ts","../src/fixtures/api/scheduledJobs.ts","../src/agent/chopstickExpert.ts","../src/index.ts"],"names":["config"],"mappings":";;;;;AAEO,IAAM,YAAN,MAAgB;AAAA,EACb,OAAA,GAAoC,IAAA;AAAA,EACpC,OAAA;AAAA,EACA,KAAA;AAAA,EAER,YAAY,OAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,MAAM,IAAA,GAAO;AACX,IAAA,IAAA,CAAK,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW;AAAA,MACtC,SAAS,IAAA,CAAK;AAAA,KACf,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,YAAA,CAAa,KAAA,EAAe,QAAA,EAAkB;AAClD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,2BAAA,EAA6B;AAAA,MACpE,IAAA,EAAM,EAAE,KAAA,EAAO,QAAA;AAAS,KACzB,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAG,EAAG;AAClB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAK,CAAA,CAAE,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,GAAA,CAAI,IAAA,EAAc,OAAA,EAA+C;AACrE,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM;AAAA,MAC5B,OAAA,EAAS,IAAA,CAAK,KAAA,GAAQ,EAAE,aAAA,EAAe,UAAU,IAAA,CAAK,KAAK,CAAA,CAAA,EAAG,GAAI,EAAC;AAAA,MACnE,QAAQ,OAAA,EAAS;AAAA,KAClB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,IAAA,CAAK,IAAA,EAAc,IAAA,EAAgB;AACvC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM;AAAA,MAC7B,IAAA;AAAA,MACA,OAAA,EAAS,KAAK,KAAA,GACV;AAAA,QACE,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,QACnC,cAAA,EAAgB;AAAA,OAClB,GACA,EAAE,cAAA,EAAgB,kBAAA;AAAmB,KAC1C,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAAc,IAAA,EAAe;AACvC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM;AAAA,MAC9B,IAAA;AAAA,MACA,OAAA,EAAS,KAAK,KAAA,GACV;AAAA,QACE,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,QACnC,cAAA,EAAgB;AAAA,OAClB,GACA,EAAE,cAAA,EAAgB,kBAAA;AAAmB,KAC1C,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,IAAA,EAAc;AACzB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM;AAAA,MAC/B,OAAA,EAAS,IAAA,CAAK,KAAA,GAAQ,EAAE,aAAA,EAAe,UAAU,IAAA,CAAK,KAAK,CAAA,CAAA,EAAG,GAAI;AAAC,KACpE,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,GAAU;AACd,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAC3B,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAAA,EACF;AACF;ACxDO,IAAM,mBAAA,GAAsB;AAAA,EACjC,MAAM,SAAA,EAA6D;AACjE,IAAA,MAAM,SAAA,uBAAgB,IAAA,EAAK;AAC3B,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,SAAS,CAAA;AAClC,IAAA,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAQ,GAAI,CAAC,CAAA;AAErC,IAAA,OAAO;AAAA;AAAA,MAEL,SAAA,EAAW,OAAA;AAAA,MACX,QAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,MAAA;AAAA,UACV,KAAA,EAAO,OAAA;AAAA,UACP,SAAA,EAAW,GAAA;AAAA,UACX,OAAA,EAAS,EAAA;AAAA,UACT,eAAA,EAAiB;AAAA;AACnB,OACF;AAAA,MACA,QAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,UAAU,WAAA,EAAY;AAAA,MACjC,OAAA,EAAS,QAAQ,WAAA,EAAY;AAAA,MAC7B,YAAA,EAAc,EAAA;AAAA,MACd,UAAA,EAAY,GAAA;AAAA;AAAA;AAAA,MAGZ,KAAA,EAAO,MAAA;AAAA,MACP,eAAA,EAAiB,KAAA,CAAM,KAAA,CAAM,SAAA,EAAU;AAAA,MACvC,YAAA,EAAc;AAAA,QACZ,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ,CAAC,MAAA,EAAQ,IAAI,CAAA;AAAA,QACrB,QAAA,EAAU,CAAC,OAAO;AAAA,OACpB;AAAA,MAEA,GAAG;AAAA,KACL;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,CACE,OACA,SAAA,EACsB;AACtB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,IAAS,MAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,EAClE;AACF;;;ACpDO,IAAM,YAAA,GAAe;AAAA,EAC1B,wBAAA,EAA0B;AAAA,IACxB,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,6BAAA,EAA+B;AAAA,IAC7B,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,+BAAA,EAAiC;AAAA,IAC/B,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,iCAAA,EAAmC;AAAA,IACjC,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,mBAAA,EAAqB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,EAC3E,sBAAA,EAAwB;AAAA,IACtB,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,oBAAA,EAAsB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,CAAA,EAAK,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,EAC5E,sBAAA,EAAwB;AAAA,IACtB,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,iBAAA,EAAmB,EAAE,KAAA,EAAO,CAAA,EAAK,QAAQ,CAAA,EAAK,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM;AAAA,EAC3E,0BAAA,EAA4B;AAAA,IAC1B,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,wCAAA,EAA0C;AAAA,IACxC,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,EAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,EACjE,aAAA,EAAe,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,EACtE,gBAAA,EAAkB,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,EAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,IAAA;AACtE;AAuJO,IAAM,OAAA,GAA6C;AAAA,EACxD,OAAA,EAAS;AAAA,IACP,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MAC/C,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACnD,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACvD,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE,KACrD;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,wCAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAa,CAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,SAAA,EAAW,CAAC,gBAAgB;AAAA,GAC9B;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MAC/C,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACnD,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACvD,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE,KACrD;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,wBAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,IAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,SAAA,EAAW,CAAC,iBAAiB;AAAA,GAC/B;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MAC/C,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACnD,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACvD,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE,KACrD;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,wBAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,GAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,SAAA,EAAW,CAAC,aAAa;AAAA,GAC3B;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,EAAE,IAAA,EAAM,EAAA,EAAI,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MAChD,YAAA,EAAc,EAAE,IAAA,EAAM,EAAA,EAAI,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACpD,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACvD,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE,KACrD;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,6BAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAa,EAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,SAAA,EAAW,CAAC,mCAAmC;AAAA,GACjD;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MAC/C,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACnD,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACvD,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE,KACrD;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,wBAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,IAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,SAAA,EAAW,CAAC,eAAe;AAAA,GAC7B;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MAC/C,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACnD,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACvD,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE,KACrD;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,wBAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,GAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,SAAA,EAAW,CAAC,cAAc;AAAA,GAC5B;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MAC/C,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACnD,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACvD,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE,KACrD;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,6BAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAa,EAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,SAAA,EAAW,CAAC,cAAc;AAAA,GAC5B;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MAC/C,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACnD,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACvD,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE,KACrD;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,wBAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,GAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,SAAA,EAAW,CAAC,mBAAmB;AAAA,GACjC;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MAC/C,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACnD,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,MACvD,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE,KACrD;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,wCAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAa,CAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,SAAA,EAAW,CAAC,aAAa;AAAA;AAE7B;AAQA,IAAM,UAAA,GAAqC;AAAA,EACzC,wBAAA,EAA0B,wCAAA;AAAA,EAC1B,sBAAA,EAAwB,mBAAA;AAAA,EACxB,sBAAA,EAAwB,mBAAA;AAAA,EACxB,sBAAA,EAAwB;AAC1B,CAAA;AAEA,SAAS,SAAA,CACP,SACA,UAAA,EACuC;AACvC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,wCAAA;AAAA,MACT,SAAS,OAAA,KAAY;AAAA,KACvB;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,WAAW,OAAO,CAAA;AAClC,EAAA,OAAO,OAAA,GACH,EAAE,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,MAAK,GAClC,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM;AAChC;AAMO,SAAS,kBAAkB,GAAA,EAA0C;AAC1E,EAAA,MAAM,YAAsB,EAAC;AAG7B,EAAA,IAAI,OAA0B,OAAA,CAAQ,QAAA;AAGtC,EAAA,IAAI,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,UAAA,EAAY;AACjC,IAAA,IAAA,GAAO,OAAA,CAAQ,KAAA;AACf,IAAA,SAAA,CAAU,KAAK,uCAAuC,CAAA;AAAA,EACxD,CAAA,MAAA,IAAW,IAAI,eAAA,EAAiB;AAC9B,IAAA,IAAA,GAAO,OAAA,CAAQ,UAAA;AAAA,EACjB,CAAA,MAAA,IAAW,IAAI,QAAA,EAAU;AACvB,IAAA,IAAA,GAAO,OAAA,CAAQ,KAAA;AAAA,EACjB,CAAA,MAAA,IAAW,GAAA,CAAI,OAAA,KAAY,QAAA,IAAY,IAAI,SAAA,EAAW;AACpD,IAAA,IAAA,GAAO,OAAA,CAAQ,MAAA;AAAA,EACjB,CAAA,MAAA,IAAW,GAAA,CAAI,OAAA,KAAY,OAAA,EAAS;AAClC,IAAA,IAAA,GAAO,OAAA,CAAQ,KAAA;AAAA,EACjB;AAGA,EAAA,IAAA,CAAK,GAAA,CAAI,WAAA,IAAe,EAAA,IAAM,CAAA,EAAG;AAC/B,IAAA,IAAA,GAAO,OAAA,CAAQ,IAAA;AACf,IAAA,SAAA,CAAU,IAAA,CAAK,CAAA,aAAA,EAAgB,GAAA,CAAI,WAAW,CAAA,CAAE,CAAA;AAAA,EAClD;AAGA,EAAA,IAAI,QAAQ,IAAA,CAAK,KAAA;AACjB,EAAA,IAAA,CAAK,GAAA,CAAI,YAAA,IAAgB,CAAA,IAAK,EAAA,EAAI;AAChC,IAAA,KAAA,GAAQ,CAAA;AACR,IAAA,SAAA,CAAU,IAAA,CAAK,CAAA,aAAA,EAAgB,GAAA,CAAI,YAAY,CAAA,CAAE,CAAA;AAAA,EACnD;AAGA,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,IAAA,EAAK;AAC5B,EAAA,IAAI,IAAI,MAAA,EAAQ;AACd,IAAA,IAAA,CAAK,QAAA,CAAS,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AACrD,IAAA,IAAA,CAAK,YAAA,CAAa,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AAC7D,IAAA,SAAA,CAAU,KAAK,WAAW,CAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,IAAI,QAAA,EAAU;AAChB,IAAA,IAAA,CAAK,QAAA,CAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AACtD,IAAA,SAAA,CAAU,KAAK,aAAa,CAAA;AAAA,EAC9B;AAGA,EAAA,IAAI,OAAA,GAAU,GAAA,CAAI,cAAA,IAAkB,IAAA,CAAK,KAAA,CAAM,OAAA;AAE/C,EAAA,IAAI,IAAI,UAAA,IAAc,CAAC,YAAA,CAAa,OAAkB,GAAG,KAAA,EAAO;AAC9D,IAAA,OAAA,GAAU,wBAAA;AACV,IAAA,SAAA,CAAU,KAAK,kBAAkB,CAAA;AAAA,EACnC;AAEA,EAAA,IAAI,IAAI,aAAA,IAAiB,CAAC,YAAA,CAAa,OAAkB,GAAG,OAAA,EAAS;AACnE,IAAA,OAAA,GAAU,6BAAA;AACV,IAAA,SAAA,CAAU,KAAK,sBAAsB,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,IAAI,eAAA,EAAiB;AACvB,IAAA,MAAM,IAAA,GAAO,SAAA;AAAA,MACX,OAAA;AAAA,MACA,GAAA,CAAI,UAAA,IAAA,CAAe,GAAA,CAAI,WAAA,IAAe,EAAA,IAAM;AAAA,KAC9C;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,OAAA,GAAU,IAAA,CAAK,OAAA;AACf,MAAA,SAAA,CAAU,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,aAAa,OAAkB,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAA,EAAY,SAAS,KAAA,IAAS,CAAA;AAAA,MAC9B,WAAA,EAAa,SAAS,MAAA,IAAU,CAAA;AAAA,MAChC,QAAA,EAAU,SAAS,KAAA,IAAS,IAAA;AAAA,MAC5B,UAAA,EAAY,SAAS,OAAA,IAAW,KAAA;AAAA,MAChC,MAAA,EAAQ,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK;AAAA,KAClC;AAAA,IACA,WAAW,CAAC,GAAG,IAAA,CAAK,SAAA,EAAW,GAAG,SAAS;AAAA,GAC7C;AACF;AAsBO,SAAS,wBAAwB,GAAA,EASjB;AACrB,EAAA,MAAM,YAAsB,EAAC;AAG7B,EAAA,MAAM,aAAa,iBAAA,CAAkB;AAAA,IACnC,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,cAAc,GAAA,CAAI,YAAA;AAAA,IAClB,iBAAiB,GAAA,CAAI;AAAA,GACtB,CAAA;AAGD,EAAA,MAAM,gBAAgB,iBAAA,CAAkB;AAAA,IACtC,OAAA,EAAS,SAAA;AAAA,IACT,eAAA,EAAiB;AAAA;AAAA,GAClB,CAAA;AAGD,EAAA,MAAM,OAA4B,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAC,IAAI,KAAA,KAAU;AACnE,IAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,SAAA;AAC1B,IAAA,MAAMA,OAAAA,GAAS,SAAS,UAAA,GAAa,aAAA;AAGrC,IAAA,MAAM,SAAS,MAAA,GACX,EAAE,QAAA,EAAU,EAAA,EAAI,cAAc,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG,GAC/C,EAAE,QAAA,EAAU,CAAA,EAAG,YAAA,EAAc,CAAA,EAAG,UAAU,CAAA,EAAE;AAEhD,IAAA,OAAO;AAAA,MACL,GAAA,EAAK;AAAA,QACH,EAAA;AAAA,QACA,IAAA,EAAM,CAAA,IAAA,EAAO,KAAA,GAAQ,CAAC,CAAA,CAAA;AAAA;AAAA,QACtB,MAAM,CAAA,IAAA,EAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,OAC7B;AAAA,MACA,OAAA,EAAS;AAAA,QACP,MAAMA,OAAAA,CAAO,IAAA;AAAA,QACb,OAAOA,OAAAA,CAAO,KAAA;AAAA,QACd,SAAA,EAAW;AAAA,OACb;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,EAAA,KAAO,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA;AACtE,EAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,GAAA,CAAI,EAAA,KAAO,GAAA,CAAI,SAAS,CAAA;AAGjE,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ;AAChD,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,GAAA;AACxC,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,CAAO,YAAA,GAAe,GAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,GAAA;AACxC,IAAA,OAAO,GAAA,GAAM,YAAY,UAAA,GAAa,SAAA;AAAA,EACxC,GAAG,CAAC,CAAA;AAEJ,EAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,SAAA,CAAU,IAAA,CAAK,sBAAsB,CAAA;AACrD,EAAA,IAAI,GAAA,CAAI,QAAA,EAAU,SAAA,CAAU,IAAA,CAAK,wBAAwB,CAAA;AACzD,EAAA,IAAI,GAAA,CAAI,SAAA,EAAW,SAAA,CAAU,IAAA,CAAK,yBAAyB,CAAA;AAE3D,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,WAAW,IAAA,CAAK,MAAA;AAAA,MAChB,SAAA;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY;AACpC,GACF;AACF;AAOO,SAAS,UAAU,IAAA,EAAqC;AAC7D,EAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,IAAK,OAAA,CAAQ,QAAA;AAClC;AAGO,SAAS,eAAe,GAAA,EAAoC;AACjE,EAAA,OAAO,iBAAA,CAAkB,GAAG,CAAA,CAAE,IAAA;AAChC;AAGO,SAAS,iBAAA,CACd,MACA,GAAA,EAGA;AACA,EAAA,MAAM,GAAA,GAAM,kBAAkB,GAAG,CAAA;AACjC,EAAA,MAAM,gBAAgB,CAAA,IAAK,GAAA,CAAI,KAAA,CAAM,UAAA,GAAa,IAAI,KAAA,CAAM,WAAA,CAAA;AAE5D,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,IAAI,KAAA,CAAM,OAAA;AAAA,MACnB,aAAA,EAAe,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,GAAI,CAAA,GAAI,GAAA;AAAA,MAClD,WAAW,GAAA,CAAI;AAAA;AACjB,GACF;AACF;;;ACrqBO,MAAA,CAAA,MAAA,EAAO;AASP,IAAM,uBAAA,GAAA,CACX,OAAA,CAAQ,GAAA,CAAI,uBAAA,EAAyB,KAAA,CAAM,GAAG,CAAA,IAAK,EAAC,EACpD,MAAA,CAAO,CAAC,EAAA,KAAO,EAAE;AACZ,IAAM,wBAAA,GAAA,CACX,OAAA,CAAQ,GAAA,CAAI,wBAAA,EAA0B,KAAA,CAAM,GAAG,CAAA,IAAK,EAAC,EACrD,MAAA,CAAO,CAAC,EAAA,KAAO,EAAE;AACZ,IAAM,kBAAA,GAAA,CACX,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,KAAA,CAAM,GAAG,CAAA,IAAK,EAAC,EAC/C,MAAA,CAAO,CAAC,KAAA,KAAU,KAAK;AAElB,IAAM,cAAA,GAAiB,QAAQ,GAAA,CAAI;AAEnC,IAAM,iBAAA,GAAoB,QAAQ,GAAA,CAAI;AACtC,IAAM,oBAAA,GAAuB,wBAAA,GAA2B,CAAC,CAAA,IAAK;AAC9D,IAAM,gBAAA,GAAmB,QAAQ,GAAA,CAAI;AACrC,IAAM,mBAAA,GAAsB,QAAQ,GAAA,CAAI;AACxC,IAAM,sBAAA,GAAyB,wBAAA,GAA2B,CAAC,CAAA,IAAK;AAChE,IAAM,gBAAA,GAAmB,QAAQ,GAAA,CAAI;AACrC,IAAM,mBAAA,GAAsB,QAAQ,GAAA,CAAI;AACxC,IAAM,mBAAA,GAAsB,QAAQ,GAAA,CAAI;AAExC,IAAM,gBAAA,GAAmB,QAAQ,GAAA,CAAI;AAErC,IAAM,sBAAA,GAAyB,wBAAA,GAA2B,CAAC,CAAA,IAAK;AAChE,IAAM,sBAAA,GAAyB,wBAAA,GAA2B,CAAC,CAAA,IAAK;AAEhE,IAAM,qBAAA,GAAA,CACX,OAAA,CAAQ,GAAA,CAAI,qBAAA,EAAuB,KAAA,CAAM,GAAG,CAAA,IAAK,EAAC,EAClD,MAAA,CAAO,CAAC,EAAA,KAAO,EAAE;AAEZ,IAAM,oBAAA,GAAuB,qBAAA,CAAsB,CAAC,CAAA,IAAK;AACzD,IAAM,sBAAA,GAAyB,qBAAA,CAAsB,CAAC,CAAA,IAAK;AAC3D,IAAM,sBAAA,GAAyB,qBAAA,CAAsB,CAAC,CAAA,IAAK;AAE3D,IAAM,QAAA,GACX,OAAA,CAAQ,GAAA,CAAI,QAAA,IAAa,QAAQ,GAAA,CAAI;AAEhC,IAAM,IAAA,GAAO,CAAC,EAAA,KACnB,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC;AAC3C,IAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,OAAA,IAAW,QAAQ,GAAA,CAAI;AAEvD,IAAM,SAAS,CACb;AAAA,EACE,MAAA,GAAS,KAAA;AAAA,EACT,QAAA,GAAW,KAAA;AAAA,EACX,IAAA,GAAO,EAAA;AAAA,EACP,WAAA,GAAc,EAAA;AAAA,EACd,GAAA,GAAM;AACR,CAAA,GAMI;AAAA,EACF,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU,KAAA;AAAA,EACV,IAAA,EAAM,EAAA;AAAA,EACN,WAAA,EAAa,EAAA;AAAA,EACb,GAAA,EAAK;AACP,CAAA,KACG;AACH,EAAA,MAAM,IAAA,GAAO,QAAA;AACb,EAAA,MAAM,EAAA,GAAK,QAAA,GACP,MAAA,GACE,sBAAA,GACA,eAAe,wBAAA,CAAyB,CAAC,CAAA,IAAK,EAAA,GAChD,MAAA,GACE,oBAAA,GACA,WAAA,IAAe,uBAAA,CAAwB,CAAC,CAAA,IAAK,EAAA;AAEnD,EAAA,MAAM,QAAA,GAAW,GAAA,GAAM,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,GAAK,EAAA;AACvC,EAAA,MAAM,GAAA,GAAM,GAAG,IAAI,CAAA,EAAG,IAAI,CAAA,IAAA,EAAO,EAAE,GAAG,QAAQ,CAAA,CAAA;AAE9C,EAAA,OAAO,GAAA;AACT;AAEO,IAAM,eAAA,GAAkB,CAAC,KAAA,KAC9B,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,QAAA,GAC7B,CAAA,GACA,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,YAAA,GAC9B,CAAA,GACA;AAED,IAAM,SAAA,GAAY;AAAA,EACvB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF;AAEA,IAAM,kBAAA,GAAqB,OAAO,IAAA,EAAY,IAAA,KAAiB;AAC7D,EAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,OAAA,KAAY;AAC/B,IAAA,MAAM,WAAW,QAAA,CAAS,aAAA;AAAA,MACxB;AAAA,KACF;AACA,IAAA,IAAI,CAAC,QAAA,EAAU;AAGf,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAM,OAAA,EAAS;AAAA,MACpC,OAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACb,CAAA;AAGD,IAAA,MAAA,CAAO,cAAA,CAAe,YAAY,eAAA,EAAiB;AAAA,MACjD,KAAA,EAAO;AAAA,QACL,SAAS,MAAM,OAAA;AAAA,QACf,KAAA,EAAO,CAAC,YAAY,CAAA;AAAA,QACpB,OAAO,EAAC;AAAA,QACR,KAAA,EAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,YAAA;AAAA,YACN,WAAA,EAAa,CAAC,QAAA,KACZ,QAAA,CAAS,OAAO;AAAA;AACpB;AACF,OACF;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,QAAA,CAAS,cAAc,UAAU,CAAA;AAGjC,IAAA,QAAA,CAAS,KAAA,GAAQ,OAAA;AAGjB,IAAA,MAAM,aAAa,IAAI,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,MAAM,CAAA;AACvD,IAAA,QAAA,CAAS,cAAc,UAAU,CAAA;AAAA,EACnC,GAAG,IAAI,CAAA;AACT;AAEA,IAAM,aAAA,GAAgB,OAAO,IAAA,EAAY,IAAA,KAAiB;AAExD,EAAA,MAAM,IAAA,CAAK,QAAA,CAAS,OAAO,OAAA,KAAY;AAErC,IAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA;AAG3C,IAAA,MAAM,cAAc,QAAA,CAAS,aAAA;AAAA,MAC3B;AAAA,KACF;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,CAAY,KAAA,EAAM;AAAA,IACpB;AAAA,EACF,GAAG,IAAI,CAAA;AACT;AAEA,SAAS,sBAAsB,GAAA,EAAa;AAC1C,EAAA,OAAO,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AAClE;AAEA,IAAM,IAAA,uBAAW,GAAA,EAAoB;AAC9B,IAAM,GAAA,GAAM,CAAC,EAAE,IAAA,EAAK,KAAsB;AAC/C,EAAA,IAAA,CAAK,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,KAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AAGpC,IAAA,IAAI,QAAA,IAAY,GAAA,GAAM,QAAA,GAAW,GAAA,EAAM;AAEvC,IAAA,GAAA,CAAI,IAAA,EAAK,KAAM,SAAA,IACb,CAAC,GAAA,CAAI,IAAA,EAAK,CAAE,QAAA,CAAS,OAAO,CAAA,IAC5B,CAAC,GAAA,CAAI,IAAA,EAAK,CAAE,QAAA,CAAS,IAAI,CAAA,IACzB,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,GAAA,CAAI,IAAA,EAAM,CAAA,EAAA,EAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,CAAA;AACtD,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,EAAK,EAAG,GAAG,CAAA;AAAA,EAC1B,CAAC,CAAA;AACH","file":"index.mjs","sourcesContent":["import { type APIRequestContext, request } from \"@playwright/test\"\n\nexport class APIClient {\n private context: APIRequestContext | null = null\n private baseURL: string\n private token?: string\n\n constructor(baseURL: string) {\n this.baseURL = baseURL\n }\n\n async init() {\n this.context = await request.newContext({\n baseURL: this.baseURL,\n })\n }\n\n async authenticate(email: string, password: string) {\n if (!this.context) {\n throw new Error(\"Client not initialized. Call init() first.\")\n }\n\n const response = await this.context.post(\"/api/auth/signin/password\", {\n data: { email, password },\n })\n\n if (!response.ok()) {\n const error = await response.text()\n throw new Error(`Authentication failed: ${error}`)\n }\n\n const data = await response.json()\n this.token = data.token\n return data\n }\n\n async get(path: string, options?: { params?: Record<string, string> }) {\n if (!this.context) {\n throw new Error(\"Client not initialized. Call init() first.\")\n }\n\n return this.context.get(path, {\n headers: this.token ? { Authorization: `Bearer ${this.token}` } : {},\n params: options?.params,\n })\n }\n\n async post(path: string, data?: unknown) {\n if (!this.context) {\n throw new Error(\"Client not initialized. Call init() first.\")\n }\n\n return this.context.post(path, {\n data,\n headers: this.token\n ? {\n Authorization: `Bearer ${this.token}`,\n \"Content-Type\": \"application/json\",\n }\n : { \"Content-Type\": \"application/json\" },\n })\n }\n\n async patch(path: string, data: unknown) {\n if (!this.context) {\n throw new Error(\"Client not initialized. Call init() first.\")\n }\n\n return this.context.patch(path, {\n data,\n headers: this.token\n ? {\n Authorization: `Bearer ${this.token}`,\n \"Content-Type\": \"application/json\",\n }\n : { \"Content-Type\": \"application/json\" },\n })\n }\n\n async delete(path: string) {\n if (!this.context) {\n throw new Error(\"Client not initialized. Call init() first.\")\n }\n\n return this.context.delete(path, {\n headers: this.token ? { Authorization: `Bearer ${this.token}` } : {},\n })\n }\n\n async dispose() {\n if (this.context) {\n await this.context.dispose()\n this.context = null\n }\n }\n}\n","import { faker } from \"@faker-js/faker\"\n\n/**\n * Tribe Schedule Fixture\n * Matches tribeScheduleSchema from @chrryai/chrry/schemas/tribeScheduleSchema\n */\n\n// Alias for backward compatibility\nexport type ScheduledJob = TribeScheduleInput\n\nexport interface TribeScheduleInput {\n sessionId?: string\n appId?: string\n schedule: Array<{\n time: string\n postType: string\n model: string\n charLimit: number\n credits: number\n intervalMinutes?: number\n generateImage?: boolean\n generateVideo?: boolean\n fetchNews?: boolean\n }>\n frequency: \"once\" | \"daily\" | \"weekly\" | \"custom\"\n startDate: string // ISO date string\n endDate?: string // ISO date string\n contentTemplate?: string\n contentRules?: {\n tone?: string\n length?: string\n topics?: string[]\n hashtags?: string[]\n }\n totalCredits: number\n totalPrice: number\n timezone: string\n}\n\nexport const scheduledJobFactory = {\n build(overrides?: Partial<TribeScheduleInput>): TribeScheduleInput {\n const startDate = new Date()\n const endDate = new Date(startDate)\n endDate.setDate(endDate.getDate() + 7)\n\n return {\n // Required fields per tribeScheduleSchema\n frequency: \"daily\",\n schedule: [\n {\n time: \"09:00\",\n postType: \"post\",\n model: \"sushi\",\n charLimit: 500,\n credits: 10,\n intervalMinutes: 60,\n },\n ],\n timezone: \"Europe/Istanbul\",\n startDate: startDate.toISOString(),\n endDate: endDate.toISOString(),\n totalCredits: 10,\n totalPrice: 500, // Minimum €5 (500 cents)\n\n // Optional fields\n appId: undefined,\n contentTemplate: faker.lorem.paragraph(),\n contentRules: {\n tone: \"friendly\",\n length: \"medium\",\n topics: [\"tech\", \"ai\"],\n hashtags: [\"#test\"],\n },\n\n ...overrides,\n }\n },\n\n buildMany(\n count: number,\n overrides?: Partial<TribeScheduleInput>,\n ): TribeScheduleInput[] {\n return Array.from({ length: count }, () => this.build(overrides))\n },\n}\n","/**\n * ChopStick Expert - Payload Optimizer\n *\n * Senkron, deterministik payload optimizasyonu.\n * JSON çıktı - AI her şeyi görsün.\n */\n\n// ramen tipi - chopStick payload'i için\ntype JoinConfig = {\n memories?: { user?: number; app?: number; dna?: number; thread?: number }\n instructions?: { user?: number; app?: number; dna?: number; thread?: number }\n characterProfile?: {\n user?: number\n app?: number\n dna?: number\n thread?: number\n }\n placeholders?: { user?: number; app?: number; dna?: number; thread?: number }\n}\n\ntype Ramen = {\n id?: string\n slug?: string\n join?: JoinConfig\n depth?: number\n [key: string]: any\n}\n\n// =============================================================================\n// MODEL PRICING & CAPABILITIES\n// =============================================================================\n\nexport const modelPricing = {\n \"deepseek/deepseek-v3.2\": {\n input: 0.28,\n output: 0.4,\n tools: true,\n analyze: false,\n },\n \"deepseek/deepseek-chat\": {\n input: 0.15,\n output: 0.45,\n tools: true,\n analyze: false,\n },\n \"anthropic/claude-sonnet-4-6\": {\n input: 3.0,\n output: 15.0,\n tools: true,\n analyze: true,\n },\n \"google/gemini-3.1-pro-preview\": {\n input: 0.35,\n output: 1.05,\n tools: true,\n analyze: true,\n },\n \"deepseek/deepseek-v3.2-thinking\": {\n input: 0.28,\n output: 0.4,\n tools: true,\n analyze: false,\n },\n \"qwen/qwen3.6-plus\": { input: 0.3, output: 0.8, tools: true, analyze: true },\n \"minimax/minimax-m2.5\": {\n input: 0.3,\n output: 1.1,\n tools: true,\n analyze: false,\n },\n \"minimax/minimax-m2.7\": {\n input: 0.3,\n output: 1.2,\n tools: true,\n analyze: false,\n },\n \"x-ai/grok-4.1-fast\": { input: 0.5, output: 2.0, tools: true, analyze: true },\n \"perplexity/sonar-pro\": {\n input: 2.0,\n output: 8.0,\n tools: false,\n analyze: false,\n },\n \"openrouter/free\": { input: 0.0, output: 0.0, tools: false, analyze: false },\n \"openai/gpt-oss-120b:free\": {\n input: 0.0,\n output: 0.073,\n tools: false,\n analyze: true,\n },\n \"nvidia/nemotron-3-super-120b-a12b:free\": {\n input: 0.0,\n output: 0.0,\n tools: true,\n analyze: false,\n },\n \"gpt-4o\": { input: 2.5, output: 10.0, tools: true, analyze: true },\n \"gpt-4o-mini\": { input: 0.15, output: 0.6, tools: true, analyze: true },\n \"openai/gpt-5.4\": { input: 2.5, output: 15.0, tools: true, analyze: true },\n} as const\n\nexport type ModelId = keyof typeof modelPricing\n\nexport interface ModelInfo {\n modelId: string\n inputPrice: number\n outputPrice: number\n hasTools: boolean\n canAnalyze: boolean\n reason: string\n}\n\n// =============================================================================\n// JOIN WEIGHTS\n// =============================================================================\n\nexport interface JoinWeights {\n memories: { user: number; app: number; dna: number; thread: number }\n instructions: { user: number; app: number; dna: number; thread: number }\n characterProfile: { user: number; app: number; dna: number; thread: number }\n placeholders: { user: number; app: number; dna: number; thread: number }\n}\n\nexport interface ChopStickDecision {\n join: JoinWeights\n depth: number\n model: ModelInfo\n reasoning: string[]\n}\n\n// =============================================================================\n// STORE APPS KNOWLEDGE BASE - JSON OUTPUT\n// =============================================================================\n\nexport interface StoreAppKnowledge {\n /** App temel bilgileri */\n app: {\n id: string\n name: string\n slug: string\n description?: string\n systemPrompt?: string\n }\n /** Context configuration */\n context: {\n join: JoinWeights\n depth: number\n isMainApp: boolean\n }\n /** Ne kadar data çekilecek */\n limits: {\n memories: number\n instructions: number\n messages: number\n }\n}\n\nexport interface StoreKnowledgeBase {\n /** Tüm store apps */\n apps: StoreAppKnowledge[]\n /** Ana app (mevcut request) */\n mainApp: StoreAppKnowledge\n /** Diğer apps (context için) */\n contextApps: StoreAppKnowledge[]\n /** Toplam context boyutu tahmini */\n estimatedTokens: number\n /** Configuration metadata */\n meta: {\n totalApps: number\n reasoning: string[]\n timestamp: string\n }\n /** DNA Artifacts for context */\n artifacts?: Array<{\n id: string\n content: string\n type: string\n createdAt: string\n }>\n /** DNA Memories for context */\n memories?: Array<{\n id: string\n content: string\n type: string\n createdAt: string\n }>\n /** Current task info */\n task?: {\n id: string\n title: string\n description?: string\n status: string\n }\n /** Task messages/work history */\n messages?: {\n messages: Array<{\n id: string\n content: string\n role: string\n createdAt: string\n mood?: {\n type: string\n }\n }>\n }\n}\n\n// =============================================================================\n// CONTEXT INPUT\n// =============================================================================\n\nexport interface ChopStickContext {\n appType?:\n | \"chat\"\n | \"tribe\"\n | \"kanban\"\n | \"retro\"\n | \"swarm\"\n | \"focus\"\n | \"default\"\n messageCount?: number\n hasTimer?: boolean\n hasDNA?: boolean\n hasKanban?: boolean\n hasRetro?: boolean\n memoriesCount?: number\n instructionsCount?: number\n isBackgroundJob?: boolean\n\n // Admin/Sato mode\n isAdmin?: boolean\n isSatoMode?: boolean\n\n // Model selection\n defaultModelId?: string\n allowsModelSwap?: boolean\n needsTools?: boolean\n needsAnalysis?: boolean\n preferFree?: boolean\n creditsLeft?: number\n\n // Store apps\n storeAppIds?: string[]\n mainAppId?: string\n}\n\n// =============================================================================\n// PRESETS\n// =============================================================================\n\nexport const presets: Record<string, ChopStickDecision> = {\n minimal: {\n join: {\n memories: { user: 1, app: 1, dna: 0, thread: 1 },\n instructions: { user: 1, app: 1, dna: 0, thread: 1 },\n characterProfile: { user: 0, app: 0, dna: 0, thread: 0 },\n placeholders: { user: 1, app: 1, dna: 0, thread: 1 },\n },\n depth: 0,\n model: {\n modelId: \"nvidia/nemotron-3-super-120b-a12b:free\",\n inputPrice: 0,\n outputPrice: 0,\n hasTools: true,\n canAnalyze: false,\n reason: \"Free model, minimal context\",\n },\n reasoning: [\"Minimal preset\"],\n },\n\n balanced: {\n join: {\n memories: { user: 3, app: 2, dna: 1, thread: 3 },\n instructions: { user: 2, app: 2, dna: 1, thread: 2 },\n characterProfile: { user: 1, app: 1, dna: 0, thread: 1 },\n placeholders: { user: 2, app: 2, dna: 1, thread: 2 },\n },\n depth: 1,\n model: {\n modelId: \"deepseek/deepseek-chat\",\n inputPrice: 0.15,\n outputPrice: 0.45,\n hasTools: true,\n canAnalyze: false,\n reason: \"Balanced cost/performance\",\n },\n reasoning: [\"Balanced preset\"],\n },\n\n rich: {\n join: {\n memories: { user: 8, app: 5, dna: 3, thread: 6 },\n instructions: { user: 5, app: 4, dna: 2, thread: 4 },\n characterProfile: { user: 2, app: 2, dna: 1, thread: 2 },\n placeholders: { user: 3, app: 3, dna: 2, thread: 3 },\n },\n depth: 2,\n model: {\n modelId: \"deepseek/deepseek-v3.2\",\n inputPrice: 0.28,\n outputPrice: 0.4,\n hasTools: true,\n canAnalyze: false,\n reason: \"Rich context\",\n },\n reasoning: [\"Rich preset\"],\n },\n\n /** Admin/Sato mode - maximum user context */\n admin: {\n join: {\n memories: { user: 15, app: 5, dna: 3, thread: 8 },\n instructions: { user: 10, app: 4, dna: 2, thread: 5 },\n characterProfile: { user: 3, app: 2, dna: 1, thread: 2 },\n placeholders: { user: 5, app: 3, dna: 2, thread: 4 },\n },\n depth: 2,\n model: {\n modelId: \"anthropic/claude-sonnet-4-6\",\n inputPrice: 3.0,\n outputPrice: 15.0,\n hasTools: true,\n canAnalyze: true,\n reason: \"Admin mode: maximum context for Sato reports\",\n },\n reasoning: [\"Admin preset: Sato mode activated\"],\n },\n\n kanban: {\n join: {\n memories: { user: 4, app: 6, dna: 2, thread: 3 },\n instructions: { user: 3, app: 6, dna: 1, thread: 3 },\n characterProfile: { user: 1, app: 2, dna: 1, thread: 1 },\n placeholders: { user: 2, app: 4, dna: 1, thread: 2 },\n },\n depth: 1,\n model: {\n modelId: \"deepseek/deepseek-chat\",\n inputPrice: 0.15,\n outputPrice: 0.45,\n hasTools: true,\n canAnalyze: false,\n reason: \"Kanban needs tools\",\n },\n reasoning: [\"Kanban preset\"],\n },\n\n tribe: {\n join: {\n memories: { user: 5, app: 3, dna: 2, thread: 8 },\n instructions: { user: 4, app: 3, dna: 1, thread: 6 },\n characterProfile: { user: 2, app: 2, dna: 1, thread: 2 },\n placeholders: { user: 3, app: 3, dna: 1, thread: 4 },\n },\n depth: 2,\n model: {\n modelId: \"deepseek/deepseek-v3.2\",\n inputPrice: 0.28,\n outputPrice: 0.4,\n hasTools: true,\n canAnalyze: false,\n reason: \"Tribe needs thread context\",\n },\n reasoning: [\"Tribe preset\"],\n },\n\n retro: {\n join: {\n memories: { user: 8, app: 2, dna: 1, thread: 5 },\n instructions: { user: 6, app: 2, dna: 1, thread: 4 },\n characterProfile: { user: 3, app: 1, dna: 0, thread: 2 },\n placeholders: { user: 4, app: 2, dna: 1, thread: 3 },\n },\n depth: 1,\n model: {\n modelId: \"anthropic/claude-sonnet-4-6\",\n inputPrice: 3.0,\n outputPrice: 15.0,\n hasTools: true,\n canAnalyze: true,\n reason: \"Retro benefits from quality\",\n },\n reasoning: [\"Retro preset\"],\n },\n\n background: {\n join: {\n memories: { user: 8, app: 5, dna: 3, thread: 6 },\n instructions: { user: 5, app: 4, dna: 2, thread: 4 },\n characterProfile: { user: 2, app: 2, dna: 1, thread: 2 },\n placeholders: { user: 3, app: 3, dna: 2, thread: 3 },\n },\n depth: 2,\n model: {\n modelId: \"deepseek/deepseek-v3.2\",\n inputPrice: 0.28,\n outputPrice: 0.4,\n hasTools: true,\n canAnalyze: false,\n reason: \"Background job: more context\",\n },\n reasoning: [\"Background preset\"],\n },\n\n free: {\n join: {\n memories: { user: 2, app: 1, dna: 0, thread: 2 },\n instructions: { user: 1, app: 1, dna: 0, thread: 1 },\n characterProfile: { user: 0, app: 0, dna: 0, thread: 0 },\n placeholders: { user: 1, app: 1, dna: 0, thread: 1 },\n },\n depth: 0,\n model: {\n modelId: \"nvidia/nemotron-3-super-120b-a12b:free\",\n inputPrice: 0,\n outputPrice: 0,\n hasTools: true,\n canAnalyze: false,\n reason: \"Zero cost\",\n },\n reasoning: [\"Free preset\"],\n },\n}\n\nexport type PresetName = keyof typeof presets\n\n// =============================================================================\n// MODEL SWAP\n// =============================================================================\n\nconst sushiSwaps: Record<string, string> = {\n \"deepseek/deepseek-v3.2\": \"nvidia/nemotron-3-super-120b-a12b:free\",\n \"deepseek/deepseek-r1\": \"qwen/qwen3.6-plus\",\n \"minimax/minimax-m2.5\": \"qwen/qwen3.6-plus\",\n \"minimax/minimax-m2.7\": \"qwen/qwen3.6-plus\",\n}\n\nfunction swapModel(\n modelId: string,\n preferFree: boolean,\n): { modelId: string; swapped: boolean } {\n if (preferFree) {\n return {\n modelId: \"nvidia/nemotron-3-super-120b-a12b:free\",\n swapped: modelId !== \"nvidia/nemotron-3-super-120b-a12b:free\",\n }\n }\n const swapped = sushiSwaps[modelId]\n return swapped\n ? { modelId: swapped, swapped: true }\n : { modelId, swapped: false }\n}\n\n// =============================================================================\n// OPTIMIZE - Main Function\n// =============================================================================\n\nexport function optimizeChopStick(ctx: ChopStickContext): ChopStickDecision {\n const reasoning: string[] = []\n\n // 1. Base preset seç - default balanced\n let base: ChopStickDecision = presets.balanced!\n\n // Admin/Sato mode öncelikli\n if (ctx.isAdmin || ctx.isSatoMode) {\n base = presets.admin!\n reasoning.push(\"Admin/Sato mode: maximum user context\")\n } else if (ctx.isBackgroundJob) {\n base = presets.background!\n } else if (ctx.hasRetro) {\n base = presets.retro!\n } else if (ctx.appType === \"kanban\" || ctx.hasKanban) {\n base = presets.kanban!\n } else if (ctx.appType === \"tribe\") {\n base = presets.tribe!\n }\n\n // 2. Düşük kredi = free\n if ((ctx.creditsLeft ?? 10) < 3) {\n base = presets.free!\n reasoning.push(`Low credits: ${ctx.creditsLeft}`)\n }\n\n // 3. Derin thread\n let depth = base.depth\n if ((ctx.messageCount ?? 0) > 50) {\n depth = 2\n reasoning.push(`Deep thread: ${ctx.messageCount}`)\n }\n\n // 4. DNA boost\n const join = { ...base.join }\n if (ctx.hasDNA) {\n join.memories.dna = Math.min(5, join.memories.dna + 2)\n join.instructions.dna = Math.min(3, join.instructions.dna + 1)\n reasoning.push(\"DNA boost\")\n }\n\n // 5. Timer boost\n if (ctx.hasTimer) {\n join.memories.app = Math.min(10, join.memories.app + 1)\n reasoning.push(\"Timer boost\")\n }\n\n // 6. Model seçimi\n let modelId = ctx.defaultModelId || base.model.modelId\n\n if (ctx.needsTools && !modelPricing[modelId as ModelId]?.tools) {\n modelId = \"deepseek/deepseek-chat\"\n reasoning.push(\"Tool requirement\")\n }\n\n if (ctx.needsAnalysis && !modelPricing[modelId as ModelId]?.analyze) {\n modelId = \"anthropic/claude-sonnet-4-6\"\n reasoning.push(\"Analysis requirement\")\n }\n\n if (ctx.allowsModelSwap) {\n const swap = swapModel(\n modelId,\n ctx.preferFree || (ctx.creditsLeft ?? 10) < 5,\n )\n if (swap.swapped) {\n modelId = swap.modelId\n reasoning.push(`Sushi swap`)\n }\n }\n\n const pricing = modelPricing[modelId as ModelId]\n\n return {\n join,\n depth,\n model: {\n modelId,\n inputPrice: pricing?.input ?? 1,\n outputPrice: pricing?.output ?? 2,\n hasTools: pricing?.tools ?? true,\n canAnalyze: pricing?.analyze ?? false,\n reason: reasoning.join(\", \") || \"Default\",\n },\n reasoning: [...base.reasoning, ...reasoning],\n }\n}\n\n// =============================================================================\n// STORE KNOWLEDGE BASE BUILDER - JSON OUTPUT\n// =============================================================================\n\n/**\n * Store apps için knowledge base oluştur - JSON output\n *\n * @example\n * ```ts\n * const kb = buildStoreKnowledgeBase({\n * mainAppId: \"app-123\",\n * storeAppIds: [\"app-123\", \"app-456\", \"app-789\"],\n * appType: \"kanban\",\n * hasDNA: true,\n * })\n *\n * // Direkt JSON olarak kullan\n * return Response.json(kb)\n * ```\n */\nexport function buildStoreKnowledgeBase(ctx: {\n mainAppId: string\n storeAppIds: string[]\n appType?: ChopStickContext[\"appType\"]\n hasDNA?: boolean\n hasTimer?: boolean\n hasKanban?: boolean\n messageCount?: number\n isBackgroundJob?: boolean\n}): StoreKnowledgeBase {\n const reasoning: string[] = []\n\n // Main app için zengin context\n const mainConfig = optimizeChopStick({\n appType: ctx.appType,\n hasDNA: ctx.hasDNA,\n hasTimer: ctx.hasTimer,\n hasKanban: ctx.hasKanban,\n messageCount: ctx.messageCount,\n isBackgroundJob: ctx.isBackgroundJob,\n })\n\n // Context apps için lighter context\n const contextConfig = optimizeChopStick({\n appType: \"default\",\n isBackgroundJob: true, // lighter\n })\n\n // Build apps array\n const apps: StoreAppKnowledge[] = ctx.storeAppIds.map((id, index) => {\n const isMain = id === ctx.mainAppId\n const config = isMain ? mainConfig : contextConfig\n\n // Her app için limitler\n const limits = isMain\n ? { memories: 15, instructions: 10, messages: 10 }\n : { memories: 5, instructions: 3, messages: 3 }\n\n return {\n app: {\n id,\n name: `App-${index + 1}`, // Caller doldurur\n slug: `app-${id.slice(0, 6)}`,\n },\n context: {\n join: config.join,\n depth: config.depth,\n isMainApp: isMain,\n },\n limits,\n }\n })\n\n const mainApp = apps.find((a) => a.app.id === ctx.mainAppId) || apps[0]!\n const contextApps = apps.filter((a) => a.app.id !== ctx.mainAppId)\n\n // Token estimate (rough)\n const estimatedTokens = apps.reduce((sum, app) => {\n const memTokens = app.limits.memories * 100\n const instTokens = app.limits.instructions * 200\n const msgTokens = app.limits.messages * 150\n return sum + memTokens + instTokens + msgTokens\n }, 0)\n\n if (ctx.hasDNA) reasoning.push(\"DNA context included\")\n if (ctx.hasTimer) reasoning.push(\"Timer context included\")\n if (ctx.hasKanban) reasoning.push(\"Kanban context included\")\n\n return {\n apps,\n mainApp,\n contextApps,\n estimatedTokens,\n meta: {\n totalApps: apps.length,\n reasoning,\n timestamp: new Date().toISOString(),\n },\n }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Preset al */\nexport function getPreset(name: PresetName): ChopStickDecision {\n return presets[name] ?? presets.balanced!\n}\n\n/** Sadece join weights */\nexport function getJoinWeights(ctx: ChopStickContext): JoinWeights {\n return optimizeChopStick(ctx).join\n}\n\n/** Ramen payload builder */\nexport function buildRamenPayload(\n base: Omit<Ramen, \"join\" | \"depth\">,\n ctx: ChopStickContext,\n): Ramen & {\n _meta: { modelId: string; estimatedCost: number; reasoning: string[] }\n} {\n const opt = optimizeChopStick(ctx)\n const estimatedCost = 2 * (opt.model.inputPrice + opt.model.outputPrice) // ~2k tokens\n\n return {\n ...base,\n join: opt.join,\n depth: opt.depth,\n _meta: {\n modelId: opt.model.modelId,\n estimatedCost: Math.round(estimatedCost * 1000) / 1000,\n reasoning: opt.reasoning,\n },\n }\n}\n","import type { Page } from \"@playwright/test\"\nimport * as dotenv from \"dotenv\"\n\ndotenv.config()\n\n// API Test Utilitiels\nexport { APIClient } from \"./api/client\"\nexport type { ScheduledJob } from \"./fixtures/api/scheduledJobs\"\nexport { scheduledJobFactory } from \"./fixtures/api/scheduledJobs\"\n\nexport type modelName = \"chatGPT\" | \"claude\" | \"gemini\" | \"sushi\" | \"perplexity\"\n\nexport const TEST_GUEST_FINGERPRINTS = (\n process.env.TEST_GUEST_FINGERPRINTS?.split(\",\") || []\n).filter((fp) => fp)\nexport const TEST_MEMBER_FINGERPRINTS = (\n process.env.TEST_MEMBER_FINGERPRINTS?.split(\",\") || []\n).filter((fp) => fp)\nexport const TEST_MEMBER_EMAILS = (\n process.env.TEST_MEMBER_EMAILS?.split(\",\") || []\n).filter((email) => email)\n\nexport const VEX_TEST_EMAIL = process.env.VEX_TEST_EMAIL!\n\nexport const VEX_TEST_PASSWORD = process.env.VEX_TEST_PASSWORD!\nexport const VEX_TEST_FINGERPRINT = TEST_MEMBER_FINGERPRINTS?.[0] || \"\"\nexport const VEX_TEST_EMAIL_2 = process.env.VEX_TEST_EMAIL_2!\nexport const VEX_TEST_PASSWORD_2 = process.env.VEX_TEST_PASSWORD_2!\nexport const VEX_TEST_FINGERPRINT_2 = TEST_MEMBER_FINGERPRINTS?.[1] || \"\"\nexport const VEX_TEST_EMAIL_3 = process.env.VEX_TEST_EMAIL_3!\nexport const VEX_TEST_PASSWORD_3 = process.env.VEX_TEST_PASSWORD_3!\nexport const VEX_TEST_PASSWORD_4 = process.env.VEX_TEST_PASSWORD_4!\n\nexport const VEX_TEST_EMAIL_4 = process.env.VEX_TEST_EMAIL_4!\n\nexport const VEX_TEST_FINGERPRINT_3 = TEST_MEMBER_FINGERPRINTS?.[2] || \"\"\nexport const VEX_TEST_FINGERPRINT_4 = TEST_MEMBER_FINGERPRINTS?.[3] || \"\"\n\nexport const VEX_LIVE_FINGERPRINTS = (\n process.env.VEX_LIVE_FINGERPRINTS?.split(\",\") || []\n).filter((fp) => fp)\n\nexport const VEX_LIVE_FINGERPRINT = VEX_LIVE_FINGERPRINTS[0] || \"\"\nexport const VEX_LIVE_FINGERPRINT_2 = VEX_LIVE_FINGERPRINTS[1] || \"\"\nexport const VEX_LIVE_FINGERPRINT_3 = VEX_LIVE_FINGERPRINTS[2] || \"\"\n\nexport const TEST_URL =\n process.env.TEST_URL! || process.env.PLAYWRIGHT_BASE_URL!\n\nexport const wait = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms))\nexport const isCI = process.env.VITE_CI || process.env.CI\n\nconst getURL = (\n {\n isLive = false,\n isMember = false,\n path = \"\",\n fingerprint = \"\",\n app = \"\",\n }: {\n isLive?: boolean\n isMember?: boolean\n path?: string\n fingerprint?: string\n app?: string\n } = {\n isLive: false,\n isMember: false,\n path: \"\",\n fingerprint: \"\",\n app: \"\",\n },\n) => {\n const base = TEST_URL\n const fp = isMember\n ? isLive\n ? VEX_LIVE_FINGERPRINT_2\n : fingerprint || TEST_MEMBER_FINGERPRINTS[0] || \"\"\n : isLive\n ? VEX_LIVE_FINGERPRINT\n : fingerprint || TEST_GUEST_FINGERPRINTS[0] || \"\"\n\n const appParam = app ? `&app=${app}` : \"\"\n const url = `${base}${path}?fp=${fp}${appParam}`\n\n return url\n}\n\nexport const getModelCredits = (model: string) =>\n model === \"chatGPT\" || model === \"gemini\"\n ? 4\n : model === \"claude\" || model === \"perplexity\"\n ? 3\n : 2\n\nexport const storeApps = [\n \"vex\",\n \"chrry\",\n \"atlas\",\n \"vault\",\n \"claude\",\n \"search\",\n \"sushi\",\n \"zarathustra\",\n \"popcorn\",\n]\n\nconst simulateInputPaste = async (page: Page, text: string) => {\n await page.evaluate((content) => {\n const textarea = document.querySelector(\n 'textarea[data-testid=\"chat-textarea\"]',\n ) as HTMLTextAreaElement\n if (!textarea) return\n\n // Create a basic event\n const pasteEvent = new Event(\"paste\", {\n bubbles: true,\n cancelable: true,\n })\n\n // Add clipboardData getter\n Object.defineProperty(pasteEvent, \"clipboardData\", {\n value: {\n getData: () => content,\n types: [\"text/plain\"],\n files: [],\n items: [\n {\n kind: \"string\",\n type: \"text/plain\",\n getAsString: (callback: (text: string) => void) =>\n callback(content),\n },\n ],\n },\n writable: false,\n })\n\n // Dispatch the event\n textarea.dispatchEvent(pasteEvent)\n\n // Set the value directly after the paste event\n textarea.value = content\n\n // Trigger input event to simulate actual typing\n const inputEvent = new Event(\"input\", { bubbles: true })\n textarea.dispatchEvent(inputEvent)\n }, text)\n}\n\nconst simulatePaste = async (page: Page, text: string) => {\n // Use Playwright's built-in clipboard API\n await page.evaluate(async (content) => {\n // Write to clipboard\n await navigator.clipboard.writeText(content)\n\n // Find the paste button and click it\n const pasteButton = document.querySelector(\n '[data-testid*=\"artifacts-paste-button\"]',\n ) as HTMLButtonElement\n if (pasteButton) {\n pasteButton.click()\n }\n }, text)\n}\n\nfunction capitalizeFirstLetter(val: string) {\n return String(val).charAt(0).toUpperCase() + String(val).slice(1)\n}\n\nconst logs = new Map<string, number>() // msg → timestamp\nexport const log = ({ page }: { page: Page }) => {\n page.on(\"console\", (msg) => {\n const now = Date.now()\n const lastSeen = logs.get(msg.text())\n\n // Only skip if seen within last 5 seconds\n if (lastSeen && now - lastSeen < 5000) return\n\n msg.type() !== \"warning\" &&\n !msg.text().includes(\"token\") &&\n !msg.text().includes(\"fp\") &&\n console.log(`[browser][${msg.type()}] ${msg.text()}`)\n logs.set(msg.text(), now)\n })\n}\n\n// 🤖 ChopStick Expert - Payload & Model Optimizer\nexport {\n buildRamenPayload,\n buildStoreKnowledgeBase,\n type ChopStickContext,\n type ChopStickDecision,\n getJoinWeights,\n getPreset,\n type JoinWeights,\n type ModelInfo,\n modelPricing,\n optimizeChopStick,\n type PresetName,\n presets,\n type StoreAppKnowledge,\n type StoreKnowledgeBase,\n} from \"./agent/chopstickExpert\"\n\nexport { capitalizeFirstLetter, getURL, simulateInputPaste, simulatePaste }\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrryai/waffles",
3
- "version": "2.4.40",
3
+ "version": "2.4.42",
4
4
  "description": "Production-ready Playwright testing utilities and helpers for modern web apps",
5
5
  "keywords": [
6
6
  "automation",
@@ -58,9 +58,11 @@
58
58
  "dependencies": {
59
59
  "@chrryai/machine": "workspace:*",
60
60
  "@faker-js/faker": "^9.3.0",
61
+ "@openrouter/ai-sdk-provider": "^2.3.3",
61
62
  "@playwright/test": "^1.49.1",
62
63
  "@types/node": "^22.18.12",
63
64
  "@types/react": "^19.1.12",
65
+ "ai": "^6.0.134",
64
66
  "dotenv": "^17.3.1",
65
67
  "effect": "^3.0.0",
66
68
  "uuid": "^13.0.0"