@chrryai/waffles 2.4.41 → 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.js CHANGED
@@ -141,6 +141,402 @@ var scheduledJobFactory = {
141
141
  }
142
142
  };
143
143
 
144
+ // src/agent/chopstickExpert.ts
145
+ var modelPricing = {
146
+ "deepseek/deepseek-v3.2": {
147
+ input: 0.28,
148
+ output: 0.4,
149
+ tools: true,
150
+ analyze: false
151
+ },
152
+ "deepseek/deepseek-chat": {
153
+ input: 0.15,
154
+ output: 0.45,
155
+ tools: true,
156
+ analyze: false
157
+ },
158
+ "anthropic/claude-sonnet-4-6": {
159
+ input: 3,
160
+ output: 15,
161
+ tools: true,
162
+ analyze: true
163
+ },
164
+ "google/gemini-3.1-pro-preview": {
165
+ input: 0.35,
166
+ output: 1.05,
167
+ tools: true,
168
+ analyze: true
169
+ },
170
+ "deepseek/deepseek-v3.2-thinking": {
171
+ input: 0.28,
172
+ output: 0.4,
173
+ tools: true,
174
+ analyze: false
175
+ },
176
+ "qwen/qwen3.6-plus": { input: 0.3, output: 0.8, tools: true, analyze: true },
177
+ "minimax/minimax-m2.5": {
178
+ input: 0.3,
179
+ output: 1.1,
180
+ tools: true,
181
+ analyze: false
182
+ },
183
+ "minimax/minimax-m2.7": {
184
+ input: 0.3,
185
+ output: 1.2,
186
+ tools: true,
187
+ analyze: false
188
+ },
189
+ "x-ai/grok-4.1-fast": { input: 0.5, output: 2, tools: true, analyze: true },
190
+ "perplexity/sonar-pro": {
191
+ input: 2,
192
+ output: 8,
193
+ tools: false,
194
+ analyze: false
195
+ },
196
+ "openrouter/free": { input: 0, output: 0, tools: false, analyze: false },
197
+ "openai/gpt-oss-120b:free": {
198
+ input: 0,
199
+ output: 0.073,
200
+ tools: false,
201
+ analyze: true
202
+ },
203
+ "nvidia/nemotron-3-super-120b-a12b:free": {
204
+ input: 0,
205
+ output: 0,
206
+ tools: true,
207
+ analyze: false
208
+ },
209
+ "gpt-4o": { input: 2.5, output: 10, tools: true, analyze: true },
210
+ "gpt-4o-mini": { input: 0.15, output: 0.6, tools: true, analyze: true },
211
+ "openai/gpt-5.4": { input: 2.5, output: 15, tools: true, analyze: true }
212
+ };
213
+ var presets = {
214
+ minimal: {
215
+ join: {
216
+ memories: { user: 1, app: 1, dna: 0, thread: 1 },
217
+ instructions: { user: 1, app: 1, dna: 0, thread: 1 },
218
+ characterProfile: { user: 0, app: 0, dna: 0, thread: 0 },
219
+ placeholders: { user: 1, app: 1, dna: 0, thread: 1 }
220
+ },
221
+ depth: 0,
222
+ model: {
223
+ modelId: "nvidia/nemotron-3-super-120b-a12b:free",
224
+ inputPrice: 0,
225
+ outputPrice: 0,
226
+ hasTools: true,
227
+ canAnalyze: false,
228
+ reason: "Free model, minimal context"
229
+ },
230
+ reasoning: ["Minimal preset"]
231
+ },
232
+ balanced: {
233
+ join: {
234
+ memories: { user: 3, app: 2, dna: 1, thread: 3 },
235
+ instructions: { user: 2, app: 2, dna: 1, thread: 2 },
236
+ characterProfile: { user: 1, app: 1, dna: 0, thread: 1 },
237
+ placeholders: { user: 2, app: 2, dna: 1, thread: 2 }
238
+ },
239
+ depth: 1,
240
+ model: {
241
+ modelId: "deepseek/deepseek-chat",
242
+ inputPrice: 0.15,
243
+ outputPrice: 0.45,
244
+ hasTools: true,
245
+ canAnalyze: false,
246
+ reason: "Balanced cost/performance"
247
+ },
248
+ reasoning: ["Balanced preset"]
249
+ },
250
+ rich: {
251
+ join: {
252
+ memories: { user: 8, app: 5, dna: 3, thread: 6 },
253
+ instructions: { user: 5, app: 4, dna: 2, thread: 4 },
254
+ characterProfile: { user: 2, app: 2, dna: 1, thread: 2 },
255
+ placeholders: { user: 3, app: 3, dna: 2, thread: 3 }
256
+ },
257
+ depth: 2,
258
+ model: {
259
+ modelId: "deepseek/deepseek-v3.2",
260
+ inputPrice: 0.28,
261
+ outputPrice: 0.4,
262
+ hasTools: true,
263
+ canAnalyze: false,
264
+ reason: "Rich context"
265
+ },
266
+ reasoning: ["Rich preset"]
267
+ },
268
+ /** Admin/Sato mode - maximum user context */
269
+ admin: {
270
+ join: {
271
+ memories: { user: 15, app: 5, dna: 3, thread: 8 },
272
+ instructions: { user: 10, app: 4, dna: 2, thread: 5 },
273
+ characterProfile: { user: 3, app: 2, dna: 1, thread: 2 },
274
+ placeholders: { user: 5, app: 3, dna: 2, thread: 4 }
275
+ },
276
+ depth: 2,
277
+ model: {
278
+ modelId: "anthropic/claude-sonnet-4-6",
279
+ inputPrice: 3,
280
+ outputPrice: 15,
281
+ hasTools: true,
282
+ canAnalyze: true,
283
+ reason: "Admin mode: maximum context for Sato reports"
284
+ },
285
+ reasoning: ["Admin preset: Sato mode activated"]
286
+ },
287
+ kanban: {
288
+ join: {
289
+ memories: { user: 4, app: 6, dna: 2, thread: 3 },
290
+ instructions: { user: 3, app: 6, dna: 1, thread: 3 },
291
+ characterProfile: { user: 1, app: 2, dna: 1, thread: 1 },
292
+ placeholders: { user: 2, app: 4, dna: 1, thread: 2 }
293
+ },
294
+ depth: 1,
295
+ model: {
296
+ modelId: "deepseek/deepseek-chat",
297
+ inputPrice: 0.15,
298
+ outputPrice: 0.45,
299
+ hasTools: true,
300
+ canAnalyze: false,
301
+ reason: "Kanban needs tools"
302
+ },
303
+ reasoning: ["Kanban preset"]
304
+ },
305
+ tribe: {
306
+ join: {
307
+ memories: { user: 5, app: 3, dna: 2, thread: 8 },
308
+ instructions: { user: 4, app: 3, dna: 1, thread: 6 },
309
+ characterProfile: { user: 2, app: 2, dna: 1, thread: 2 },
310
+ placeholders: { user: 3, app: 3, dna: 1, thread: 4 }
311
+ },
312
+ depth: 2,
313
+ model: {
314
+ modelId: "deepseek/deepseek-v3.2",
315
+ inputPrice: 0.28,
316
+ outputPrice: 0.4,
317
+ hasTools: true,
318
+ canAnalyze: false,
319
+ reason: "Tribe needs thread context"
320
+ },
321
+ reasoning: ["Tribe preset"]
322
+ },
323
+ retro: {
324
+ join: {
325
+ memories: { user: 8, app: 2, dna: 1, thread: 5 },
326
+ instructions: { user: 6, app: 2, dna: 1, thread: 4 },
327
+ characterProfile: { user: 3, app: 1, dna: 0, thread: 2 },
328
+ placeholders: { user: 4, app: 2, dna: 1, thread: 3 }
329
+ },
330
+ depth: 1,
331
+ model: {
332
+ modelId: "anthropic/claude-sonnet-4-6",
333
+ inputPrice: 3,
334
+ outputPrice: 15,
335
+ hasTools: true,
336
+ canAnalyze: true,
337
+ reason: "Retro benefits from quality"
338
+ },
339
+ reasoning: ["Retro preset"]
340
+ },
341
+ background: {
342
+ join: {
343
+ memories: { user: 8, app: 5, dna: 3, thread: 6 },
344
+ instructions: { user: 5, app: 4, dna: 2, thread: 4 },
345
+ characterProfile: { user: 2, app: 2, dna: 1, thread: 2 },
346
+ placeholders: { user: 3, app: 3, dna: 2, thread: 3 }
347
+ },
348
+ depth: 2,
349
+ model: {
350
+ modelId: "deepseek/deepseek-v3.2",
351
+ inputPrice: 0.28,
352
+ outputPrice: 0.4,
353
+ hasTools: true,
354
+ canAnalyze: false,
355
+ reason: "Background job: more context"
356
+ },
357
+ reasoning: ["Background preset"]
358
+ },
359
+ free: {
360
+ join: {
361
+ memories: { user: 2, app: 1, dna: 0, thread: 2 },
362
+ instructions: { user: 1, app: 1, dna: 0, thread: 1 },
363
+ characterProfile: { user: 0, app: 0, dna: 0, thread: 0 },
364
+ placeholders: { user: 1, app: 1, dna: 0, thread: 1 }
365
+ },
366
+ depth: 0,
367
+ model: {
368
+ modelId: "nvidia/nemotron-3-super-120b-a12b:free",
369
+ inputPrice: 0,
370
+ outputPrice: 0,
371
+ hasTools: true,
372
+ canAnalyze: false,
373
+ reason: "Zero cost"
374
+ },
375
+ reasoning: ["Free preset"]
376
+ }
377
+ };
378
+ var sushiSwaps = {
379
+ "deepseek/deepseek-v3.2": "nvidia/nemotron-3-super-120b-a12b:free",
380
+ "deepseek/deepseek-r1": "qwen/qwen3.6-plus",
381
+ "minimax/minimax-m2.5": "qwen/qwen3.6-plus",
382
+ "minimax/minimax-m2.7": "qwen/qwen3.6-plus"
383
+ };
384
+ function swapModel(modelId, preferFree) {
385
+ if (preferFree) {
386
+ return {
387
+ modelId: "nvidia/nemotron-3-super-120b-a12b:free",
388
+ swapped: modelId !== "nvidia/nemotron-3-super-120b-a12b:free"
389
+ };
390
+ }
391
+ const swapped = sushiSwaps[modelId];
392
+ return swapped ? { modelId: swapped, swapped: true } : { modelId, swapped: false };
393
+ }
394
+ function optimizeChopStick(ctx) {
395
+ const reasoning = [];
396
+ let base = presets.balanced;
397
+ if (ctx.isAdmin || ctx.isSatoMode) {
398
+ base = presets.admin;
399
+ reasoning.push("Admin/Sato mode: maximum user context");
400
+ } else if (ctx.isBackgroundJob) {
401
+ base = presets.background;
402
+ } else if (ctx.hasRetro) {
403
+ base = presets.retro;
404
+ } else if (ctx.appType === "kanban" || ctx.hasKanban) {
405
+ base = presets.kanban;
406
+ } else if (ctx.appType === "tribe") {
407
+ base = presets.tribe;
408
+ }
409
+ if ((ctx.creditsLeft ?? 10) < 3) {
410
+ base = presets.free;
411
+ reasoning.push(`Low credits: ${ctx.creditsLeft}`);
412
+ }
413
+ let depth = base.depth;
414
+ if ((ctx.messageCount ?? 0) > 50) {
415
+ depth = 2;
416
+ reasoning.push(`Deep thread: ${ctx.messageCount}`);
417
+ }
418
+ const join = { ...base.join };
419
+ if (ctx.hasDNA) {
420
+ join.memories.dna = Math.min(5, join.memories.dna + 2);
421
+ join.instructions.dna = Math.min(3, join.instructions.dna + 1);
422
+ reasoning.push("DNA boost");
423
+ }
424
+ if (ctx.hasTimer) {
425
+ join.memories.app = Math.min(10, join.memories.app + 1);
426
+ reasoning.push("Timer boost");
427
+ }
428
+ let modelId = ctx.defaultModelId || base.model.modelId;
429
+ if (ctx.needsTools && !modelPricing[modelId]?.tools) {
430
+ modelId = "deepseek/deepseek-chat";
431
+ reasoning.push("Tool requirement");
432
+ }
433
+ if (ctx.needsAnalysis && !modelPricing[modelId]?.analyze) {
434
+ modelId = "anthropic/claude-sonnet-4-6";
435
+ reasoning.push("Analysis requirement");
436
+ }
437
+ if (ctx.allowsModelSwap) {
438
+ const swap = swapModel(
439
+ modelId,
440
+ ctx.preferFree || (ctx.creditsLeft ?? 10) < 5
441
+ );
442
+ if (swap.swapped) {
443
+ modelId = swap.modelId;
444
+ reasoning.push(`Sushi swap`);
445
+ }
446
+ }
447
+ const pricing = modelPricing[modelId];
448
+ return {
449
+ join,
450
+ depth,
451
+ model: {
452
+ modelId,
453
+ inputPrice: pricing?.input ?? 1,
454
+ outputPrice: pricing?.output ?? 2,
455
+ hasTools: pricing?.tools ?? true,
456
+ canAnalyze: pricing?.analyze ?? false,
457
+ reason: reasoning.join(", ") || "Default"
458
+ },
459
+ reasoning: [...base.reasoning, ...reasoning]
460
+ };
461
+ }
462
+ function buildStoreKnowledgeBase(ctx) {
463
+ const reasoning = [];
464
+ const mainConfig = optimizeChopStick({
465
+ appType: ctx.appType,
466
+ hasDNA: ctx.hasDNA,
467
+ hasTimer: ctx.hasTimer,
468
+ hasKanban: ctx.hasKanban,
469
+ messageCount: ctx.messageCount,
470
+ isBackgroundJob: ctx.isBackgroundJob
471
+ });
472
+ const contextConfig = optimizeChopStick({
473
+ appType: "default",
474
+ isBackgroundJob: true
475
+ // lighter
476
+ });
477
+ const apps = ctx.storeAppIds.map((id, index) => {
478
+ const isMain = id === ctx.mainAppId;
479
+ const config2 = isMain ? mainConfig : contextConfig;
480
+ const limits = isMain ? { memories: 15, instructions: 10, messages: 10 } : { memories: 5, instructions: 3, messages: 3 };
481
+ return {
482
+ app: {
483
+ id,
484
+ name: `App-${index + 1}`,
485
+ // Caller doldurur
486
+ slug: `app-${id.slice(0, 6)}`
487
+ },
488
+ context: {
489
+ join: config2.join,
490
+ depth: config2.depth,
491
+ isMainApp: isMain
492
+ },
493
+ limits
494
+ };
495
+ });
496
+ const mainApp = apps.find((a) => a.app.id === ctx.mainAppId) || apps[0];
497
+ const contextApps = apps.filter((a) => a.app.id !== ctx.mainAppId);
498
+ const estimatedTokens = apps.reduce((sum, app) => {
499
+ const memTokens = app.limits.memories * 100;
500
+ const instTokens = app.limits.instructions * 200;
501
+ const msgTokens = app.limits.messages * 150;
502
+ return sum + memTokens + instTokens + msgTokens;
503
+ }, 0);
504
+ if (ctx.hasDNA) reasoning.push("DNA context included");
505
+ if (ctx.hasTimer) reasoning.push("Timer context included");
506
+ if (ctx.hasKanban) reasoning.push("Kanban context included");
507
+ return {
508
+ apps,
509
+ mainApp,
510
+ contextApps,
511
+ estimatedTokens,
512
+ meta: {
513
+ totalApps: apps.length,
514
+ reasoning,
515
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
516
+ }
517
+ };
518
+ }
519
+ function getPreset(name) {
520
+ return presets[name] ?? presets.balanced;
521
+ }
522
+ function getJoinWeights(ctx) {
523
+ return optimizeChopStick(ctx).join;
524
+ }
525
+ function buildRamenPayload(base, ctx) {
526
+ const opt = optimizeChopStick(ctx);
527
+ const estimatedCost = 2 * (opt.model.inputPrice + opt.model.outputPrice);
528
+ return {
529
+ ...base,
530
+ join: opt.join,
531
+ depth: opt.depth,
532
+ _meta: {
533
+ modelId: opt.model.modelId,
534
+ estimatedCost: Math.round(estimatedCost * 1e3) / 1e3,
535
+ reasoning: opt.reasoning
536
+ }
537
+ };
538
+ }
539
+
144
540
  // src/index.ts
145
541
  dotenv__namespace.config();
146
542
  var TEST_GUEST_FINGERPRINTS = (process.env.TEST_GUEST_FINGERPRINTS?.split(",") || []).filter((fp) => fp);
@@ -273,11 +669,18 @@ exports.VEX_TEST_PASSWORD = VEX_TEST_PASSWORD;
273
669
  exports.VEX_TEST_PASSWORD_2 = VEX_TEST_PASSWORD_2;
274
670
  exports.VEX_TEST_PASSWORD_3 = VEX_TEST_PASSWORD_3;
275
671
  exports.VEX_TEST_PASSWORD_4 = VEX_TEST_PASSWORD_4;
672
+ exports.buildRamenPayload = buildRamenPayload;
673
+ exports.buildStoreKnowledgeBase = buildStoreKnowledgeBase;
276
674
  exports.capitalizeFirstLetter = capitalizeFirstLetter;
675
+ exports.getJoinWeights = getJoinWeights;
277
676
  exports.getModelCredits = getModelCredits;
677
+ exports.getPreset = getPreset;
278
678
  exports.getURL = getURL;
279
679
  exports.isCI = isCI;
280
680
  exports.log = log;
681
+ exports.modelPricing = modelPricing;
682
+ exports.optimizeChopStick = optimizeChopStick;
683
+ exports.presets = presets;
281
684
  exports.scheduledJobFactory = scheduledJobFactory;
282
685
  exports.simulateInputPaste = simulateInputPaste;
283
686
  exports.simulatePaste = simulatePaste;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/client.ts","../src/fixtures/api/scheduledJobs.ts","../src/index.ts"],"names":["request","faker","dotenv"],"mappings":"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","file":"index.js","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":["request","faker","config","dotenv"],"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,MAAMA,YAAA,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,EAAiBC,WAAA,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,MAAMC,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;;;ACrqBOC,iBAAA,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.js","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"]}