@bubblelab/shared-schemas 0.1.84 → 0.1.86
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.map +1 -1
- package/dist/trigger.d.ts +9 -0
- package/dist/trigger.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api-schema.ts","../src/database-definition-schema.ts","../src/types.ts","../src/credential-schema.ts","../src/bubble-definition-schema.ts","../src/mock-data-generator.ts","../src/oauth-schema.ts","../src/waitlist-schema.ts","../src/bubbleflow-schema.ts","../src/permission-schema.ts","../src/bubbleflow-execution-schema.ts","../src/generate-bubbleflow-schema.ts","../src/coffee.ts","../src/webhook-schema.ts","../src/subscription-status-schema.ts","../src/organization-schema.ts","../src/milk-tea.ts","../src/ai-models.ts","../src/agent-memory.ts","../src/pearl.ts","../src/rice.ts","../src/bubbleflow-generation-prompts.ts","../src/cron-utils.ts","../src/trigger.ts","../src/storage-utils.ts","../src/param-utils.ts","../src/error-enhancer.ts","../src/hash-utils.ts","../src/parameter-formatter.ts"],"sourcesContent":["import { z } from '@hono/zod-openapi';\n\nexport const errorResponseSchema = z\n .object({\n error: z.string().openapi({\n description: 'Error message',\n example: 'Validation failed',\n }),\n details: z.string().optional().openapi({\n description: 'Additional error details',\n example: 'Invalid field: name is required',\n }),\n })\n .openapi('ErrorResponse');\n\nexport type ErrorResponse = z.infer<typeof errorResponseSchema>;\n\nexport interface HealthCheckResponse {\n message: string;\n timestamp: string;\n}\n\nexport const slackUrlVerificationSchema = z.object({\n token: z.string(),\n challenge: z.string(),\n type: z.literal('url_verification'),\n});\n\nexport const slackUrlVerificationResponseSchema = z\n .object({\n challenge: z\n .string()\n .openapi({ description: 'Slack URL verification challenge' }),\n })\n .openapi('SlackUrlVerificationResponse');\n\nexport type SlackUrlVerificationResponse = z.infer<\n typeof slackUrlVerificationResponseSchema\n>;\n","/**\n * Database Definition Schema\n *\n * This schema is designed to store database table definitions and metadata\n */\n\nimport { z } from '@hono/zod-openapi';\n\n// Database connection types for frontend display\nexport interface DatabaseConnection {\n id: string;\n name: string;\n type: 'postgresql' | 'mysql' | 'mongodb' | 'bigquery' | 'sqlite';\n host: string;\n port: number;\n database: string;\n username?: string;\n status: 'connected' | 'disconnected' | 'error';\n createdAt: string;\n lastUsed: string;\n description?: string;\n}\n\nexport type DatabaseStatus = 'connected' | 'disconnected' | 'error';\nexport type DatabaseType =\n | 'postgresql'\n | 'mysql'\n | 'mongodb'\n | 'bigquery'\n | 'sqlite';\n\n// Database schema types for table structure display\nexport interface DatabaseColumn {\n name: string;\n type: string;\n isNullable: boolean;\n defaultValue?: string;\n constraints?: string[];\n}\n\nexport interface DatabaseTable {\n name: string;\n schema: string;\n columns: DatabaseColumn[];\n rowCount?: number;\n size?: string;\n}\n\nexport interface DatabaseSchema {\n tables: DatabaseTable[];\n totalTables: number;\n totalSize?: string;\n}\n\n// Schema for database metadata that can be stored in credentials\nexport const databaseMetadataSchema = z.object({\n // Core database definition - mapping of table names to column definitions\n // Format: { [tableName]: { [columnName]: columnType } }\n tables: z.record(\n z.string(), // table name\n z.record(\n z.string(), // column name\n z.string() // notes about it\n )\n ),\n // Table-level notes - mapping of table names to notes about the entire table\n tableNotes: z.record(z.string(), z.string()).optional(),\n // Optional metadata\n databaseName: z.string().optional(),\n databaseType: z\n .enum(['postgresql', 'mysql', 'sqlite', 'mssql', 'oracle'])\n .optional(),\n // Rules and constraints - simplified to match frontend\n rules: z\n .array(\n z.object({\n id: z.string(),\n text: z.string(),\n enabled: z.boolean(),\n createdAt: z.string(), // ISO string\n updatedAt: z.string(), // ISO string\n })\n )\n .optional(),\n // Additional context\n notes: z.string().optional(),\n tags: z.array(z.string()).optional(),\n});\n\nexport type DatabaseMetadata = z.infer<typeof databaseMetadataSchema>;\n\n/**\n * Jira OAuth metadata - stored after OAuth callback with cloudId for API calls\n */\nexport const jiraOAuthMetadataSchema = z.object({\n cloudId: z.string(),\n siteUrl: z.string(),\n siteName: z.string().optional(),\n /** Human-readable display name for the credential (e.g., Jira site name) */\n displayName: z.string().optional(),\n});\n\nexport type JiraOAuthMetadata = z.infer<typeof jiraOAuthMetadataSchema>;\n\n/**\n * Stripe Apps OAuth metadata - stored after OAuth callback\n */\nexport const stripeOAuthMetadataSchema = z.object({\n stripeUserId: z.string(), // Connected account ID (acct_xxx)\n stripePublishableKey: z.string(), // Publishable key (pk_live_xxx or pk_test_xxx)\n livemode: z.boolean(), // true = production, false = test mode\n /** Human-readable display name for the credential */\n displayName: z.string().optional(),\n});\n\nexport type StripeOAuthMetadata = z.infer<typeof stripeOAuthMetadataSchema>;\n\n/**\n * Slack OAuth metadata - stored after OAuth callback with workspace info\n */\nexport const slackOAuthMetadataSchema = z.object({\n teamId: z.string(),\n teamName: z.string(),\n botUserId: z.string(),\n /** Human-readable display name for the credential (workspace name) */\n displayName: z.string().optional(),\n});\n\nexport type SlackOAuthMetadata = z.infer<typeof slackOAuthMetadataSchema>;\n\n/**\n * Airtable OAuth metadata - stored after OAuth callback\n */\nexport const airtableOAuthMetadataSchema = z.object({\n airtableUserId: z.string(),\n email: z.string().optional(),\n /** Human-readable display name for the credential */\n displayName: z.string().optional(),\n});\n\nexport type AirtableOAuthMetadata = z.infer<typeof airtableOAuthMetadataSchema>;\n\n/**\n * Union type for all credential metadata types\n * - DatabaseMetadata: For DATABASE_CRED (PostgreSQL, etc.)\n * - JiraOAuthMetadata: For JIRA_CRED OAuth credentials\n * - SlackOAuthMetadata: For SLACK_CRED OAuth credentials\n */\nexport type CredentialMetadata =\n | DatabaseMetadata\n | JiraOAuthMetadata\n | SlackOAuthMetadata\n | AirtableOAuthMetadata;\n","// Define CredentialType enum here to avoid circular dependencies\n\nexport enum CredentialType {\n /**\n * Wildcard marker that indicates a bubble accepts any credential type.\n * Used in BUBBLE_CREDENTIAL_OPTIONS to allow users to plug in any credential.\n */\n CREDENTIAL_WILDCARD = '*',\n\n // AI Credentials\n OPENAI_CRED = 'OPENAI_CRED',\n GOOGLE_GEMINI_CRED = 'GOOGLE_GEMINI_CRED',\n ANTHROPIC_CRED = 'ANTHROPIC_CRED',\n OPENROUTER_CRED = 'OPENROUTER_CRED',\n // Search Credentials\n FIRECRAWL_API_KEY = 'FIRECRAWL_API_KEY',\n // Database Credentials\n DATABASE_CRED = 'DATABASE_CRED',\n // Communication Credentials\n SLACK_CRED = 'SLACK_CRED',\n TELEGRAM_BOT_TOKEN = 'TELEGRAM_BOT_TOKEN',\n // Email Credentials\n RESEND_CRED = 'RESEND_CRED',\n // Storage Credentials\n CLOUDFLARE_R2_ACCESS_KEY = 'CLOUDFLARE_R2_ACCESS_KEY',\n CLOUDFLARE_R2_SECRET_KEY = 'CLOUDFLARE_R2_SECRET_KEY',\n CLOUDFLARE_R2_ACCOUNT_ID = 'CLOUDFLARE_R2_ACCOUNT_ID',\n // Scraping Credentials\n APIFY_CRED = 'APIFY_CRED',\n\n // Voice Credentials\n ELEVENLABS_API_KEY = 'ELEVENLABS_API_KEY',\n\n // OAuth Credentials\n GOOGLE_DRIVE_CRED = 'GOOGLE_DRIVE_CRED',\n GMAIL_CRED = 'GMAIL_CRED',\n GOOGLE_SHEETS_CRED = 'GOOGLE_SHEETS_CRED',\n GOOGLE_CALENDAR_CRED = 'GOOGLE_CALENDAR_CRED',\n FUB_CRED = 'FUB_CRED',\n NOTION_OAUTH_TOKEN = 'NOTION_OAUTH_TOKEN',\n AIRTABLE_OAUTH = 'AIRTABLE_OAUTH',\n\n // Development Platform Credentials\n GITHUB_TOKEN = 'GITHUB_TOKEN',\n\n // Browser Automation Credentials\n AGI_API_KEY = 'AGI_API_KEY',\n\n // Database/Storage Credentials\n AIRTABLE_CRED = 'AIRTABLE_CRED',\n\n // InsForge Credentials\n INSFORGE_BASE_URL = 'INSFORGE_BASE_URL',\n INSFORGE_API_KEY = 'INSFORGE_API_KEY',\n\n // Custom Authentication Credentials\n CUSTOM_AUTH_KEY = 'CUSTOM_AUTH_KEY',\n\n // Browser Session Credentials (BrowserBase-powered)\n AMAZON_CRED = 'AMAZON_CRED',\n LINKEDIN_CRED = 'LINKEDIN_CRED',\n // Crustdata Credentials\n CRUSTDATA_API_KEY = 'CRUSTDATA_API_KEY',\n\n // Jira Credentials\n JIRA_CRED = 'JIRA_CRED',\n\n // Ashby Credentials\n ASHBY_CRED = 'ASHBY_CRED',\n\n // FullEnrich Credentials\n FULLENRICH_API_KEY = 'FULLENRICH_API_KEY',\n\n // Stripe Credentials\n STRIPE_CRED = 'STRIPE_CRED',\n}\n\n// Define all bubble names as a union type for type safety\nexport type BubbleName =\n | 'hello-world'\n | 'ai-agent'\n | 'postgresql'\n | 'slack'\n | 'resend'\n | 'http'\n | 'slack-formatter-agent'\n | 'database-analyzer'\n | 'slack-notifier'\n | 'get-bubble-details-tool'\n | 'get-trigger-detail-tool'\n | 'list-bubbles-tool'\n | 'sql-query-tool'\n | 'chart-js-tool'\n | 'web-search-tool'\n | 'web-scrape-tool'\n | 'web-crawl-tool'\n | 'web-extract-tool'\n | 'research-agent-tool'\n | 'reddit-scrape-tool'\n | 'slack-data-assistant'\n | 'bubbleflow-code-generator'\n | 'bubbleflow-generator'\n | 'pdf-form-operations'\n | 'pdf-ocr-workflow'\n | 'generate-document-workflow'\n | 'parse-document-workflow'\n | 'bubbleflow-validation-tool'\n | 'code-edit-tool'\n | 'storage'\n | 'google-drive'\n | 'gmail'\n | 'google-sheets'\n | 'google-calendar'\n | 'apify'\n | 'instagram-tool'\n | 'linkedin-tool'\n | 'tiktok-tool'\n | 'twitter-tool'\n | 'google-maps-tool'\n | 'youtube-tool'\n | 'github'\n | 'eleven-labs'\n | 'followupboss'\n | 'agi-inc'\n | 'telegram'\n | 'airtable'\n | 'notion'\n | 'firecrawl'\n | 'insforge-db'\n | 'browserbase'\n | 'amazon-shopping-tool'\n | 'crustdata'\n | 'company-enrichment-tool'\n | 'people-search-tool'\n | 'jira'\n | 'ashby'\n | 'fullenrich'\n | 'linkedin-connection-tool'\n | 'stripe';\n","import { BubbleName, CredentialType } from './types.js';\nimport { z } from '@hono/zod-openapi';\nimport {\n databaseMetadataSchema,\n jiraOAuthMetadataSchema,\n slackOAuthMetadataSchema,\n airtableOAuthMetadataSchema,\n} from './database-definition-schema.js';\n\n/**\n * Configuration for a credential type displayed in the UI\n */\nexport interface CredentialConfig {\n label: string;\n description: string;\n placeholder: string;\n namePlaceholder: string;\n credentialConfigurations: Record<string, unknown>;\n}\n\n/**\n * Configuration for all credential types - used by Credentials page and AI agents\n */\nexport const CREDENTIAL_TYPE_CONFIG: Record<CredentialType, CredentialConfig> =\n {\n [CredentialType.OPENAI_CRED]: {\n label: 'OpenAI',\n description: 'API key for OpenAI services (GPT models, embeddings, etc.)',\n placeholder: 'sk-...',\n namePlaceholder: 'My OpenAI API Key',\n credentialConfigurations: {},\n },\n [CredentialType.GOOGLE_GEMINI_CRED]: {\n label: 'Google Gemini',\n description: 'API key for Google Gemini AI models',\n placeholder: 'AIza...',\n namePlaceholder: 'My Google Gemini Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.ANTHROPIC_CRED]: {\n label: 'Anthropic',\n description: 'API key for Anthropic Claude models',\n placeholder: 'sk-ant-...',\n namePlaceholder: 'My Anthropic API Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.DATABASE_CRED]: {\n label: 'Database (PostgreSQL)',\n description: 'Database connection string for PostgreSQL',\n placeholder: 'postgresql://user:pass@host:port/dbname',\n namePlaceholder: 'My PostgreSQL Database',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.FIRECRAWL_API_KEY]: {\n label: 'Firecrawl',\n description: 'API key for Firecrawl web scraping and search services',\n placeholder: 'fc-...',\n namePlaceholder: 'My Firecrawl API Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.SLACK_CRED]: {\n label: 'Slack',\n description:\n 'Slack Bot token (xoxb-) or User token (xoxp-) from api.slack.com/apps. Configure scopes in OAuth & Permissions.',\n placeholder: 'xoxb-... or xoxp-...',\n namePlaceholder: 'My Slack Token',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.RESEND_CRED]: {\n label: 'Resend',\n description: 'Your Resend API key for email services',\n placeholder: 're_...',\n namePlaceholder: 'My Resend API Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.OPENROUTER_CRED]: {\n label: 'OpenRouter',\n description: 'API key for OpenRouter services',\n placeholder: 'sk-or-...',\n namePlaceholder: 'My OpenRouter API Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.CLOUDFLARE_R2_ACCESS_KEY]: {\n label: 'Cloudflare R2 Access Key',\n description: 'Access key for Cloudflare R2 storage',\n placeholder: 'Enter your access key',\n namePlaceholder: 'My R2 Access Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.CLOUDFLARE_R2_SECRET_KEY]: {\n label: 'Cloudflare R2 Secret Key',\n description: 'Secret key for Cloudflare R2 storage',\n placeholder: 'Enter your secret key',\n namePlaceholder: 'My R2 Secret Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.CLOUDFLARE_R2_ACCOUNT_ID]: {\n label: 'Cloudflare R2 Account ID',\n description: 'Account ID for Cloudflare R2 storage',\n placeholder: 'Enter your account ID',\n namePlaceholder: 'My R2 Account ID',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.APIFY_CRED]: {\n label: 'Apify',\n description: 'API token for Apify platform (web scraping, automation)',\n placeholder: 'apify_api_...',\n namePlaceholder: 'My Apify API Token',\n credentialConfigurations: {},\n },\n [CredentialType.GOOGLE_DRIVE_CRED]: {\n label: 'Google Drive',\n description: 'OAuth connection to Google Drive for file access',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Google Drive Connection',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.GMAIL_CRED]: {\n label: 'Gmail',\n description: 'OAuth connection to Gmail for email management',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Gmail Connection',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.GOOGLE_SHEETS_CRED]: {\n label: 'Google Sheets',\n description:\n 'OAuth connection to Google Sheets for spreadsheet management',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Google Sheets Connection',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.GOOGLE_CALENDAR_CRED]: {\n label: 'Google Calendar',\n description:\n 'OAuth connection to Google Calendar for events and schedules',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Google Calendar Connection',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.FUB_CRED]: {\n label: 'Follow Up Boss',\n description:\n 'OAuth connection to Follow Up Boss CRM for contacts, tasks, and deals',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Follow Up Boss Connection',\n credentialConfigurations: {},\n },\n [CredentialType.NOTION_OAUTH_TOKEN]: {\n label: 'Notion',\n description:\n 'OAuth connection to your Notion workspace (pages, databases, search)',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Notion Connection',\n credentialConfigurations: {},\n },\n [CredentialType.GITHUB_TOKEN]: {\n label: 'GitHub',\n description:\n 'Personal Access Token for GitHub API (read repos, PRs, issues)',\n placeholder: 'github_pat...',\n namePlaceholder: 'My GitHub Token',\n credentialConfigurations: {},\n },\n [CredentialType.ELEVENLABS_API_KEY]: {\n label: 'Eleven Labs API Key',\n description: 'Your API key from Eleven Labs',\n placeholder: 'agent_...',\n namePlaceholder: 'My Eleven Labs Key',\n credentialConfigurations: {},\n },\n [CredentialType.AGI_API_KEY]: {\n label: 'AGI Inc API Key',\n description: 'Your API key from AGI Inc',\n placeholder: 'api_...',\n namePlaceholder: 'My AGI Inc Key',\n credentialConfigurations: {},\n },\n [CredentialType.TELEGRAM_BOT_TOKEN]: {\n label: 'Telegram Bot Token',\n description: 'Your Telegram bot token',\n placeholder: 'bot_...',\n namePlaceholder: 'My Telegram Bot Token',\n credentialConfigurations: {},\n },\n [CredentialType.AIRTABLE_CRED]: {\n label: 'Airtable',\n description:\n 'Personal Access Token for Airtable API (manage bases, tables, records)',\n placeholder: 'pat...',\n namePlaceholder: 'My Airtable Token',\n credentialConfigurations: {},\n },\n [CredentialType.AIRTABLE_OAUTH]: {\n label: 'Airtable (OAuth)',\n description:\n 'OAuth connection to Airtable for full API access including webhooks',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Airtable Connection',\n credentialConfigurations: {},\n },\n [CredentialType.INSFORGE_BASE_URL]: {\n label: 'InsForge Base URL',\n description:\n 'Base URL for your InsForge backend (e.g., https://your-app.region.insforge.app)',\n placeholder: 'https://your-app.region.insforge.app',\n namePlaceholder: 'My InsForge Backend URL',\n credentialConfigurations: {},\n },\n [CredentialType.INSFORGE_API_KEY]: {\n label: 'InsForge API Key',\n description: 'API key for your InsForge backend',\n placeholder: 'ik_...',\n namePlaceholder: 'My InsForge API Key',\n credentialConfigurations: {},\n },\n [CredentialType.CRUSTDATA_API_KEY]: {\n label: 'Crustdata API Key',\n description: 'API key for your Crustdata backend',\n placeholder: 'crust_...',\n namePlaceholder: 'My Crustdata API Key',\n credentialConfigurations: {},\n },\n [CredentialType.CUSTOM_AUTH_KEY]: {\n label: 'Custom Authentication Key',\n description:\n 'Custom API key or authentication token for HTTP requests (Bearer, Basic, X-API-Key, etc.)',\n placeholder: 'Enter your API key or token...',\n namePlaceholder: 'My Custom Auth Key',\n credentialConfigurations: {},\n },\n [CredentialType.AMAZON_CRED]: {\n label: 'Amazon',\n description:\n 'Browser session authentication for Amazon shopping (cart, orders, purchases). Authenticate by logging into your Amazon account in a secure browser session.',\n placeholder: '', // Not used for browser session auth\n namePlaceholder: 'My Amazon Account',\n credentialConfigurations: {},\n },\n [CredentialType.LINKEDIN_CRED]: {\n label: 'LinkedIn',\n description:\n 'Browser session authentication for LinkedIn automation (connections, messaging). Authenticate by logging into your LinkedIn account in a secure browser session.',\n placeholder: '', // Not used for browser session auth\n namePlaceholder: 'My LinkedIn Account',\n credentialConfigurations: {},\n },\n [CredentialType.JIRA_CRED]: {\n label: 'Jira',\n description:\n 'OAuth connection to Jira Cloud for issue tracking and project management',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Jira Connection',\n credentialConfigurations: {},\n },\n [CredentialType.ASHBY_CRED]: {\n label: 'Ashby',\n description:\n 'API key for Ashby ATS (Applicant Tracking System) for candidate management',\n placeholder: 'Enter your Ashby API key...',\n namePlaceholder: 'My Ashby API Key',\n credentialConfigurations: {},\n },\n [CredentialType.FULLENRICH_API_KEY]: {\n label: 'FullEnrich',\n description:\n 'API key for FullEnrich B2B contact enrichment (emails, phones, LinkedIn data)',\n placeholder: 'Enter your FullEnrich API key...',\n namePlaceholder: 'My FullEnrich API Key',\n credentialConfigurations: {},\n },\n [CredentialType.STRIPE_CRED]: {\n label: 'Stripe',\n description:\n 'Stripe API secret key for payment processing (sk_live_... or sk_test_...)',\n placeholder: 'sk_...',\n namePlaceholder: 'My Stripe API Key',\n credentialConfigurations: {},\n },\n [CredentialType.CREDENTIAL_WILDCARD]: {\n label: 'Any Credential',\n description:\n 'Wildcard marker - this is not a real credential type, used internally to indicate any credential is accepted',\n placeholder: '',\n namePlaceholder: '',\n credentialConfigurations: {},\n },\n } as const satisfies Record<CredentialType, CredentialConfig>;\n\n/**\n * Generate a human-readable summary of available credentials for AI agents\n */\nexport function generateCredentialsSummary(): string {\n const lines: string[] = ['Available credentials that users can configure:'];\n\n for (const [credType, config] of Object.entries(CREDENTIAL_TYPE_CONFIG)) {\n lines.push(`- ${config.label} (${credType}): ${config.description}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Maps credential types to their environment variable names (for backend only!!!!)\n */\nexport const CREDENTIAL_ENV_MAP: Record<CredentialType, string> = {\n [CredentialType.OPENAI_CRED]: 'OPENAI_API_KEY',\n [CredentialType.GOOGLE_GEMINI_CRED]: 'GOOGLE_API_KEY',\n [CredentialType.ANTHROPIC_CRED]: 'ANTHROPIC_API_KEY',\n [CredentialType.FIRECRAWL_API_KEY]: 'FIRE_CRAWL_API_KEY',\n [CredentialType.DATABASE_CRED]: 'BUBBLE_CONNECTING_STRING_URL',\n [CredentialType.SLACK_CRED]: 'SLACK_TOKEN',\n [CredentialType.TELEGRAM_BOT_TOKEN]: 'TELEGRAM_BOT_TOKEN',\n [CredentialType.RESEND_CRED]: 'RESEND_API_KEY',\n [CredentialType.OPENROUTER_CRED]: 'OPENROUTER_API_KEY',\n [CredentialType.CLOUDFLARE_R2_ACCESS_KEY]: 'CLOUDFLARE_R2_ACCESS_KEY',\n [CredentialType.CLOUDFLARE_R2_SECRET_KEY]: 'CLOUDFLARE_R2_SECRET_KEY',\n [CredentialType.CLOUDFLARE_R2_ACCOUNT_ID]: 'CLOUDFLARE_R2_ACCOUNT_ID',\n [CredentialType.APIFY_CRED]: 'APIFY_API_TOKEN',\n [CredentialType.ELEVENLABS_API_KEY]: 'ELEVENLABS_API_KEY',\n [CredentialType.GOOGLE_DRIVE_CRED]: '',\n [CredentialType.GMAIL_CRED]: '',\n [CredentialType.GOOGLE_SHEETS_CRED]: '',\n [CredentialType.GOOGLE_CALENDAR_CRED]: '',\n [CredentialType.FUB_CRED]: '',\n [CredentialType.GITHUB_TOKEN]: 'GITHUB_TOKEN',\n [CredentialType.AGI_API_KEY]: 'AGI_API_KEY',\n [CredentialType.AIRTABLE_CRED]: 'AIRTABLE_API_KEY',\n [CredentialType.AIRTABLE_OAUTH]: '', // OAuth credential, no env var\n [CredentialType.NOTION_OAUTH_TOKEN]: '',\n [CredentialType.INSFORGE_BASE_URL]: 'INSFORGE_BASE_URL',\n [CredentialType.INSFORGE_API_KEY]: 'INSFORGE_API_KEY',\n [CredentialType.CUSTOM_AUTH_KEY]: '', // User-provided, no env var\n [CredentialType.AMAZON_CRED]: '', // Browser session credential, no env var\n [CredentialType.LINKEDIN_CRED]: '', // Browser session credential, no env var\n [CredentialType.CRUSTDATA_API_KEY]: 'CRUSTDATA_API_KEY',\n [CredentialType.JIRA_CRED]: '', // OAuth credential, no env var\n [CredentialType.ASHBY_CRED]: 'ASHBY_API_KEY',\n [CredentialType.FULLENRICH_API_KEY]: 'FULLENRICH_API_KEY',\n [CredentialType.STRIPE_CRED]: 'STRIPE_SECRET_KEY',\n [CredentialType.CREDENTIAL_WILDCARD]: '', // Wildcard marker, not a real credential\n};\n\n/** Used by bubblelab studio */\nexport const SYSTEM_CREDENTIALS = new Set<CredentialType>([\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.FIRECRAWL_API_KEY,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.RESEND_CRED,\n CredentialType.OPENROUTER_CRED,\n // Cloudflare R2 Storage credentials\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n // Scraping credentials\n CredentialType.APIFY_CRED,\n CredentialType.CRUSTDATA_API_KEY,\n // Enrichment credentials\n CredentialType.FULLENRICH_API_KEY,\n]);\n\n/**\n * Credentials that are optional (not required) for their associated bubbles.\n * These will not show as \"missing\" in the UI when not selected.\n */\nexport const OPTIONAL_CREDENTIALS = new Set<CredentialType>([\n CredentialType.CUSTOM_AUTH_KEY,\n CredentialType.FULLENRICH_API_KEY,\n]);\n\n/**\n * OAuth provider names - type-safe provider identifiers\n */\nexport type OAuthProvider =\n | 'google'\n | 'followupboss'\n | 'notion'\n | 'jira'\n | 'slack'\n | 'airtable';\n\n/**\n * Scope description mapping - maps OAuth scope URLs to human-readable descriptions\n */\nexport interface ScopeDescription {\n scope: string; // OAuth scope URL\n description: string; // Human-readable description of what this scope allows\n defaultEnabled: boolean; // Whether this scope should be enabled by default\n}\n\n/**\n * OAuth credential type configuration for a specific service under a provider\n */\nexport interface OAuthCredentialConfig {\n displayName: string; // User-facing name\n defaultScopes: string[]; // OAuth scopes for this credential type (non-admin, safe for any user)\n adminScopes?: string[]; // OAuth scopes that require admin approval (optional)\n description: string; // Description of what this credential provides access to\n scopeDescriptions?: ScopeDescription[]; // Optional: descriptions for each scope\n}\n\n/**\n * OAuth provider configuration shared between frontend and backend\n */\nexport interface OAuthProviderConfig {\n name: OAuthProvider; // Type-safe provider identifier\n displayName: string; // User-facing provider name: 'Google'\n credentialTypes: Partial<Record<CredentialType, OAuthCredentialConfig>>; // Supported credential types\n authorizationParams?: Record<string, string>; // Provider-wide OAuth parameters\n}\n\n/**\n * OAuth provider configurations - single source of truth for OAuth providers\n * Contains all information needed by frontend and backend\n */\nexport const OAUTH_PROVIDERS: Record<OAuthProvider, OAuthProviderConfig> = {\n google: {\n name: 'google',\n displayName: 'Google',\n credentialTypes: {\n [CredentialType.GOOGLE_DRIVE_CRED]: {\n displayName: 'Google Drive',\n defaultScopes: [\n 'https://www.googleapis.com/auth/drive.file',\n 'https://www.googleapis.com/auth/documents',\n 'https://www.googleapis.com/auth/spreadsheets',\n 'https://www.googleapis.com/auth/drive',\n ],\n description: 'Access Google Drive files and folders',\n scopeDescriptions: [\n {\n scope: 'https://www.googleapis.com/auth/drive.file',\n description:\n 'View and manage Google Drive files and folders that you have created with Bubble Lab or selected w/ file picker',\n defaultEnabled: true,\n },\n {\n scope: 'https://www.googleapis.com/auth/documents',\n description: 'View and manage your Google Docs documents',\n defaultEnabled: true,\n },\n {\n scope: 'https://www.googleapis.com/auth/spreadsheets',\n description: 'View and manage your Google Sheets spreadsheets',\n defaultEnabled: true,\n },\n {\n scope: 'https://www.googleapis.com/auth/drive.readonly',\n description:\n 'View and manage all of your Google Drive files and folders (will see a warning about an \"untrusted app\" during authentication. Choose only if you need extra permissions)',\n defaultEnabled: false,\n },\n ],\n },\n [CredentialType.GMAIL_CRED]: {\n displayName: 'Gmail',\n defaultScopes: [\n 'https://www.googleapis.com/auth/gmail.send',\n 'https://www.googleapis.com/auth/gmail.modify',\n ],\n description: 'Access Gmail for sending emails',\n scopeDescriptions: [\n {\n scope: 'https://www.googleapis.com/auth/gmail.send',\n description: 'Send email on your behalf',\n defaultEnabled: true,\n },\n {\n scope: 'https://www.googleapis.com/auth/gmail.modify',\n description:\n 'View and manage all of your Gmail emails and labels (might see a warning about an \"untrusted app\" during authentication. Choose only if you need extra permissions)',\n defaultEnabled: false,\n },\n ],\n },\n [CredentialType.GOOGLE_SHEETS_CRED]: {\n displayName: 'Google Sheets',\n defaultScopes: ['https://www.googleapis.com/auth/spreadsheets'],\n description:\n 'Access Google Sheets for reading and writing spreadsheet data',\n scopeDescriptions: [\n {\n scope: 'https://www.googleapis.com/auth/spreadsheets',\n description: 'View and manage your Google Sheets spreadsheets',\n defaultEnabled: true,\n },\n ],\n },\n [CredentialType.GOOGLE_CALENDAR_CRED]: {\n displayName: 'Google Calendar',\n defaultScopes: ['https://www.googleapis.com/auth/calendar'],\n description: 'Access Google Calendar for reading and managing events',\n scopeDescriptions: [\n {\n scope: 'https://www.googleapis.com/auth/calendar',\n description: 'View and manage events on all your calendars',\n defaultEnabled: true,\n },\n ],\n },\n },\n authorizationParams: {\n access_type: 'offline', // Required for refresh tokens\n prompt: 'consent', // Force consent screen to ensure refresh token is issued\n },\n },\n followupboss: {\n name: 'followupboss',\n displayName: 'Follow Up Boss',\n credentialTypes: {\n [CredentialType.FUB_CRED]: {\n displayName: 'Follow Up Boss',\n defaultScopes: [], // FUB doesn't use granular scopes\n description:\n 'Access Follow Up Boss CRM for managing contacts, tasks, deals, and more',\n },\n },\n authorizationParams: {\n response_type: 'auth_code', // FUB uses 'auth_code' instead of standard 'code'\n prompt: 'login', // FUB supports 'login' to force re-authentication\n },\n },\n notion: {\n name: 'notion',\n displayName: 'Notion',\n credentialTypes: {\n [CredentialType.NOTION_OAUTH_TOKEN]: {\n displayName: 'Notion Workspace',\n defaultScopes: [], // Notion scopes are managed in the integration capabilities\n description:\n 'Authorize access to your Notion workspace for searching and reading pages/databases',\n },\n },\n },\n jira: {\n name: 'jira',\n displayName: 'Jira',\n credentialTypes: {\n [CredentialType.JIRA_CRED]: {\n displayName: 'Jira Cloud',\n defaultScopes: [\n 'read:jira-user',\n 'read:jira-work',\n 'write:jira-work',\n 'offline_access', // Required for refresh tokens\n ],\n description:\n 'Access Jira Cloud for issue tracking and project management',\n scopeDescriptions: [\n {\n scope: 'read:jira-user',\n description: 'View user information and search for users',\n defaultEnabled: true,\n },\n {\n scope: 'read:jira-work',\n description: 'View issues, projects, and workflows',\n defaultEnabled: true,\n },\n {\n scope: 'write:jira-work',\n description: 'Create and update issues, comments, and transitions',\n defaultEnabled: true,\n },\n {\n scope: 'offline_access',\n description:\n 'Maintain access when you are not actively using the app',\n defaultEnabled: true,\n },\n ],\n },\n },\n authorizationParams: {\n audience: 'api.atlassian.com',\n prompt: 'consent',\n },\n },\n slack: {\n name: 'slack',\n displayName: 'Slack',\n credentialTypes: {\n [CredentialType.SLACK_CRED]: {\n displayName: 'Slack Workspace',\n defaultScopes: [\n // Messaging - Read\n 'app_mentions:read',\n 'channels:history',\n 'groups:history',\n 'im:history',\n 'mpim:history',\n // Messaging - Write\n 'chat:write',\n 'chat:write.public',\n 'chat:write.customize',\n // Channels & Conversations - Read\n 'channels:read',\n 'groups:read',\n 'im:read',\n 'mpim:read',\n // Channels & Conversations - Write (non-admin)\n 'channels:join',\n // Users & Team (read-only)\n 'users:read',\n 'users:read.email',\n 'users.profile:read',\n 'team:read',\n 'usergroups:read',\n 'dnd:read',\n // Reactions\n 'reactions:read',\n 'reactions:write',\n // Files\n 'files:read',\n 'files:write',\n // Pins & Bookmarks (read-only)\n 'pins:read',\n 'bookmarks:read',\n // Reminders\n 'reminders:read',\n 'reminders:write',\n // Commands\n 'commands',\n // Metadata & Emoji\n 'metadata.message:read',\n 'emoji:read',\n ],\n adminScopes: [\n // Channel management (requires admin)\n 'channels:manage',\n 'channels:write.invites',\n 'channels:write.topic',\n // Private channel management (requires admin)\n 'groups:write',\n 'groups:write.invites',\n 'groups:write.topic',\n // DM management (requires admin)\n 'im:write',\n 'im:write.topic',\n 'mpim:write',\n 'mpim:write.topic',\n // User management (requires admin)\n 'users:write',\n 'usergroups:write',\n // Pins & Bookmarks write (requires admin)\n 'pins:write',\n 'bookmarks:write',\n // Links (requires admin)\n 'links:read',\n 'links:write',\n 'links.embed:write',\n // Canvases & Lists (requires admin)\n 'canvases:read',\n 'canvases:write',\n 'lists:read',\n 'lists:write',\n // Calls (requires admin)\n 'calls:read',\n 'calls:write',\n // Slack Connect (requires admin)\n 'conversations.connect:read',\n 'conversations.connect:write',\n 'conversations.connect:manage',\n // Remote files (requires admin)\n 'remote_files:read',\n 'remote_files:write',\n 'remote_files:share',\n // Assistant (requires admin)\n 'assistant:write',\n // Search (requires admin)\n 'search:read.files',\n 'search:read.public',\n 'search:read.users',\n // Team Preferences (requires admin)\n 'team.preferences:read',\n ],\n description:\n 'Connect to your Slack workspace for full messaging, file sharing, and workflow automation capabilities',\n scopeDescriptions: [\n // Messaging - Read\n {\n scope: 'app_mentions:read',\n description: 'Receive @mentions of the bot',\n defaultEnabled: true,\n },\n {\n scope: 'channels:history',\n description: 'Read messages in public channels',\n defaultEnabled: true,\n },\n {\n scope: 'groups:history',\n description: 'Read messages in private channels',\n defaultEnabled: true,\n },\n {\n scope: 'im:history',\n description: 'Read direct messages with the bot',\n defaultEnabled: true,\n },\n {\n scope: 'mpim:history',\n description: 'Read group DMs with the bot',\n defaultEnabled: true,\n },\n // Messaging - Write\n {\n scope: 'chat:write',\n description: 'Send messages to channels',\n defaultEnabled: true,\n },\n {\n scope: 'chat:write.public',\n description: 'Send messages to any public channel',\n defaultEnabled: true,\n },\n {\n scope: 'chat:write.customize',\n description: 'Customize bot username and avatar',\n defaultEnabled: true,\n },\n // Channels - Read\n {\n scope: 'channels:read',\n description: 'View public channels list',\n defaultEnabled: true,\n },\n {\n scope: 'groups:read',\n description: 'View private channels list',\n defaultEnabled: true,\n },\n {\n scope: 'im:read',\n description: 'View direct messages list',\n defaultEnabled: true,\n },\n {\n scope: 'mpim:read',\n description: 'View group DMs list',\n defaultEnabled: true,\n },\n // Channels - Write\n {\n scope: 'channels:join',\n description: 'Join public channels',\n defaultEnabled: true,\n },\n {\n scope: 'channels:manage',\n description: 'Create and archive public channels',\n defaultEnabled: true,\n },\n {\n scope: 'channels:write.invites',\n description: 'Invite users to public channels',\n defaultEnabled: true,\n },\n {\n scope: 'channels:write.topic',\n description: 'Set public channel topics',\n defaultEnabled: true,\n },\n {\n scope: 'groups:write',\n description: 'Create and archive private channels',\n defaultEnabled: true,\n },\n {\n scope: 'groups:write.invites',\n description: 'Invite users to private channels',\n defaultEnabled: true,\n },\n {\n scope: 'groups:write.topic',\n description: 'Set private channel topics',\n defaultEnabled: true,\n },\n {\n scope: 'im:write',\n description: 'Start DM conversations',\n defaultEnabled: true,\n },\n {\n scope: 'im:write.topic',\n description: 'Set DM topics',\n defaultEnabled: true,\n },\n {\n scope: 'mpim:write',\n description: 'Start group DM conversations',\n defaultEnabled: true,\n },\n {\n scope: 'mpim:write.topic',\n description: 'Set group DM topics',\n defaultEnabled: true,\n },\n // Users & Team\n {\n scope: 'users:read',\n description: 'View user information',\n defaultEnabled: true,\n },\n {\n scope: 'users:read.email',\n description: 'View user emails',\n defaultEnabled: true,\n },\n {\n scope: 'users:write',\n description: 'Set bot presence status',\n defaultEnabled: true,\n },\n {\n scope: 'users.profile:read',\n description: 'View detailed user profiles',\n defaultEnabled: true,\n },\n {\n scope: 'team:read',\n description: 'View workspace info',\n defaultEnabled: true,\n },\n {\n scope: 'usergroups:read',\n description: 'View user groups',\n defaultEnabled: true,\n },\n {\n scope: 'usergroups:write',\n description: 'Manage user groups',\n defaultEnabled: true,\n },\n {\n scope: 'dnd:read',\n description: 'View Do Not Disturb status',\n defaultEnabled: true,\n },\n // Reactions\n {\n scope: 'reactions:read',\n description: 'View emoji reactions',\n defaultEnabled: true,\n },\n {\n scope: 'reactions:write',\n description: 'Add emoji reactions',\n defaultEnabled: true,\n },\n // Files\n {\n scope: 'files:read',\n description: 'View shared files',\n defaultEnabled: true,\n },\n {\n scope: 'files:write',\n description: 'Upload files',\n defaultEnabled: true,\n },\n {\n scope: 'remote_files:read',\n description: 'View remote files',\n defaultEnabled: true,\n },\n {\n scope: 'remote_files:write',\n description: 'Manage remote files',\n defaultEnabled: true,\n },\n {\n scope: 'remote_files:share',\n description: 'Share remote files',\n defaultEnabled: true,\n },\n // Pins & Bookmarks\n {\n scope: 'pins:read',\n description: 'View pinned messages',\n defaultEnabled: true,\n },\n {\n scope: 'pins:write',\n description: 'Pin messages',\n defaultEnabled: true,\n },\n {\n scope: 'bookmarks:read',\n description: 'View bookmarks',\n defaultEnabled: true,\n },\n {\n scope: 'bookmarks:write',\n description: 'Add bookmarks',\n defaultEnabled: true,\n },\n // Links\n {\n scope: 'links:read',\n description: 'View link metadata',\n defaultEnabled: true,\n },\n {\n scope: 'links:write',\n description: 'Unfurl links',\n defaultEnabled: true,\n },\n {\n scope: 'links.embed:write',\n description: 'Embed video players',\n defaultEnabled: true,\n },\n // Canvases & Lists\n {\n scope: 'canvases:read',\n description: 'Read Slack canvases',\n defaultEnabled: true,\n },\n {\n scope: 'canvases:write',\n description: 'Create and edit canvases',\n defaultEnabled: true,\n },\n {\n scope: 'lists:read',\n description: 'Read Slack lists',\n defaultEnabled: true,\n },\n {\n scope: 'lists:write',\n description: 'Manage Slack lists',\n defaultEnabled: true,\n },\n // Calls\n {\n scope: 'calls:read',\n description: 'View call information',\n defaultEnabled: true,\n },\n {\n scope: 'calls:write',\n description: 'Start and manage calls',\n defaultEnabled: true,\n },\n // Reminders\n {\n scope: 'reminders:read',\n description: 'View reminders',\n defaultEnabled: true,\n },\n {\n scope: 'reminders:write',\n description: 'Create reminders',\n defaultEnabled: true,\n },\n // Slack Connect\n {\n scope: 'conversations.connect:read',\n description: 'View Slack Connect events',\n defaultEnabled: true,\n },\n {\n scope: 'conversations.connect:write',\n description: 'Create Slack Connect invites',\n defaultEnabled: true,\n },\n {\n scope: 'conversations.connect:manage',\n description: 'Manage Slack Connect channels',\n defaultEnabled: true,\n },\n // Commands\n {\n scope: 'commands',\n description: 'Use slash commands',\n defaultEnabled: true,\n },\n // Metadata & Emoji\n {\n scope: 'metadata.message:read',\n description: 'Read message metadata',\n defaultEnabled: true,\n },\n {\n scope: 'emoji:read',\n description: 'View custom emoji',\n defaultEnabled: true,\n },\n // Assistant\n {\n scope: 'assistant:write',\n description: 'Respond in Slack AI threads',\n defaultEnabled: true,\n },\n // Search\n {\n scope: 'search:read.files',\n description: 'Search files',\n defaultEnabled: true,\n },\n {\n scope: 'search:read.public',\n description: 'Search public channels',\n defaultEnabled: true,\n },\n {\n scope: 'search:read.users',\n description: 'Search for users',\n defaultEnabled: true,\n },\n // Team Preferences\n {\n scope: 'team.preferences:read',\n description: 'Read workspace preferences',\n defaultEnabled: true,\n },\n ],\n },\n },\n },\n airtable: {\n name: 'airtable',\n displayName: 'Airtable',\n credentialTypes: {\n [CredentialType.AIRTABLE_OAUTH]: {\n displayName: 'Airtable (OAuth)',\n defaultScopes: [\n 'data.records:read',\n 'data.records:write',\n 'data.recordComments:read',\n 'data.recordComments:write',\n 'schema.bases:read',\n 'schema.bases:write',\n 'user.email:read',\n 'webhook:manage',\n ],\n description:\n 'Connect to Airtable with OAuth for full API access including webhooks',\n scopeDescriptions: [\n {\n scope: 'data.records:read',\n description: 'See the data in records',\n defaultEnabled: true,\n },\n {\n scope: 'data.records:write',\n description: 'Create, edit, and delete records',\n defaultEnabled: true,\n },\n {\n scope: 'data.recordComments:read',\n description: 'See comments in records',\n defaultEnabled: true,\n },\n {\n scope: 'data.recordComments:write',\n description: 'Create, edit, and delete record comments',\n defaultEnabled: true,\n },\n {\n scope: 'schema.bases:read',\n description:\n 'See the structure of a base, like table names or field types',\n defaultEnabled: true,\n },\n {\n scope: 'schema.bases:write',\n description:\n 'Edit the structure of a base, like adding new fields or tables',\n defaultEnabled: true,\n },\n {\n scope: 'user.email:read',\n description: \"See the user's email address\",\n defaultEnabled: true,\n },\n {\n scope: 'webhook:manage',\n description:\n 'View, create, delete webhooks for a base, as well as fetch webhook payloads',\n defaultEnabled: true,\n },\n ],\n },\n },\n },\n};\n\n/**\n * Get the OAuth provider for a specific credential type\n * Safely maps credential types to their OAuth providers\n */\nexport function getOAuthProvider(\n credentialType: CredentialType\n): OAuthProvider | null {\n for (const [providerName, config] of Object.entries(OAUTH_PROVIDERS)) {\n if (config.credentialTypes[credentialType]) {\n return providerName as OAuthProvider;\n }\n }\n return null;\n}\n\n/**\n * Check if a credential type is OAuth-based\n */\nexport function isOAuthCredential(credentialType: CredentialType): boolean {\n return getOAuthProvider(credentialType) !== null;\n}\n\n/**\n * Get scope descriptions for a specific credential type\n * Returns an array of scope descriptions that will be requested during OAuth\n */\nexport function getScopeDescriptions(\n credentialType: CredentialType\n): ScopeDescription[] {\n const provider = getOAuthProvider(credentialType);\n if (!provider) {\n return [];\n }\n\n const providerConfig = OAUTH_PROVIDERS[provider];\n const credentialConfig = providerConfig?.credentialTypes[credentialType];\n\n if (!credentialConfig?.scopeDescriptions) {\n // Fallback: create descriptions from scope URLs if not explicitly defined\n return (\n credentialConfig?.defaultScopes.map((scope) => ({\n scope,\n description: `Access: ${scope}`,\n defaultEnabled: true, // Default to enabled if in defaultScopes\n })) || []\n );\n }\n\n return credentialConfig.scopeDescriptions;\n}\n\n/**\n * Get default (non-admin) scopes for a specific credential type\n * Returns only the scopes that don't require admin approval\n */\nexport function getDefaultScopes(credentialType: CredentialType): string[] {\n const provider = getOAuthProvider(credentialType);\n if (!provider) {\n return [];\n }\n\n const providerConfig = OAUTH_PROVIDERS[provider];\n const credentialConfig = providerConfig?.credentialTypes[credentialType];\n\n return credentialConfig?.defaultScopes || [];\n}\n\n/**\n * Get admin scopes for a specific credential type\n * Returns only the scopes that require admin/workspace admin approval\n */\nexport function getAdminScopes(credentialType: CredentialType): string[] {\n const provider = getOAuthProvider(credentialType);\n if (!provider) {\n return [];\n }\n\n const providerConfig = OAUTH_PROVIDERS[provider];\n const credentialConfig = providerConfig?.credentialTypes[credentialType];\n\n return credentialConfig?.adminScopes || [];\n}\n\n/**\n * Browser session provider name - for BrowserBase-powered authentication\n */\nexport type BrowserSessionProvider = 'browserbase';\n\n/**\n * Browser session credential type configuration\n */\nexport interface BrowserSessionCredentialConfig {\n displayName: string;\n description: string;\n targetUrl: string; // URL to navigate to for authentication\n cookieDomain: string; // Domain filter for captured cookies\n}\n\n/**\n * Browser session provider configuration\n */\nexport interface BrowserSessionProviderConfig {\n name: BrowserSessionProvider;\n displayName: string;\n credentialTypes: Partial<\n Record<CredentialType, BrowserSessionCredentialConfig>\n >;\n}\n\n/**\n * Browser session provider configurations - for credentials that use BrowserBase\n * browser sessions instead of OAuth or API keys\n */\nexport const BROWSER_SESSION_PROVIDERS: Record<\n BrowserSessionProvider,\n BrowserSessionProviderConfig\n> = {\n browserbase: {\n name: 'browserbase',\n displayName: 'BrowserBase',\n credentialTypes: {\n [CredentialType.AMAZON_CRED]: {\n displayName: 'Amazon Account',\n description:\n 'Log into Amazon to enable cart, order, and purchase automation',\n targetUrl: 'https://www.amazon.com',\n cookieDomain: 'amazon',\n },\n [CredentialType.LINKEDIN_CRED]: {\n displayName: 'LinkedIn Account',\n description:\n 'Log into LinkedIn to enable connection requests and messaging automation',\n targetUrl: 'https://www.linkedin.com',\n cookieDomain: 'linkedin',\n },\n },\n },\n};\n\n/**\n * Get the browser session provider for a specific credential type\n */\nexport function getBrowserSessionProvider(\n credentialType: CredentialType\n): BrowserSessionProvider | null {\n for (const [providerName, config] of Object.entries(\n BROWSER_SESSION_PROVIDERS\n )) {\n if (config.credentialTypes[credentialType]) {\n return providerName as BrowserSessionProvider;\n }\n }\n return null;\n}\n\n/**\n * Check if a credential type uses browser session authentication (BrowserBase)\n */\nexport function isBrowserSessionCredential(\n credentialType: CredentialType\n): boolean {\n return getBrowserSessionProvider(credentialType) !== null;\n}\n\n/**\n * Maps bubble names to their accepted credential types\n */\nexport type CredentialOptions = Partial<Record<CredentialType, string>>;\n\n/**\n * Credential options for a bubble - array of credential types.\n * Use CredentialType.CREDENTIAL_WILDCARD to indicate the bubble accepts any credential.\n */\nexport type BubbleCredentialOption = CredentialType[];\n\n/**\n * Collection of credential options for all bubbles\n */\nexport const BUBBLE_CREDENTIAL_OPTIONS: Record<\n BubbleName,\n BubbleCredentialOption\n> = {\n 'ai-agent': [\n CredentialType.OPENAI_CRED,\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.FIRECRAWL_API_KEY,\n CredentialType.OPENROUTER_CRED,\n ],\n postgresql: [CredentialType.DATABASE_CRED],\n slack: [CredentialType.SLACK_CRED],\n telegram: [CredentialType.TELEGRAM_BOT_TOKEN],\n resend: [CredentialType.RESEND_CRED],\n 'database-analyzer': [CredentialType.DATABASE_CRED],\n 'slack-notifier': [\n CredentialType.SLACK_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.ANTHROPIC_CRED,\n ],\n 'slack-formatter-agent': [\n CredentialType.OPENAI_CRED,\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.ANTHROPIC_CRED,\n ],\n 'slack-data-assistant': [\n CredentialType.DATABASE_CRED,\n CredentialType.SLACK_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.ANTHROPIC_CRED,\n ],\n 'hello-world': [],\n http: [CredentialType.CREDENTIAL_WILDCARD], // Accepts any credential type for flexible API integrations\n 'get-bubble-details-tool': [],\n 'get-trigger-detail-tool': [],\n 'list-bubbles-tool': [],\n 'sql-query-tool': [CredentialType.DATABASE_CRED],\n 'chart-js-tool': [],\n 'bubbleflow-validation-tool': [],\n 'code-edit-tool': [CredentialType.OPENROUTER_CRED],\n 'web-search-tool': [CredentialType.FIRECRAWL_API_KEY],\n 'web-scrape-tool': [CredentialType.FIRECRAWL_API_KEY],\n 'web-crawl-tool': [\n CredentialType.FIRECRAWL_API_KEY,\n CredentialType.GOOGLE_GEMINI_CRED,\n ],\n 'web-extract-tool': [CredentialType.FIRECRAWL_API_KEY],\n 'research-agent-tool': [\n CredentialType.FIRECRAWL_API_KEY,\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.OPENROUTER_CRED,\n CredentialType.APIFY_CRED,\n ],\n 'reddit-scrape-tool': [],\n 'bubbleflow-code-generator': [],\n 'bubbleflow-generator': [\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENROUTER_CRED,\n ],\n 'pdf-form-operations': [\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.OPENROUTER_CRED,\n ],\n 'pdf-ocr-workflow': [\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.OPENROUTER_CRED,\n ],\n 'generate-document-workflow': [\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.OPENROUTER_CRED,\n ],\n 'parse-document-workflow': [\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.OPENROUTER_CRED,\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n ],\n storage: [\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n ],\n 'google-drive': [CredentialType.GOOGLE_DRIVE_CRED],\n gmail: [CredentialType.GMAIL_CRED],\n 'google-sheets': [CredentialType.GOOGLE_SHEETS_CRED],\n 'google-calendar': [CredentialType.GOOGLE_CALENDAR_CRED],\n apify: [CredentialType.APIFY_CRED],\n 'instagram-tool': [CredentialType.APIFY_CRED],\n 'linkedin-tool': [CredentialType.APIFY_CRED],\n 'tiktok-tool': [CredentialType.APIFY_CRED],\n 'twitter-tool': [CredentialType.APIFY_CRED],\n 'google-maps-tool': [CredentialType.APIFY_CRED],\n 'youtube-tool': [CredentialType.APIFY_CRED],\n github: [CredentialType.GITHUB_TOKEN],\n 'eleven-labs': [CredentialType.ELEVENLABS_API_KEY],\n followupboss: [CredentialType.FUB_CRED],\n 'agi-inc': [CredentialType.AGI_API_KEY],\n airtable: [CredentialType.AIRTABLE_CRED, CredentialType.AIRTABLE_OAUTH],\n notion: [CredentialType.NOTION_OAUTH_TOKEN],\n firecrawl: [CredentialType.FIRECRAWL_API_KEY],\n 'insforge-db': [\n CredentialType.INSFORGE_BASE_URL,\n CredentialType.INSFORGE_API_KEY,\n ],\n browserbase: [\n CredentialType.AMAZON_CRED,\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n ],\n 'amazon-shopping-tool': [\n CredentialType.AMAZON_CRED,\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n ],\n crustdata: [CredentialType.CRUSTDATA_API_KEY],\n 'company-enrichment-tool': [CredentialType.CRUSTDATA_API_KEY],\n 'people-search-tool': [\n CredentialType.CRUSTDATA_API_KEY,\n CredentialType.FULLENRICH_API_KEY,\n ],\n jira: [CredentialType.JIRA_CRED],\n ashby: [CredentialType.ASHBY_CRED],\n fullenrich: [CredentialType.FULLENRICH_API_KEY],\n 'linkedin-connection-tool': [\n CredentialType.LINKEDIN_CRED,\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n ],\n stripe: [CredentialType.STRIPE_CRED],\n};\n\n// POST /credentials - Create credential schema\nexport const createCredentialSchema = z\n .object({\n credentialType: z.nativeEnum(CredentialType).openapi({\n description: 'Type of credential to store',\n example: CredentialType.OPENAI_CRED,\n }),\n value: z.string().min(1).openapi({\n description: 'The credential value (will be encrypted)',\n example: 'sk-1234567890abcdef',\n }),\n name: z.string().optional().openapi({\n description: 'Optional user-friendly name for the credential',\n example: 'My OpenAI Key',\n }),\n skipValidation: z.boolean().optional().openapi({\n description:\n 'Skip credential validation before storing (for testing/admin use)',\n example: false,\n }),\n credentialConfigurations: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({\n description:\n 'Optional configurations for credential validation (e.g., ignoreSSL for PostgreSQL)',\n example: { ignoreSSL: true },\n }),\n metadata: databaseMetadataSchema.optional().openapi({\n description:\n 'Optional metadata for the credential (e.g., database schema for DATABASE_CRED)',\n example: {\n tables: {\n users: {\n id: 'integer',\n email: 'character varying',\n created_at: 'timestamp with time zone',\n },\n },\n rules: [\n {\n id: 'rule-1',\n text: 'No direct DELETE on users table',\n enabled: true,\n createdAt: '2024-01-01T00:00:00Z',\n updatedAt: '2024-01-01T00:00:00Z',\n },\n ],\n },\n }),\n })\n .openapi('CreateCredentialRequest');\n\n// PUT /credentials/:id - Update credential schema\nexport const updateCredentialSchema = z\n .object({\n value: z.string().optional().openapi({\n description:\n 'The credential value (will be encrypted). Leave empty to keep current value.',\n example: 'sk-1234567890abcdef',\n }),\n name: z.string().optional().openapi({\n description: 'Optional user-friendly name for the credential',\n example: 'My OpenAI Key',\n }),\n skipValidation: z.boolean().optional().openapi({\n description:\n 'Skip credential validation before storing (for testing/admin use)',\n example: false,\n }),\n credentialConfigurations: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({\n description:\n 'Optional configurations for credential validation (e.g., ignoreSSL for PostgreSQL)',\n example: { ignoreSSL: true },\n }),\n metadata: databaseMetadataSchema.optional().openapi({\n description:\n 'Optional metadata for the credential (e.g., database schema for DATABASE_CRED)',\n example: {\n tables: {\n users: {\n id: 'integer',\n email: 'character varying',\n created_at: 'timestamp with time zone',\n },\n },\n },\n }),\n })\n .openapi('UpdateCredentialRequest');\n// GET /credentials - List credentials response\nexport const credentialResponseSchema = z\n .object({\n id: z.number().openapi({ description: 'Credential ID' }),\n credentialType: z.string().openapi({ description: 'Type of credential' }),\n name: z.string().optional().openapi({ description: 'Credential name' }),\n metadata: z\n .union([\n databaseMetadataSchema,\n jiraOAuthMetadataSchema,\n slackOAuthMetadataSchema,\n airtableOAuthMetadataSchema,\n ])\n .optional()\n .openapi({\n description:\n 'Credential metadata (DatabaseMetadata, JiraOAuthMetadata, SlackOAuthMetadata, or AirtableOAuthMetadata)',\n }),\n createdAt: z.string().openapi({ description: 'Creation timestamp' }),\n\n // OAuth-specific fields\n isOauth: z\n .boolean()\n .optional()\n .openapi({ description: 'Whether this is an OAuth credential' }),\n oauthProvider: z\n .string()\n .optional()\n .openapi({ description: 'OAuth provider name' }),\n oauthExpiresAt: z\n .string()\n .optional()\n .openapi({ description: 'OAuth token expiration timestamp' }),\n oauthScopes: z\n .array(z.string())\n .optional()\n .openapi({ description: 'OAuth scopes granted' }),\n oauthStatus: z\n .enum(['active', 'expired', 'needs_refresh'])\n .optional()\n .openapi({ description: 'OAuth token status' }),\n\n // Browser session-specific fields\n isBrowserSession: z\n .boolean()\n .optional()\n .openapi({ description: 'Whether this is a browser session credential' }),\n browserbaseSessionData: z\n .object({\n capturedAt: z.string(),\n cookieCount: z.number(),\n domain: z.string(),\n })\n .optional()\n .openapi({ description: 'Browser session metadata' }),\n\n // Master/Child credential relationship (for Slack OAuth)\n masterCredentialId: z.number().optional().openapi({\n description:\n 'ID of the master credential this credential uses for tokens (null means this is a master)',\n }),\n })\n .openapi('CredentialResponse');\n\n// POST /credentials - Create credential response\nexport const createCredentialResponseSchema = z\n .object({\n id: z.number().openapi({ description: 'Credential ID' }),\n message: z.string().openapi({ description: 'Success message' }),\n })\n .openapi('CreateCredentialResponse');\n\n// PUT /credentials/:id - Update credential response\nexport const updateCredentialResponseSchema = z\n .object({\n id: z.number().openapi({ description: 'Credential ID' }),\n message: z.string().openapi({ description: 'Success message' }),\n })\n .openapi('UpdateCredentialResponse');\n\n// General success message response (used by DELETE /credentials/:id, DELETE /bubble-flow/:id, PUT /bubble-flow/:id)\nexport const successMessageResponseSchema = z\n .object({\n message: z.string().openapi({ description: 'Success message' }),\n })\n .openapi('SuccessMessageResponse');\n\n// BrowserBase session schemas\nexport const browserbaseSessionCreateRequestSchema = z\n .object({\n credentialType: z.nativeEnum(CredentialType).openapi({\n description: 'Type of credential requiring browser authentication',\n example: CredentialType.AMAZON_CRED,\n }),\n name: z.string().optional().openapi({\n description: 'User-friendly name for the credential',\n example: 'My Amazon Account',\n }),\n })\n .openapi('BrowserbaseSessionCreateRequest');\n\nexport const browserbaseSessionCreateResponseSchema = z\n .object({\n sessionId: z.string().openapi({\n description: 'BrowserBase session ID',\n }),\n debugUrl: z.string().openapi({\n description: 'URL to open for manual browser interaction',\n }),\n contextId: z.string().openapi({\n description: 'BrowserBase context ID for session persistence',\n }),\n state: z.string().openapi({\n description: 'State token for CSRF protection',\n }),\n })\n .openapi('BrowserbaseSessionCreateResponse');\n\nexport const browserbaseSessionCompleteRequestSchema = z\n .object({\n sessionId: z.string().openapi({\n description: 'BrowserBase session ID to complete',\n }),\n state: z.string().openapi({\n description: 'State token for verification',\n }),\n name: z.string().optional().openapi({\n description: 'User-friendly name for the credential',\n }),\n })\n .openapi('BrowserbaseSessionCompleteRequest');\n\nexport const browserbaseSessionCompleteResponseSchema = z\n .object({\n id: z.number().openapi({\n description: 'Created credential ID',\n }),\n message: z.string().openapi({\n description: 'Success message',\n }),\n })\n .openapi('BrowserbaseSessionCompleteResponse');\n\nexport const browserbaseSessionReopenRequestSchema = z\n .object({\n credentialId: z.number().openapi({\n description: 'ID of the credential to reopen session for',\n }),\n })\n .openapi('BrowserbaseSessionReopenRequest');\n\nexport const browserbaseSessionReopenResponseSchema = z\n .object({\n sessionId: z.string().openapi({\n description: 'BrowserBase session ID',\n }),\n debugUrl: z.string().openapi({\n description: 'URL to open for manual browser interaction',\n }),\n })\n .openapi('BrowserbaseSessionReopenResponse');\n\nexport type CreateCredentialRequest = z.infer<typeof createCredentialSchema>;\nexport type UpdateCredentialRequest = z.infer<typeof updateCredentialSchema>;\nexport type CredentialResponse = z.infer<typeof credentialResponseSchema>;\nexport type CreateCredentialResponse = z.infer<\n typeof createCredentialResponseSchema\n>;\nexport type UpdateCredentialResponse = z.infer<\n typeof updateCredentialResponseSchema\n>;\nexport type BrowserbaseSessionCreateRequest = z.infer<\n typeof browserbaseSessionCreateRequestSchema\n>;\nexport type BrowserbaseSessionCreateResponse = z.infer<\n typeof browserbaseSessionCreateResponseSchema\n>;\nexport type BrowserbaseSessionCompleteRequest = z.infer<\n typeof browserbaseSessionCompleteRequestSchema\n>;\nexport type BrowserbaseSessionCompleteResponse = z.infer<\n typeof browserbaseSessionCompleteResponseSchema\n>;\nexport type BrowserbaseSessionReopenRequest = z.infer<\n typeof browserbaseSessionReopenRequestSchema\n>;\nexport type BrowserbaseSessionReopenResponse = z.infer<\n typeof browserbaseSessionReopenResponseSchema\n>;\n","import { z } from 'zod';\nimport { CredentialType, BubbleName } from './types';\n\n// Bubble parameter type enum\nexport enum BubbleParameterType {\n STRING = 'string',\n NUMBER = 'number',\n BOOLEAN = 'boolean',\n OBJECT = 'object',\n ARRAY = 'array',\n ENV = 'env',\n VARIABLE = 'variable',\n EXPRESSION = 'expression',\n UNKNOWN = 'unknown',\n}\n\n// Credential configuration mappings - defines what configurations are available for each credential type\nexport const CREDENTIAL_CONFIGURATION_MAP: Record<\n CredentialType,\n Record<string, BubbleParameterType>\n> = {\n [CredentialType.DATABASE_CRED]: {\n ignoreSSL: BubbleParameterType.BOOLEAN,\n },\n [CredentialType.TELEGRAM_BOT_TOKEN]: {},\n [CredentialType.AGI_API_KEY]: {},\n [CredentialType.FUB_CRED]: {},\n [CredentialType.OPENAI_CRED]: {},\n [CredentialType.GOOGLE_GEMINI_CRED]: {},\n [CredentialType.ANTHROPIC_CRED]: {},\n [CredentialType.FIRECRAWL_API_KEY]: {},\n [CredentialType.SLACK_CRED]: {},\n [CredentialType.RESEND_CRED]: {},\n [CredentialType.OPENROUTER_CRED]: {},\n [CredentialType.CLOUDFLARE_R2_ACCESS_KEY]: {},\n [CredentialType.CLOUDFLARE_R2_SECRET_KEY]: {},\n [CredentialType.CLOUDFLARE_R2_ACCOUNT_ID]: {},\n [CredentialType.APIFY_CRED]: {},\n [CredentialType.ELEVENLABS_API_KEY]: {},\n [CredentialType.GOOGLE_DRIVE_CRED]: {},\n [CredentialType.GMAIL_CRED]: {},\n [CredentialType.GOOGLE_SHEETS_CRED]: {},\n [CredentialType.GOOGLE_CALENDAR_CRED]: {},\n [CredentialType.GITHUB_TOKEN]: {},\n [CredentialType.AIRTABLE_CRED]: {},\n [CredentialType.AIRTABLE_OAUTH]: {},\n [CredentialType.NOTION_OAUTH_TOKEN]: {},\n [CredentialType.INSFORGE_BASE_URL]: {},\n [CredentialType.INSFORGE_API_KEY]: {},\n [CredentialType.CUSTOM_AUTH_KEY]: {},\n [CredentialType.AMAZON_CRED]: {},\n [CredentialType.LINKEDIN_CRED]: {},\n [CredentialType.CRUSTDATA_API_KEY]: {},\n [CredentialType.JIRA_CRED]: {},\n [CredentialType.ASHBY_CRED]: {},\n [CredentialType.FULLENRICH_API_KEY]: {},\n [CredentialType.STRIPE_CRED]: {},\n [CredentialType.CREDENTIAL_WILDCARD]: {}, // Wildcard marker, not a real credential\n};\n\n// Fixed list of bubble names that need context injection\nexport const BUBBLE_NAMES_WITH_CONTEXT_INJECTION = [\n 'database-analyzer',\n 'slack-data-assistant',\n];\n\n// Zod schemas for validation and type inference\nexport const BubbleParameterTypeSchema = z.nativeEnum(BubbleParameterType);\n\nexport const BubbleParameterSchema = z.object({\n location: z.optional(\n z.object({\n startLine: z.number(),\n startCol: z.number(),\n endLine: z.number(),\n endCol: z.number(),\n })\n ),\n variableId: z\n .number()\n .optional()\n .describe('The variable id of the parameter'),\n name: z.string().describe('The name of the parameter'),\n value: z\n .union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.unknown()),\n z.array(z.unknown()),\n ])\n .describe('The value of the parameter'),\n type: BubbleParameterTypeSchema,\n /**\n * Source of the parameter - indicates whether it came from an object literal property\n * or represents the entire first argument. Used to determine if spread pattern should be applied.\n * Ex.\n * const abc = '1234567890';\n * new GoogleDriveBubble({\n * fileId: abc,\n * })\n * source: 'object-property',\n *\n * new GoogleDriveBubble({\n * url: 'https://www.google.com',\n * ...args,\n * })\n * source: 'spread',\n *\n * source = 'first-arg'\n * new GoogleDriveBubble(args)\n */\n source: z\n .enum(['object-property', 'first-arg', 'spread'])\n .optional()\n .describe(\n 'Source of the parameter - indicates if it came from an object literal property, represents the entire first argument, or came from a spread operator'\n ),\n});\n\n// Bubble parameter from backend parser (derived from Zod schema - single source of truth)\nexport type BubbleParameter = z.infer<typeof BubbleParameterSchema>;\n\n// Parsed bubble from backend parser (matches backend ParsedBubble interface)\nexport interface ParsedBubble {\n variableName: string;\n bubbleName: BubbleName; // This comes from the registry (e.g., 'postgresql', 'slack')\n className: string; // This is the actual class name (e.g., 'PostgreSQLBubble', 'SlackBubble')\n parameters: BubbleParameter[];\n hasAwait: boolean; // Whether the original expression was awaited\n hasActionCall: boolean; // Whether the original expression called .action()\n dependencies?: BubbleName[];\n dependencyGraph?: DependencyGraphNode;\n}\n// Nested dependency graph node for a bubble\nexport interface DependencyGraphNode {\n name: BubbleName;\n /** Optional variable name for this node instance, when available */\n variableName?: string;\n nodeType: BubbleNodeType;\n /**\n * Unique hierarchical ID path for the node within a flow.\n * Constructed as parentUniqueId + \".\" + bubbleName + \"#\" + ordinal.\n * Root nodes can omit or use empty string for the parent portion.\n */\n uniqueId?: string;\n /**\n * Variable id assigned by the parser/scope manager if available.\n * Root bubble nodes will carry their declaration variable id; synthetic/child nodes\n * inferred from dependencies may be assigned a negative synthetic id.\n */\n variableId?: number;\n dependencies: DependencyGraphNode[];\n /**\n * Custom tool functions parsed as FunctionCallWorkflowNode.\n * Used when an ai-agent has customTools with func properties containing bubble instantiations.\n */\n functionCallChildren?: FunctionCallWorkflowNode[];\n}\n\n// Detailed dependency specification for factory metadata\nexport interface BubbleDependencySpec {\n name: BubbleName;\n // If this dependency is an ai-agent, include its tool dependencies\n tools?: BubbleName[];\n}\n\nexport type BubbleNodeType = 'service' | 'tool' | 'workflow' | 'unknown';\n\nexport const BubbleNodeTypeSchema = z.enum([\n 'service',\n 'tool',\n 'workflow',\n 'unknown',\n]);\n\nexport const DependencyGraphNodeSchema: z.ZodType<DependencyGraphNode> = z.lazy(\n () =>\n z.object({\n name: z.string() as z.ZodType<BubbleName>,\n variableName: z.string().optional(),\n nodeType: BubbleNodeTypeSchema,\n uniqueId: z.string().optional(),\n variableId: z.number().optional(),\n dependencies: z.array(DependencyGraphNodeSchema),\n // Use lazy reference since FunctionCallWorkflowNodeSchema is defined later\n functionCallChildren: z\n .lazy(() => z.array(FunctionCallWorkflowNodeSchema))\n .optional(),\n })\n);\n\nexport const ParsedBubbleSchema = z.object({\n variableName: z.string(),\n bubbleName: z.string() as z.ZodType<BubbleName>,\n className: z.string(),\n parameters: z.array(BubbleParameterSchema),\n hasAwait: z.boolean(),\n hasActionCall: z.boolean(),\n dependencies: z.array(z.string() as z.ZodType<BubbleName>).optional(),\n dependencyGraph: DependencyGraphNodeSchema.optional(),\n});\n\nexport const BubbleDependencySpecSchema = z.object({\n name: z.string() as z.ZodType<BubbleName>,\n tools: z.array(z.string() as z.ZodType<BubbleName>).optional(),\n});\n\nexport const ParsedBubbleWithInfoSchema = z.object({\n variableName: z.string(),\n bubbleName: z.string() as z.ZodType<BubbleName>,\n className: z.string(),\n parameters: z.array(BubbleParameterSchema),\n hasAwait: z.boolean(),\n hasActionCall: z.boolean(),\n dependencies: z.array(z.string() as z.ZodType<BubbleName>).optional(),\n dependencyGraph: DependencyGraphNodeSchema.optional(),\n variableId: z.number(),\n nodeType: BubbleNodeTypeSchema,\n location: z.object({\n startLine: z.number(),\n startCol: z.number(),\n endLine: z.number(),\n endCol: z.number(),\n }),\n description: z.string().optional(),\n invocationCallSiteKey: z.string().optional(),\n clonedFromVariableId: z.number().optional(),\n isInsideCustomTool: z.boolean().optional(),\n containingCustomToolId: z.string().optional(),\n});\n\nexport type ParsedBubbleWithInfo = z.infer<typeof ParsedBubbleWithInfoSchema>;\n// Inferred types from Zod schemas\nexport type BubbleParameterTypeInferred = z.infer<\n typeof BubbleParameterTypeSchema\n>;\n// Keep for backwards compatibility - now just an alias\nexport type BubbleParameterInferred = BubbleParameter;\nexport type BubbleNodeTypeInferred = z.infer<typeof BubbleNodeTypeSchema>;\nexport type DependencyGraphNodeInferred = z.infer<\n typeof DependencyGraphNodeSchema\n>;\nexport type ParsedBubbleInferred = z.infer<typeof ParsedBubbleSchema>;\nexport type BubbleDependencySpecInferred = z.infer<\n typeof BubbleDependencySpecSchema\n>;\nexport type ParsedBubbleWithInfoInferred = z.infer<\n typeof ParsedBubbleWithInfoSchema\n>;\n\n// Workflow node types for hierarchical workflow representation\nexport type WorkflowNodeType =\n | 'bubble'\n | 'if'\n | 'for'\n | 'while'\n | 'try_catch'\n | 'variable_declaration'\n | 'return'\n | 'function_call'\n | 'code_block'\n | 'parallel_execution'\n | 'transformation_function';\n\nexport interface BubbleWorkflowNode {\n type: 'bubble';\n variableId: number; // Reference to bubble in ParsedWorkflow.bubbles map\n}\n\nexport interface ControlFlowWorkflowNode {\n type: 'if' | 'for' | 'while';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n condition?: string; // For if/for/while conditions\n children: WorkflowNode[];\n elseBranch?: WorkflowNode[]; // For if statements\n thenTerminates?: boolean; // True if then branch contains return/throw\n elseTerminates?: boolean; // True if else branch contains return/throw\n}\n\nexport interface TryCatchWorkflowNode {\n type: 'try_catch';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n children: WorkflowNode[]; // Try block\n catchBlock?: WorkflowNode[]; // Catch block\n}\n\nexport interface CodeBlockWorkflowNode {\n type: 'code_block';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n code: string; // The actual code snippet\n children: WorkflowNode[]; // Nested bubbles/control flow within this block\n}\n\nexport interface VariableDeclarationBlockNode {\n type: 'variable_declaration';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n code: string; // The variable declarations code\n variables: Array<{\n name: string;\n type: 'const' | 'let' | 'var';\n hasInitializer: boolean;\n }>;\n children: WorkflowNode[];\n}\n\nexport interface ReturnWorkflowNode {\n type: 'return';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n code: string; // The return statement code\n value?: string; // Extracted return value expression (optional, for easier access)\n children: WorkflowNode[]; // Rare, but return could contain nested structures\n}\n\nexport interface FunctionCallWorkflowNode {\n type: 'function_call';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n functionName: string; // e.g., \"processData\"\n isMethodCall: boolean; // true for this.method(), false for helper()\n description?: string; // Method description from code comments\n arguments?: string; // The arguments as code string\n code: string; // Full call expression code\n variableId: number; // Unique variable ID for tracking execution (added for logging consistency)\n variableDeclaration?: {\n // If this function call is part of a variable declaration\n variableName: string;\n variableType: 'const' | 'let' | 'var';\n };\n methodDefinition?: {\n // If method definition found in class\n location: {\n startLine: number;\n endLine: number;\n };\n isAsync: boolean;\n parameters: string[]; // Parameter names\n };\n children: WorkflowNode[]; // If method definition found, expand its body here\n}\n\nexport interface ParallelExecutionWorkflowNode {\n type: 'parallel_execution';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n code: string; // Full Promise.all() code\n variableDeclaration?: {\n // If this parallel execution is part of a variable declaration\n variableNames: string[]; // Array destructuring names\n variableType: 'const' | 'let' | 'var';\n };\n children: WorkflowNode[]; // Parallel tasks (function calls inside Promise.all)\n}\n\nexport interface TransformationFunctionWorkflowNode {\n type: 'transformation_function';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n code: string; // Entire function call code\n functionName: string; // e.g., \"validateInput\"\n isMethodCall: boolean; // true for this.method(), false for helper()\n description?: string; // Method description from code comments\n arguments?: string; // The arguments as code string\n variableId: number; // Unique variable ID for tracking execution\n variableDeclaration?: {\n // If this function call is part of a variable declaration\n variableName: string;\n variableType: 'const' | 'let' | 'var';\n };\n methodDefinition?: {\n // If method definition found in class\n location: {\n startLine: number;\n endLine: number;\n };\n isAsync: boolean;\n parameters: string[]; // Parameter names\n };\n}\n\nexport type WorkflowNode =\n | BubbleWorkflowNode\n | ControlFlowWorkflowNode\n | TryCatchWorkflowNode\n | CodeBlockWorkflowNode\n | VariableDeclarationBlockNode\n | ReturnWorkflowNode\n | FunctionCallWorkflowNode\n | ParallelExecutionWorkflowNode\n | TransformationFunctionWorkflowNode;\n\nexport interface ParsedWorkflow {\n root: WorkflowNode[];\n bubbles: Record<number, ParsedBubbleWithInfo>; // Keep for backward compatibility\n}\n\n// Zod schemas for workflow nodes\nexport const WorkflowNodeTypeSchema = z.enum([\n 'bubble',\n 'if',\n 'for',\n 'while',\n 'try_catch',\n 'variable_declaration',\n 'return',\n 'function_call',\n 'code_block',\n 'parallel_execution',\n 'transformation_function',\n]);\n\nexport const LocationSchema = z.object({\n startLine: z.number(),\n startCol: z.number(),\n endLine: z.number(),\n endCol: z.number(),\n});\n\nexport const BubbleWorkflowNodeSchema: z.ZodType<BubbleWorkflowNode> = z.object(\n {\n type: z.literal('bubble'),\n variableId: z.number(),\n }\n);\n\nexport const ControlFlowWorkflowNodeSchema: z.ZodType<ControlFlowWorkflowNode> =\n z.lazy(() =>\n z.object({\n type: z.enum(['if', 'for', 'while']),\n location: LocationSchema,\n condition: z.string().optional(),\n children: z.array(WorkflowNodeSchema),\n elseBranch: z.array(WorkflowNodeSchema).optional(),\n thenTerminates: z.boolean().optional(),\n elseTerminates: z.boolean().optional(),\n })\n );\n\nexport const TryCatchWorkflowNodeSchema: z.ZodType<TryCatchWorkflowNode> =\n z.lazy(() =>\n z.object({\n type: z.literal('try_catch'),\n location: LocationSchema,\n children: z.array(WorkflowNodeSchema),\n catchBlock: z.array(WorkflowNodeSchema).optional(),\n })\n );\n\nexport const CodeBlockWorkflowNodeSchema: z.ZodType<CodeBlockWorkflowNode> =\n z.lazy(() =>\n z.object({\n type: z.literal('code_block'),\n location: LocationSchema,\n code: z.string(),\n children: z.array(WorkflowNodeSchema),\n })\n );\n\nexport const VariableDeclarationBlockNodeSchema: z.ZodType<VariableDeclarationBlockNode> =\n z.lazy(() =>\n z.object({\n type: z.literal('variable_declaration'),\n location: LocationSchema,\n code: z.string(),\n variables: z.array(\n z.object({\n name: z.string(),\n type: z.enum(['const', 'let', 'var']),\n hasInitializer: z.boolean(),\n })\n ),\n children: z.array(WorkflowNodeSchema),\n })\n );\n\nexport const ReturnWorkflowNodeSchema: z.ZodType<ReturnWorkflowNode> = z.lazy(\n () =>\n z.object({\n type: z.literal('return'),\n location: LocationSchema,\n code: z.string(),\n value: z.string().optional(),\n children: z.array(WorkflowNodeSchema),\n })\n);\n\nexport const FunctionCallWorkflowNodeSchema: z.ZodType<FunctionCallWorkflowNode> =\n z.lazy(() =>\n z.object({\n type: z.literal('function_call'),\n location: LocationSchema,\n functionName: z.string(),\n isMethodCall: z.boolean(),\n description: z.string().optional(),\n arguments: z.string().optional(),\n code: z.string(),\n variableId: z.number(),\n variableDeclaration: z\n .object({\n variableName: z.string(),\n variableType: z.enum(['const', 'let', 'var']),\n })\n .optional(),\n methodDefinition: z\n .object({\n location: z.object({\n startLine: z.number(),\n endLine: z.number(),\n }),\n isAsync: z.boolean(),\n parameters: z.array(z.string()),\n })\n .optional(),\n children: z.array(WorkflowNodeSchema),\n })\n );\n\nexport const ParallelExecutionWorkflowNodeSchema: z.ZodType<ParallelExecutionWorkflowNode> =\n z.lazy(() =>\n z.object({\n type: z.literal('parallel_execution'),\n location: LocationSchema,\n code: z.string(),\n variableDeclaration: z\n .object({\n variableNames: z.array(z.string()),\n variableType: z.enum(['const', 'let', 'var']),\n })\n .optional(),\n children: z.array(WorkflowNodeSchema),\n })\n );\n\nexport const TransformationFunctionWorkflowNodeSchema: z.ZodType<TransformationFunctionWorkflowNode> =\n z.object({\n type: z.literal('transformation_function'),\n location: LocationSchema,\n code: z.string(),\n functionName: z.string(),\n isMethodCall: z.boolean(),\n description: z.string().optional(),\n arguments: z.string().optional(),\n variableId: z.number(),\n variableDeclaration: z\n .object({\n variableName: z.string(),\n variableType: z.enum(['const', 'let', 'var']),\n })\n .optional(),\n methodDefinition: z\n .object({\n location: z.object({\n startLine: z.number(),\n endLine: z.number(),\n }),\n isAsync: z.boolean(),\n parameters: z.array(z.string()),\n })\n .optional(),\n });\n\nexport const WorkflowNodeSchema: z.ZodType<WorkflowNode> = z.lazy(() =>\n z.union([\n BubbleWorkflowNodeSchema,\n ControlFlowWorkflowNodeSchema,\n TryCatchWorkflowNodeSchema,\n CodeBlockWorkflowNodeSchema,\n VariableDeclarationBlockNodeSchema,\n ReturnWorkflowNodeSchema,\n FunctionCallWorkflowNodeSchema,\n ParallelExecutionWorkflowNodeSchema,\n TransformationFunctionWorkflowNodeSchema,\n ])\n);\n\nexport const ParsedWorkflowSchema = z.object({\n root: z.array(WorkflowNodeSchema),\n bubbles: z.record(z.number(), ParsedBubbleWithInfoSchema),\n});\n","import { z } from 'zod';\n\n/**\n * Generate a UUID v4 compatible with both Node.js and browser environments\n */\nfunction generateUUID(): string {\n // Use crypto.randomUUID if available (modern browsers and Node.js 14.17+)\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback for older environments\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// Base interface that all bubble operation results must extend, at individual bubble level\nexport interface BubbleOperationResult {\n success: boolean;\n error: string;\n}\n\n// Final bubble execution result\nexport interface BubbleResult<T> extends BubbleOperationResult {\n data: T;\n executionId: string;\n timestamp: Date;\n}\n\n/**\n * Utility class for generating mock data from Zod schemas\n * Useful for testing, development, and creating sample data\n */\nexport class MockDataGenerator {\n /**\n * Generate a complete mock BubbleResult from a result schema\n */\n static generateMockResult<TResult extends BubbleOperationResult>(\n resultSchema: z.ZodObject<z.ZodRawShape>\n ): BubbleResult<TResult> {\n const mockData = this.generateMockFromSchema(resultSchema);\n\n return {\n success: true,\n data: mockData as TResult,\n executionId: generateUUID(),\n error: '',\n timestamp: new Date(),\n };\n }\n\n /**\n * Generate mock data from JSON Schema\n * Converts JSON Schema to mock data with realistic values\n */\n static generateMockFromJsonSchema(\n jsonSchema: Record<string, unknown>\n ): Record<string, unknown> {\n const mockData: Record<string, unknown> = {};\n\n if (!jsonSchema || typeof jsonSchema !== 'object') {\n return mockData;\n }\n\n // Handle object type with properties\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n const properties = jsonSchema.properties as Record<string, unknown>;\n\n for (const [key, propertySchema] of Object.entries(properties)) {\n if (propertySchema && typeof propertySchema === 'object') {\n const value = this.generateMockValueFromJsonSchema(\n propertySchema as Record<string, unknown>\n );\n if (value !== undefined) {\n mockData[key] = value;\n }\n }\n }\n }\n\n return mockData;\n }\n\n /**\n * Generate a mock value for a specific JSON Schema property\n */\n static generateMockValueFromJsonSchema(\n schema: Record<string, unknown>\n ): unknown {\n const type = schema.type as string;\n\n switch (type) {\n case 'string': {\n if (schema.enum && Array.isArray(schema.enum)) {\n return schema.enum[Math.floor(Math.random() * schema.enum.length)];\n }\n if (schema.format === 'email') {\n return 'test@example.com';\n }\n if (schema.format === 'date-time') {\n return new Date().toISOString();\n }\n if (schema.format === 'uuid') {\n return generateUUID();\n }\n const minLength =\n typeof schema.minLength === 'number' ? schema.minLength : 1;\n const maxLength =\n typeof schema.maxLength === 'number' ? schema.maxLength : 10;\n const length =\n Math.floor(Math.random() * (maxLength - minLength + 1)) + minLength;\n return (\n 'sample_' +\n Math.random()\n .toString(36)\n .substring(2, 2 + length)\n );\n }\n\n case 'number':\n case 'integer': {\n const min = typeof schema.minimum === 'number' ? schema.minimum : 0;\n const max = typeof schema.maximum === 'number' ? schema.maximum : 100;\n const value = Math.random() * (max - min) + min;\n return type === 'integer'\n ? Math.floor(value)\n : Math.round(value * 100) / 100;\n }\n\n case 'boolean': {\n return Math.random() > 0.5;\n }\n\n case 'array': {\n const items = schema.items as Record<string, unknown>;\n if (items) {\n const minItems =\n typeof schema.minItems === 'number' ? schema.minItems : 1;\n const maxItems =\n typeof schema.maxItems === 'number' ? schema.maxItems : 3;\n const length =\n Math.floor(Math.random() * (maxItems - minItems + 1)) + minItems;\n\n return Array.from({ length }, () =>\n this.generateMockValueFromJsonSchema(items)\n );\n }\n return [];\n }\n\n case 'object': {\n return this.generateMockFromJsonSchema(schema);\n }\n\n default: {\n return null;\n }\n }\n }\n\n /**\n * Generate mock data object from a Zod schema\n * Recursively handles nested objects, arrays, and primitive types\n */\n static generateMockFromSchema(\n schema: z.ZodObject<z.ZodRawShape>\n ): Record<string, unknown> {\n const mockData: Record<string, unknown> = {};\n\n if (!schema || typeof schema !== 'object' || !('shape' in schema)) {\n return mockData;\n }\n\n const shape = schema.shape;\n\n for (const [key, zodType] of Object.entries(shape)) {\n if (key === 'success' || key === 'error') {\n // Skip these as they're handled by the wrapper\n continue;\n }\n\n if (zodType && typeof zodType === 'object' && '_def' in zodType) {\n const value = this.generateMockValue(zodType as z.ZodTypeAny);\n if (value !== undefined) {\n mockData[key] = value;\n }\n }\n }\n\n return mockData;\n }\n\n /**\n * Generate a mock value for a specific Zod type\n */\n static generateMockValue(zodType: z.ZodTypeAny): unknown {\n const def = zodType._def;\n\n switch (def.typeName) {\n case 'ZodString': {\n return this.generateMockString(def);\n }\n\n case 'ZodNumber': {\n return this.generateMockNumber(def);\n }\n\n case 'ZodBoolean': {\n return Math.random() > 0.5;\n }\n\n case 'ZodDate': {\n return new Date();\n }\n\n case 'ZodArray': {\n const elementType = def.type;\n if (elementType) {\n const arrayLength = Math.floor(Math.random() * 3) + 1; // 1-3 elements\n return Array.from({ length: arrayLength }, () =>\n this.generateMockValue(elementType)\n );\n }\n return [];\n }\n\n case 'ZodObject': {\n if ('shape' in zodType) {\n const nestedMock: Record<string, unknown> = {};\n const shape = (zodType as z.ZodObject<z.ZodRawShape>).shape;\n\n for (const [key, value] of Object.entries(shape)) {\n if (value && typeof value === 'object' && '_def' in value) {\n const nestedValue = this.generateMockValue(value as z.ZodTypeAny);\n if (nestedValue !== undefined) {\n nestedMock[key] = nestedValue;\n }\n }\n }\n\n return nestedMock;\n }\n return {};\n }\n\n case 'ZodOptional': {\n // 70% chance to include optional fields\n if (Math.random() > 0.3) {\n return this.generateMockValue(def.innerType);\n }\n return undefined;\n }\n\n case 'ZodDefault': {\n // 50% chance to use default, 50% to generate mock value\n if (Math.random() > 0.5) {\n return def.defaultValue();\n }\n return this.generateMockValue(def.innerType);\n }\n\n case 'ZodEnum': {\n const values = def.values as readonly unknown[];\n return values[Math.floor(Math.random() * values.length)];\n }\n\n case 'ZodLiteral': {\n return def.value;\n }\n\n case 'ZodUnion': {\n const options = def.options as z.ZodTypeAny[];\n const randomOption =\n options[Math.floor(Math.random() * options.length)];\n return this.generateMockValue(randomOption);\n }\n\n case 'ZodDiscriminatedUnion': {\n const discriminatedOptions = def.options as z.ZodTypeAny[];\n const randomDiscriminatedOption =\n discriminatedOptions[\n Math.floor(Math.random() * discriminatedOptions.length)\n ];\n return this.generateMockValue(randomDiscriminatedOption);\n }\n\n case 'ZodRecord': {\n const recordMock: Record<string, unknown> = {};\n const numKeys = Math.floor(Math.random() * 3) + 1; // 1-3 keys\n\n for (let i = 0; i < numKeys; i++) {\n const key = `key${i + 1}`;\n const value = this.generateMockValue(def.valueType);\n if (value !== undefined) {\n recordMock[key] = value;\n }\n }\n\n return recordMock;\n }\n\n case 'ZodNullable': {\n // 80% chance to have value, 20% chance to be null\n if (Math.random() > 0.2) {\n return this.generateMockValue(def.innerType);\n }\n return null;\n }\n\n default: {\n // For unknown types, return a generic value\n console.warn(`Unknown Zod type for mock generation: ${def.typeName}`);\n return `mock_${def.typeName}`;\n }\n }\n }\n\n /**\n * Generate mock string values with format-specific handling\n */\n private static generateMockString(def: Record<string, unknown>): string {\n if (def.checks) {\n for (const check of def.checks as Array<Record<string, unknown>>) {\n switch (check.kind) {\n case 'email': {\n return 'test@example.com';\n }\n case 'url': {\n return 'https://example.com';\n }\n case 'uuid': {\n return generateUUID();\n }\n case 'regex': {\n // For regex patterns, try to generate simple matching strings\n const pattern = check.regex as RegExp;\n if (pattern.source.includes('\\\\d+')) {\n return '12345';\n }\n if (pattern.source.includes('[a-z]')) {\n return 'abcde';\n }\n return 'mock_regex_match';\n }\n case 'min': {\n return 'a'.repeat(check.value as number);\n }\n case 'max': {\n return 'mock'.substring(0, check.value as number);\n }\n }\n }\n }\n return 'mock string';\n }\n\n /**\n * Generate mock number values respecting constraints\n */\n private static generateMockNumber(def: Record<string, unknown>): number {\n let min = 0;\n let max = 100;\n let isInt = false;\n\n if (def.checks) {\n for (const check of def.checks as Array<Record<string, unknown>>) {\n switch (check.kind) {\n case 'min': {\n min = check.value as number;\n break;\n }\n case 'max': {\n max = check.value as number;\n break;\n }\n case 'int': {\n isInt = true;\n break;\n }\n }\n }\n }\n\n const value = Math.random() * (max - min) + min;\n return isInt ? Math.floor(value) : Math.round(value * 100) / 100;\n }\n\n /**\n * Generate mock data with custom seed for reproducible results\n */\n static generateMockWithSeed<TResult extends BubbleOperationResult>(\n resultSchema: z.ZodObject<z.ZodRawShape>,\n seed: number\n ): BubbleResult<TResult> {\n // Simple seeded random number generator\n let currentSeed = seed;\n const seededRandom = () => {\n currentSeed = (currentSeed * 9301 + 49297) % 233280;\n return currentSeed / 233280;\n };\n\n // Temporarily override Math.random\n const originalRandom = Math.random;\n Math.random = seededRandom;\n\n try {\n const mockData = this.generateMockFromSchema(resultSchema);\n\n // Generate executionId using crypto (not affected by seeded random)\n // to ensure execution IDs are always unique even with the same seed\n const executionId = generateUUID();\n\n return {\n success: true,\n data: mockData as TResult,\n executionId,\n error: '',\n timestamp: new Date(),\n };\n } finally {\n // Restore original Math.random\n Math.random = originalRandom;\n }\n }\n}\n","// ========================= OAuth Schemas =========================\nimport { z } from '@hono/zod-openapi';\nimport { CredentialType } from './types';\n\n// OAuth initiation request schema\nexport const oauthInitiateRequestSchema = z\n .object({\n credentialType: z.nativeEnum(CredentialType).openapi({\n description: 'The type of credential to create',\n example: CredentialType.GOOGLE_DRIVE_CRED,\n }),\n name: z.string().optional().openapi({\n description: 'Optional name for the credential',\n example: 'My Google Drive',\n }),\n scopes: z\n .array(z.string())\n .optional()\n .openapi({\n description:\n 'Optional OAuth scopes to request (defaults based on credential type)',\n example: ['https://www.googleapis.com/auth/drive.readonly'],\n }),\n })\n .openapi('OAuthInitiateRequest');\n\n// OAuth initiation response schema\nexport const oauthInitiateResponseSchema = z\n .object({\n authUrl: z.string().url().openapi({\n description: 'OAuth authorization URL to redirect user to',\n example: 'https://accounts.google.com/oauth2/auth?client_id=...',\n }),\n state: z.string().openapi({\n description: 'CSRF protection state parameter',\n example: 'abc123-def456-ghi789',\n }),\n })\n .openapi('OAuthInitiateResponse');\n\n// OAuth callback request schema (for POST callback with credential details)\nexport const oauthCallbackRequestSchema = z\n .object({\n code: z.string().openapi({\n description: 'OAuth authorization code from provider',\n example: 'abc123def456',\n }),\n state: z.string().openapi({\n description: 'CSRF protection state parameter',\n example: 'abc123-def456-ghi789',\n }),\n name: z.string().openapi({\n description: 'Name for the credential',\n example: 'My Google Drive',\n }),\n description: z.string().optional().openapi({\n description: 'Optional description for the credential',\n }),\n })\n .openapi('OAuthCallbackRequest');\n\n// OAuth token refresh response schema\nexport const oauthTokenRefreshResponseSchema = z\n .object({\n message: z.string().openapi({\n description: 'Success message',\n example: 'Token refreshed successfully',\n }),\n })\n .openapi('OAuthTokenRefreshResponse');\n\n// OAuth revoke response schema\nexport const oauthRevokeResponseSchema = z\n .object({\n message: z.string().openapi({\n description: 'Success message',\n example: 'Credential revoked successfully',\n }),\n })\n .openapi('OAuthRevokeResponse');\n\n// Export OAuth TypeScript types\nexport type OAuthInitiateRequest = z.infer<typeof oauthInitiateRequestSchema>;\nexport type OAuthInitiateResponse = z.infer<typeof oauthInitiateResponseSchema>;\nexport type OAuthCallbackRequest = z.infer<typeof oauthCallbackRequestSchema>;\nexport type OAuthTokenRefreshResponse = z.infer<\n typeof oauthTokenRefreshResponseSchema\n>;\nexport type OAuthRevokeResponse = z.infer<typeof oauthRevokeResponseSchema>;\n","import { z } from '@hono/zod-openapi';\n// ============================================================================\n// JOIN WAITLIST SCHEMAS\n// ============================================================================\n\n// POST /join-waitlist - Join waitlist request schema\nexport const joinWaitlistSchema = z\n .object({\n name: z.string().min(1, 'Name is required').openapi({\n description: 'Full name of the user',\n example: 'John Doe',\n }),\n email: z.string().email('Valid email is required').openapi({\n description: 'Email address of the user',\n example: 'john.doe@example.com',\n }),\n database: z.string().min(1, 'Database selection is required').openapi({\n description: 'Database type the user wants to use',\n example: 'postgres',\n }),\n otherDatabase: z.string().optional().openapi({\n description: 'Other database type if \"other\" was selected',\n example: 'Redis',\n }),\n })\n .openapi('JoinWaitlistRequest');\n\n// POST /join-waitlist - Join waitlist response schema\nexport const joinWaitlistResponseSchema = z\n .object({\n success: z.boolean().openapi({\n description: 'Whether the request was successful',\n example: true,\n }),\n message: z.string().openapi({\n description: 'Success message',\n example:\n 'Successfully joined the waitlist! Check your email for next steps.',\n }),\n })\n .openapi('JoinWaitlistResponse');\n\n// Export TypeScript types\nexport type JoinWaitlistRequest = z.infer<typeof joinWaitlistSchema>;\nexport type JoinWaitlistResponse = z.infer<typeof joinWaitlistResponseSchema>;\n","import { z } from '@hono/zod-openapi';\nimport {\n ParsedBubbleWithInfoSchema,\n ParsedBubbleSchema,\n BubbleParameterType,\n ParsedWorkflowSchema,\n} from './bubble-definition-schema.js';\nimport { CredentialType } from './types.js';\nimport type { BubbleName } from './types.js';\nimport { flowRoleSchema } from './permission-schema.js';\n// POST /bubble-flow - Create new BubbleFlow schema (with code)\nexport const createBubbleFlowSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'Name of the BubbleFlow',\n example: 'My First BubbleFlow',\n }),\n description: z.string().optional().openapi({\n description: 'Optional description of what this BubbleFlow does',\n example: 'A flow that processes webhook data',\n }),\n prompt: z.string().optional().openapi({\n description: 'Optional prompt used to generate the flow',\n example:\n 'Create a flow that processes webhook data and sends notifications',\n }),\n code: z.string().min(1).openapi({\n description: 'TypeScript code that defines the BubbleFlow class',\n example: 'export class MyFlow extends BubbleFlow { ... }',\n }),\n eventType: z.string().min(1).openapi({\n description: 'Event type this BubbleFlow responds to',\n example: 'webhook/http',\n }),\n webhookPath: z\n .string()\n .min(1)\n .max(50)\n .regex(/^[a-zA-Z0-9-_]+$/)\n .optional()\n .openapi({\n description: 'Custom webhook path (auto-generated if not provided)',\n example: 'my-webhook',\n }),\n webhookActive: z.boolean().default(false).optional().openapi({\n description: 'Whether the webhook should be active immediately',\n example: true,\n }),\n bubbleParameters: z\n .record(z.string(), ParsedBubbleWithInfoSchema)\n .optional()\n .openapi({\n description:\n 'Optional pre-parsed bubble parameters with descriptions (from AI generation). If provided, will be used instead of re-parsing the code.',\n }),\n triggerCredentialId: z.number().nullable().optional().openapi({\n description:\n 'ID of credential for trigger authentication (e.g., Slack OAuth)',\n }),\n })\n .openapi('CreateBubbleFlowRequest');\n\n// POST /bubble-flow - Create empty BubbleFlow schema (for async generation)\nexport const createEmptyBubbleFlowSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'Name of the BubbleFlow',\n example: 'My First BubbleFlow',\n }),\n description: z.string().optional().openapi({\n description: 'Optional description of what this BubbleFlow does',\n example: 'A flow that processes webhook data',\n }),\n prompt: z.string().openapi({\n description: 'Prompt used to generate the flow code asynchronously',\n example:\n 'Create a flow that processes webhook data and sends notifications',\n }),\n eventType: z.string().min(1).openapi({\n description: 'Event type this BubbleFlow responds to',\n example: 'webhook/http',\n }),\n webhookPath: z\n .string()\n .min(1)\n .max(50)\n .regex(/^[a-zA-Z0-9-_]+$/)\n .optional()\n .openapi({\n description: 'Custom webhook path (auto-generated if not provided)',\n example: 'my-webhook',\n }),\n webhookActive: z.boolean().default(false).optional().openapi({\n description: 'Whether the webhook should be active immediately',\n example: true,\n }),\n triggerCredentialId: z.number().nullable().optional().openapi({\n description:\n 'ID of credential for trigger authentication (e.g., Slack OAuth)',\n }),\n })\n .openapi('CreateEmptyBubbleFlowRequest');\n\n// POST /:id/execute - Execute BubbleFlow schema\nexport const executeBubbleFlowSchema = z\n .record(z.string(), z.unknown())\n .openapi('ExecuteBubbleFlowRequest');\n\n// PUT /bubble-flow/:id - Update BubbleFlow parameters schema\nexport const updateBubbleFlowParametersSchema = z\n .object({\n bubbleParameters: z.record(\n z.string(),\n z.union([ParsedBubbleWithInfoSchema, ParsedBubbleSchema])\n ),\n })\n .openapi('UpdateBubbleFlowParametersRequest');\n\n// PATCH /bubble-flow/:id/name - Update BubbleFlow name schema\nexport const updateBubbleFlowNameSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'New name for the BubbleFlow',\n example: 'My Updated Flow',\n }),\n })\n .openapi('UpdateBubbleFlowNameRequest');\n\n// ============================================================================\n// RESPONSE SCHEMAS (Output Types)\n// ============================================================================\n\n// POST /bubble-flow - Create BubbleFlow response (with code)\nexport const createBubbleFlowResponseSchema = z\n .object({\n id: z.number().openapi({\n description: 'ID of the created BubbleFlow',\n example: 123,\n }),\n message: z.string().openapi({\n description: 'Success message',\n example: 'BubbleFlow created successfully',\n }),\n inputSchema: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({\n description: 'Input schema',\n example: {\n name: 'string',\n age: 'number',\n },\n }),\n bubbleParameters: z.record(z.string(), ParsedBubbleWithInfoSchema).openapi({\n description: 'Parsed bubble parameters from the BubbleFlow code',\n }),\n workflow: ParsedWorkflowSchema.optional().openapi({\n description: 'Hierarchical workflow structure with control flow',\n }),\n requiredCredentials: z\n .record(z.string(), z.array(z.nativeEnum(CredentialType)))\n .optional()\n .openapi({\n description:\n 'Mapping of bubble names to their required credential types. Uses CREDENTIAL_WILDCARD (\"*\") for bubbles accepting any credential.',\n example: {\n 'database-connection': [CredentialType.DATABASE_CRED],\n 'slack-notification': [CredentialType.SLACK_CRED],\n 'ai-analysis': [CredentialType.GOOGLE_GEMINI_CRED],\n 'http-request': [CredentialType.CREDENTIAL_WILDCARD],\n },\n }),\n eventType: z.string().min(1).openapi({\n description: 'Event type this BubbleFlow responds to',\n example: 'webhook/http',\n }),\n triggerCredentialId: z.number().nullable().optional().openapi({\n description:\n 'ID of credential for trigger authentication (e.g., Slack OAuth)',\n }),\n webhook: z\n .object({\n id: z.number().openapi({ description: 'Webhook ID', example: 456 }),\n url: z.string().openapi({\n description: 'Full webhook URL',\n example: 'http://localhost:3001/webhook/user123/my-webhook',\n }),\n path: z.string().openapi({\n description: 'Webhook path',\n example: 'my-webhook',\n }),\n active: z.boolean().openapi({\n description: 'Whether webhook is active',\n example: true,\n }),\n })\n .optional()\n .openapi({\n description: 'Webhook information (if webhook was created)',\n }),\n })\n .openapi('CreateBubbleFlowResponse');\n\n// POST /bubble-flow - Create empty BubbleFlow response (for async generation)\nexport const createEmptyBubbleFlowResponseSchema = z\n .object({\n id: z.number().openapi({\n description:\n 'ID of the created BubbleFlow (code will be generated asynchronously)',\n example: 123,\n }),\n message: z.string().openapi({\n description: 'Success message',\n example:\n 'BubbleFlow created successfully. Code generation in progress...',\n }),\n webhook: z\n .object({\n id: z.number().openapi({ description: 'Webhook ID', example: 456 }),\n url: z.string().openapi({\n description: 'Full webhook URL',\n example: 'http://localhost:3001/webhook/user123/my-webhook',\n }),\n path: z.string().openapi({\n description: 'Webhook path',\n example: 'my-webhook',\n }),\n active: z.boolean().openapi({\n description: 'Whether webhook is active',\n example: false,\n }),\n })\n .optional()\n .openapi({\n description: 'Webhook information (if webhook was created)',\n }),\n })\n .openapi('CreateEmptyBubbleFlowResponse');\n\n// Used credential schema for credential visibility in shared workflows\nexport const usedCredentialSchema = z\n .object({\n id: z.number().openapi({\n description: 'Credential ID',\n example: 123,\n }),\n name: z.string().openapi({\n description: 'Credential name',\n example: 'My OpenAI Key',\n }),\n type: z.nativeEnum(CredentialType).openapi({\n description: 'Credential type',\n example: CredentialType.OPENAI_CRED,\n }),\n ownerId: z.string().openapi({\n description: 'User ID of the credential owner',\n example: 'user_abc',\n }),\n isMine: z.boolean().openapi({\n description: 'Whether this credential belongs to the current user',\n example: true,\n }),\n })\n .openapi('UsedCredential');\n\nexport type UsedCredential = z.infer<typeof usedCredentialSchema>;\n\n// GET /bubble-flow/:id - Get BubbleFlow details response\nexport const bubbleFlowDetailsResponseSchema = z\n .object({\n id: z.number().openapi({ description: 'BubbleFlow ID' }),\n name: z.string().openapi({ description: 'BubbleFlow name' }),\n description: z.string().optional().openapi({ description: 'Description' }),\n prompt: z\n .string()\n .optional()\n .openapi({ description: 'Original prompt used to generate the flow' }),\n eventType: z.string().openapi({ description: 'Event type' }),\n code: z.string().openapi({ description: 'TypeScript source code' }),\n generationError: z\n .string()\n .nullable()\n .optional()\n .openapi({ description: 'Error message if code generation failed' }),\n inputSchema: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({ description: 'Input schema' }),\n cron: z\n .string()\n .nullable()\n .optional()\n .openapi({ description: 'Cron expression' }),\n cronActive: z\n .boolean()\n .optional()\n .openapi({ description: 'Whether cron scheduling is active' }),\n defaultInputs: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({ description: 'Default inputs for cron scheduling' }),\n isActive: z\n .boolean()\n .openapi({ description: 'Whether the BubbleFlow is active' }),\n organizationId: z.number().optional().openapi({\n description: 'Organization ID this flow belongs to',\n example: 123,\n }),\n requiredCredentials: z\n .record(z.string(), z.array(z.nativeEnum(CredentialType)))\n .openapi({ description: 'Required credentials by bubble' }),\n usedCredentials: z.array(usedCredentialSchema).optional().openapi({\n description:\n 'Credentials used in this flow with metadata (for shared workflow visibility)',\n }),\n displayedBubbleParameters: z\n .record(\n z.string(),\n z.object({\n variableName: z.string(),\n bubbleName: z.string(),\n className: z.string(),\n parameters: z.array(\n z.object({\n name: z.string(),\n value: z.unknown(),\n type: z.nativeEnum(BubbleParameterType),\n })\n ),\n hasAwait: z.boolean(),\n hasActionCall: z.boolean(),\n })\n )\n .optional()\n .openapi({\n description: 'Displayed bubble parameters for visualization',\n }),\n bubbleParameters: z.record(z.string(), ParsedBubbleWithInfoSchema).openapi({\n description: 'Bubble parameters',\n }),\n workflow: ParsedWorkflowSchema.optional().openapi({\n description: 'Hierarchical workflow structure with control flow',\n }),\n metadata: z.record(z.string(), z.unknown()).optional().openapi({\n description:\n 'Flow metadata including conversation messages from generation',\n }),\n permission: z\n .enum(['owner', 'editor', 'runner', 'viewer'])\n .optional()\n .openapi({\n description: 'Current user permission level for this flow',\n example: 'owner',\n }),\n triggerCredentialId: z.number().nullable().optional().openapi({\n description: 'Credential ID for trigger authentication',\n }),\n triggerCredential: usedCredentialSchema.nullable().optional().openapi({\n description:\n 'Trigger credential metadata with owner info (for shared workflow visibility)',\n }),\n createdAt: z.string().openapi({ description: 'Creation timestamp' }),\n updatedAt: z.string().openapi({ description: 'Update timestamp' }),\n webhook_url: z\n .string()\n .openapi({ description: 'Webhook URL for this bubble flow' }),\n })\n .openapi('BubbleFlowDetailsResponse');\n\n// Individual BubbleFlow list item schema\nexport const bubbleFlowListItemSchema = z.object({\n id: z.number().openapi({ description: 'BubbleFlow ID' }),\n name: z.string().openapi({ description: 'BubbleFlow name' }),\n description: z.string().optional().openapi({ description: 'Description' }),\n eventType: z.string().openapi({ description: 'Event type' }),\n isActive: z\n .boolean()\n .openapi({ description: 'Whether the BubbleFlow is active' }),\n cronActive: z\n .boolean()\n .openapi({ description: 'Whether cron scheduling is active' }),\n cronSchedule: z.string().optional().openapi({ description: 'Cron schedule' }),\n webhookExecutionCount: z\n .number()\n .openapi({ description: 'Webhook execution count' }),\n webhookFailureCount: z\n .number()\n .openapi({ description: 'Webhook failure count' }),\n executionCount: z\n .number()\n .openapi({ description: 'Total number of executions in history' }),\n bubbles: z\n .array(\n z.object({\n bubbleName: z\n .string()\n .openapi({ description: 'Bubble name' }) as z.ZodType<BubbleName>,\n className: z.string().openapi({ description: 'Bubble class name' }),\n })\n )\n .optional()\n .openapi({ description: 'List of bubbles used in this flow' }),\n permission: flowRoleSchema.optional().openapi({\n description: 'User permission level for this flow',\n example: 'owner',\n }),\n organizationId: z.number().optional().openapi({\n description: 'Organization ID this flow belongs to',\n example: 123,\n }),\n ownerId: z.string().openapi({\n description: 'User ID of the flow owner',\n example: 'user_abc123',\n }),\n triggerCredentialId: z.number().nullable().optional().openapi({\n description: 'Credential ID for trigger authentication',\n }),\n createdAt: z.string().openapi({ description: 'Creation timestamp' }),\n updatedAt: z.string().openapi({ description: 'Update timestamp' }),\n});\n\n// GET /bubble-flow - List BubbleFlows response with user info\nexport const bubbleFlowListResponseSchema = z.object({\n bubbleFlows: z.array(bubbleFlowListItemSchema).default([]),\n userMonthlyUsage: z\n .object({\n count: z.number().openapi({ description: 'Current monthly usage count' }),\n })\n .openapi({ description: 'User monthly usage information' }),\n});\n// POST /bubble-flow/:id/activate - Activate workflow\nexport const activateBubbleFlowResponseSchema = z\n .object({\n success: z.boolean().openapi({\n description: 'Whether the activation was successful',\n example: true,\n }),\n webhookUrl: z.string().openapi({\n description: 'Webhook URL for the activated workflow',\n example: 'https://api.nodex.dev/webhook/user123/workflow-123',\n }),\n message: z.string().openapi({\n description: 'Success message',\n example: 'Workflow activated successfully! Your Slack bot is now ready.',\n }),\n })\n .openapi('ActivateBubbleFlowResponse');\n\nexport type ActivateBubbleFlowResponse = z.infer<\n typeof activateBubbleFlowResponseSchema\n>;\n// Keep interface for backwards compatibility\nexport type CreateBubbleFlowResponse = z.infer<\n typeof createBubbleFlowResponseSchema\n>;\nexport type CreateBubbleFlowRequest = z.infer<typeof createBubbleFlowSchema>;\nexport type CreateEmptyBubbleFlowRequest = z.infer<\n typeof createEmptyBubbleFlowSchema\n>;\nexport type CreateEmptyBubbleFlowResponse = z.infer<\n typeof createEmptyBubbleFlowResponseSchema\n>;\nexport type ExecuteBubbleFlowRequest = z.infer<typeof executeBubbleFlowSchema>;\n\nexport type UpdateBubbleFlowParametersRequest = z.infer<\n typeof updateBubbleFlowParametersSchema\n>;\nexport type UpdateBubbleFlowParametersResponse = z.infer<\n typeof updateBubbleFlowParametersSchema\n>;\nexport type UpdateBubbleFlowNameRequest = z.infer<\n typeof updateBubbleFlowNameSchema\n>;\nexport type BubbleFlowDetailsResponse = z.infer<\n typeof bubbleFlowDetailsResponseSchema\n>;\n// Response types (derived from response schemas)\nexport type BubbleFlowListResponse = z.infer<\n typeof bubbleFlowListResponseSchema\n>;\nexport type BubbleFlowListItem = z.infer<typeof bubbleFlowListItemSchema>;\n","/**\n * Zod schemas for workflow permission and trash management\n * These are shared between frontend and backend\n */\n\nimport { z } from '@hono/zod-openapi';\n\n// ============================================================================\n// Enums and Base Types\n// ============================================================================\n\nexport const flowRoleSchema = z\n .enum(['owner', 'editor', 'runner', 'viewer'])\n .openapi('FlowRole');\n\nexport type FlowRole = z.infer<typeof flowRoleSchema>;\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nexport const flowPermissionSchema = z\n .object({\n userId: z.string().openapi({\n description: 'User ID',\n example: 'user_123',\n }),\n email: z.string().openapi({\n description: 'User email',\n example: 'user@example.com',\n }),\n name: z.string().nullable().openapi({\n description: 'User display name',\n example: 'John Doe',\n }),\n avatarUrl: z.string().optional().openapi({\n description: 'User avatar URL',\n example: 'https://example.com/avatar.png',\n }),\n role: flowRoleSchema,\n grantedAt: z.string().openapi({\n description: 'ISO timestamp when permission was granted',\n example: '2024-01-01T00:00:00Z',\n }),\n grantedBy: z.string().nullable().openapi({\n description: 'User ID who granted the permission',\n example: 'user_456',\n }),\n })\n .openapi('FlowPermission');\n\nexport type FlowPermission = z.infer<typeof flowPermissionSchema>;\n\nexport const trashedFlowSchema = z\n .object({\n id: z.number().openapi({\n description: 'Flow ID',\n example: 123,\n }),\n name: z.string().openapi({\n description: 'Flow name',\n example: 'My Workflow',\n }),\n organizationId: z.number().nullable().openapi({\n description: 'Organization ID if the flow belongs to an organization',\n example: 456,\n }),\n organizationName: z.string().nullable().openapi({\n description: 'Organization name',\n example: 'My Team',\n }),\n deletedAt: z.string().openapi({\n description: 'ISO timestamp when flow was deleted',\n example: '2024-01-01T00:00:00Z',\n }),\n deletedBy: z.string().nullable().openapi({\n description: 'User ID who deleted the flow',\n example: 'user_123',\n }),\n canRestore: z.boolean().openapi({\n description: 'Whether the current user can restore this flow',\n example: true,\n }),\n canPermanentDelete: z.boolean().openapi({\n description: 'Whether the current user can permanently delete this flow',\n example: false,\n }),\n })\n .openapi('TrashedFlow');\n\nexport type TrashedFlow = z.infer<typeof trashedFlowSchema>;\n\n// ============================================================================\n// Request Schemas\n// ============================================================================\n\nexport const grantPermissionSchema = z\n .object({\n email: z.string().email().optional().openapi({\n description: 'User email to grant permission to',\n example: 'user@example.com',\n }),\n userId: z.string().optional().openapi({\n description: 'User ID to grant permission to',\n example: 'user_123',\n }),\n role: flowRoleSchema,\n })\n .refine((data) => data.email || data.userId, {\n message: 'Either email or userId must be provided',\n })\n .openapi('GrantPermissionRequest');\n\nexport type GrantPermissionRequest = z.infer<typeof grantPermissionSchema>;\n\nexport const updatePermissionSchema = z\n .object({\n role: flowRoleSchema,\n })\n .openapi('UpdatePermissionRequest');\n\nexport type UpdatePermissionRequest = z.infer<typeof updatePermissionSchema>;\n\nexport const transferOwnershipSchema = z\n .object({\n fromUserId: z.string().openapi({\n description: 'Current owner user ID',\n example: 'user_123',\n }),\n toUserId: z.string().openapi({\n description: 'New owner user ID',\n example: 'user_456',\n }),\n })\n .openapi('TransferOwnershipRequest');\n\nexport type TransferOwnershipRequest = z.infer<typeof transferOwnershipSchema>;\n\n// ============================================================================\n// List Permissions Response\n// ============================================================================\n\nexport const listFlowPermissionsResponseSchema = z\n .object({\n permissions: z.array(flowPermissionSchema),\n organizationId: z.number().nullable().openapi({\n description: 'Organization ID if the flow belongs to an organization',\n example: 456,\n }),\n isInTrash: z.boolean().openapi({\n description: 'Whether the flow is in trash',\n example: false,\n }),\n })\n .openapi('ListFlowPermissionsResponse');\n\nexport type ListFlowPermissionsResponse = z.infer<\n typeof listFlowPermissionsResponseSchema\n>;\n\n// ============================================================================\n// Grant Permission Response\n// ============================================================================\n\nexport const grantPermissionResponseSchema = z\n .object({\n userId: z.string(),\n role: flowRoleSchema,\n grantedAt: z.string(),\n })\n .openapi('GrantPermissionResponse');\n\nexport type GrantPermissionResponse = z.infer<\n typeof grantPermissionResponseSchema\n>;\n\n// ============================================================================\n// Update Permission Response\n// ============================================================================\n\nexport const updatePermissionResponseSchema = z\n .object({\n userId: z.string(),\n role: flowRoleSchema,\n updatedAt: z.string(),\n })\n .openapi('UpdatePermissionResponse');\n\nexport type UpdatePermissionResponse = z.infer<\n typeof updatePermissionResponseSchema\n>;\n\n// ============================================================================\n// Transfer Ownership Response\n// ============================================================================\n\nexport const transferOwnershipResponseSchema = z\n .object({\n previousOwner: z.string(),\n newOwner: z.string(),\n transferredAt: z.string(),\n })\n .openapi('TransferOwnershipResponse');\n\nexport type TransferOwnershipResponse = z.infer<\n typeof transferOwnershipResponseSchema\n>;\n\n// ============================================================================\n// Trash List Response\n// ============================================================================\n\nexport const listTrashResponseSchema = z\n .object({\n workflows: z.array(trashedFlowSchema),\n })\n .openapi('ListTrashResponse');\n\nexport type ListTrashResponse = z.infer<typeof listTrashResponseSchema>;\n\n// ============================================================================\n// Restore Flow Response\n// ============================================================================\n\nexport const restoreFlowResponseSchema = z\n .object({\n id: z.number(),\n restoredAt: z.string(),\n message: z.string(),\n })\n .openapi('RestoreFlowResponse');\n\nexport type RestoreFlowResponse = z.infer<typeof restoreFlowResponseSchema>;\n","import { z } from '@hono/zod-openapi';\nimport {\n ParsedBubbleWithInfoSchema,\n ParsedWorkflowSchema,\n} from './bubble-definition-schema';\nimport { CredentialType } from './types';\n\nexport const ServiceUsageSchema = z\n .object({\n service: z.nativeEnum(CredentialType).openapi({\n description: 'Service identifier',\n example: CredentialType.OPENAI_CRED,\n }),\n subService: z.string().optional().openapi({\n description: 'Sub-service identifier',\n example: 'gpt-4',\n }),\n unit: z.string().openapi({\n description: 'Unit type for this service',\n example: 'per_1m_tokens',\n }),\n usage: z.number().openapi({\n description: 'Units used this month',\n example: 2250000,\n }),\n unitCost: z.number().openapi({\n description: 'Bubble Lab price per unit (with multiplier applied)',\n example: 2.1,\n }),\n totalCost: z.number().openapi({\n description: 'Total cost for this service (usage * unitCost)',\n example: 4.725,\n }),\n })\n .openapi('ServiceUsage');\n\nexport type ServiceUsage = z.infer<typeof ServiceUsageSchema>;\n\nexport const ExecutionSummarySchema = z\n .object({\n result: z.any().optional().openapi({\n description: 'Execution result',\n example: 'Execution completed successfully',\n }),\n totalDuration: z.number().openapi({\n description: 'Total execution duration in milliseconds',\n example: 1500,\n }),\n lineExecutionCount: z.number().optional().openapi({\n description: 'Number of lines executed',\n example: 25,\n }),\n bubbleExecutionCount: z.number().optional().openapi({\n description: 'Number of bubbles executed',\n example: 5,\n }),\n errorCount: z.number().optional().openapi({\n description: 'Number of errors encountered',\n example: 0,\n }),\n totalCost: z\n .number()\n .openapi({ description: 'Total cost of the execution' }),\n warningCount: z.number().optional().openapi({\n description: 'Number of warnings encountered',\n example: 1,\n }),\n errors: z\n .array(\n z.object({\n message: z.string().openapi({\n description: 'Error message',\n example: 'Failed to execute bubble',\n }),\n timestamp: z.number().openapi({\n description: 'Error timestamp (Unix timestamp)',\n example: 1703123457000,\n }),\n bubbleName: z.string().optional().openapi({\n description: 'Name of the bubble that caused the error',\n example: 'AIAgentBubble',\n }),\n variableId: z.number().optional().openapi({\n description: 'Variable ID associated with the error',\n example: 1,\n }),\n lineNumber: z.number().optional().openapi({\n description: 'Line number where the error occurred',\n example: 15,\n }),\n additionalData: z.any().optional().openapi({\n description: 'Additional error details',\n }),\n })\n )\n .optional()\n .openapi({\n description: 'Array of errors encountered during execution',\n }),\n warnings: z\n .array(\n z.object({\n message: z.string().openapi({\n description: 'Warning message',\n example: 'Deprecated API usage detected',\n }),\n timestamp: z.number().openapi({\n description: 'Warning timestamp (Unix timestamp)',\n example: 1703123457000,\n }),\n bubbleName: z.string().optional().openapi({\n description: 'Name of the bubble that caused the warning',\n example: 'HttpBubble',\n }),\n variableId: z.number().optional().openapi({\n description: 'Variable ID associated with the warning',\n example: 2,\n }),\n lineNumber: z.number().optional().openapi({\n description: 'Line number where the warning occurred',\n example: 20,\n }),\n additionalData: z.any().optional().openapi({\n description: 'Additional warning details',\n }),\n })\n )\n .optional()\n .openapi({\n description: 'Array of warnings encountered during execution',\n }),\n averageLineExecutionTime: z.number().optional().openapi({\n description: 'Average execution time per line in milliseconds',\n example: 60,\n }),\n slowestLines: z\n .array(\n z.object({\n lineNumber: z.number().openapi({\n description: 'Line number',\n example: 15,\n }),\n duration: z.number().openapi({\n description: 'Execution duration in milliseconds',\n example: 250,\n }),\n message: z.string().openapi({\n description: 'Description of what was executed on this line',\n example: 'API call to external service',\n }),\n })\n )\n .optional()\n .openapi({\n description: 'Array of the slowest executing lines',\n }),\n memoryPeakUsage: z.any().optional().openapi({\n description:\n 'Peak memory usage during execution (NodeJS.MemoryUsage type)',\n }), // NodeJS.MemoryUsage type\n startTime: z.number().optional().openapi({\n description: 'Execution start timestamp (Unix timestamp)',\n example: 1703123456789,\n }),\n endTime: z.number().optional().openapi({\n description: 'Execution end timestamp (Unix timestamp)',\n example: 1703123458289,\n }),\n serviceUsage: z.array(ServiceUsageSchema).optional().openapi({\n description: 'Token usage during execution',\n }),\n serviceUsageByService: z\n .record(z.string(), ServiceUsageSchema)\n .optional()\n .openapi({\n description: 'Service usage breakdown by service',\n }),\n })\n .openapi('ExecutionSummary');\n\nexport type ExecutionSummary = z.infer<typeof ExecutionSummarySchema>;\n\n// BubbleFlow execution history item schema\nexport const bubbleFlowExecutionSchema = z.object({\n id: z.number().openapi({ description: 'Execution ID' }),\n status: z\n .enum(['running', 'success', 'error'])\n .openapi({ description: 'Execution status' }),\n payload: z\n .record(z.string(), z.any())\n .openapi({ description: 'Execution payload' }),\n result: z.any().optional().openapi({ description: 'Execution result data' }),\n error: z\n .string()\n .optional()\n .openapi({ description: 'Error message if failed' }),\n startedAt: z.string().openapi({ description: 'Execution start timestamp' }),\n webhook_url: z.string().openapi({ description: 'Webhook URL' }),\n completedAt: z\n .string()\n .optional()\n .openapi({ description: 'Execution completion timestamp' }),\n code: z.string().optional().openapi({\n description:\n 'The code that was executed (snapshot of the code at execution time)',\n }),\n totalCost: z.number().optional().openapi({\n description: 'Total cost of the execution in credits',\n }),\n});\n\n// GET /bubble-flow/:id/executions - List BubbleFlow executions response\nexport const listBubbleFlowExecutionsResponseSchema = z\n .object({\n items: z.array(bubbleFlowExecutionSchema).openapi({\n description: 'Array of execution records for the current page',\n }),\n total: z.number().openapi({\n description: 'Total number of executions for this flow',\n example: 42,\n }),\n })\n .openapi('ListBubbleFlowExecutionsResponse');\n\nexport type ListBubbleFlowExecutionsResponse = z.infer<\n typeof listBubbleFlowExecutionsResponseSchema\n>;\n\n// GET /bubble-flow/:id/executions/:executionId - Single execution with logs\nexport const bubbleFlowExecutionDetailSchema = bubbleFlowExecutionSchema.extend(\n {\n executionLogs: z.array(z.any()).optional().openapi({\n description: 'Array of streaming log events from the execution',\n }),\n }\n);\n\nexport type BubbleFlowExecutionDetail = z.infer<\n typeof bubbleFlowExecutionDetailSchema\n>;\n\nexport const executeBubbleFlowResponseSchema = z\n .object({\n executionId: z.number().openapi({\n description: 'ID of the execution record',\n example: 789,\n }),\n success: z.boolean().openapi({\n description: 'Whether the execution was successful',\n example: true,\n }),\n data: z\n .any()\n .optional()\n .openapi({\n description: 'Data returned by the BubbleFlow (if successful)',\n example: { result: 'processed successfully', count: 42 },\n }),\n summary: ExecutionSummarySchema.optional().openapi({\n description: 'Execution summary',\n }),\n error: z.string().optional().openapi({\n description: 'Error message (if execution failed)',\n example: 'Validation error in BubbleFlow',\n }),\n })\n .openapi('ExecuteBubbleFlowResponse');\n\nexport type ExecuteBubbleFlowResponse = z.infer<\n typeof executeBubbleFlowResponseSchema\n>;\n\n// ExecutionResult interface for internal use (matches the API response)\nexport type ExecutionResult = ExecuteBubbleFlowResponse;\n\n// Validation schemas\nexport const validateBubbleFlowCodeSchema = z.object({\n code: z.string().min(1).openapi({\n description: 'TypeScript BubbleFlow code to validate',\n example:\n 'export class TestFlow extends BubbleFlow<\"webhook/http\"> { async handle() { return {}; } }',\n }),\n options: z\n .object({\n includeDetails: z.boolean().default(true).openapi({\n description: 'Include detailed bubble analysis',\n }),\n strictMode: z.boolean().default(true).openapi({\n description: 'Enable strict TypeScript validation',\n }),\n syncInputsWithFlow: z.boolean().default(false).openapi({\n description: 'Whether to sync input values with the flow',\n }),\n })\n .optional()\n .openapi({\n description: 'Validation options',\n }),\n flowId: z.number().positive().optional().openapi({\n description:\n 'Optional BubbleFlow ID to update with validation results if user owns the flow',\n example: 123,\n }),\n credentials: z\n .record(z.string(), z.record(z.string(), z.number()))\n .optional()\n .openapi({\n description:\n 'Optional credentials mapping: bubble name -> credential type -> credential ID',\n example: {\n 'slack-sender': {\n SLACK_CRED: 123,\n },\n 'ai-agent': {\n OPENAI_CRED: 456,\n },\n },\n }),\n defaultInputs: z\n .record(z.unknown())\n .optional()\n .openapi({\n description: 'User-filled input values for cron execution',\n example: {\n message: 'Hello World',\n channel: '#general',\n },\n }),\n activateCron: z.boolean().optional().openapi({\n description: 'Whether to activate/deactivate cron scheduling',\n example: true,\n }),\n});\n\nexport const validateBubbleFlowCodeResponseSchema = z.object({\n eventType: z.string().min(1).openapi({\n description: 'Event type this BubbleFlow responds to',\n example: 'webhook/http',\n }),\n webhookPath: z.string().min(1).openapi({\n description: 'Custom webhook path (auto-generated if not provided)',\n example: 'my-webhook',\n }),\n valid: z.boolean().openapi({\n description: 'Whether the code is valid',\n }),\n errors: z.array(z.string()).optional().openapi({\n description: 'List of validation errors if any',\n }),\n bubbleCount: z.number().optional().openapi({\n description: 'Number of bubbles found in the code',\n }),\n inputSchema: z.record(z.string(), z.unknown()).openapi({\n description: 'Input schema',\n example: {\n name: 'string',\n age: 'number',\n },\n }),\n bubbles: z.record(z.string(), ParsedBubbleWithInfoSchema).optional().openapi({\n description: 'Record mapping bubble IDs to their detailed information',\n }),\n workflow: ParsedWorkflowSchema.optional().openapi({\n description: 'Hierarchical workflow structure with control flow',\n }),\n requiredCredentials: z\n .record(z.string(), z.array(z.string()))\n .optional()\n .openapi({\n description: 'Required credentials for the bubbles in the code',\n }),\n metadata: z\n .object({\n validatedAt: z.string().openapi({\n description: 'Timestamp when validation was performed',\n }),\n codeLength: z.number().openapi({\n description: 'Length of the code in characters',\n }),\n strictMode: z.boolean().openapi({\n description: 'Whether strict mode was used',\n }),\n flowUpdated: z.boolean().optional().openapi({\n description:\n 'Whether the BubbleFlow was updated with validation results',\n }),\n })\n .openapi({\n description: 'Validation metadata',\n }),\n cron: z.string().nullable().optional().openapi({\n description: 'Cron expression extracted from code',\n example: '0 0 * * *',\n }),\n cronActive: z.boolean().optional().openapi({\n description: 'Whether cron scheduling is currently active',\n example: false,\n }),\n defaultInputs: z\n .record(z.unknown())\n .optional()\n .openapi({\n description: 'User-filled input values for cron execution',\n example: {\n message: 'Hello World',\n channel: '#general',\n },\n }),\n success: z.boolean(),\n error: z.string(),\n});\nexport type ValidateBubbleFlowResponse = z.infer<\n typeof validateBubbleFlowCodeResponseSchema\n>;\nexport type BubbleFlowExecution = z.infer<typeof bubbleFlowExecutionSchema>;\n","import { ParsedBubbleWithInfoSchema } from './bubble-definition-schema';\nimport { z } from '@hono/zod-openapi';\nimport { BubbleParameterType } from './bubble-definition-schema';\nimport { CredentialType } from './types';\nimport { ServiceUsageSchema } from './bubbleflow-execution-schema';\nimport { CoffeeMessageSchema } from './coffee';\n\n// BubbleFlow generation schemas\nexport const generateBubbleFlowCodeSchema = z.object({\n prompt: z.string().min(1).openapi({\n description: 'Natural language description of the desired BubbleFlow',\n example:\n 'Create a flow that queries my database and sends results to Slack',\n }),\n flowId: z.number().optional().openapi({\n description:\n 'Optional flow ID to update with generated code (for async generation)',\n example: 123,\n }),\n // Coffee agent unified messages (for planning phase)\n messages: z.array(CoffeeMessageSchema).optional().openapi({\n description:\n 'Full conversation history including clarification Q&A, context results, plan approvals',\n }),\n // Plan context (passed to Boba for enriched code generation)\n planContext: z.string().optional().openapi({\n description:\n 'Plan context from Coffee agent (passed to Boba for enriched generation)',\n example: 'Plan: 1. Fetch data from API 2. Process with AI 3. Send to Slack',\n }),\n});\n\nexport const generateBubbleFlowCodeResponseSchema = z.object({\n generatedCode: z.string().openapi({\n description: 'The generated BubbleFlow TypeScript code',\n }),\n isValid: z.boolean().openapi({\n description: 'Whether the generated code is valid',\n }),\n success: z.boolean(),\n error: z.string(),\n bubbleParameters: z.record(z.string(), ParsedBubbleWithInfoSchema).openapi({\n description: 'Parsed bubble parameters from the generated code',\n }),\n requiredCredentials: z.record(z.string(), z.array(z.string())).openapi({\n description: 'Required credentials for the bubbles in the generated code',\n }),\n});\n\n/**\n * Schema for the result of BubbleFlow generation\n * Used by the BubbleFlowGeneratorWorkflow\n */\nexport const GenerationResultSchema = z.object({\n generatedCode: z\n .string()\n .describe('The generated BubbleFlow TypeScript code'),\n isValid: z.boolean().describe('Whether the generated code is valid'),\n success: z.boolean(),\n error: z.string(),\n flowId: z.number().optional().openapi({\n description: 'ID of the generated BubbleFlow',\n example: 123,\n }),\n toolCalls: z\n .array(z.unknown())\n .describe('The tool calls made by the AI agent'),\n summary: z\n .string()\n .default('')\n .describe('High-level instructions for using the validated flow'),\n inputsSchema: z\n .string()\n .default('')\n .describe('JSON Schema (string) representing the inputs of the flow'),\n serviceUsage: z.array(ServiceUsageSchema).optional().openapi({\n description:\n 'Service usage statistics for the generation (array of services used)',\n }),\n bubbleCount: z.number().optional().openapi({\n description: 'Number of bubbles used in the generated flow',\n }),\n codeLength: z.number().optional().openapi({\n description: 'Length of the generated code in characters',\n }),\n bubbleParameters: z\n .record(z.union([z.string(), z.number()]), ParsedBubbleWithInfoSchema)\n .optional()\n .openapi({\n description:\n 'Parsed bubble parameters with descriptions from AI generation',\n }),\n});\n// POST /bubbleflow-template/data-analyst - Generate template from description\nexport const generateBubbleFlowTemplateSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'Name for the workflow',\n example: 'Sam Dix Data Scientist Bot',\n }),\n description: z.string().min(10).max(500).openapi({\n description: 'Description of what the workflow should do',\n example:\n 'A Slack bot that helps analyze user engagement data and provides insights',\n }),\n roles: z.string().min(10).max(1000).openapi({\n description:\n \"Detailed description of the bot's roles and responsibilities\",\n example:\n 'Be prepared to answer any question on user engagement and come up with proactive insights...',\n }),\n useCase: z.literal('slack-data-scientist').openapi({\n description: 'The specific use case template to generate',\n example: 'slack-data-scientist',\n }),\n // Optional configuration parameters\n verbosity: z.enum(['1', '2', '3', '4', '5']).optional().openapi({\n description: 'Response verbosity level (1=concise, 5=comprehensive)',\n example: '3',\n }),\n technicality: z.enum(['1', '2', '3', '4', '5']).optional().openapi({\n description: 'Technical complexity level (1=plain English, 5=expert)',\n example: '2',\n }),\n includeQuery: z.boolean().optional().openapi({\n description: 'Include the SQL query in the response',\n example: true,\n }),\n includeExplanation: z.boolean().optional().openapi({\n description: 'Include query explanation in the response',\n example: true,\n }),\n maxQueries: z.number().optional().openapi({\n description: 'Maximum number of queries to run',\n example: 10,\n }),\n })\n .openapi('GenerateBubbleFlowTemplateRequest');\n\n// POST /bubbleflow-template/document-generation - Generate document processing template\nexport const generateDocumentGenerationTemplateSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'Name for the document processing workflow',\n example: 'Expense Report Generator',\n }),\n description: z\n .string()\n .max(500)\n .default('Document processing workflow')\n .openapi({\n description:\n 'Description of what the document processing workflow should do (optional)',\n example:\n 'Process receipts and invoices to generate structured expense reports',\n }),\n outputDescription: z.string().min(1).max(1000).openapi({\n description:\n 'Detailed description of the desired output format and data extraction',\n example:\n 'Extract expense tracking data with vendor name, transaction date, amount, category, and description',\n }),\n // Optional configuration parameters\n outputFormat: z.enum(['html', 'csv', 'json']).optional().openapi({\n description: 'Default output format for generated documents',\n example: 'html',\n }),\n conversionOptions: z\n .object({\n preserveStructure: z.boolean().optional().openapi({\n description: 'Preserve document structure during parsing',\n example: true,\n }),\n includeVisualDescriptions: z.boolean().optional().openapi({\n description: 'Include descriptions of visual elements',\n example: true,\n }),\n extractNumericalData: z.boolean().optional().openapi({\n description: 'Extract and process numerical data',\n example: true,\n }),\n combinePages: z.boolean().optional().openapi({\n description: 'Combine multiple pages into single output',\n example: true,\n }),\n })\n .optional(),\n imageOptions: z\n .object({\n format: z.enum(['png', 'jpg', 'jpeg']).optional().openapi({\n description: 'Image format for document conversion',\n example: 'png',\n }),\n quality: z.number().min(0.1).max(1.0).optional().openapi({\n description: 'Image quality (0.1 to 1.0)',\n example: 0.9,\n }),\n dpi: z.number().min(72).max(300).optional().openapi({\n description: 'Image DPI for conversion',\n example: 200,\n }),\n })\n .optional(),\n aiOptions: z\n .object({\n model: z.string().optional().openapi({\n description: 'AI model to use for processing',\n example: 'google/gemini-2.5-flash',\n }),\n temperature: z.number().min(0).max(2).optional().openapi({\n description: 'AI model temperature (0 to 2)',\n example: 0.2,\n }),\n maxTokens: z.number().min(1000).max(200000).optional().openapi({\n description: 'Maximum tokens for AI processing',\n example: 90000,\n }),\n jsonMode: z.boolean().optional().openapi({\n description: 'Enable JSON mode for structured output',\n example: false,\n }),\n })\n .optional(),\n metadata: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({\n description:\n 'Additional metadata for the workflow (e.g., outputDescription)',\n example: { outputDescription: 'Extract expense data from receipts' },\n }),\n })\n .openapi('GenerateDocumentGenerationTemplateRequest');\n\n// Response for template generation (extends the regular create response)\nexport const bubbleFlowTemplateResponseSchema = z\n .object({\n id: z.number().openapi({\n description: 'ID of the created BubbleFlow template',\n example: 123,\n }),\n name: z.string().openapi({\n description: 'Name of the BubbleFlow',\n example: 'Sam Dix Data Scientist Bot',\n }),\n description: z.string().openapi({\n description: 'Description of the BubbleFlow',\n example: 'A Slack bot that helps analyze user engagement data',\n }),\n eventType: z.string().openapi({\n description: 'Event type this BubbleFlow responds to',\n example: 'slack/bot_mentioned',\n }),\n displayedBubbleParameters: z.record(\n z.string(),\n z.object({\n variableName: z.string(),\n bubbleName: z.string(),\n className: z.string(),\n parameters: z.array(\n z.object({\n name: z.string(),\n value: z.unknown(),\n type: z.nativeEnum(BubbleParameterType),\n })\n ),\n hasAwait: z.boolean(),\n hasActionCall: z.boolean(),\n })\n ),\n bubbleParameters: z\n .record(\n z.string(),\n z.object({\n variableName: z.string(),\n bubbleName: z.string(),\n className: z.string(),\n parameters: z.array(\n z.object({\n name: z.string(),\n value: z.unknown(),\n type: z.nativeEnum(BubbleParameterType),\n })\n ),\n hasAwait: z.boolean(),\n hasActionCall: z.boolean(),\n })\n )\n .openapi({\n description: 'Parsed bubble parameters from the BubbleFlow code',\n }),\n requiredCredentials: z\n .record(z.string(), z.array(z.nativeEnum(CredentialType)))\n .optional()\n .openapi({\n description:\n 'Mapping of bubble names to their required credential types',\n example: {\n 'database-connection': [CredentialType.DATABASE_CRED],\n 'slack-notification': [CredentialType.SLACK_CRED],\n 'ai-analysis': [CredentialType.GOOGLE_GEMINI_CRED],\n },\n }),\n createdAt: z.string().openapi({\n description: 'ISO timestamp when the template was created',\n example: '2025-01-15T10:30:00.000Z',\n }),\n updatedAt: z.string().openapi({\n description: 'ISO timestamp when the template was last updated',\n example: '2025-01-15T10:30:00.000Z',\n }),\n\n webhook: z\n .object({\n id: z.number().openapi({ description: 'Webhook ID', example: 456 }),\n url: z.string().openapi({\n description: 'Full webhook URL',\n example: 'http://localhost:3001/webhook/user123/my-webhook',\n }),\n path: z.string().openapi({\n description: 'Webhook path',\n example: 'my-webhook',\n }),\n active: z.boolean().openapi({\n description: 'Whether webhook is active',\n example: true,\n }),\n })\n .optional()\n .openapi({\n description: 'Webhook information (if webhook was created)',\n }),\n })\n .openapi('BubbleFlowTemplateResponse');\nexport type GenerateBubbleFlowCodeResponse = z.infer<\n typeof generateBubbleFlowCodeResponseSchema\n>;\nexport type GenerateBubbleFlowTemplateRequest = z.infer<\n typeof generateBubbleFlowTemplateSchema\n>;\nexport type GenerateDocumentGenerationTemplateRequest = z.infer<\n typeof generateDocumentGenerationTemplateSchema\n>;\nexport type BubbleFlowTemplateResponse = z.infer<\n typeof bubbleFlowTemplateResponseSchema\n>;\nexport type GenerationResult = z.infer<typeof GenerationResultSchema>;\n","import { z } from 'zod';\nimport { CredentialType } from './types.js';\n\n// ============================================================================\n// Coffee Agent - Planning Phase for BubbleFlow Generation\n// ============================================================================\n// Coffee runs BEFORE Boba to gather clarification and generate an\n// implementation plan. This helps reduce ambiguity in user requests.\n\n// Constants\nexport const COFFEE_MAX_ITERATIONS = 30;\nexport const COFFEE_MAX_QUESTIONS = 5;\nexport const COFFEE_DEFAULT_MODEL = 'google/gemini-3-pro-preview' as const;\n\n// ============================================================================\n// Clarification Schemas\n// ============================================================================\n\n/** A single choice option for a clarification question */\nexport const ClarificationChoiceSchema = z.object({\n id: z.string().describe('Unique identifier for this choice'),\n label: z.string().describe('Short display label for the choice'),\n description: z\n .string()\n .optional()\n .describe('Optional longer description explaining the choice'),\n});\n\n/** A clarification question with multiple choices */\nexport const ClarificationQuestionSchema = z.object({\n id: z.string().describe('Unique identifier for this question'),\n question: z.string().describe('The question text to display to the user'),\n choices: z\n .array(ClarificationChoiceSchema)\n .min(2)\n .describe('Available choices for the user (minimum 2 options)'),\n context: z\n .string()\n .optional()\n .describe('Optional context explaining why this question is being asked'),\n allowMultiple: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'If true, user can select multiple choices. Default is false (single selection)'\n ),\n});\n\n/** Event sent to frontend containing clarification questions */\nexport const CoffeeClarificationEventSchema = z.object({\n questions: z\n .array(ClarificationQuestionSchema)\n .min(1)\n .max(COFFEE_MAX_QUESTIONS)\n .describe(`List of clarification questions (1-${COFFEE_MAX_QUESTIONS})`),\n});\n\n// ============================================================================\n// Context Gathering Schemas\n// ============================================================================\n\n/**\n * Event sent when Coffee requests external context via running a BubbleFlow.\n * This pauses the planning process until the user provides credentials and approves execution.\n */\nexport const CoffeeRequestExternalContextEventSchema = z.object({\n flowId: z.string().describe('Unique ID for this context request'),\n flowCode: z\n .string()\n .describe('Validated BubbleFlow TypeScript code to execute'),\n requiredCredentials: z\n .array(z.nativeEnum(CredentialType))\n .describe('List of credential types needed to run this flow'),\n description: z\n .string()\n .describe('User-friendly description of what this flow will do'),\n});\n\n/**\n * Answer sent back to Coffee after user provides credentials and flow executes.\n * This is used to resume the planning process with enriched context.\n */\nexport const CoffeeContextAnswerSchema = z.object({\n flowId: z.string().describe('ID of the context request being answered'),\n status: z\n .enum(['success', 'rejected', 'error'])\n .describe(\n 'Status: success (got context), rejected (user skipped), error (execution failed)'\n ),\n result: z\n .unknown()\n .optional()\n .describe('The result data from running the context-gathering flow'),\n error: z.string().optional().describe('Error message if status is error'),\n originalRequest: CoffeeRequestExternalContextEventSchema.optional().describe(\n 'The original context request that triggered this answer'\n ),\n});\n\n/**\n * Context request info that the agent generates when it wants to run a flow.\n */\nexport const CoffeeContextRequestInfoSchema = z.object({\n purpose: z.string().describe('Why this context is needed'),\n flowDescription: z\n .string()\n .describe('User-facing description of what the flow will do'),\n});\n\n/** Legacy context gathering status (used in streaming events) */\nexport const CoffeeContextEventSchema = z.object({\n status: z.enum(['gathering', 'complete']),\n miniFlowDescription: z.string().optional(),\n result: z.string().optional(),\n});\n\n// ============================================================================\n// Plan Schemas\n// ============================================================================\n\n/** A single step in the implementation plan */\nexport const PlanStepSchema = z.object({\n title: z.string().describe('Short title for this step'),\n description: z\n .string()\n .describe('Detailed description of what this step does'),\n bubblesUsed: z\n .array(z.string())\n .optional()\n .describe('Names of bubbles used in this step'),\n});\n\n/** The complete implementation plan generated by Coffee */\nexport const CoffeePlanEventSchema = z.object({\n summary: z.string().describe('Brief overview of the workflow'),\n steps: z.array(PlanStepSchema).describe('Step-by-step implementation plan'),\n estimatedBubbles: z\n .array(z.string())\n .describe('All bubbles that will be used in the workflow'),\n});\n\n// ============================================================================\n// Unified Message Types for Coffee Chat\n// ============================================================================\n// These message types allow Coffee interactions to be stored as persistent\n// messages in the chat history, rather than ephemeral state.\n\n/** Base message structure shared by all message types */\nconst BaseMessageSchema = z.object({\n id: z.string().describe('Unique message identifier'),\n timestamp: z.string().describe('ISO timestamp of message creation'),\n});\n\n/** Regular user text message */\nexport const UserMessageSchema = BaseMessageSchema.extend({\n type: z.literal('user'),\n content: z.string().describe('User message text'),\n});\n\n/** Regular assistant text message */\nexport const AssistantMessageSchema = BaseMessageSchema.extend({\n type: z.literal('assistant'),\n content: z.string().describe('Assistant response text'),\n code: z.string().optional().describe('Generated code if applicable'),\n resultType: z\n .enum(['code', 'question', 'answer', 'reject'])\n .optional()\n .describe('Type of assistant response'),\n bubbleParameters: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Bubble parameters for code responses'),\n});\n\n/** Coffee asking clarification questions */\nexport const ClarificationRequestMessageSchema = BaseMessageSchema.extend({\n type: z.literal('clarification_request'),\n questions: z\n .array(ClarificationQuestionSchema)\n .describe('Questions being asked'),\n});\n\n/** User's answers to clarification questions */\nexport const ClarificationResponseMessageSchema = BaseMessageSchema.extend({\n type: z.literal('clarification_response'),\n answers: z\n .record(z.string(), z.array(z.string()))\n .describe('questionId -> choiceIds'),\n originalQuestions: z\n .array(ClarificationQuestionSchema)\n .optional()\n .describe('The questions that were answered (for display purposes)'),\n});\n\n/** Coffee requesting external context */\nexport const ContextRequestMessageSchema = BaseMessageSchema.extend({\n type: z.literal('context_request'),\n request: CoffeeRequestExternalContextEventSchema.describe(\n 'Context gathering request details'\n ),\n});\n\n/** User's response to context request */\nexport const ContextResponseMessageSchema = BaseMessageSchema.extend({\n type: z.literal('context_response'),\n answer: CoffeeContextAnswerSchema.describe(\n 'User response to context request'\n ),\n credentialTypes: z\n .array(z.string())\n .optional()\n .describe('Credential types used (for display, not actual secrets)'),\n});\n\n/** Coffee's generated plan */\nexport const PlanMessageSchema = BaseMessageSchema.extend({\n type: z.literal('plan'),\n plan: CoffeePlanEventSchema.describe('Generated implementation plan'),\n});\n\n/** User's plan approval with optional comment */\nexport const PlanApprovalMessageSchema = BaseMessageSchema.extend({\n type: z.literal('plan_approval'),\n approved: z.boolean().describe('Whether the plan was approved'),\n comment: z.string().optional().describe('Optional user comment on the plan'),\n});\n\n/** System message (for retries, errors, etc.) */\nexport const SystemMessageSchema = BaseMessageSchema.extend({\n type: z.literal('system'),\n content: z.string().describe('System message content'),\n});\n\n/** Tool result message - persists successful tool call results */\nexport const ToolResultMessageSchema = BaseMessageSchema.extend({\n type: z.literal('tool_result'),\n toolName: z.string().describe('Name of the tool that was called'),\n toolCallId: z.string().describe('Unique ID for this tool call'),\n input: z.unknown().describe('Input parameters passed to the tool'),\n output: z.unknown().describe('Output/result from the tool'),\n duration: z.number().describe('Duration of the tool call in milliseconds'),\n success: z.boolean().describe('Whether the tool call succeeded'),\n});\n\n/** Union of all Coffee message types */\nexport const CoffeeMessageSchema = z.discriminatedUnion('type', [\n UserMessageSchema,\n AssistantMessageSchema,\n ClarificationRequestMessageSchema,\n ClarificationResponseMessageSchema,\n ContextRequestMessageSchema,\n ContextResponseMessageSchema,\n PlanMessageSchema,\n PlanApprovalMessageSchema,\n SystemMessageSchema,\n ToolResultMessageSchema,\n]);\n\n// ============================================================================\n// Request/Response Schemas\n// ============================================================================\n\n/** Request to the Generate BubbleFlow */\nexport const CoffeeRequestSchema = z.object({\n prompt: z.string().min(1).describe('The user prompt describing the workflow'),\n flowId: z\n .number()\n .optional()\n .describe('Optional flow ID if updating existing flow'),\n messages: z\n .array(CoffeeMessageSchema)\n .optional()\n .describe(\n 'Full conversation history including clarification Q&A, context results, plan approvals'\n ),\n});\n\n/** Response from the Coffee agent */\nexport const CoffeeResponseSchema = z.object({\n type: z\n .enum(['clarification', 'plan', 'context_request', 'error'])\n .describe('Response type'),\n clarification: CoffeeClarificationEventSchema.optional(),\n plan: CoffeePlanEventSchema.optional(),\n contextRequest: CoffeeRequestExternalContextEventSchema.optional(),\n error: z.string().optional(),\n success: z.boolean().describe('Whether the operation completed successfully'),\n});\n\n/** Internal output format from the Coffee AI agent */\nexport const CoffeeAgentOutputSchema = z.object({\n action: z\n .enum(['askClarification', 'generatePlan', 'requestContext'])\n .describe('The action the agent wants to take'),\n questions: z.array(ClarificationQuestionSchema).optional(),\n plan: CoffeePlanEventSchema.optional(),\n contextRequest: CoffeeContextRequestInfoSchema.optional(),\n});\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type ClarificationChoice = z.infer<typeof ClarificationChoiceSchema>;\nexport type ClarificationQuestion = z.infer<typeof ClarificationQuestionSchema>;\nexport type CoffeeClarificationEvent = z.infer<\n typeof CoffeeClarificationEventSchema\n>;\nexport type CoffeeRequestExternalContextEvent = z.infer<\n typeof CoffeeRequestExternalContextEventSchema\n>;\nexport type CoffeeContextAnswer = z.infer<typeof CoffeeContextAnswerSchema>;\nexport type CoffeeContextEvent = z.infer<typeof CoffeeContextEventSchema>;\nexport type CoffeeContextRequestInfo = z.infer<\n typeof CoffeeContextRequestInfoSchema\n>;\nexport type PlanStep = z.infer<typeof PlanStepSchema>;\nexport type CoffeePlanEvent = z.infer<typeof CoffeePlanEventSchema>;\nexport type CoffeeRequest = z.infer<typeof CoffeeRequestSchema>;\nexport type CoffeeResponse = z.infer<typeof CoffeeResponseSchema>;\nexport type CoffeeAgentOutput = z.infer<typeof CoffeeAgentOutputSchema>;\n\n// Unified message types\nexport type UserMessage = z.infer<typeof UserMessageSchema>;\nexport type AssistantMessage = z.infer<typeof AssistantMessageSchema>;\nexport type ClarificationRequestMessage = z.infer<\n typeof ClarificationRequestMessageSchema\n>;\nexport type ClarificationResponseMessage = z.infer<\n typeof ClarificationResponseMessageSchema\n>;\nexport type ContextRequestMessage = z.infer<typeof ContextRequestMessageSchema>;\nexport type ContextResponseMessage = z.infer<\n typeof ContextResponseMessageSchema\n>;\nexport type PlanMessage = z.infer<typeof PlanMessageSchema>;\nexport type PlanApprovalMessage = z.infer<typeof PlanApprovalMessageSchema>;\nexport type SystemMessage = z.infer<typeof SystemMessageSchema>;\nexport type ToolResultMessage = z.infer<typeof ToolResultMessageSchema>;\nexport type CoffeeMessage = z.infer<typeof CoffeeMessageSchema>;\n","import { z } from '@hono/zod-openapi';\n// Webhook execution response (used internally)\nexport const webhookExecutionResponseSchema = z\n .object({\n executionId: z.number().openapi({ description: 'Execution ID' }),\n success: z.boolean().openapi({ description: 'Execution success' }),\n data: z.unknown().optional().openapi({ description: 'Result data' }),\n error: z.string().optional().openapi({ description: 'Error message' }),\n webhook: z\n .object({\n userId: z.string().openapi({ description: 'User ID' }),\n path: z.string().openapi({ description: 'Webhook path' }),\n triggeredAt: z.string().openapi({ description: 'Trigger timestamp' }),\n method: z.string().openapi({ description: 'HTTP method' }),\n })\n .openapi({ description: 'Webhook info' }),\n })\n .openapi('WebhookExecutionResponse');\n\n// POST /webhook/{userId}/{path} - Webhook response\nexport const webhookResponseSchema = z\n .object({\n // Slack verification fields\n challenge: z\n .string()\n .optional()\n .openapi({ description: 'Slack URL verification challenge' }),\n // Execution fields\n executionId: z.number().optional().openapi({ description: 'Execution ID' }),\n success: z\n .boolean()\n .optional()\n .openapi({ description: 'Execution success' }),\n data: z\n .record(z.string(), z.unknown())\n .or(z.undefined())\n .optional()\n .openapi({ description: 'Result data' }),\n error: z.string().optional().openapi({ description: 'Error message' }),\n webhook: z\n .object({\n userId: z.string().openapi({ description: 'User ID' }),\n path: z.string().openapi({ description: 'Webhook path' }),\n triggeredAt: z.string().openapi({ description: 'Trigger timestamp' }),\n method: z.string().openapi({ description: 'HTTP method' }),\n })\n .optional()\n .openapi({ description: 'Webhook info' }),\n })\n .openapi('WebhookResponse');\nexport type WebhookResponse = z.infer<typeof webhookResponseSchema>;\nexport type WebhookExecutionResponse = z.infer<\n typeof webhookExecutionResponseSchema\n>;\n","import { z } from '@hono/zod-openapi';\nimport { ServiceUsageSchema } from './bubbleflow-execution-schema';\nimport { orgRoleSchema, orgTypeSchema } from './organization-schema';\n\n// ============================================================================\n// Reusable Usage Schema\n// ============================================================================\n\n/**\n * Token usage breakdown by model\n */\nexport const tokenUsageSchema = z\n .object({\n modelName: z.string().optional().openapi({\n description: 'Model name',\n example: 'gpt-4',\n }),\n inputTokens: z.number().openapi({\n description: 'Input tokens used this month',\n example: 1500,\n }),\n outputTokens: z.number().openapi({\n description: 'Output tokens used this month',\n example: 750,\n }),\n totalTokens: z.number().openapi({\n description: 'Total tokens used this month',\n example: 2250,\n }),\n })\n .openapi('TokenUsage');\n\nexport type TokenUsage = z.infer<typeof tokenUsageSchema>;\n\n/**\n * Reusable usage schema for both personal and organization usage\n */\nexport const usageSchema = z\n .object({\n executionCount: z.number().openapi({\n description: 'Current monthly execution count',\n example: 100,\n }),\n tokenUsage: z.array(tokenUsageSchema).openapi({\n description: 'Token usage breakdown by model for current month',\n }),\n serviceUsage: z.array(ServiceUsageSchema).openapi({\n description: 'Service usage and cost breakdown for current month',\n }),\n estimatedMonthlyCost: z.number().optional().openapi({\n description: 'Projected monthly cost based on current usage trend',\n example: 14.19,\n }),\n })\n .openapi('Usage');\n\nexport type Usage = z.infer<typeof usageSchema>;\n\n/**\n * Organization billing context - shows which org the billing belongs to\n */\nexport const billingOrganizationSchema = z\n .object({\n id: z.number().openapi({\n description: 'Organization ID',\n example: 123,\n }),\n name: z.string().openapi({\n description: 'Organization name',\n example: 'My Team',\n }),\n slug: z.string().openapi({\n description: 'Organization slug',\n example: 'my-team',\n }),\n type: orgTypeSchema.optional().openapi({\n description: 'Organization type (personal or organization)',\n }),\n role: orgRoleSchema.openapi({\n description: \"Current user's role in this organization\",\n }),\n memberCount: z.number().openapi({\n description: 'Number of members in the organization',\n example: 5,\n }),\n })\n .openapi('BillingOrganization');\n\nexport type BillingOrganization = z.infer<typeof billingOrganizationSchema>;\n\n// ============================================================================\n// Offer Schemas\n// ============================================================================\n\n// Hackathon offer schema for promotional code redemptions\nexport const hackathonOfferSchema = z\n .object({\n isActive: z.boolean().openapi({\n description: 'Whether a hackathon offer is currently active',\n example: true,\n }),\n expiresAt: z.string().openapi({\n description: 'ISO date when the hackathon offer expires',\n example: '2025-01-15T14:30:00.000Z',\n }),\n redeemedAt: z.string().openapi({\n description: 'ISO date when the code was redeemed',\n example: '2025-01-14T14:30:00.000Z',\n }),\n })\n .openapi('HackathonOffer');\n\nexport type HackathonOffer = z.infer<typeof hackathonOfferSchema>;\n\n// Special offer schema for private metadata overrides (exclusive members)\nexport const specialOfferSchema = z\n .object({\n isActive: z.boolean().openapi({\n description: 'Whether a special offer is currently active',\n example: true,\n }),\n plan: z.string().openapi({\n description: 'The plan granted by the special offer',\n example: 'unlimited',\n }),\n expiresAt: z.string().nullable().openapi({\n description:\n 'ISO date when the special offer expires (null = never expires)',\n example: '2025-06-15T14:30:00.000Z',\n }),\n })\n .openapi('SpecialOffer');\n\nexport type SpecialOffer = z.infer<typeof specialOfferSchema>;\n\n// Coupon redemption request schema\nexport const redeemCouponRequestSchema = z\n .object({\n code: z.string().min(1).openapi({\n description: 'The coupon code to redeem',\n example: 'HACKATHON2025',\n }),\n })\n .openapi('RedeemCouponRequest');\n\nexport type RedeemCouponRequest = z.infer<typeof redeemCouponRequestSchema>;\n\n// Coupon redemption response schema\nexport const redeemCouponResponseSchema = z\n .object({\n success: z.boolean().openapi({\n description: 'Whether the redemption was successful',\n example: true,\n }),\n message: z.string().openapi({\n description: 'Human-readable message about the redemption result',\n example: 'Coupon redeemed successfully! You now have Pro access.',\n }),\n expiresAt: z.string().optional().openapi({\n description: 'When the offer expires (if successful)',\n example: '2025-01-15T14:30:00.000Z',\n }),\n })\n .openapi('RedeemCouponResponse');\n\nexport type RedeemCouponResponse = z.infer<typeof redeemCouponResponseSchema>;\n\nexport const subscriptionStatusResponseSchema = z\n .object({\n userId: z.string().openapi({\n description: 'User ID from Clerk',\n example: 'user_30Gbwrzto1VZvAHcGUm5NLQhpkp',\n }),\n plan: z.string().openapi({\n description: 'Current subscription plan',\n example: 'pro_plus',\n }),\n planDisplayName: z.string().openapi({\n description: 'Human-readable plan name',\n example: 'Pro Plus',\n }),\n features: z.array(z.string()).openapi({\n description: 'List of features available to the user',\n example: ['unlimited_usage', 'priority_support'],\n }),\n // Organization context - which org the billing belongs to\n organization: billingOrganizationSchema.optional().openapi({\n description:\n 'Organization that owns the billing (null for personal accounts without org)',\n }),\n // Organization-level usage (what billing is based on)\n usage: z.object({\n executionCount: z.number().openapi({\n description: 'Organization monthly execution count',\n example: 100,\n }),\n executionLimit: z.number().openapi({\n description: 'Organization monthly execution limit',\n example: 42,\n }),\n creditLimit: z.number().openapi({\n description: 'Organization monthly credit limit',\n example: 100,\n }),\n activeFlowLimit: z.number().openapi({\n description: 'Organization monthly active flow limit',\n example: 2,\n }),\n estimatedMonthlyCost: z.number().openapi({\n description: 'Projected monthly cost based on current usage trend',\n example: 14.19,\n }),\n resetDate: z.string().openapi({\n description: 'ISO date when usage resets',\n example: '2025-02-01T00:00:00.000Z',\n }),\n tokenUsage: z.array(tokenUsageSchema).openapi({\n description: 'Token usage breakdown by model for current month',\n }),\n serviceUsage: z.array(ServiceUsageSchema).openapi({\n description: 'Service usage and cost breakdown for current month',\n }),\n }),\n // User's personal contribution to the organization usage\n personalUsage: usageSchema.optional().openapi({\n description:\n \"User's personal contribution to the organization's usage for current billing period\",\n }),\n isActive: z.boolean().openapi({\n description: 'Whether the subscription is active',\n example: true,\n }),\n hackathonOffer: hackathonOfferSchema.optional().openapi({\n description: 'Active hackathon promotional offer information',\n }),\n specialOffer: specialOfferSchema.optional().openapi({\n description:\n 'Special offer from private metadata (takes precedence over hackathon offer)',\n }),\n })\n .openapi('SubscriptionStatusResponse');\n\nexport type SubscriptionStatusResponse = z.infer<\n typeof subscriptionStatusResponseSchema\n>;\n\n// ============================================================================\n// Organization Usage Breakdown (Admin/Owner Only)\n// ============================================================================\n\n/**\n * User usage item in org usage breakdown (admin/owner only endpoint)\n */\nexport const userUsageItemSchema = z\n .object({\n userId: z.string().openapi({\n description: 'User ID from Clerk',\n example: 'user_30Gbwrzto1VZvAHcGUm5NLQhpkp',\n }),\n firstName: z.string().optional().openapi({\n description: \"User's first name\",\n example: 'John',\n }),\n lastName: z.string().optional().openapi({\n description: \"User's last name\",\n example: 'Doe',\n }),\n userEmail: z.string().optional().openapi({\n description: 'User email address',\n example: 'john@acme.com',\n }),\n role: orgRoleSchema.openapi({\n description: \"User's role in the organization\",\n }),\n executionCount: z.number().openapi({\n description: 'Number of executions by this user',\n example: 42,\n }),\n totalCost: z.number().openapi({\n description: 'Total cost incurred by this user',\n example: 5.67,\n }),\n })\n .openapi('UserUsageItem');\n\nexport type UserUsageItem = z.infer<typeof userUsageItemSchema>;\n\n/**\n * Organization usage breakdown response (admin/owner only)\n * Response from GET /subscription/org-usage\n */\nexport const orgUsageBreakdownResponseSchema = z\n .object({\n organizationId: z.number().openapi({\n description: 'Organization ID',\n example: 123,\n }),\n organizationName: z.string().optional().openapi({\n description: 'Organization name',\n example: 'Acme Inc',\n }),\n monthYear: z.string().openapi({\n description: 'Billing month in YYYY-MM format',\n example: '2025-01',\n }),\n totalOrgCost: z.number().openapi({\n description: 'Total organization cost for this billing period',\n example: 45.67,\n }),\n totalOrgExecutions: z.number().openapi({\n description: 'Total executions across all users',\n example: 500,\n }),\n users: z.array(userUsageItemSchema).openapi({\n description: 'Usage breakdown by user',\n }),\n })\n .openapi('OrgUsageBreakdownResponse');\n\nexport type OrgUsageBreakdownResponse = z.infer<\n typeof orgUsageBreakdownResponseSchema\n>;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Helper to check if user is admin or owner in their org\n */\nexport function isAdminOrOwner(\n subscription: SubscriptionStatusResponse\n): boolean {\n const role = subscription.organization?.role;\n return role === 'owner' || role === 'admin';\n}\n\n/**\n * Helper to check if user is a regular member\n */\nexport function isMember(subscription: SubscriptionStatusResponse): boolean {\n const role = subscription.organization?.role;\n return role === 'member';\n}\n","/**\n * Zod schemas for organization management\n * These are shared between frontend and backend\n */\n\nimport { z } from '@hono/zod-openapi';\n\n// ============================================================================\n// Enums and Base Types\n// ============================================================================\n\nexport const orgRoleSchema = z\n .enum(['owner', 'admin', 'member'])\n .openapi('OrgRole');\n\nexport type OrgRole = z.infer<typeof orgRoleSchema>;\n\nexport const orgTypeSchema = z\n .enum(['personal', 'organization'])\n .openapi('OrgType');\n\nexport type OrgType = z.infer<typeof orgTypeSchema>;\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nexport const organizationSchema = z\n .object({\n id: z.number().openapi({\n description: 'Organization ID',\n example: 123,\n }),\n name: z.string().openapi({\n description: 'Organization name',\n example: 'My Team',\n }),\n slug: z.string().openapi({\n description: 'Organization slug for URLs',\n example: 'my-team',\n }),\n type: orgTypeSchema,\n domain: z.string().nullable().optional().openapi({\n description:\n 'Email domain for auto-joining (e.g., \"acme.com\"). Users with matching email domains are automatically added as members.',\n example: 'acme.com',\n }),\n role: orgRoleSchema.openapi({\n description: \"Current user's role in this organization\",\n }),\n memberCount: z.number().openapi({\n description: 'Number of members in the organization',\n example: 5,\n }),\n createdAt: z.string().openapi({\n description: 'ISO timestamp when organization was created',\n example: '2024-01-01T00:00:00Z',\n }),\n })\n .openapi('Organization');\n\nexport type Organization = z.infer<typeof organizationSchema>;\n\nexport const organizationDetailSchema = organizationSchema\n .extend({\n workflowCount: z.number().openapi({\n description: 'Number of workflows in the organization',\n example: 10,\n }),\n updatedAt: z.string().openapi({\n description: 'ISO timestamp when organization was last updated',\n example: '2024-01-02T00:00:00Z',\n }),\n })\n .openapi('OrganizationDetail');\n\nexport type OrganizationDetail = z.infer<typeof organizationDetailSchema>;\n\nexport const organizationMemberSchema = z\n .object({\n userId: z.string().openapi({\n description: 'User ID',\n example: 'user_123',\n }),\n email: z.string().openapi({\n description: 'User email',\n example: 'user@example.com',\n }),\n name: z.string().nullable().openapi({\n description: 'User display name',\n example: 'John Doe',\n }),\n avatarUrl: z.string().optional().openapi({\n description: 'User avatar URL',\n example: 'https://example.com/avatar.png',\n }),\n role: orgRoleSchema,\n joinedAt: z.string().openapi({\n description: 'ISO timestamp when user joined the organization',\n example: '2024-01-01T00:00:00Z',\n }),\n })\n .openapi('OrganizationMember');\n\nexport type OrganizationMember = z.infer<typeof organizationMemberSchema>;\n\n// ============================================================================\n// Request Schemas\n// ============================================================================\n\nexport const createOrganizationSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'Organization name',\n example: 'My Team',\n }),\n slug: z\n .string()\n .min(3)\n .max(50)\n .regex(/^[a-z0-9-]+$/, 'Slug must be lowercase alphanumeric with hyphens')\n .openapi({\n description: 'Organization slug for URLs',\n example: 'my-team',\n }),\n domain: z\n .string()\n .regex(\n /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/i,\n 'Must be a valid domain (e.g., acme.com)'\n )\n .optional()\n .openapi({\n description:\n 'Email domain for auto-joining. Users with matching email domains are automatically added as members.',\n example: 'acme.com',\n }),\n })\n .openapi('CreateOrganizationRequest');\n\nexport type CreateOrganizationRequest = z.infer<\n typeof createOrganizationSchema\n>;\n\nexport const updateOrganizationSchema = z\n .object({\n name: z.string().min(1).max(100).optional().openapi({\n description: 'Organization name',\n example: 'My Team',\n }),\n slug: z\n .string()\n .min(3)\n .max(50)\n .regex(/^[a-z0-9-]+$/, 'Slug must be lowercase alphanumeric with hyphens')\n .optional()\n .openapi({\n description: 'Organization slug for URLs',\n example: 'my-team',\n }),\n domain: z\n .string()\n .regex(\n /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/i,\n 'Must be a valid domain (e.g., acme.com)'\n )\n .nullable()\n .optional()\n .openapi({\n description:\n 'Email domain for auto-joining. Set to null to disable auto-join.',\n example: 'acme.com',\n }),\n })\n .openapi('UpdateOrganizationRequest');\n\nexport type UpdateOrganizationRequest = z.infer<\n typeof updateOrganizationSchema\n>;\n\nexport const addMemberSchema = z\n .object({\n email: z.string().email().openapi({\n description: 'Email of the user to add',\n example: 'user@example.com',\n }),\n role: z.enum(['admin', 'member']).openapi({\n description: 'Role to assign to the new member',\n example: 'member',\n }),\n })\n .openapi('AddMemberRequest');\n\nexport type AddMemberRequest = z.infer<typeof addMemberSchema>;\n\nexport const updateMemberRoleSchema = z\n .object({\n role: z.enum(['admin', 'member']).openapi({\n description: 'New role for the member',\n example: 'admin',\n }),\n })\n .openapi('UpdateMemberRoleRequest');\n\nexport type UpdateMemberRoleRequest = z.infer<typeof updateMemberRoleSchema>;\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nexport const listOrganizationsResponseSchema = z\n .object({\n organizations: z.array(organizationSchema),\n })\n .openapi('ListOrganizationsResponse');\n\nexport type ListOrganizationsResponse = z.infer<\n typeof listOrganizationsResponseSchema\n>;\n\nexport const updateOrganizationResponseSchema = z\n .object({\n id: z.number(),\n name: z.string(),\n slug: z.string(),\n updatedAt: z.string(),\n })\n .openapi('UpdateOrganizationResponse');\n\nexport type UpdateOrganizationResponse = z.infer<\n typeof updateOrganizationResponseSchema\n>;\n\nexport const listMembersResponseSchema = z\n .object({\n members: z.array(organizationMemberSchema),\n })\n .openapi('ListMembersResponse');\n\nexport type ListMembersResponse = z.infer<typeof listMembersResponseSchema>;\n\nexport const addMemberResponseSchema = z\n .object({\n userId: z.string(),\n role: orgRoleSchema,\n joinedAt: z.string(),\n })\n .openapi('AddMemberResponse');\n\nexport type AddMemberResponse = z.infer<typeof addMemberResponseSchema>;\n\nexport const updateMemberRoleResponseSchema = z\n .object({\n userId: z.string(),\n role: orgRoleSchema,\n })\n .openapi('UpdateMemberRoleResponse');\n\nexport type UpdateMemberRoleResponse = z.infer<\n typeof updateMemberRoleResponseSchema\n>;\n\nexport const successResponseSchema = z\n .object({\n success: z.boolean(),\n })\n .openapi('SuccessResponse');\n\nexport type SuccessResponse = z.infer<typeof successResponseSchema>;\n","import { z } from 'zod';\nimport { AvailableModels } from './ai-models.js';\nimport { ConversationMessageSchema } from './agent-memory.js';\n/**\n * Conversation message schema for milk tea multi-turn conversations\n */\n\n/**\n * Request schema for Milk Tea agent\n * Milk Tea helps users configure bubble parameters through conversation\n */\nexport const MilkTeaRequestSchema = z.object({\n userRequest: z\n .string()\n .min(1, 'User request is required')\n .describe('The user request or question about configuring the bubble'),\n\n bubbleName: z\n .string()\n .min(1, 'Bubble name is required')\n .describe('The name of the bubble to configure (e.g., \"email-tool\")'),\n\n bubbleSchema: z\n .record(z.unknown())\n .describe(\n 'The full schema/interface definition of the bubble including parameters and types'\n ),\n\n currentCode: z\n .string()\n .optional()\n .describe('The current workflow code context for validation'),\n\n availableCredentials: z\n .array(z.string())\n .default([])\n .describe('List of credential types available to the user'),\n\n userName: z.string().describe('Name of the user making the request'),\n\n insertLocation: z\n .string()\n .optional()\n .describe('Location in code where the snippet should be inserted'),\n\n conversationHistory: z\n .array(ConversationMessageSchema)\n .optional()\n .default([])\n .describe(\n 'Previous conversation messages for multi-turn interactions (frontend manages state)'\n ),\n\n model: AvailableModels.default('google/gemini-2.5-pro').describe(\n 'AI model to use for Milk Tea agent'\n ),\n});\n\n/**\n * Response schema for Milk Tea agent\n */\nexport const MilkTeaResponseSchema = z.object({\n type: z\n .enum(['code', 'question', 'reject'])\n .describe(\n 'Type of response: code (generated snippet), question (needs clarification), reject (infeasible request)'\n ),\n\n message: z\n .string()\n .describe(\n 'Human-readable message: explanation for code, question text, or rejection reason'\n ),\n\n snippet: z\n .string()\n .optional()\n .describe(\n 'Generated TypeScript code snippet (only present when type is \"code\")'\n ),\n\n success: z.boolean().describe('Whether the operation completed successfully'),\n\n error: z\n .string()\n .optional()\n .describe('Error message if the operation failed'),\n});\n\n/**\n * Internal agent response format (JSON mode output from AI)\n */\nexport const MilkTeaAgentOutputSchema = z.object({\n type: z.enum(['code', 'question', 'reject']),\n message: z.string(),\n snippet: z.string().optional(),\n});\n\n// Export inferred TypeScript types\nexport type MilkTeaRequest = z.infer<typeof MilkTeaRequestSchema>;\nexport type MilkTeaResponse = z.infer<typeof MilkTeaResponseSchema>;\nexport type MilkTeaAgentOutput = z.infer<typeof MilkTeaAgentOutputSchema>;\n","import { z } from 'zod';\n\n// Define available models with provider/name combinations\nexport const AvailableModels = z.enum([\n // OpenAI models\n 'openai/gpt-5',\n 'openai/gpt-5-mini',\n 'openai/gpt-5.1',\n 'openai/gpt-5.2',\n // Google Gemini models\n 'google/gemini-2.5-pro',\n 'google/gemini-2.5-flash',\n 'google/gemini-2.5-flash-lite',\n 'google/gemini-2.5-flash-image-preview',\n 'google/gemini-3-pro-preview',\n 'google/gemini-3-pro-image-preview',\n 'google/gemini-3-flash-preview',\n // Anthropic models\n 'anthropic/claude-sonnet-4-5',\n 'anthropic/claude-opus-4-5',\n 'anthropic/claude-haiku-4-5',\n // OpenRouter models\n 'openrouter/x-ai/grok-code-fast-1',\n 'openrouter/z-ai/glm-4.6',\n 'openrouter/z-ai/glm-4.7',\n 'openrouter/anthropic/claude-sonnet-4.5',\n 'openrouter/anthropic/claude-opus-4.5',\n 'openrouter/google/gemini-3-pro-preview',\n 'openrouter/morph/morph-v3-large',\n 'openrouter/openai/gpt-oss-120b',\n 'openrouter/openai/o3-deep-research',\n 'openrouter/openai/o4-mini-deep-research',\n]);\n\nexport type AvailableModel = z.infer<typeof AvailableModels>;\n","import type { BubbleName } from './types.js';\nimport { z } from 'zod';\nexport const TOOL_CALL_TO_DISCARD: BubbleName[] = ['get-bubble-details-tool'];\n\nexport const ConversationMessageSchema = z.object({\n role: z\n .enum(['user', 'assistant', 'tool'])\n .describe('The role of the message sender'),\n content: z.string().describe('The message content'),\n toolCallId: z.string().optional().describe('Tool call ID for tool messages'),\n name: z.string().optional().describe('Tool name for tool messages'),\n});\nexport type ConversationMessage = z.infer<typeof ConversationMessageSchema>;\n","import { z } from 'zod';\nimport { AvailableModels, type AvailableModel } from './ai-models.js';\nimport { ParsedBubbleWithInfoSchema } from './bubble-definition-schema.js';\nimport { CredentialType } from './types.js';\nimport { ConversationMessageSchema } from './agent-memory.js';\n// Default model for Pearl AI agent\nexport const PEARL_DEFAULT_MODEL: AvailableModel =\n 'openrouter/anthropic/claude-sonnet-4.5';\n/**\n * Request schema for Pearl agent\n * Pearl helps users build complete workflows without requiring specific bubbles\n */\nexport const PearlRequestSchema = z.object({\n userRequest: z\n .string()\n .min(1, 'User request is required')\n .describe('The user request or question about building a workflow'),\n\n currentCode: z\n .string()\n .optional()\n .describe('The current workflow code for context and modification'),\n\n userName: z.string().describe('Name of the user making the request'),\n availableVariables: z\n .array(z.any())\n .describe('List of available variables in the current code'),\n conversationHistory: z\n .array(ConversationMessageSchema)\n .optional()\n .default([])\n .describe(\n 'Previous conversation messages for multi-turn interactions (frontend manages state)'\n ),\n\n model: AvailableModels.default(PEARL_DEFAULT_MODEL).describe(\n 'AI model to use for Pearl agent'\n ),\n\n additionalContext: z\n .string()\n .optional()\n .describe(\n 'Additional context information like timezone, user preferences, etc.'\n ),\n\n uploadedFiles: z\n .array(\n z.object({\n name: z.string().describe('File name'),\n content: z\n .string()\n .describe(\n 'File content: base64 for images, plain text for text files'\n ),\n fileType: z\n .enum(['image', 'text'])\n .describe('Type of file: image (base64) or text (plain text)'),\n })\n )\n .optional()\n .default([])\n .describe(\n 'Files uploaded by the user: images as base64, text files as plain text'\n ),\n});\n\n/**\n * Response schema for Pearl agent\n */\nexport const PearlResponseSchema = z.object({\n type: z\n .enum(['code', 'question', 'answer', 'reject'])\n .describe(\n 'Type of response: code (generated workflow), question (needs clarification), answer (provides information/guidance), reject (infeasible request)'\n ),\n\n message: z\n .string()\n .describe(\n 'Human-readable message: explanation for code, question text, or rejection reason'\n ),\n\n snippet: z\n .string()\n .optional()\n .describe(\n 'Generated TypeScript code for complete workflow (only present when type is \"code\")'\n ),\n\n bubbleParameters: z\n .record(z.number(), ParsedBubbleWithInfoSchema)\n .optional()\n .describe(\n 'Parsed bubble parameters from the generated workflow (only present when type is \"code\")'\n ),\n\n inputSchema: z\n .record(z.unknown())\n .optional()\n .describe(\n 'Input schema for the generated workflow (only present when type is \"code\")'\n ),\n\n requiredCredentials: z\n .record(z.string(), z.array(z.nativeEnum(CredentialType)))\n .optional()\n .describe(\n 'Required credentials for the bubbles in the workflow (only present when type is \"code\")'\n ),\n\n success: z.boolean().describe('Whether the operation completed successfully'),\n\n error: z\n .string()\n .optional()\n .describe('Error message if the operation failed'),\n});\n\n/**\n * Internal agent response format (JSON mode output from AI)\n */\nexport const PearlAgentOutputSchema = z.object({\n type: z.enum(['code', 'question', 'answer', 'reject', 'text']),\n message: z.string(),\n snippet: z.string().optional(),\n});\n\n// Export inferred TypeScript types\nexport type PearlRequest = z.infer<typeof PearlRequestSchema>;\nexport type PearlResponse = z.infer<typeof PearlResponseSchema>;\nexport type PearlAgentOutput = z.infer<typeof PearlAgentOutputSchema>;\n// Note: ConversationMessage type is exported from milk-tea.ts to avoid duplication\n","import { z } from 'zod';\nimport { AvailableModels, type AvailableModel } from './ai-models.js';\nimport { RECOMMENDED_MODELS } from './bubbleflow-generation-prompts.js';\n\n// Default model for Rice evaluation agent\nexport const RICE_DEFAULT_MODEL: AvailableModel = RECOMMENDED_MODELS.FAST;\n\n/**\n * Issue type categories for Rice evaluation\n * - setup: Configuration/credential issues (user can fix in settings, not workflow code)\n * - workflow: Logic/code issues in the workflow itself (fixable with Pearl)\n * - input: Issues with input data (user needs to provide different input)\n * - null: No issues (working=true)\n */\nexport const RiceIssueTypeSchema = z\n .enum(['setup', 'workflow', 'input'])\n .nullable();\n\nexport type RiceIssueType = z.infer<typeof RiceIssueTypeSchema>;\n\n/**\n * Evaluation result schema from Rice agent\n * This represents the AI's assessment of workflow execution quality\n */\nexport const RiceEvaluationResultSchema = z.object({\n working: z\n .boolean()\n .describe(\n 'Whether the workflow is functioning correctly (true if no errors and expected behavior)'\n ),\n\n issueType: RiceIssueTypeSchema.describe(\n 'Category of issue: \"setup\" (config/credentials), \"workflow\" (code logic), \"input\" (bad input data), or null if working'\n ),\n\n summary: z\n .string()\n .describe(\n 'Brief summary of the execution. If working: what happened and any external changes made. If not working: description of the issue.'\n ),\n\n rating: z\n .number()\n .int()\n .min(1)\n .max(10)\n .describe(\n 'Quality rating 1-10: 1-3=severe issues, 4-6=partial functionality, 7-8=working with minor issues, 9-10=excellent'\n ),\n});\n\n/**\n * Request schema for Rice evaluation agent\n * Rice evaluates workflow execution quality based on logs and code\n */\nexport const RiceRequestSchema = z.object({\n executionLogs: z\n .array(z.unknown())\n .describe('StreamingLogEvent[] from execution'),\n\n workflowCode: z\n .string()\n .describe('The original workflow code that was executed'),\n\n executionId: z.number().describe('ID of the execution being evaluated'),\n\n bubbleFlowId: z.number().describe('ID of the BubbleFlow being evaluated'),\n\n model: AvailableModels.optional()\n .default(RICE_DEFAULT_MODEL)\n .describe('AI model to use for Rice evaluation'),\n});\n\n/**\n * Response schema for Rice evaluation agent\n */\nexport const RiceResponseSchema = z.object({\n success: z\n .boolean()\n .describe('Whether the evaluation completed successfully'),\n\n evaluation: RiceEvaluationResultSchema.optional().describe(\n 'Evaluation result (only present if success=true)'\n ),\n\n error: z\n .string()\n .optional()\n .describe('Error message if the evaluation failed'),\n});\n\n// Export inferred TypeScript types\nexport type RiceEvaluationResult = z.infer<typeof RiceEvaluationResultSchema>;\n\n// Use z.input for RiceRequest to make optional fields with defaults truly optional for callers\n// z.infer would include the model field (since default is applied during parsing)\n// z.input represents what callers need to provide (before transforms/defaults are applied)\nexport type RiceRequest = z.input<typeof RiceRequestSchema>;\n\nexport type RiceResponse = z.infer<typeof RiceResponseSchema>;\n","/**\n * Recommended AI models for BubbleFlow code generation\n * This file is kept in shared-schemas for backwards compatibility\n * The full prompts have been moved to apps/bubblelab-api/src/config/bubbleflow-generation-prompts.ts\n */\n\nimport { AvailableModel } from './ai-models.js';\n\n// Model constants for AI agent instructions\nexport const RECOMMENDED_MODELS = {\n BEST: 'google/gemini-3-pro-preview',\n BEST_ALT: 'openai/gpt-5.2',\n PRO: 'google/gemini-3-flash-preview',\n PRO_ALT: 'anthropic/claude-sonnet-4-5',\n FAST: 'google/gemini-3-flash-preview',\n FAST_ALT: 'anthropic/claude-haiku-4-5',\n LITE: 'google/gemini-2.5-flash-lite',\n IMAGE: 'google/gemini-3-pro-image-preview',\n} as Record<string, AvailableModel>;\n","/**\n * Utility functions for parsing and working with cron expressions\n * Supports standard 5-field cron format: minute hour day month day-of-week\n */\n\nexport interface CronExpression {\n minute: string;\n hour: string;\n dayOfMonth: string;\n month: string;\n dayOfWeek: string;\n original: string;\n}\n\nexport interface CronScheduleInfo {\n expression: CronExpression;\n description: string;\n nextRun?: Date;\n isValid: boolean;\n error?: string;\n}\n\n/**\n * Parse a cron expression string into its components\n * @param cronString - Cron expression (e.g., \"0 0 * * *\")\n * @returns Parsed cron expression object\n */\nexport function parseCronExpression(cronString: string): CronExpression {\n const parts = cronString.trim().split(/\\s+/);\n\n if (parts.length !== 5) {\n throw new Error(\n `Invalid cron expression: expected 5 fields, got ${parts.length}`\n );\n }\n\n const [minute, hour, dayOfMonth, month, dayOfWeek] = parts;\n\n return {\n minute,\n hour,\n dayOfMonth,\n month,\n dayOfWeek,\n original: cronString,\n };\n}\n\n/**\n * Validate a cron expression\n * @param cronString - Cron expression to validate\n * @returns Object with validation result\n */\nexport function validateCronExpression(cronString: string): {\n valid: boolean;\n error?: string;\n} {\n try {\n const expr = parseCronExpression(cronString);\n\n // Validate each field\n const validations = [\n validateCronField(expr.minute, 0, 59, 'minute'),\n validateCronField(expr.hour, 0, 23, 'hour'),\n validateCronField(expr.dayOfMonth, 1, 31, 'day of month'),\n validateCronField(expr.month, 1, 12, 'month'),\n validateCronField(expr.dayOfWeek, 0, 6, 'day of week'),\n ];\n\n for (const validation of validations) {\n if (!validation.valid) {\n return validation;\n }\n }\n\n return { valid: true };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Invalid cron expression',\n };\n }\n}\n\n/**\n * Validate a single cron field\n */\nfunction validateCronField(\n field: string,\n min: number,\n max: number,\n fieldName: string\n): { valid: boolean; error?: string } {\n // Wildcard\n if (field === '*') return { valid: true };\n\n // Step values (*/n)\n if (field.startsWith('*/')) {\n const step = parseInt(field.substring(2), 10);\n if (isNaN(step) || step <= 0) {\n return {\n valid: false,\n error: `Invalid step value in ${fieldName}: ${field}`,\n };\n }\n return { valid: true };\n }\n\n // Ranges (n-m)\n if (field.includes('-')) {\n const [start, end] = field.split('-').map((v) => parseInt(v, 10));\n if (isNaN(start) || isNaN(end) || start < min || end > max || start > end) {\n return {\n valid: false,\n error: `Invalid range in ${fieldName}: ${field} (must be ${min}-${max})`,\n };\n }\n return { valid: true };\n }\n\n // Lists (n,m,o)\n if (field.includes(',')) {\n const values = field.split(',').map((v) => parseInt(v.trim(), 10));\n for (const val of values) {\n if (isNaN(val) || val < min || val > max) {\n return {\n valid: false,\n error: `Invalid value in ${fieldName} list: ${val} (must be ${min}-${max})`,\n };\n }\n }\n return { valid: true };\n }\n\n // Single value\n const value = parseInt(field, 10);\n if (isNaN(value) || value < min || value > max) {\n return {\n valid: false,\n error: `Invalid ${fieldName}: ${field} (must be ${min}-${max})`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Generate a human-readable description of a cron expression\n * @param cronString - Cron expression to describe\n * @returns Human-readable description\n */\nexport function describeCronExpression(cronString: string): string {\n try {\n const expr = parseCronExpression(cronString);\n\n // Common patterns\n if (cronString === '* * * * *') return 'Every minute';\n if (cronString === '0 * * * *') return 'Every hour';\n if (cronString === '0 0 * * *') return 'Daily at midnight';\n if (cronString === '0 0 * * 0') return 'Weekly on Sunday at midnight';\n if (cronString === '0 0 1 * *') return 'Monthly on the 1st at midnight';\n if (cronString === '0 0 1 1 *') return 'Yearly on January 1st at midnight';\n\n // Step patterns\n if (expr.minute.startsWith('*/')) {\n const step = expr.minute.substring(2);\n return `Every ${step} minute${step === '1' ? '' : 's'}`;\n }\n if (expr.hour.startsWith('*/') && expr.minute === '0') {\n const step = expr.hour.substring(2);\n return `Every ${step} hour${step === '1' ? '' : 's'}`;\n }\n\n // Weekday patterns\n if (expr.dayOfWeek === '1-5' && expr.hour === '9' && expr.minute === '0') {\n return 'Every weekday at 9:00 AM';\n }\n\n // Build description from parts\n let description = 'At ';\n\n // Time\n if (expr.minute !== '*' && expr.hour !== '*') {\n const hour = parseInt(expr.hour, 10);\n const minute = parseInt(expr.minute, 10);\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const hour12 = hour % 12 || 12;\n description += `${hour12}:${minute.toString().padStart(2, '0')} ${ampm}`;\n } else if (expr.minute !== '*') {\n description += `minute ${expr.minute}`;\n } else if (expr.hour !== '*') {\n description += `hour ${expr.hour}`;\n }\n\n // Day\n if (expr.dayOfMonth !== '*') {\n description += ` on day ${expr.dayOfMonth}`;\n }\n if (expr.dayOfWeek !== '*') {\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n if (expr.dayOfWeek.includes('-')) {\n const [start, end] = expr.dayOfWeek\n .split('-')\n .map((v) => parseInt(v, 10));\n description += ` on ${days[start]} through ${days[end]}`;\n } else {\n const day = parseInt(expr.dayOfWeek, 10);\n description += ` on ${days[day]}`;\n }\n }\n\n // Month\n if (expr.month !== '*') {\n const months = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ];\n const month = parseInt(expr.month, 10);\n description += ` in ${months[month - 1]}`;\n }\n\n return description;\n } catch (error) {\n return 'Invalid cron expression';\n }\n}\n\n/**\n * Get schedule information for a cron expression\n * @param cronString - Cron expression\n * @returns Schedule information including description and validation status\n */\nexport function getCronScheduleInfo(cronString: string): CronScheduleInfo {\n const validation = validateCronExpression(cronString);\n\n if (!validation.valid) {\n return {\n expression: parseCronExpression(\n cronString.split(/\\s+/).length === 5 ? cronString : '0 0 * * *'\n ),\n description: 'Invalid cron expression',\n isValid: false,\n error: validation.error,\n };\n }\n\n return {\n expression: parseCronExpression(cronString),\n description: describeCronExpression(cronString),\n isValid: true,\n };\n}\n","export interface BubbleTriggerEventRegistry {\n 'slack/bot_mentioned': SlackMentionEvent;\n 'slack/message_received': SlackMessageReceivedEvent;\n 'airtable/record_created': AirtableRecordCreatedEvent;\n 'airtable/record_updated': AirtableRecordUpdatedEvent;\n 'airtable/record_deleted': AirtableRecordDeletedEvent;\n 'schedule/cron': CronEvent;\n 'webhook/http': WebhookEvent;\n}\n\n// Runtime object that mirrors the interface keys\n// This allows us to validate event types at runtime\nexport const BUBBLE_TRIGGER_EVENTS = {\n 'slack/bot_mentioned': true,\n 'slack/message_received': true,\n 'airtable/record_created': true,\n 'airtable/record_updated': true,\n 'airtable/record_deleted': true,\n 'schedule/cron': true,\n 'webhook/http': true,\n} as const satisfies Record<keyof BubbleTriggerEventRegistry, true>;\n\n// Helper function to check if an event type is valid\nexport function isValidBubbleTriggerEvent(\n eventType: string\n): eventType is keyof BubbleTriggerEventRegistry {\n return eventType in BUBBLE_TRIGGER_EVENTS;\n}\n\nexport interface BubbleTriggerEvent {\n type: keyof BubbleTriggerEventRegistry;\n timestamp: string;\n executionId: string;\n path: string;\n [key: string]: unknown;\n}\n\n/**\n * Cron event payload structure\n *\n * The 'cron' field contains the cron expression in standard 5-part cron format:\n *\n * ┌───────────── minute (0 - 59)\n * │ ┌───────────── hour (0 - 23)\n * │ │ ┌───────────── day of month (1 - 31)\n * │ │ │ ┌───────────── month (1 - 12)\n * │ │ │ │ ┌───────────── day of week (0 - 6) (Sunday to Saturday)\n * │ │ │ │ │\n * * * * * *\n *\n * @example\n * ```typescript\n * // Daily at midnight\n * { cron: '0 0 * * *' }\n *\n * // Every weekday at 9am\n * { cron: '0 9 * * 1-5' }\n *\n * // Every 15 minutes\n * { cron: '*\\/15 * * * *' }\n *\n * // First day of every month at midnight\n * { cron: '0 0 1 * *' }\n * ```\n */\nexport interface CronEvent extends BubbleTriggerEvent {\n /** The cron expression defining when this event triggers */\n cron: string;\n body?: Record<string, unknown>;\n}\n\nexport interface WebhookEvent extends BubbleTriggerEvent {\n body?: Record<string, unknown>;\n}\n\nexport interface BubbleTrigger {\n type: keyof BubbleTriggerEventRegistry;\n cronSchedule?: string;\n name?: string;\n description?: string;\n timeout?: number;\n retries?: number;\n}\n\n/**\n * Slack file object - included in message events when files/images are shared\n * @see https://api.slack.com/types/file\n */\nexport interface SlackFile {\n /** Unique file identifier */\n id: string;\n /** Filename with extension */\n name: string;\n /** Display title of the file */\n title?: string;\n /** MIME type (e.g., 'image/png', 'application/pdf') */\n mimetype: string;\n /** File extension without dot (e.g., 'png', 'pdf') */\n filetype: string;\n /** File size in bytes */\n size: number;\n /** User ID who uploaded the file */\n user?: string;\n\n // File access URLs (require authentication with bot token)\n /** Private URL to view the file (requires bot token auth) */\n url_private?: string;\n /** Private URL to download the file (requires bot token auth) */\n url_private_download?: string;\n\n // Image dimensions\n /** Original image width in pixels */\n original_w?: number;\n /** Original image height in pixels */\n original_h?: number;\n\n /** Permanent link to the file */\n permalink?: string;\n}\n\n// Slack Event Wrapper (outer payload)\nexport interface SlackEventWrapper {\n token: string;\n team_id: string;\n api_app_id: string;\n event: SlackAppMentionEvent | SlackMessageEvent;\n type: 'event_callback';\n authorizations: Array<{\n enterprise_id?: string;\n team_id: string;\n user_id: string;\n is_bot: boolean;\n }>;\n event_context: string;\n event_id: string;\n event_time: number;\n}\n\n// App Mention Event (inner event data)\nexport interface SlackAppMentionEvent {\n type: 'app_mention';\n user: string;\n text: string;\n ts: string;\n channel: string;\n event_ts: string;\n thread_ts?: string;\n /** Files/images attached to the mention message */\n files?: SlackFile[];\n /** Whether this message was an upload */\n upload?: boolean;\n}\n\n// Slack Message Event (inner event data)\nexport interface SlackMessageEvent {\n type: 'message';\n user: string;\n text: string;\n ts: string;\n channel: string;\n event_ts: string;\n channel_type: 'channel' | 'group' | 'im' | 'mpim';\n /** Message subtype (e.g., 'file_share', 'bot_message', 'channel_join') */\n subtype?: string;\n // Bot message indicators - present when message is from a bot\n bot_id?: string;\n bot_profile?: {\n id: string;\n name: string;\n app_id: string;\n };\n /** Files/images attached to this message (present when subtype is 'file_share' or user uploads files) */\n files?: SlackFile[];\n /** Whether this message was an upload */\n upload?: boolean;\n}\n\n// BubbleTrigger-specific event types that wrap Slack events\nexport interface SlackMentionEvent extends BubbleTriggerEvent {\n slack_event: SlackEventWrapper;\n channel: string;\n user: string;\n text: string;\n thread_ts?: string;\n /** Files/images attached to the mention message */\n files?: SlackFile[];\n}\n\nexport interface SlackMessageReceivedEvent extends BubbleTriggerEvent {\n slack_event: SlackEventWrapper;\n channel: string;\n user: string;\n text: string;\n channel_type: 'channel' | 'group' | 'im' | 'mpim';\n subtype?: string;\n /** Files/images attached to this message */\n files?: SlackFile[];\n}\n\n// ============================================================================\n// Airtable Event Types\n// ============================================================================\n\n/**\n * Base Airtable event structure\n */\nexport interface AirtableEventBase extends BubbleTriggerEvent {\n airtable_event: {\n baseId: string;\n webhookId: string;\n timestamp: string;\n baseTransactionNumber: number;\n actionMetadata?: {\n source: string;\n sourceMetadata?: Record<string, unknown>;\n };\n };\n base_id: string;\n table_id: string;\n}\n\n/**\n * Airtable record created event\n */\nexport interface AirtableRecordCreatedEvent extends AirtableEventBase {\n airtable_event: AirtableEventBase['airtable_event'] & {\n type: 'record_created';\n records: Record<string, { cellValuesByFieldId: Record<string, unknown> }>;\n };\n}\n\n/**\n * Airtable record updated event\n */\nexport interface AirtableRecordUpdatedEvent extends AirtableEventBase {\n airtable_event: AirtableEventBase['airtable_event'] & {\n type: 'record_updated';\n records: Record<\n string,\n {\n current: { cellValuesByFieldId: Record<string, unknown> };\n previous?: { cellValuesByFieldId: Record<string, unknown> };\n }\n >;\n };\n}\n\n/**\n * Airtable record deleted event\n */\nexport interface AirtableRecordDeletedEvent extends AirtableEventBase {\n airtable_event: AirtableEventBase['airtable_event'] & {\n type: 'record_deleted';\n recordIds: string[];\n };\n}\n\n// ============================================================================\n// Centralized Trigger Configuration\n// Single source of truth for all trigger metadata\n// ============================================================================\n\n/**\n * JSON Schema type for payload validation\n */\nexport interface JsonSchema {\n type: string;\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n additionalProperties?: boolean;\n}\n\nexport interface JsonSchemaProperty {\n type?: string;\n description?: string;\n [key: string]: unknown;\n}\n\n/**\n * Configuration for a trigger event type\n * Single source of truth for all trigger metadata\n */\nexport interface TriggerEventConfig {\n /** The bubble/service name (e.g., 'Slack') - used for logo lookup */\n serviceName: string;\n /** Human-friendly name (e.g., 'When Slack bot is mentioned') */\n friendlyName: string;\n /** Description of what this trigger does */\n description: string;\n /** Setup guide markdown for configuring this trigger */\n setupGuide: string;\n /** JSON Schema for the payload */\n payloadSchema: JsonSchema;\n}\n\n/**\n * Registry of all trigger event configurations\n * Keys must match BubbleTriggerEventRegistry\n */\nexport const TRIGGER_EVENT_CONFIGS: Record<\n keyof BubbleTriggerEventRegistry,\n TriggerEventConfig\n> = {\n 'slack/message_received': {\n serviceName: 'Slack',\n friendlyName: 'When Slack message is received',\n description:\n 'Triggered when a message is posted in a channel your bot has access to',\n setupGuide: `## Slack Message Event Setup Guide\n\n### 1. Create a Slack App\n1. Go to [Slack API Apps](https://api.slack.com/apps)\n2. Click \"Create New App\" → \"From scratch\"\n3. Name your app and select your workspace\n\n### 2. Configure OAuth Scopes\nNavigate to **OAuth & Permissions** and add these Bot Token Scopes:\n- \\`channels:history\\` - To read messages in public channels\n- \\`groups:history\\` - To read messages in private channels\n- \\`im:history\\` - To read direct messages\n- \\`mpim:history\\` - To read group direct messages\n- \\`chat:write\\` - To send messages\n\n### 3. Enable Event Subscriptions\n1. Go to **Event Subscriptions**\n2. Toggle \"Enable Events\" to ON\n3. Toggle the webhook active button above and copy the webhook URL\n4. Add your webhook URL to the Request URL field\n5. Subscribe to bot events: \\`message.channels\\`, \\`message.groups\\`, \\`message.im\\`, \\`message.mpim\\`\n\n### 4. Install to Workspace\n1. Go to **Install App**\n2. Click \"Install to Workspace\"\n3. Authorize the requested permissions\n\n### 5. Get Your Bot Token\nCopy the **Bot User OAuth Token** (starts with \\`xoxb-\\`) from the OAuth & Permissions page.`,\n payloadSchema: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'The message text' },\n channel: {\n type: 'string',\n description: 'Channel ID where message was posted',\n },\n user: { type: 'string', description: 'User ID who posted the message' },\n channel_type: {\n type: 'string',\n description: 'Type of channel (channel, group, im, mpim)',\n },\n files: {\n type: 'array',\n description:\n 'Files/images attached to the message. Present when user shares files. Use url_private with bot token to download.',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Unique file identifier' },\n name: { type: 'string', description: 'Filename with extension' },\n title: { type: 'string', description: 'Display title' },\n mimetype: {\n type: 'string',\n description: 'MIME type (e.g., image/png)',\n },\n filetype: {\n type: 'string',\n description: 'File extension (e.g., png)',\n },\n size: { type: 'number', description: 'File size in bytes' },\n url_private: {\n type: 'string',\n description: 'Private URL to access file (requires bot token)',\n },\n url_private_download: {\n type: 'string',\n description:\n 'Private URL to download file (requires bot token)',\n },\n thumb_360: {\n type: 'string',\n description: '360px thumbnail URL for images',\n },\n thumb_480: {\n type: 'string',\n description: '480px thumbnail URL for images',\n },\n original_w: {\n type: 'number',\n description: 'Original image width in pixels',\n },\n original_h: {\n type: 'number',\n description: 'Original image height in pixels',\n },\n permalink: {\n type: 'string',\n description: 'Permanent link to the file',\n },\n },\n },\n },\n slack_event: {\n type: 'object',\n description: 'Full Slack event wrapper',\n properties: {\n token: { type: 'string', description: 'Verification token' },\n team_id: { type: 'string', description: 'Workspace ID' },\n api_app_id: { type: 'string', description: 'Slack App ID' },\n type: {\n type: 'string',\n enum: ['event_callback'],\n description: 'Event type',\n },\n event_id: { type: 'string', description: 'Unique event ID' },\n event_time: { type: 'number', description: 'Event timestamp' },\n event_context: { type: 'string', description: 'Event context' },\n authorizations: {\n type: 'array',\n description: 'Bot authorizations',\n items: {\n type: 'object',\n properties: {\n enterprise_id: { type: 'string' },\n team_id: { type: 'string' },\n user_id: { type: 'string' },\n is_bot: { type: 'boolean' },\n },\n },\n },\n event: {\n type: 'object',\n description: 'Inner message event data',\n properties: {\n type: {\n type: 'string',\n enum: ['message'],\n description: 'Event type',\n },\n user: {\n type: 'string',\n description: 'User ID who sent the message',\n },\n text: { type: 'string', description: 'Message text content' },\n ts: { type: 'string', description: 'Message timestamp' },\n channel: { type: 'string', description: 'Channel ID' },\n event_ts: { type: 'string', description: 'Event timestamp' },\n channel_type: {\n type: 'string',\n enum: ['channel', 'group', 'im', 'mpim'],\n description: 'Type of channel',\n },\n subtype: {\n type: 'string',\n description:\n 'Message subtype (e.g., file_share when files attached)',\n },\n files: {\n type: 'array',\n description: 'Files attached to the message',\n },\n },\n required: [\n 'type',\n 'user',\n 'text',\n 'ts',\n 'channel',\n 'event_ts',\n 'channel_type',\n ],\n },\n },\n required: [\n 'token',\n 'team_id',\n 'api_app_id',\n 'type',\n 'event_id',\n 'event_time',\n 'event',\n ],\n },\n },\n required: ['text', 'channel', 'user', 'slack_event'],\n },\n },\n 'slack/bot_mentioned': {\n serviceName: 'Slack',\n friendlyName: 'When Slack bot is mentioned',\n description: 'Triggered when someone mentions your bot in a Slack channel',\n setupGuide: `## Slack Bot Setup Guide\n\n### 1. Create a Slack App\n1. Go to [Slack API Apps](https://api.slack.com/apps)\n2. Click \"Create New App\" → \"From scratch\"\n3. Name your app and select your workspace\n\n### 2. Configure OAuth Scopes\nNavigate to **OAuth & Permissions** and add these Bot Token Scopes:\n- \\`app_mentions:read\\` - To receive mention events\n- \\`chat:write\\` - To send messages\n- \\`channels:history\\` - To read channel messages (optional)\n\n### 3. Enable Event Subscriptions\n1. Go to **Event Subscriptions**\n2. Toggle \"Enable Events\" to ON\n3. Toggle the webhook active button above and copy the webhook URL\n4. Add your webhook URL to the Request URL field\n5. Subscribe to bot events: \\`app_mention\\`\n\n### 4. Install to Workspace\n1. Go to **Install App**\n2. Click \"Install to Workspace\"\n3. Authorize the requested permissions\n\n### 5. Get Your Bot Token\nCopy the **Bot User OAuth Token** (starts with \\`xoxb-\\`) from the OAuth & Permissions page.`,\n payloadSchema: {\n type: 'object',\n properties: {\n text: {\n type: 'string',\n description: 'The message text mentioning the bot',\n },\n channel: {\n type: 'string',\n description: 'Channel ID where bot was mentioned',\n },\n user: { type: 'string', description: 'User ID who mentioned the bot' },\n thread_ts: {\n type: 'string',\n description: 'Thread timestamp (if replying in a thread)',\n },\n files: {\n type: 'array',\n description:\n 'Files/images attached to the mention message. Use url_private with bot token to download.',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Unique file identifier' },\n name: { type: 'string', description: 'Filename with extension' },\n title: { type: 'string', description: 'Display title' },\n mimetype: {\n type: 'string',\n description: 'MIME type (e.g., image/png)',\n },\n filetype: {\n type: 'string',\n description: 'File extension (e.g., png)',\n },\n size: { type: 'number', description: 'File size in bytes' },\n url_private: {\n type: 'string',\n description: 'Private URL to access file (requires bot token)',\n },\n url_private_download: {\n type: 'string',\n description:\n 'Private URL to download file (requires bot token)',\n },\n thumb_360: {\n type: 'string',\n description: '360px thumbnail URL for images',\n },\n thumb_480: {\n type: 'string',\n description: '480px thumbnail URL for images',\n },\n original_w: {\n type: 'number',\n description: 'Original image width in pixels',\n },\n original_h: {\n type: 'number',\n description: 'Original image height in pixels',\n },\n permalink: {\n type: 'string',\n description: 'Permanent link to the file',\n },\n },\n },\n },\n slack_event: {\n type: 'object',\n description: 'Full Slack event wrapper',\n properties: {\n token: { type: 'string', description: 'Verification token' },\n team_id: { type: 'string', description: 'Workspace ID' },\n api_app_id: { type: 'string', description: 'Slack App ID' },\n type: {\n type: 'string',\n enum: ['event_callback'],\n description: 'Event type',\n },\n event_id: { type: 'string', description: 'Unique event ID' },\n event_time: { type: 'number', description: 'Event timestamp' },\n event_context: { type: 'string', description: 'Event context' },\n authorizations: {\n type: 'array',\n description: 'Bot authorizations',\n items: {\n type: 'object',\n properties: {\n enterprise_id: { type: 'string' },\n team_id: { type: 'string' },\n user_id: { type: 'string' },\n is_bot: { type: 'boolean' },\n },\n },\n },\n event: {\n type: 'object',\n description: 'Inner app_mention event data',\n properties: {\n type: {\n type: 'string',\n enum: ['app_mention'],\n description: 'Event type',\n },\n user: {\n type: 'string',\n description: 'User ID who mentioned the bot',\n },\n text: {\n type: 'string',\n description: 'Message text containing the mention',\n },\n ts: { type: 'string', description: 'Message timestamp' },\n channel: { type: 'string', description: 'Channel ID' },\n event_ts: { type: 'string', description: 'Event timestamp' },\n thread_ts: {\n type: 'string',\n description: 'Thread timestamp (if in a thread)',\n },\n files: {\n type: 'array',\n description: 'Files attached to the mention message',\n },\n },\n required: ['type', 'user', 'text', 'ts', 'channel', 'event_ts'],\n },\n },\n required: [\n 'token',\n 'team_id',\n 'api_app_id',\n 'type',\n 'event_id',\n 'event_time',\n 'event',\n ],\n },\n },\n required: ['text', 'channel', 'user', 'slack_event'],\n },\n },\n 'airtable/record_created': {\n serviceName: 'Airtable',\n friendlyName: 'When Airtable record is created',\n description: 'Triggered when a new record is created in an Airtable base',\n setupGuide: `## Airtable Record Created Setup Guide\n\n### 1. Connect Your Airtable Account\n1. Go to Credentials and add an Airtable OAuth connection\n2. Authorize access to your Airtable workspace\n\n### 2. Create a Webhook\nWebhooks must be created via the Airtable API. The system will handle this automatically when you configure the trigger.\n\n### 3. Configure the Trigger\n1. Select your Airtable credential\n2. Choose the base and table to monitor\n3. The webhook will be created automatically\n\n### Payload Structure\nThe payload includes:\n- \\`base_id\\`: The Airtable base ID\n- \\`table_id\\`: The table where records were created\n- \\`airtable_event.records\\`: Map of record IDs to their field values`,\n payloadSchema: {\n type: 'object',\n properties: {\n base_id: { type: 'string', description: 'Airtable base ID' },\n table_id: {\n type: 'string',\n description: 'Table ID where record was created',\n },\n airtable_event: {\n type: 'object',\n description: 'Full Airtable event data',\n },\n },\n required: ['base_id', 'table_id', 'airtable_event'],\n },\n },\n 'airtable/record_updated': {\n serviceName: 'Airtable',\n friendlyName: 'When Airtable record is updated',\n description: 'Triggered when a record is updated in an Airtable base',\n setupGuide: `## Airtable Record Updated Setup Guide\n\n### 1. Connect Your Airtable Account\n1. Go to Credentials and add an Airtable OAuth connection\n2. Authorize access to your Airtable workspace\n\n### 2. Configure the Trigger\n1. Select your Airtable credential\n2. Choose the base and table to monitor\n3. The webhook will be created automatically\n\n### Payload Structure\nThe payload includes:\n- \\`base_id\\`: The Airtable base ID\n- \\`table_id\\`: The table where records were updated\n- \\`airtable_event.records\\`: Map of record IDs to their current and previous field values`,\n payloadSchema: {\n type: 'object',\n properties: {\n base_id: { type: 'string', description: 'Airtable base ID' },\n table_id: {\n type: 'string',\n description: 'Table ID where record was updated',\n },\n airtable_event: {\n type: 'object',\n description:\n 'Full Airtable event data with current and previous values',\n },\n },\n required: ['base_id', 'table_id', 'airtable_event'],\n },\n },\n 'airtable/record_deleted': {\n serviceName: 'Airtable',\n friendlyName: 'When Airtable record is deleted',\n description: 'Triggered when a record is deleted from an Airtable base',\n setupGuide: `## Airtable Record Deleted Setup Guide\n\n### 1. Connect Your Airtable Account\n1. Go to Credentials and add an Airtable OAuth connection\n2. Authorize access to your Airtable workspace\n\n### 2. Configure the Trigger\n1. Select your Airtable credential\n2. Choose the base and table to monitor\n3. The webhook will be created automatically\n\n### Payload Structure\nThe payload includes:\n- \\`base_id\\`: The Airtable base ID\n- \\`table_id\\`: The table where records were deleted\n- \\`airtable_event.recordIds\\`: Array of deleted record IDs`,\n payloadSchema: {\n type: 'object',\n properties: {\n base_id: { type: 'string', description: 'Airtable base ID' },\n table_id: {\n type: 'string',\n description: 'Table ID where record was deleted',\n },\n airtable_event: {\n type: 'object',\n description: 'Full Airtable event data with deleted record IDs',\n },\n },\n required: ['base_id', 'table_id', 'airtable_event'],\n },\n },\n 'schedule/cron': {\n serviceName: 'Cron',\n friendlyName: 'On Schedule',\n description:\n 'Triggered on a recurring schedule defined by a cron expression',\n setupGuide: `## Cron Schedule Setup Guide\n\nConfigure when this flow should run using the schedule editor or a cron expression.\n\n### Common Schedules\n- **Every minute**: \\`* * * * *\\`\n- **Every hour**: \\`0 * * * *\\`\n- **Daily at midnight**: \\`0 0 * * *\\`\n- **Weekly on Monday**: \\`0 0 * * 1\\`\n- **Monthly on the 1st**: \\`0 0 1 * *\\`\n\n### Cron Format\n\\`\\`\\`\n┌───────────── minute (0-59)\n│ ┌───────────── hour (0-23)\n│ │ ┌───────────── day of month (1-31)\n│ │ │ ┌───────────── month (1-12)\n│ │ │ │ ┌───────────── day of week (0-6, Sunday=0)\n│ │ │ │ │\n* * * * *\n\\`\\`\\`\n\n### Custom Payload Interface\nDefine your own payload interface extending CronEvent for scheduled input data:\n\\`\\`\\`typescript\ninterface DailyReportPayload extends CronEvent {\n reportType: 'summary' | 'detailed';\n recipients: string[];\n}\n\nexport class DailyReportFlow extends BubbleFlow<'schedule/cron'> {\n readonly cronSchedule = '0 9 * * 1-5'; // Weekdays at 9am\n\n async handle(payload: DailyReportPayload) {\n // Access fields directly: payload.reportType, payload.recipients\n }\n}\n\\`\\`\\``,\n payloadSchema: {\n type: 'object',\n properties: {},\n additionalProperties: true,\n },\n },\n 'webhook/http': {\n serviceName: 'Webhook',\n friendlyName: 'HTTP Webhook',\n description: 'Triggered by an HTTP POST request to your webhook URL',\n setupGuide: `## Webhook Setup Guide\n\n### Your Webhook URL\nToggle the webhook active button above and copy the webhook URL to send HTTP POST requests to trigger this flow.\n\n### Request Format\n\\`\\`\\`bash\ncurl -X POST https://your-domain.com/webhook/your-path \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\"email\": \"user@example.com\", \"name\": \"John\"}'\n\\`\\`\\`\n\n### Custom Payload Interface\nDefine your own payload interface extending WebhookEvent:\n\\`\\`\\`typescript\ninterface MyPayload extends WebhookEvent {\n email: string;\n name: string;\n message?: string;\n}\n\nexport class MyFlow extends BubbleFlow<'webhook/http'> {\n async handle(payload: MyPayload) {\n // Access fields directly: payload.email, payload.name\n }\n}\n\\`\\`\\`\n\nThe JSON body fields from the HTTP request are directly available on the payload object.`,\n payloadSchema: {\n type: 'object',\n properties: {},\n additionalProperties: true,\n },\n },\n};\n\n/**\n * Get configuration for a trigger event type\n * @param eventType - The trigger event type key\n * @returns The trigger configuration or undefined if not found\n */\nexport function getTriggerEventConfig(\n eventType: keyof BubbleTriggerEventRegistry\n): TriggerEventConfig {\n return TRIGGER_EVENT_CONFIGS[eventType];\n}\n\n/**\n * Check if an event type is a service trigger (not webhook/cron)\n * Service triggers get special UI treatment with logos and friendly names\n */\nexport function isServiceTrigger(\n eventType: keyof BubbleTriggerEventRegistry\n): boolean {\n return eventType !== 'webhook/http' && eventType !== 'schedule/cron';\n}\n\n/**\n * Mapping from trigger event interface names to their event type keys.\n * Used by BubbleParser to identify when a payload interface extends a known trigger event.\n */\nexport const TRIGGER_EVENT_INTERFACE_MAP: Record<\n string,\n keyof BubbleTriggerEventRegistry\n> = {\n SlackMentionEvent: 'slack/bot_mentioned',\n SlackMessageReceivedEvent: 'slack/message_received',\n AirtableRecordCreatedEvent: 'airtable/record_created',\n AirtableRecordUpdatedEvent: 'airtable/record_updated',\n AirtableRecordDeletedEvent: 'airtable/record_deleted',\n CronEvent: 'schedule/cron',\n WebhookEvent: 'webhook/http',\n BubbleTriggerEvent: 'webhook/http', // Base type defaults to webhook\n};\n\n/**\n * Get the trigger event type key from an interface name.\n * @param interfaceName - The name of the interface (e.g., 'SlackMentionEvent')\n * @returns The trigger event type key or undefined if not a known trigger interface\n */\nexport function getTriggerEventTypeFromInterfaceName(\n interfaceName: string\n): keyof BubbleTriggerEventRegistry | undefined {\n return TRIGGER_EVENT_INTERFACE_MAP[interfaceName];\n}\n","export type StorableValue = {\n truncated: boolean;\n preview: string | unknown;\n sizeBytes: number;\n};\n\n/**\n * Prepare an object for storage with a size cap. If the JSON stringified\n * representation exceeds maxBytes, return a preview marker with metadata.\n * Also logs a warning when truncation happens.\n *\n * Returns a consistent object structure when truncated to ensure compatibility\n * with database schemas expecting JSON objects (jsonb/text with mode: 'json').\n */\nexport function prepareForStorage(\n value: unknown,\n options?: { maxBytes?: number; previewBytes?: number }\n): StorableValue {\n const maxBytes = options?.maxBytes ?? 1024 * 1024; // 1MB\n const previewBytes = options?.previewBytes ?? 4096; // 4KB\n\n try {\n const json = JSON.stringify(value);\n // Compute byte length in a way that works in both browser and Node\n const sizeBytes =\n typeof TextEncoder !== 'undefined'\n ? new TextEncoder().encode(json).length\n : ((globalThis as any).Buffer?.byteLength?.(json, 'utf8') ??\n json.length);\n if (sizeBytes > maxBytes) {\n // eslint-disable-next-line no-console\n console.warn(\n `[prepareForStorage] Size ${sizeBytes} > ${maxBytes}. Storing preview only.`\n );\n // Use Buffer.slice to ensure we slice at byte boundaries, not character boundaries\n // This prevents splitting multi-byte UTF-8 characters\n const previewBuffer =\n json.slice(0, previewBytes) + '....truncated due to size limit';\n return {\n truncated: true,\n preview: previewBuffer,\n sizeBytes,\n };\n }\n return {\n truncated: false,\n preview: value,\n sizeBytes: 0,\n };\n } catch (_err) {\n // eslint-disable-next-line no-console\n console.warn(\n '[prepareForStorage] Failed to serialize value for size check. Storing preview only.'\n );\n return {\n truncated: true,\n preview: '',\n sizeBytes: 0,\n };\n }\n}\n\nexport function cleanUpObjectForDisplayAndStorage(\n obj: unknown,\n maxBytes: number = 1024 * 1024\n): unknown {\n const storageResult = prepareForStorage(obj, { maxBytes });\n if (storageResult.truncated) {\n return storageResult.preview;\n }\n return obj;\n}\n","/**\n * Utility functions for parameter handling\n */\n\n/**\n * Sanitizes parameters by removing credential-related fields\n * @param params - The parameters object to sanitize\n * @returns A new object with credentials removed\n */\nexport function sanitizeParams(\n params: Record<string, unknown>\n): Record<string, unknown> {\n // Remove credentials from params\n return Object.fromEntries(\n Object.entries(params).filter(([key]) => !key.startsWith('credentials'))\n );\n}\n","import { BUBBLE_TRIGGER_EVENTS } from './trigger.js';\n\n/**\n * Enhances TypeScript error messages with helpful hints about available options\n * for BubbleTriggerEventRegistry, BubbleError, and LogMetadata\n */\nexport function enhanceErrorMessage(errorMessage: string): string {\n let enhanced = errorMessage;\n\n // Pattern 1: BubbleTriggerEventRegistry errors\n // Matches: \"Type 'X' does not satisfy the constraint 'keyof BubbleTriggerEventRegistry'\"\n const triggerRegistryPattern =\n /does not satisfy the constraint 'keyof BubbleTriggerEventRegistry'/;\n if (triggerRegistryPattern.test(enhanced)) {\n const availableKeys = Object.keys(BUBBLE_TRIGGER_EVENTS);\n const hint = `\\nAvailable trigger event types: ${availableKeys.map((k) => `'${k}'`).join(', ')}`;\n enhanced = enhanced + hint;\n }\n\n // Pattern 2: Generic \"keyof BubbleTriggerEventRegistry\" constraint errors\n // Matches: \"Type 'X' does not satisfy the constraint 'keyof BubbleTriggerEventRegistry'\"\n const keyofTriggerPattern =\n /Type '([^']+)' does not satisfy the constraint 'keyof BubbleTriggerEventRegistry'/;\n if (\n keyofTriggerPattern.test(enhanced) &&\n !enhanced.includes('Available trigger event types')\n ) {\n const availableKeys = Object.keys(BUBBLE_TRIGGER_EVENTS);\n const hint = `\\nAvailable trigger event types: ${availableKeys.map((k) => `'${k}'`).join(', ')}`;\n enhanced = enhanced + hint;\n }\n\n // Pattern 3: BubbleError type errors\n // Matches whenever \"BubbleError\" appears in the error message\n const bubbleErrorPattern = /BubbleError/;\n if (bubbleErrorPattern.test(enhanced)) {\n const hint =\n `\\nBubbleLogger.error() method signature:\\n` +\n `- this.logger?.error(message: string, error?: BubbleError, metadata?: Partial<LogMetadata>)\\n` +\n `\\nIMPORTANT: The second parameter must be a BubbleError instance, NOT a string!\\n` +\n `\\n❌ INCORRECT: this.logger?.error(\"msg1\", \"msg2\")\\n` +\n `❌ INCORRECT: this.logger?.error(msg1, msg2) // where msg2 is a string\\n` +\n `\\n✅ CORRECT: this.logger?.error(\"Error message\")\\n` +\n `✅ CORRECT: this.logger?.error(\"Error message\", bubbleError)\\n` +\n `✅ CORRECT: this.logger?.error(\"Error message\", bubbleError, { variableId: 1 })\\n` +\n `\\nBubbleError minimal interface:\\n` +\n `- message: string (from Error)\\n` +\n `- variableId?: number\\n` +\n `- bubbleName?: string\\n` +\n `\\nCreating a BubbleError:\\n` +\n `- new BubbleError(\"Error message\", { variableId?: number, bubbleName?: string })\\n` +\n `- new BubbleValidationError(\"Validation failed\", { variableId?: number, bubbleName?: string, validationErrors?: string[] })\\n` +\n `- new BubbleExecutionError(\"Execution failed\", { variableId?: number, bubbleName?: string, executionPhase?: 'instantiation' | 'execution' | 'validation' })\\n` +\n `\\nLogMetadata minimal interface (for metadata parameter):\\n` +\n `- variableId?: number\\n` +\n `- bubbleName?: string\\n` +\n `- lineNumber?: number\\n` +\n `- additionalData?: Record<string, unknown>\\n` +\n `\\nExample usage:\\n` +\n `- this.logger?.error(\"Bubble execution failed\", new BubbleError(\"Details\", { variableId: 1, bubbleName: \"MyBubble\" }))\\n` +\n `- this.logger?.error(\"Error occurred\", undefined, { variableId: 1, additionalData: { custom: \"data\" } })`;\n enhanced = enhanced + hint;\n }\n\n // Pattern 4: LogMetadata property errors\n // Matches: \"'X' does not exist in type 'LogMetadata'\" or \"'X' does not exist in type 'Partial<LogMetadata>'\"\n // We only allow additional data to be part of AI agent's context for simplicity\n const logMetadataPropertyPattern =\n /'(\\w+)' does not exist in type '(?:Partial<)?LogMetadata(?:>)?'/;\n const logMetadataMatch = enhanced.match(logMetadataPropertyPattern);\n if (logMetadataMatch) {\n const [, propertyName] = logMetadataMatch;\n const hint =\n `\\nLogMetadata does not support '${propertyName}'. Available properties:\\n` +\n `- additionalData?: Record<string, unknown>`;\n enhanced = enhanced + hint;\n }\n\n // Pattern 5: LogMetadata type assignment errors\n // Matches whenever \"LogMetadata\" appears in the error message\n const logMetadataTypePattern = /LogMetadata/;\n if (\n logMetadataTypePattern.test(enhanced) &&\n !enhanced.includes('Available properties:')\n ) {\n const hint =\n `\\nLogMetadata interface properties:\\n` +\n `- additionalData?: Record<string, unknown> (optional)\\n` +\n `\\nTo add custom data, use the additionalData property.`;\n enhanced = enhanced + hint;\n }\n\n // Pattern 6: Module has no exported member errors\n // Matches: \"Module 'X' has no exported member 'Y'\"\n const noExportedMemberPattern =\n /Module '([^']+)' has no exported member '(\\w+)'/;\n const noExportedMemberMatch = enhanced.match(noExportedMemberPattern);\n if (noExportedMemberMatch) {\n const [, moduleName, memberName] = noExportedMemberMatch;\n const hint =\n `\\n'${memberName}' is not exported from '${moduleName}'. ` +\n `Please remove it from your import statement or check the module's exports for the correct name.`;\n enhanced = enhanced + hint;\n }\n\n return enhanced;\n}\n","/**\n * Shared hashing utilities for generating deterministic variable IDs\n */\n\n/**\n * Generate a deterministic non-negative integer ID from a string input.\n * Uses FNV-1a hash algorithm for better distribution and fewer collisions.\n *\n * This is used to generate variableIds that remain consistent across:\n * - Bubble parsing (BubbleParser)\n * - Logger injection (LoggerInjector)\n *\n * @param input - String to hash (e.g., method name, uniqueId)\n * @returns A 6-digit integer in the range [100000, 999999]\n */\nexport function hashToVariableId(input: string): number {\n let hash = 2166136261; // FNV-1a 32-bit offset basis\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = (hash * 16777619) >>> 0; // unsigned 32-bit\n }\n // Map to 6-digit range to avoid colliding with small AST ids while readable\n const mapped = 100000 + (hash % 900000);\n return mapped;\n}\n\n/**\n * Build a call site key from method name and invocation order.\n * Using the ordinal position of the invocation within the method keeps the key\n * stable even if lines shift after instrumentation.\n *\n * @param methodName - Name of the instance method being called\n * @param invocationIndex - 1-based invocation index within that method\n * @returns A string key in the format \"methodName#invocationIndex\"\n */\nexport function buildCallSiteKey(\n methodName: string,\n invocationIndex: number\n): string {\n return `${methodName}#${invocationIndex}`;\n}\n","/**\n * Shared parameter formatting utilities for both frontend and runtime.\n * This module contains core formatting logic that can be used by:\n * - bubble-runtime (for code injection/transformation)\n * - bubble-studio (for visual editing)\n */\n\nimport type { BubbleParameter } from './bubble-definition-schema.js';\nimport { BubbleParameterType } from './bubble-definition-schema.js';\n\n/**\n * Patterns that indicate function literals in source code.\n * Used to detect when parameters contain functions that cannot be safely condensed.\n */\nconst FUNCTION_LITERAL_PATTERNS = [\n 'func:', // Object property with function value\n '=>', // Arrow function\n 'function(', // Function expression\n 'function (', // Function expression with space\n 'async(', // Async arrow function\n 'async (', // Async function with space\n] as const;\n\n/**\n * Check if a string contains function literal patterns.\n * When function literals are present, the source code must be preserved as-is\n * because functions cannot be safely serialized or condensed to single-line.\n */\nexport function containsFunctionLiteral(value: string): boolean {\n return FUNCTION_LITERAL_PATTERNS.some((pattern) => value.includes(pattern));\n}\n\n/**\n * Format a parameter value based on its type.\n * Converts values to their TypeScript code representation.\n */\nexport function formatParameterValue(value: unknown, type: string): string {\n switch (type) {\n case 'string': {\n const stringValue = String(value);\n // If it's a template literal, pass through unchanged\n if (stringValue.startsWith('`') && stringValue.endsWith('`')) {\n return stringValue;\n }\n // Always properly quote strings, regardless of input format\n // This ensures consistent quoting that survives condensation\n const escapedValue = stringValue.replace(/'/g, \"\\\\'\");\n return `'${escapedValue}'`;\n }\n case 'number':\n return String(value);\n case 'boolean':\n return String(value);\n case 'object':\n // If caller provided a source literal string, keep it as code\n if (typeof value === 'string') {\n const trimmed = value.trim();\n // Preserve source code if it contains function literals\n if (containsFunctionLiteral(trimmed)) {\n return value;\n }\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n trimmed.startsWith('new ')\n ) {\n return value;\n }\n }\n return JSON.stringify(value, null, 2);\n case 'array':\n if (typeof value === 'string') {\n const trimmed = value.trim();\n // Preserve source code if it contains function literals\n if (containsFunctionLiteral(trimmed)) {\n return value;\n }\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n return value;\n }\n }\n return JSON.stringify(value);\n case 'env':\n return `process.env.${String(value)}`;\n case 'variable':\n return String(value); // Reference to another variable\n case 'expression':\n return String(value); // Return expressions unquoted so they can be evaluated\n default:\n return JSON.stringify(value);\n }\n}\n\n/**\n * Condense a parameters string to a single line.\n * Used when parameters don't contain function literals.\n */\nexport function condenseToSingleLine(input: string): string {\n return input\n .replace(/\\s*\\n\\s*/g, ' ')\n .replace(/\\s{2,}/g, ' ')\n .replace(/\\{\\s+/g, '{ ')\n .replace(/\\s+\\}/g, ' }')\n .replace(/\\s*,\\s*/g, ', ')\n .trim();\n}\n\n/**\n * Strip // line comments and /* block comments that are outside of string and template literals.\n * This is used before we condense parameters into a single line so inline comments don't swallow code.\n */\nexport function stripCommentsOutsideStrings(input: string): string {\n let result = '';\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let inLineComment = false;\n let inBlockComment = false;\n let escapeNext = false;\n\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n const next = i + 1 < input.length ? input[i + 1] : '';\n\n if (inLineComment) {\n if (ch === '\\n') {\n inLineComment = false;\n result += ch;\n }\n continue;\n }\n\n if (inBlockComment) {\n if (ch === '*' && next === '/') {\n inBlockComment = false;\n i++; // skip '/'\n }\n continue;\n }\n\n if (inSingle) {\n if (escapeNext) {\n result += ch;\n escapeNext = false;\n continue;\n }\n if (ch === '\\\\') {\n result += ch;\n escapeNext = true;\n continue;\n }\n result += ch;\n if (ch === \"'\") inSingle = false;\n continue;\n }\n\n if (inDouble) {\n if (escapeNext) {\n result += ch;\n escapeNext = false;\n continue;\n }\n if (ch === '\\\\') {\n result += ch;\n escapeNext = true;\n continue;\n }\n result += ch;\n if (ch === '\"') inDouble = false;\n continue;\n }\n\n if (inTemplate) {\n if (escapeNext) {\n result += ch;\n escapeNext = false;\n continue;\n }\n if (ch === '\\\\') {\n result += ch;\n escapeNext = true;\n continue;\n }\n result += ch;\n if (ch === '`') inTemplate = false;\n continue;\n }\n\n // Not in any string/comment\n if (ch === '/' && next === '/') {\n inLineComment = true;\n i++; // skip next '/'\n continue;\n }\n if (ch === '/' && next === '*') {\n inBlockComment = true;\n i++; // skip next '*'\n continue;\n }\n if (ch === \"'\") {\n inSingle = true;\n result += ch;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n result += ch;\n continue;\n }\n if (ch === '`') {\n inTemplate = true;\n result += ch;\n continue;\n }\n\n result += ch;\n }\n\n return result;\n}\n\nexport interface BuildParameterObjectOptions {\n /** Whether to preserve multi-line formatting (default: false, will condense to single line) */\n preserveFormatting?: boolean;\n}\n\n/**\n * Build just the parameters object literal (no runtime metadata like logger config).\n * This is the core function used by both runtime and frontend for parameter serialization.\n *\n * @param parameters - Array of bubble parameters\n * @param options - Optional settings for formatting\n * @returns The parameters object as a TypeScript code string\n */\nexport function buildParameterObjectLiteral(\n parameters: BubbleParameter[],\n options?: BuildParameterObjectOptions\n): string {\n const { preserveFormatting = false } = options ?? {};\n\n if (!parameters || parameters.length === 0) {\n return '{}';\n }\n\n // Handle single variable parameter case (e.g., new GoogleDriveBubble(params))\n if (\n parameters.length === 1 &&\n parameters[0].type === BubbleParameterType.VARIABLE\n ) {\n const paramValue = formatParameterValue(\n parameters[0].value,\n parameters[0].type\n );\n return paramValue;\n }\n\n const nonCredentialParams = parameters.filter(\n (p) => p.name !== 'credentials'\n );\n const credentialsParam = parameters.find(\n (p) => p.name === 'credentials' && p.type === BubbleParameterType.OBJECT\n );\n\n // Handle single variable parameter + credentials case\n if (\n credentialsParam &&\n nonCredentialParams.length === 1 &&\n nonCredentialParams[0].type === BubbleParameterType.VARIABLE\n ) {\n const paramsParam = nonCredentialParams[0];\n\n // Only spread if the parameter source is 'first-arg' (represents entire first argument),\n // or if source is undefined (backward compatibility) and name is 'arg0' (parser's fallback).\n const shouldSpread =\n paramsParam.source === 'first-arg' ||\n (paramsParam.source === undefined && paramsParam.name === 'arg0');\n\n if (shouldSpread) {\n const paramsValue = formatParameterValue(\n paramsParam.value,\n paramsParam.type\n );\n const credentialsValue = formatParameterValue(\n credentialsParam.value,\n credentialsParam.type\n );\n\n return `{...${paramsValue}, credentials: ${credentialsValue}}`;\n }\n }\n\n // Separate spreads from regular properties\n const spreadParams = nonCredentialParams.filter((p) => p.source === 'spread');\n const regularParams = nonCredentialParams.filter(\n (p) => p.source !== 'spread'\n );\n\n // Build parameter entries: regular properties first, then spreads\n const regularEntries = regularParams.map((param) => {\n const value = formatParameterValue(param.value, param.type);\n return `${param.name}: ${value}`;\n });\n\n const spreadEntries = spreadParams.map((param) => {\n const value = formatParameterValue(param.value, param.type);\n return `...${value}`;\n });\n\n // Combine all entries: regular properties, spreads, then credentials\n const allEntries = [...regularEntries, ...spreadEntries];\n if (credentialsParam) {\n const credentialsValue = formatParameterValue(\n credentialsParam.value,\n credentialsParam.type\n );\n allEntries.push(`credentials: ${credentialsValue}`);\n }\n\n let paramsString = `{\\n ${allEntries.join(',\\n ')}\\n }`;\n\n // Check if parameters contain function literals before condensing\n const hasFunctions = containsFunctionLiteral(paramsString);\n\n if (!preserveFormatting && !hasFunctions) {\n // Strip comments and condense to single line\n paramsString = stripCommentsOutsideStrings(paramsString);\n paramsString = condenseToSingleLine(paramsString);\n }\n\n return paramsString;\n}\n"],"mappings":"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","names":["z","CredentialType","z","z","z","BubbleParameterType","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/api-schema.ts","../src/database-definition-schema.ts","../src/types.ts","../src/credential-schema.ts","../src/bubble-definition-schema.ts","../src/mock-data-generator.ts","../src/oauth-schema.ts","../src/waitlist-schema.ts","../src/bubbleflow-schema.ts","../src/permission-schema.ts","../src/bubbleflow-execution-schema.ts","../src/generate-bubbleflow-schema.ts","../src/coffee.ts","../src/webhook-schema.ts","../src/subscription-status-schema.ts","../src/organization-schema.ts","../src/milk-tea.ts","../src/ai-models.ts","../src/agent-memory.ts","../src/pearl.ts","../src/rice.ts","../src/bubbleflow-generation-prompts.ts","../src/cron-utils.ts","../src/trigger.ts","../src/storage-utils.ts","../src/param-utils.ts","../src/error-enhancer.ts","../src/hash-utils.ts","../src/parameter-formatter.ts"],"sourcesContent":["import { z } from '@hono/zod-openapi';\n\nexport const errorResponseSchema = z\n .object({\n error: z.string().openapi({\n description: 'Error message',\n example: 'Validation failed',\n }),\n details: z.string().optional().openapi({\n description: 'Additional error details',\n example: 'Invalid field: name is required',\n }),\n })\n .openapi('ErrorResponse');\n\nexport type ErrorResponse = z.infer<typeof errorResponseSchema>;\n\nexport interface HealthCheckResponse {\n message: string;\n timestamp: string;\n}\n\nexport const slackUrlVerificationSchema = z.object({\n token: z.string(),\n challenge: z.string(),\n type: z.literal('url_verification'),\n});\n\nexport const slackUrlVerificationResponseSchema = z\n .object({\n challenge: z\n .string()\n .openapi({ description: 'Slack URL verification challenge' }),\n })\n .openapi('SlackUrlVerificationResponse');\n\nexport type SlackUrlVerificationResponse = z.infer<\n typeof slackUrlVerificationResponseSchema\n>;\n","/**\n * Database Definition Schema\n *\n * This schema is designed to store database table definitions and metadata\n */\n\nimport { z } from '@hono/zod-openapi';\n\n// Database connection types for frontend display\nexport interface DatabaseConnection {\n id: string;\n name: string;\n type: 'postgresql' | 'mysql' | 'mongodb' | 'bigquery' | 'sqlite';\n host: string;\n port: number;\n database: string;\n username?: string;\n status: 'connected' | 'disconnected' | 'error';\n createdAt: string;\n lastUsed: string;\n description?: string;\n}\n\nexport type DatabaseStatus = 'connected' | 'disconnected' | 'error';\nexport type DatabaseType =\n | 'postgresql'\n | 'mysql'\n | 'mongodb'\n | 'bigquery'\n | 'sqlite';\n\n// Database schema types for table structure display\nexport interface DatabaseColumn {\n name: string;\n type: string;\n isNullable: boolean;\n defaultValue?: string;\n constraints?: string[];\n}\n\nexport interface DatabaseTable {\n name: string;\n schema: string;\n columns: DatabaseColumn[];\n rowCount?: number;\n size?: string;\n}\n\nexport interface DatabaseSchema {\n tables: DatabaseTable[];\n totalTables: number;\n totalSize?: string;\n}\n\n// Schema for database metadata that can be stored in credentials\nexport const databaseMetadataSchema = z.object({\n // Core database definition - mapping of table names to column definitions\n // Format: { [tableName]: { [columnName]: columnType } }\n tables: z.record(\n z.string(), // table name\n z.record(\n z.string(), // column name\n z.string() // notes about it\n )\n ),\n // Table-level notes - mapping of table names to notes about the entire table\n tableNotes: z.record(z.string(), z.string()).optional(),\n // Optional metadata\n databaseName: z.string().optional(),\n databaseType: z\n .enum(['postgresql', 'mysql', 'sqlite', 'mssql', 'oracle'])\n .optional(),\n // Rules and constraints - simplified to match frontend\n rules: z\n .array(\n z.object({\n id: z.string(),\n text: z.string(),\n enabled: z.boolean(),\n createdAt: z.string(), // ISO string\n updatedAt: z.string(), // ISO string\n })\n )\n .optional(),\n // Additional context\n notes: z.string().optional(),\n tags: z.array(z.string()).optional(),\n});\n\nexport type DatabaseMetadata = z.infer<typeof databaseMetadataSchema>;\n\n/**\n * Jira OAuth metadata - stored after OAuth callback with cloudId for API calls\n */\nexport const jiraOAuthMetadataSchema = z.object({\n cloudId: z.string(),\n siteUrl: z.string(),\n siteName: z.string().optional(),\n /** Human-readable display name for the credential (e.g., Jira site name) */\n displayName: z.string().optional(),\n});\n\nexport type JiraOAuthMetadata = z.infer<typeof jiraOAuthMetadataSchema>;\n\n/**\n * Stripe Apps OAuth metadata - stored after OAuth callback\n */\nexport const stripeOAuthMetadataSchema = z.object({\n stripeUserId: z.string(), // Connected account ID (acct_xxx)\n stripePublishableKey: z.string(), // Publishable key (pk_live_xxx or pk_test_xxx)\n livemode: z.boolean(), // true = production, false = test mode\n /** Human-readable display name for the credential */\n displayName: z.string().optional(),\n});\n\nexport type StripeOAuthMetadata = z.infer<typeof stripeOAuthMetadataSchema>;\n\n/**\n * Slack OAuth metadata - stored after OAuth callback with workspace info\n */\nexport const slackOAuthMetadataSchema = z.object({\n teamId: z.string(),\n teamName: z.string(),\n botUserId: z.string(),\n /** Human-readable display name for the credential (workspace name) */\n displayName: z.string().optional(),\n});\n\nexport type SlackOAuthMetadata = z.infer<typeof slackOAuthMetadataSchema>;\n\n/**\n * Airtable OAuth metadata - stored after OAuth callback\n */\nexport const airtableOAuthMetadataSchema = z.object({\n airtableUserId: z.string(),\n email: z.string().optional(),\n /** Human-readable display name for the credential */\n displayName: z.string().optional(),\n});\n\nexport type AirtableOAuthMetadata = z.infer<typeof airtableOAuthMetadataSchema>;\n\n/**\n * Union type for all credential metadata types\n * - DatabaseMetadata: For DATABASE_CRED (PostgreSQL, etc.)\n * - JiraOAuthMetadata: For JIRA_CRED OAuth credentials\n * - SlackOAuthMetadata: For SLACK_CRED OAuth credentials\n */\nexport type CredentialMetadata =\n | DatabaseMetadata\n | JiraOAuthMetadata\n | SlackOAuthMetadata\n | AirtableOAuthMetadata;\n","// Define CredentialType enum here to avoid circular dependencies\n\nexport enum CredentialType {\n /**\n * Wildcard marker that indicates a bubble accepts any credential type.\n * Used in BUBBLE_CREDENTIAL_OPTIONS to allow users to plug in any credential.\n */\n CREDENTIAL_WILDCARD = '*',\n\n // AI Credentials\n OPENAI_CRED = 'OPENAI_CRED',\n GOOGLE_GEMINI_CRED = 'GOOGLE_GEMINI_CRED',\n ANTHROPIC_CRED = 'ANTHROPIC_CRED',\n OPENROUTER_CRED = 'OPENROUTER_CRED',\n // Search Credentials\n FIRECRAWL_API_KEY = 'FIRECRAWL_API_KEY',\n // Database Credentials\n DATABASE_CRED = 'DATABASE_CRED',\n // Communication Credentials\n SLACK_CRED = 'SLACK_CRED',\n TELEGRAM_BOT_TOKEN = 'TELEGRAM_BOT_TOKEN',\n // Email Credentials\n RESEND_CRED = 'RESEND_CRED',\n // Storage Credentials\n CLOUDFLARE_R2_ACCESS_KEY = 'CLOUDFLARE_R2_ACCESS_KEY',\n CLOUDFLARE_R2_SECRET_KEY = 'CLOUDFLARE_R2_SECRET_KEY',\n CLOUDFLARE_R2_ACCOUNT_ID = 'CLOUDFLARE_R2_ACCOUNT_ID',\n // Scraping Credentials\n APIFY_CRED = 'APIFY_CRED',\n\n // Voice Credentials\n ELEVENLABS_API_KEY = 'ELEVENLABS_API_KEY',\n\n // OAuth Credentials\n GOOGLE_DRIVE_CRED = 'GOOGLE_DRIVE_CRED',\n GMAIL_CRED = 'GMAIL_CRED',\n GOOGLE_SHEETS_CRED = 'GOOGLE_SHEETS_CRED',\n GOOGLE_CALENDAR_CRED = 'GOOGLE_CALENDAR_CRED',\n FUB_CRED = 'FUB_CRED',\n NOTION_OAUTH_TOKEN = 'NOTION_OAUTH_TOKEN',\n AIRTABLE_OAUTH = 'AIRTABLE_OAUTH',\n\n // Development Platform Credentials\n GITHUB_TOKEN = 'GITHUB_TOKEN',\n\n // Browser Automation Credentials\n AGI_API_KEY = 'AGI_API_KEY',\n\n // Database/Storage Credentials\n AIRTABLE_CRED = 'AIRTABLE_CRED',\n\n // InsForge Credentials\n INSFORGE_BASE_URL = 'INSFORGE_BASE_URL',\n INSFORGE_API_KEY = 'INSFORGE_API_KEY',\n\n // Custom Authentication Credentials\n CUSTOM_AUTH_KEY = 'CUSTOM_AUTH_KEY',\n\n // Browser Session Credentials (BrowserBase-powered)\n AMAZON_CRED = 'AMAZON_CRED',\n LINKEDIN_CRED = 'LINKEDIN_CRED',\n // Crustdata Credentials\n CRUSTDATA_API_KEY = 'CRUSTDATA_API_KEY',\n\n // Jira Credentials\n JIRA_CRED = 'JIRA_CRED',\n\n // Ashby Credentials\n ASHBY_CRED = 'ASHBY_CRED',\n\n // FullEnrich Credentials\n FULLENRICH_API_KEY = 'FULLENRICH_API_KEY',\n\n // Stripe Credentials\n STRIPE_CRED = 'STRIPE_CRED',\n}\n\n// Define all bubble names as a union type for type safety\nexport type BubbleName =\n | 'hello-world'\n | 'ai-agent'\n | 'postgresql'\n | 'slack'\n | 'resend'\n | 'http'\n | 'slack-formatter-agent'\n | 'database-analyzer'\n | 'slack-notifier'\n | 'get-bubble-details-tool'\n | 'get-trigger-detail-tool'\n | 'list-bubbles-tool'\n | 'sql-query-tool'\n | 'chart-js-tool'\n | 'web-search-tool'\n | 'web-scrape-tool'\n | 'web-crawl-tool'\n | 'web-extract-tool'\n | 'research-agent-tool'\n | 'reddit-scrape-tool'\n | 'slack-data-assistant'\n | 'bubbleflow-code-generator'\n | 'bubbleflow-generator'\n | 'pdf-form-operations'\n | 'pdf-ocr-workflow'\n | 'generate-document-workflow'\n | 'parse-document-workflow'\n | 'bubbleflow-validation-tool'\n | 'code-edit-tool'\n | 'storage'\n | 'google-drive'\n | 'gmail'\n | 'google-sheets'\n | 'google-calendar'\n | 'apify'\n | 'instagram-tool'\n | 'linkedin-tool'\n | 'tiktok-tool'\n | 'twitter-tool'\n | 'google-maps-tool'\n | 'youtube-tool'\n | 'github'\n | 'eleven-labs'\n | 'followupboss'\n | 'agi-inc'\n | 'telegram'\n | 'airtable'\n | 'notion'\n | 'firecrawl'\n | 'insforge-db'\n | 'browserbase'\n | 'amazon-shopping-tool'\n | 'crustdata'\n | 'company-enrichment-tool'\n | 'people-search-tool'\n | 'jira'\n | 'ashby'\n | 'fullenrich'\n | 'linkedin-connection-tool'\n | 'stripe';\n","import { BubbleName, CredentialType } from './types.js';\nimport { z } from '@hono/zod-openapi';\nimport {\n databaseMetadataSchema,\n jiraOAuthMetadataSchema,\n slackOAuthMetadataSchema,\n airtableOAuthMetadataSchema,\n} from './database-definition-schema.js';\n\n/**\n * Configuration for a credential type displayed in the UI\n */\nexport interface CredentialConfig {\n label: string;\n description: string;\n placeholder: string;\n namePlaceholder: string;\n credentialConfigurations: Record<string, unknown>;\n}\n\n/**\n * Configuration for all credential types - used by Credentials page and AI agents\n */\nexport const CREDENTIAL_TYPE_CONFIG: Record<CredentialType, CredentialConfig> =\n {\n [CredentialType.OPENAI_CRED]: {\n label: 'OpenAI',\n description: 'API key for OpenAI services (GPT models, embeddings, etc.)',\n placeholder: 'sk-...',\n namePlaceholder: 'My OpenAI API Key',\n credentialConfigurations: {},\n },\n [CredentialType.GOOGLE_GEMINI_CRED]: {\n label: 'Google Gemini',\n description: 'API key for Google Gemini AI models',\n placeholder: 'AIza...',\n namePlaceholder: 'My Google Gemini Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.ANTHROPIC_CRED]: {\n label: 'Anthropic',\n description: 'API key for Anthropic Claude models',\n placeholder: 'sk-ant-...',\n namePlaceholder: 'My Anthropic API Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.DATABASE_CRED]: {\n label: 'Database (PostgreSQL)',\n description: 'Database connection string for PostgreSQL',\n placeholder: 'postgresql://user:pass@host:port/dbname',\n namePlaceholder: 'My PostgreSQL Database',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.FIRECRAWL_API_KEY]: {\n label: 'Firecrawl',\n description: 'API key for Firecrawl web scraping and search services',\n placeholder: 'fc-...',\n namePlaceholder: 'My Firecrawl API Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.SLACK_CRED]: {\n label: 'Slack',\n description:\n 'Slack Bot token (xoxb-) or User token (xoxp-) from api.slack.com/apps. Configure scopes in OAuth & Permissions.',\n placeholder: 'xoxb-... or xoxp-...',\n namePlaceholder: 'My Slack Token',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.RESEND_CRED]: {\n label: 'Resend',\n description: 'Your Resend API key for email services',\n placeholder: 're_...',\n namePlaceholder: 'My Resend API Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.OPENROUTER_CRED]: {\n label: 'OpenRouter',\n description: 'API key for OpenRouter services',\n placeholder: 'sk-or-...',\n namePlaceholder: 'My OpenRouter API Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.CLOUDFLARE_R2_ACCESS_KEY]: {\n label: 'Cloudflare R2 Access Key',\n description: 'Access key for Cloudflare R2 storage',\n placeholder: 'Enter your access key',\n namePlaceholder: 'My R2 Access Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.CLOUDFLARE_R2_SECRET_KEY]: {\n label: 'Cloudflare R2 Secret Key',\n description: 'Secret key for Cloudflare R2 storage',\n placeholder: 'Enter your secret key',\n namePlaceholder: 'My R2 Secret Key',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.CLOUDFLARE_R2_ACCOUNT_ID]: {\n label: 'Cloudflare R2 Account ID',\n description: 'Account ID for Cloudflare R2 storage',\n placeholder: 'Enter your account ID',\n namePlaceholder: 'My R2 Account ID',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.APIFY_CRED]: {\n label: 'Apify',\n description: 'API token for Apify platform (web scraping, automation)',\n placeholder: 'apify_api_...',\n namePlaceholder: 'My Apify API Token',\n credentialConfigurations: {},\n },\n [CredentialType.GOOGLE_DRIVE_CRED]: {\n label: 'Google Drive',\n description: 'OAuth connection to Google Drive for file access',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Google Drive Connection',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.GMAIL_CRED]: {\n label: 'Gmail',\n description: 'OAuth connection to Gmail for email management',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Gmail Connection',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.GOOGLE_SHEETS_CRED]: {\n label: 'Google Sheets',\n description:\n 'OAuth connection to Google Sheets for spreadsheet management',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Google Sheets Connection',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.GOOGLE_CALENDAR_CRED]: {\n label: 'Google Calendar',\n description:\n 'OAuth connection to Google Calendar for events and schedules',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Google Calendar Connection',\n credentialConfigurations: {\n ignoreSSL: false,\n },\n },\n [CredentialType.FUB_CRED]: {\n label: 'Follow Up Boss',\n description:\n 'OAuth connection to Follow Up Boss CRM for contacts, tasks, and deals',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Follow Up Boss Connection',\n credentialConfigurations: {},\n },\n [CredentialType.NOTION_OAUTH_TOKEN]: {\n label: 'Notion',\n description:\n 'OAuth connection to your Notion workspace (pages, databases, search)',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Notion Connection',\n credentialConfigurations: {},\n },\n [CredentialType.GITHUB_TOKEN]: {\n label: 'GitHub',\n description:\n 'Personal Access Token for GitHub API (read repos, PRs, issues)',\n placeholder: 'github_pat...',\n namePlaceholder: 'My GitHub Token',\n credentialConfigurations: {},\n },\n [CredentialType.ELEVENLABS_API_KEY]: {\n label: 'Eleven Labs API Key',\n description: 'Your API key from Eleven Labs',\n placeholder: 'agent_...',\n namePlaceholder: 'My Eleven Labs Key',\n credentialConfigurations: {},\n },\n [CredentialType.AGI_API_KEY]: {\n label: 'AGI Inc API Key',\n description: 'Your API key from AGI Inc',\n placeholder: 'api_...',\n namePlaceholder: 'My AGI Inc Key',\n credentialConfigurations: {},\n },\n [CredentialType.TELEGRAM_BOT_TOKEN]: {\n label: 'Telegram Bot Token',\n description: 'Your Telegram bot token',\n placeholder: 'bot_...',\n namePlaceholder: 'My Telegram Bot Token',\n credentialConfigurations: {},\n },\n [CredentialType.AIRTABLE_CRED]: {\n label: 'Airtable',\n description:\n 'Personal Access Token for Airtable API (manage bases, tables, records)',\n placeholder: 'pat...',\n namePlaceholder: 'My Airtable Token',\n credentialConfigurations: {},\n },\n [CredentialType.AIRTABLE_OAUTH]: {\n label: 'Airtable (OAuth)',\n description:\n 'OAuth connection to Airtable for full API access including webhooks',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Airtable Connection',\n credentialConfigurations: {},\n },\n [CredentialType.INSFORGE_BASE_URL]: {\n label: 'InsForge Base URL',\n description:\n 'Base URL for your InsForge backend (e.g., https://your-app.region.insforge.app)',\n placeholder: 'https://your-app.region.insforge.app',\n namePlaceholder: 'My InsForge Backend URL',\n credentialConfigurations: {},\n },\n [CredentialType.INSFORGE_API_KEY]: {\n label: 'InsForge API Key',\n description: 'API key for your InsForge backend',\n placeholder: 'ik_...',\n namePlaceholder: 'My InsForge API Key',\n credentialConfigurations: {},\n },\n [CredentialType.CRUSTDATA_API_KEY]: {\n label: 'Crustdata API Key',\n description: 'API key for your Crustdata backend',\n placeholder: 'crust_...',\n namePlaceholder: 'My Crustdata API Key',\n credentialConfigurations: {},\n },\n [CredentialType.CUSTOM_AUTH_KEY]: {\n label: 'Custom Authentication Key',\n description:\n 'Custom API key or authentication token for HTTP requests (Bearer, Basic, X-API-Key, etc.)',\n placeholder: 'Enter your API key or token...',\n namePlaceholder: 'My Custom Auth Key',\n credentialConfigurations: {},\n },\n [CredentialType.AMAZON_CRED]: {\n label: 'Amazon',\n description:\n 'Browser session authentication for Amazon shopping (cart, orders, purchases). Authenticate by logging into your Amazon account in a secure browser session.',\n placeholder: '', // Not used for browser session auth\n namePlaceholder: 'My Amazon Account',\n credentialConfigurations: {},\n },\n [CredentialType.LINKEDIN_CRED]: {\n label: 'LinkedIn',\n description:\n 'Browser session authentication for LinkedIn automation (connections, messaging). Authenticate by logging into your LinkedIn account in a secure browser session.',\n placeholder: '', // Not used for browser session auth\n namePlaceholder: 'My LinkedIn Account',\n credentialConfigurations: {},\n },\n [CredentialType.JIRA_CRED]: {\n label: 'Jira',\n description:\n 'OAuth connection to Jira Cloud for issue tracking and project management',\n placeholder: '', // Not used for OAuth\n namePlaceholder: 'My Jira Connection',\n credentialConfigurations: {},\n },\n [CredentialType.ASHBY_CRED]: {\n label: 'Ashby',\n description:\n 'API key for Ashby ATS (Applicant Tracking System) for candidate management',\n placeholder: 'Enter your Ashby API key...',\n namePlaceholder: 'My Ashby API Key',\n credentialConfigurations: {},\n },\n [CredentialType.FULLENRICH_API_KEY]: {\n label: 'FullEnrich',\n description:\n 'API key for FullEnrich B2B contact enrichment (emails, phones, LinkedIn data)',\n placeholder: 'Enter your FullEnrich API key...',\n namePlaceholder: 'My FullEnrich API Key',\n credentialConfigurations: {},\n },\n [CredentialType.STRIPE_CRED]: {\n label: 'Stripe',\n description:\n 'Stripe API secret key for payment processing (sk_live_... or sk_test_...)',\n placeholder: 'sk_...',\n namePlaceholder: 'My Stripe API Key',\n credentialConfigurations: {},\n },\n [CredentialType.CREDENTIAL_WILDCARD]: {\n label: 'Any Credential',\n description:\n 'Wildcard marker - this is not a real credential type, used internally to indicate any credential is accepted',\n placeholder: '',\n namePlaceholder: '',\n credentialConfigurations: {},\n },\n } as const satisfies Record<CredentialType, CredentialConfig>;\n\n/**\n * Generate a human-readable summary of available credentials for AI agents\n */\nexport function generateCredentialsSummary(): string {\n const lines: string[] = ['Available credentials that users can configure:'];\n\n for (const [credType, config] of Object.entries(CREDENTIAL_TYPE_CONFIG)) {\n lines.push(`- ${config.label} (${credType}): ${config.description}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Maps credential types to their environment variable names (for backend only!!!!)\n */\nexport const CREDENTIAL_ENV_MAP: Record<CredentialType, string> = {\n [CredentialType.OPENAI_CRED]: 'OPENAI_API_KEY',\n [CredentialType.GOOGLE_GEMINI_CRED]: 'GOOGLE_API_KEY',\n [CredentialType.ANTHROPIC_CRED]: 'ANTHROPIC_API_KEY',\n [CredentialType.FIRECRAWL_API_KEY]: 'FIRE_CRAWL_API_KEY',\n [CredentialType.DATABASE_CRED]: 'BUBBLE_CONNECTING_STRING_URL',\n [CredentialType.SLACK_CRED]: 'SLACK_TOKEN',\n [CredentialType.TELEGRAM_BOT_TOKEN]: 'TELEGRAM_BOT_TOKEN',\n [CredentialType.RESEND_CRED]: 'RESEND_API_KEY',\n [CredentialType.OPENROUTER_CRED]: 'OPENROUTER_API_KEY',\n [CredentialType.CLOUDFLARE_R2_ACCESS_KEY]: 'CLOUDFLARE_R2_ACCESS_KEY',\n [CredentialType.CLOUDFLARE_R2_SECRET_KEY]: 'CLOUDFLARE_R2_SECRET_KEY',\n [CredentialType.CLOUDFLARE_R2_ACCOUNT_ID]: 'CLOUDFLARE_R2_ACCOUNT_ID',\n [CredentialType.APIFY_CRED]: 'APIFY_API_TOKEN',\n [CredentialType.ELEVENLABS_API_KEY]: 'ELEVENLABS_API_KEY',\n [CredentialType.GOOGLE_DRIVE_CRED]: '',\n [CredentialType.GMAIL_CRED]: '',\n [CredentialType.GOOGLE_SHEETS_CRED]: '',\n [CredentialType.GOOGLE_CALENDAR_CRED]: '',\n [CredentialType.FUB_CRED]: '',\n [CredentialType.GITHUB_TOKEN]: 'GITHUB_TOKEN',\n [CredentialType.AGI_API_KEY]: 'AGI_API_KEY',\n [CredentialType.AIRTABLE_CRED]: 'AIRTABLE_API_KEY',\n [CredentialType.AIRTABLE_OAUTH]: '', // OAuth credential, no env var\n [CredentialType.NOTION_OAUTH_TOKEN]: '',\n [CredentialType.INSFORGE_BASE_URL]: 'INSFORGE_BASE_URL',\n [CredentialType.INSFORGE_API_KEY]: 'INSFORGE_API_KEY',\n [CredentialType.CUSTOM_AUTH_KEY]: '', // User-provided, no env var\n [CredentialType.AMAZON_CRED]: '', // Browser session credential, no env var\n [CredentialType.LINKEDIN_CRED]: '', // Browser session credential, no env var\n [CredentialType.CRUSTDATA_API_KEY]: 'CRUSTDATA_API_KEY',\n [CredentialType.JIRA_CRED]: '', // OAuth credential, no env var\n [CredentialType.ASHBY_CRED]: 'ASHBY_API_KEY',\n [CredentialType.FULLENRICH_API_KEY]: 'FULLENRICH_API_KEY',\n [CredentialType.STRIPE_CRED]: 'STRIPE_SECRET_KEY',\n [CredentialType.CREDENTIAL_WILDCARD]: '', // Wildcard marker, not a real credential\n};\n\n/** Used by bubblelab studio */\nexport const SYSTEM_CREDENTIALS = new Set<CredentialType>([\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.FIRECRAWL_API_KEY,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.RESEND_CRED,\n CredentialType.OPENROUTER_CRED,\n // Cloudflare R2 Storage credentials\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n // Scraping credentials\n CredentialType.APIFY_CRED,\n CredentialType.CRUSTDATA_API_KEY,\n // Enrichment credentials\n CredentialType.FULLENRICH_API_KEY,\n]);\n\n/**\n * Credentials that are optional (not required) for their associated bubbles.\n * These will not show as \"missing\" in the UI when not selected.\n */\nexport const OPTIONAL_CREDENTIALS = new Set<CredentialType>([\n CredentialType.CUSTOM_AUTH_KEY,\n CredentialType.FULLENRICH_API_KEY,\n]);\n\n/**\n * OAuth provider names - type-safe provider identifiers\n */\nexport type OAuthProvider =\n | 'google'\n | 'followupboss'\n | 'notion'\n | 'jira'\n | 'slack'\n | 'airtable';\n\n/**\n * Scope description mapping - maps OAuth scope URLs to human-readable descriptions\n */\nexport interface ScopeDescription {\n scope: string; // OAuth scope URL\n description: string; // Human-readable description of what this scope allows\n defaultEnabled: boolean; // Whether this scope should be enabled by default\n}\n\n/**\n * OAuth credential type configuration for a specific service under a provider\n */\nexport interface OAuthCredentialConfig {\n displayName: string; // User-facing name\n defaultScopes: string[]; // OAuth scopes for this credential type (non-admin, safe for any user)\n adminScopes?: string[]; // OAuth scopes that require admin approval (optional)\n description: string; // Description of what this credential provides access to\n scopeDescriptions?: ScopeDescription[]; // Optional: descriptions for each scope\n}\n\n/**\n * OAuth provider configuration shared between frontend and backend\n */\nexport interface OAuthProviderConfig {\n name: OAuthProvider; // Type-safe provider identifier\n displayName: string; // User-facing provider name: 'Google'\n credentialTypes: Partial<Record<CredentialType, OAuthCredentialConfig>>; // Supported credential types\n authorizationParams?: Record<string, string>; // Provider-wide OAuth parameters\n}\n\n/**\n * OAuth provider configurations - single source of truth for OAuth providers\n * Contains all information needed by frontend and backend\n */\nexport const OAUTH_PROVIDERS: Record<OAuthProvider, OAuthProviderConfig> = {\n google: {\n name: 'google',\n displayName: 'Google',\n credentialTypes: {\n [CredentialType.GOOGLE_DRIVE_CRED]: {\n displayName: 'Google Drive',\n defaultScopes: [\n 'https://www.googleapis.com/auth/drive.file',\n 'https://www.googleapis.com/auth/documents',\n 'https://www.googleapis.com/auth/spreadsheets',\n 'https://www.googleapis.com/auth/drive',\n ],\n description: 'Access Google Drive files and folders',\n scopeDescriptions: [\n {\n scope: 'https://www.googleapis.com/auth/drive.file',\n description:\n 'View and manage Google Drive files and folders that you have created with Bubble Lab or selected w/ file picker',\n defaultEnabled: true,\n },\n {\n scope: 'https://www.googleapis.com/auth/documents',\n description: 'View and manage your Google Docs documents',\n defaultEnabled: true,\n },\n {\n scope: 'https://www.googleapis.com/auth/spreadsheets',\n description: 'View and manage your Google Sheets spreadsheets',\n defaultEnabled: true,\n },\n {\n scope: 'https://www.googleapis.com/auth/drive.readonly',\n description:\n 'View and manage all of your Google Drive files and folders (will see a warning about an \"untrusted app\" during authentication. Choose only if you need extra permissions)',\n defaultEnabled: false,\n },\n ],\n },\n [CredentialType.GMAIL_CRED]: {\n displayName: 'Gmail',\n defaultScopes: [\n 'https://www.googleapis.com/auth/gmail.send',\n 'https://www.googleapis.com/auth/gmail.modify',\n ],\n description: 'Access Gmail for sending emails',\n scopeDescriptions: [\n {\n scope: 'https://www.googleapis.com/auth/gmail.send',\n description: 'Send email on your behalf',\n defaultEnabled: true,\n },\n {\n scope: 'https://www.googleapis.com/auth/gmail.modify',\n description:\n 'View and manage all of your Gmail emails and labels (might see a warning about an \"untrusted app\" during authentication. Choose only if you need extra permissions)',\n defaultEnabled: false,\n },\n ],\n },\n [CredentialType.GOOGLE_SHEETS_CRED]: {\n displayName: 'Google Sheets',\n defaultScopes: ['https://www.googleapis.com/auth/spreadsheets'],\n description:\n 'Access Google Sheets for reading and writing spreadsheet data',\n scopeDescriptions: [\n {\n scope: 'https://www.googleapis.com/auth/spreadsheets',\n description: 'View and manage your Google Sheets spreadsheets',\n defaultEnabled: true,\n },\n ],\n },\n [CredentialType.GOOGLE_CALENDAR_CRED]: {\n displayName: 'Google Calendar',\n defaultScopes: ['https://www.googleapis.com/auth/calendar'],\n description: 'Access Google Calendar for reading and managing events',\n scopeDescriptions: [\n {\n scope: 'https://www.googleapis.com/auth/calendar',\n description: 'View and manage events on all your calendars',\n defaultEnabled: true,\n },\n ],\n },\n },\n authorizationParams: {\n access_type: 'offline', // Required for refresh tokens\n prompt: 'consent', // Force consent screen to ensure refresh token is issued\n },\n },\n followupboss: {\n name: 'followupboss',\n displayName: 'Follow Up Boss',\n credentialTypes: {\n [CredentialType.FUB_CRED]: {\n displayName: 'Follow Up Boss',\n defaultScopes: [], // FUB doesn't use granular scopes\n description:\n 'Access Follow Up Boss CRM for managing contacts, tasks, deals, and more',\n },\n },\n authorizationParams: {\n response_type: 'auth_code', // FUB uses 'auth_code' instead of standard 'code'\n prompt: 'login', // FUB supports 'login' to force re-authentication\n },\n },\n notion: {\n name: 'notion',\n displayName: 'Notion',\n credentialTypes: {\n [CredentialType.NOTION_OAUTH_TOKEN]: {\n displayName: 'Notion Workspace',\n defaultScopes: [], // Notion scopes are managed in the integration capabilities\n description:\n 'Authorize access to your Notion workspace for searching and reading pages/databases',\n },\n },\n },\n jira: {\n name: 'jira',\n displayName: 'Jira',\n credentialTypes: {\n [CredentialType.JIRA_CRED]: {\n displayName: 'Jira Cloud',\n defaultScopes: [\n 'read:jira-user',\n 'read:jira-work',\n 'write:jira-work',\n 'offline_access', // Required for refresh tokens\n ],\n description:\n 'Access Jira Cloud for issue tracking and project management',\n scopeDescriptions: [\n {\n scope: 'read:jira-user',\n description: 'View user information and search for users',\n defaultEnabled: true,\n },\n {\n scope: 'read:jira-work',\n description: 'View issues, projects, and workflows',\n defaultEnabled: true,\n },\n {\n scope: 'write:jira-work',\n description: 'Create and update issues, comments, and transitions',\n defaultEnabled: true,\n },\n {\n scope: 'offline_access',\n description:\n 'Maintain access when you are not actively using the app',\n defaultEnabled: true,\n },\n ],\n },\n },\n authorizationParams: {\n audience: 'api.atlassian.com',\n prompt: 'consent',\n },\n },\n slack: {\n name: 'slack',\n displayName: 'Slack',\n credentialTypes: {\n [CredentialType.SLACK_CRED]: {\n displayName: 'Slack Workspace',\n defaultScopes: [\n // Messaging - Read\n 'app_mentions:read',\n 'channels:history',\n 'groups:history',\n 'im:history',\n 'mpim:history',\n // Messaging - Write\n 'chat:write',\n 'chat:write.public',\n 'chat:write.customize',\n // Channels & Conversations - Read\n 'channels:read',\n 'groups:read',\n 'im:read',\n 'mpim:read',\n // Channels & Conversations - Write (non-admin)\n 'channels:join',\n // Users & Team (read-only)\n 'users:read',\n 'users:read.email',\n 'users.profile:read',\n 'team:read',\n 'usergroups:read',\n 'dnd:read',\n // Reactions\n 'reactions:read',\n 'reactions:write',\n // Files\n 'files:read',\n 'files:write',\n // Pins & Bookmarks (read-only)\n 'pins:read',\n 'bookmarks:read',\n // Reminders\n 'reminders:read',\n 'reminders:write',\n // Commands\n 'commands',\n // Metadata & Emoji\n 'metadata.message:read',\n 'emoji:read',\n ],\n adminScopes: [\n // Channel management (requires admin)\n 'channels:manage',\n 'channels:write.invites',\n 'channels:write.topic',\n // Private channel management (requires admin)\n 'groups:write',\n 'groups:write.invites',\n 'groups:write.topic',\n // DM management (requires admin)\n 'im:write',\n 'im:write.topic',\n 'mpim:write',\n 'mpim:write.topic',\n // User management (requires admin)\n 'users:write',\n 'usergroups:write',\n // Pins & Bookmarks write (requires admin)\n 'pins:write',\n 'bookmarks:write',\n // Links (requires admin)\n 'links:read',\n 'links:write',\n 'links.embed:write',\n // Canvases & Lists (requires admin)\n 'canvases:read',\n 'canvases:write',\n 'lists:read',\n 'lists:write',\n // Calls (requires admin)\n 'calls:read',\n 'calls:write',\n // Slack Connect (requires admin)\n 'conversations.connect:read',\n 'conversations.connect:write',\n 'conversations.connect:manage',\n // Remote files (requires admin)\n 'remote_files:read',\n 'remote_files:write',\n 'remote_files:share',\n // Assistant (requires admin)\n 'assistant:write',\n // Search (requires admin)\n 'search:read.files',\n 'search:read.public',\n 'search:read.users',\n // Team Preferences (requires admin)\n 'team.preferences:read',\n ],\n description:\n 'Connect to your Slack workspace for full messaging, file sharing, and workflow automation capabilities',\n scopeDescriptions: [\n // Messaging - Read\n {\n scope: 'app_mentions:read',\n description: 'Receive @mentions of the bot',\n defaultEnabled: true,\n },\n {\n scope: 'channels:history',\n description: 'Read messages in public channels',\n defaultEnabled: true,\n },\n {\n scope: 'groups:history',\n description: 'Read messages in private channels',\n defaultEnabled: true,\n },\n {\n scope: 'im:history',\n description: 'Read direct messages with the bot',\n defaultEnabled: true,\n },\n {\n scope: 'mpim:history',\n description: 'Read group DMs with the bot',\n defaultEnabled: true,\n },\n // Messaging - Write\n {\n scope: 'chat:write',\n description: 'Send messages to channels',\n defaultEnabled: true,\n },\n {\n scope: 'chat:write.public',\n description: 'Send messages to any public channel',\n defaultEnabled: true,\n },\n {\n scope: 'chat:write.customize',\n description: 'Customize bot username and avatar',\n defaultEnabled: true,\n },\n // Channels - Read\n {\n scope: 'channels:read',\n description: 'View public channels list',\n defaultEnabled: true,\n },\n {\n scope: 'groups:read',\n description: 'View private channels list',\n defaultEnabled: true,\n },\n {\n scope: 'im:read',\n description: 'View direct messages list',\n defaultEnabled: true,\n },\n {\n scope: 'mpim:read',\n description: 'View group DMs list',\n defaultEnabled: true,\n },\n // Channels - Write\n {\n scope: 'channels:join',\n description: 'Join public channels',\n defaultEnabled: true,\n },\n {\n scope: 'channels:manage',\n description: 'Create and archive public channels',\n defaultEnabled: true,\n },\n {\n scope: 'channels:write.invites',\n description: 'Invite users to public channels',\n defaultEnabled: true,\n },\n {\n scope: 'channels:write.topic',\n description: 'Set public channel topics',\n defaultEnabled: true,\n },\n {\n scope: 'groups:write',\n description: 'Create and archive private channels',\n defaultEnabled: true,\n },\n {\n scope: 'groups:write.invites',\n description: 'Invite users to private channels',\n defaultEnabled: true,\n },\n {\n scope: 'groups:write.topic',\n description: 'Set private channel topics',\n defaultEnabled: true,\n },\n {\n scope: 'im:write',\n description: 'Start DM conversations',\n defaultEnabled: true,\n },\n {\n scope: 'im:write.topic',\n description: 'Set DM topics',\n defaultEnabled: true,\n },\n {\n scope: 'mpim:write',\n description: 'Start group DM conversations',\n defaultEnabled: true,\n },\n {\n scope: 'mpim:write.topic',\n description: 'Set group DM topics',\n defaultEnabled: true,\n },\n // Users & Team\n {\n scope: 'users:read',\n description: 'View user information',\n defaultEnabled: true,\n },\n {\n scope: 'users:read.email',\n description: 'View user emails',\n defaultEnabled: true,\n },\n {\n scope: 'users:write',\n description: 'Set bot presence status',\n defaultEnabled: true,\n },\n {\n scope: 'users.profile:read',\n description: 'View detailed user profiles',\n defaultEnabled: true,\n },\n {\n scope: 'team:read',\n description: 'View workspace info',\n defaultEnabled: true,\n },\n {\n scope: 'usergroups:read',\n description: 'View user groups',\n defaultEnabled: true,\n },\n {\n scope: 'usergroups:write',\n description: 'Manage user groups',\n defaultEnabled: true,\n },\n {\n scope: 'dnd:read',\n description: 'View Do Not Disturb status',\n defaultEnabled: true,\n },\n // Reactions\n {\n scope: 'reactions:read',\n description: 'View emoji reactions',\n defaultEnabled: true,\n },\n {\n scope: 'reactions:write',\n description: 'Add emoji reactions',\n defaultEnabled: true,\n },\n // Files\n {\n scope: 'files:read',\n description: 'View shared files',\n defaultEnabled: true,\n },\n {\n scope: 'files:write',\n description: 'Upload files',\n defaultEnabled: true,\n },\n {\n scope: 'remote_files:read',\n description: 'View remote files',\n defaultEnabled: true,\n },\n {\n scope: 'remote_files:write',\n description: 'Manage remote files',\n defaultEnabled: true,\n },\n {\n scope: 'remote_files:share',\n description: 'Share remote files',\n defaultEnabled: true,\n },\n // Pins & Bookmarks\n {\n scope: 'pins:read',\n description: 'View pinned messages',\n defaultEnabled: true,\n },\n {\n scope: 'pins:write',\n description: 'Pin messages',\n defaultEnabled: true,\n },\n {\n scope: 'bookmarks:read',\n description: 'View bookmarks',\n defaultEnabled: true,\n },\n {\n scope: 'bookmarks:write',\n description: 'Add bookmarks',\n defaultEnabled: true,\n },\n // Links\n {\n scope: 'links:read',\n description: 'View link metadata',\n defaultEnabled: true,\n },\n {\n scope: 'links:write',\n description: 'Unfurl links',\n defaultEnabled: true,\n },\n {\n scope: 'links.embed:write',\n description: 'Embed video players',\n defaultEnabled: true,\n },\n // Canvases & Lists\n {\n scope: 'canvases:read',\n description: 'Read Slack canvases',\n defaultEnabled: true,\n },\n {\n scope: 'canvases:write',\n description: 'Create and edit canvases',\n defaultEnabled: true,\n },\n {\n scope: 'lists:read',\n description: 'Read Slack lists',\n defaultEnabled: true,\n },\n {\n scope: 'lists:write',\n description: 'Manage Slack lists',\n defaultEnabled: true,\n },\n // Calls\n {\n scope: 'calls:read',\n description: 'View call information',\n defaultEnabled: true,\n },\n {\n scope: 'calls:write',\n description: 'Start and manage calls',\n defaultEnabled: true,\n },\n // Reminders\n {\n scope: 'reminders:read',\n description: 'View reminders',\n defaultEnabled: true,\n },\n {\n scope: 'reminders:write',\n description: 'Create reminders',\n defaultEnabled: true,\n },\n // Slack Connect\n {\n scope: 'conversations.connect:read',\n description: 'View Slack Connect events',\n defaultEnabled: true,\n },\n {\n scope: 'conversations.connect:write',\n description: 'Create Slack Connect invites',\n defaultEnabled: true,\n },\n {\n scope: 'conversations.connect:manage',\n description: 'Manage Slack Connect channels',\n defaultEnabled: true,\n },\n // Commands\n {\n scope: 'commands',\n description: 'Use slash commands',\n defaultEnabled: true,\n },\n // Metadata & Emoji\n {\n scope: 'metadata.message:read',\n description: 'Read message metadata',\n defaultEnabled: true,\n },\n {\n scope: 'emoji:read',\n description: 'View custom emoji',\n defaultEnabled: true,\n },\n // Assistant\n {\n scope: 'assistant:write',\n description: 'Respond in Slack AI threads',\n defaultEnabled: true,\n },\n // Search\n {\n scope: 'search:read.files',\n description: 'Search files',\n defaultEnabled: true,\n },\n {\n scope: 'search:read.public',\n description: 'Search public channels',\n defaultEnabled: true,\n },\n {\n scope: 'search:read.users',\n description: 'Search for users',\n defaultEnabled: true,\n },\n // Team Preferences\n {\n scope: 'team.preferences:read',\n description: 'Read workspace preferences',\n defaultEnabled: true,\n },\n ],\n },\n },\n },\n airtable: {\n name: 'airtable',\n displayName: 'Airtable',\n credentialTypes: {\n [CredentialType.AIRTABLE_OAUTH]: {\n displayName: 'Airtable (OAuth)',\n defaultScopes: [\n 'data.records:read',\n 'data.records:write',\n 'data.recordComments:read',\n 'data.recordComments:write',\n 'schema.bases:read',\n 'schema.bases:write',\n 'user.email:read',\n 'webhook:manage',\n ],\n description:\n 'Connect to Airtable with OAuth for full API access including webhooks',\n scopeDescriptions: [\n {\n scope: 'data.records:read',\n description: 'See the data in records',\n defaultEnabled: true,\n },\n {\n scope: 'data.records:write',\n description: 'Create, edit, and delete records',\n defaultEnabled: true,\n },\n {\n scope: 'data.recordComments:read',\n description: 'See comments in records',\n defaultEnabled: true,\n },\n {\n scope: 'data.recordComments:write',\n description: 'Create, edit, and delete record comments',\n defaultEnabled: true,\n },\n {\n scope: 'schema.bases:read',\n description:\n 'See the structure of a base, like table names or field types',\n defaultEnabled: true,\n },\n {\n scope: 'schema.bases:write',\n description:\n 'Edit the structure of a base, like adding new fields or tables',\n defaultEnabled: true,\n },\n {\n scope: 'user.email:read',\n description: \"See the user's email address\",\n defaultEnabled: true,\n },\n {\n scope: 'webhook:manage',\n description:\n 'View, create, delete webhooks for a base, as well as fetch webhook payloads',\n defaultEnabled: true,\n },\n ],\n },\n },\n },\n};\n\n/**\n * Get the OAuth provider for a specific credential type\n * Safely maps credential types to their OAuth providers\n */\nexport function getOAuthProvider(\n credentialType: CredentialType\n): OAuthProvider | null {\n for (const [providerName, config] of Object.entries(OAUTH_PROVIDERS)) {\n if (config.credentialTypes[credentialType]) {\n return providerName as OAuthProvider;\n }\n }\n return null;\n}\n\n/**\n * Check if a credential type is OAuth-based\n */\nexport function isOAuthCredential(credentialType: CredentialType): boolean {\n return getOAuthProvider(credentialType) !== null;\n}\n\n/**\n * Get scope descriptions for a specific credential type\n * Returns an array of scope descriptions that will be requested during OAuth\n */\nexport function getScopeDescriptions(\n credentialType: CredentialType\n): ScopeDescription[] {\n const provider = getOAuthProvider(credentialType);\n if (!provider) {\n return [];\n }\n\n const providerConfig = OAUTH_PROVIDERS[provider];\n const credentialConfig = providerConfig?.credentialTypes[credentialType];\n\n if (!credentialConfig?.scopeDescriptions) {\n // Fallback: create descriptions from scope URLs if not explicitly defined\n return (\n credentialConfig?.defaultScopes.map((scope) => ({\n scope,\n description: `Access: ${scope}`,\n defaultEnabled: true, // Default to enabled if in defaultScopes\n })) || []\n );\n }\n\n return credentialConfig.scopeDescriptions;\n}\n\n/**\n * Get default (non-admin) scopes for a specific credential type\n * Returns only the scopes that don't require admin approval\n */\nexport function getDefaultScopes(credentialType: CredentialType): string[] {\n const provider = getOAuthProvider(credentialType);\n if (!provider) {\n return [];\n }\n\n const providerConfig = OAUTH_PROVIDERS[provider];\n const credentialConfig = providerConfig?.credentialTypes[credentialType];\n\n return credentialConfig?.defaultScopes || [];\n}\n\n/**\n * Get admin scopes for a specific credential type\n * Returns only the scopes that require admin/workspace admin approval\n */\nexport function getAdminScopes(credentialType: CredentialType): string[] {\n const provider = getOAuthProvider(credentialType);\n if (!provider) {\n return [];\n }\n\n const providerConfig = OAUTH_PROVIDERS[provider];\n const credentialConfig = providerConfig?.credentialTypes[credentialType];\n\n return credentialConfig?.adminScopes || [];\n}\n\n/**\n * Browser session provider name - for BrowserBase-powered authentication\n */\nexport type BrowserSessionProvider = 'browserbase';\n\n/**\n * Browser session credential type configuration\n */\nexport interface BrowserSessionCredentialConfig {\n displayName: string;\n description: string;\n targetUrl: string; // URL to navigate to for authentication\n cookieDomain: string; // Domain filter for captured cookies\n}\n\n/**\n * Browser session provider configuration\n */\nexport interface BrowserSessionProviderConfig {\n name: BrowserSessionProvider;\n displayName: string;\n credentialTypes: Partial<\n Record<CredentialType, BrowserSessionCredentialConfig>\n >;\n}\n\n/**\n * Browser session provider configurations - for credentials that use BrowserBase\n * browser sessions instead of OAuth or API keys\n */\nexport const BROWSER_SESSION_PROVIDERS: Record<\n BrowserSessionProvider,\n BrowserSessionProviderConfig\n> = {\n browserbase: {\n name: 'browserbase',\n displayName: 'BrowserBase',\n credentialTypes: {\n [CredentialType.AMAZON_CRED]: {\n displayName: 'Amazon Account',\n description:\n 'Log into Amazon to enable cart, order, and purchase automation',\n targetUrl: 'https://www.amazon.com',\n cookieDomain: 'amazon',\n },\n [CredentialType.LINKEDIN_CRED]: {\n displayName: 'LinkedIn Account',\n description:\n 'Log into LinkedIn to enable connection requests and messaging automation',\n targetUrl: 'https://www.linkedin.com',\n cookieDomain: 'linkedin',\n },\n },\n },\n};\n\n/**\n * Get the browser session provider for a specific credential type\n */\nexport function getBrowserSessionProvider(\n credentialType: CredentialType\n): BrowserSessionProvider | null {\n for (const [providerName, config] of Object.entries(\n BROWSER_SESSION_PROVIDERS\n )) {\n if (config.credentialTypes[credentialType]) {\n return providerName as BrowserSessionProvider;\n }\n }\n return null;\n}\n\n/**\n * Check if a credential type uses browser session authentication (BrowserBase)\n */\nexport function isBrowserSessionCredential(\n credentialType: CredentialType\n): boolean {\n return getBrowserSessionProvider(credentialType) !== null;\n}\n\n/**\n * Maps bubble names to their accepted credential types\n */\nexport type CredentialOptions = Partial<Record<CredentialType, string>>;\n\n/**\n * Credential options for a bubble - array of credential types.\n * Use CredentialType.CREDENTIAL_WILDCARD to indicate the bubble accepts any credential.\n */\nexport type BubbleCredentialOption = CredentialType[];\n\n/**\n * Collection of credential options for all bubbles\n */\nexport const BUBBLE_CREDENTIAL_OPTIONS: Record<\n BubbleName,\n BubbleCredentialOption\n> = {\n 'ai-agent': [\n CredentialType.OPENAI_CRED,\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.FIRECRAWL_API_KEY,\n CredentialType.OPENROUTER_CRED,\n ],\n postgresql: [CredentialType.DATABASE_CRED],\n slack: [CredentialType.SLACK_CRED],\n telegram: [CredentialType.TELEGRAM_BOT_TOKEN],\n resend: [CredentialType.RESEND_CRED],\n 'database-analyzer': [CredentialType.DATABASE_CRED],\n 'slack-notifier': [\n CredentialType.SLACK_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.ANTHROPIC_CRED,\n ],\n 'slack-formatter-agent': [\n CredentialType.OPENAI_CRED,\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.ANTHROPIC_CRED,\n ],\n 'slack-data-assistant': [\n CredentialType.DATABASE_CRED,\n CredentialType.SLACK_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.ANTHROPIC_CRED,\n ],\n 'hello-world': [],\n http: [CredentialType.CREDENTIAL_WILDCARD], // Accepts any credential type for flexible API integrations\n 'get-bubble-details-tool': [],\n 'get-trigger-detail-tool': [],\n 'list-bubbles-tool': [],\n 'sql-query-tool': [CredentialType.DATABASE_CRED],\n 'chart-js-tool': [],\n 'bubbleflow-validation-tool': [],\n 'code-edit-tool': [CredentialType.OPENROUTER_CRED],\n 'web-search-tool': [CredentialType.FIRECRAWL_API_KEY],\n 'web-scrape-tool': [CredentialType.FIRECRAWL_API_KEY],\n 'web-crawl-tool': [\n CredentialType.FIRECRAWL_API_KEY,\n CredentialType.GOOGLE_GEMINI_CRED,\n ],\n 'web-extract-tool': [CredentialType.FIRECRAWL_API_KEY],\n 'research-agent-tool': [\n CredentialType.FIRECRAWL_API_KEY,\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.OPENROUTER_CRED,\n CredentialType.APIFY_CRED,\n ],\n 'reddit-scrape-tool': [],\n 'bubbleflow-code-generator': [],\n 'bubbleflow-generator': [\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENROUTER_CRED,\n ],\n 'pdf-form-operations': [\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.OPENROUTER_CRED,\n ],\n 'pdf-ocr-workflow': [\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.OPENROUTER_CRED,\n ],\n 'generate-document-workflow': [\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.OPENROUTER_CRED,\n ],\n 'parse-document-workflow': [\n CredentialType.GOOGLE_GEMINI_CRED,\n CredentialType.OPENAI_CRED,\n CredentialType.ANTHROPIC_CRED,\n CredentialType.OPENROUTER_CRED,\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n ],\n storage: [\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n ],\n 'google-drive': [CredentialType.GOOGLE_DRIVE_CRED],\n gmail: [CredentialType.GMAIL_CRED],\n 'google-sheets': [CredentialType.GOOGLE_SHEETS_CRED],\n 'google-calendar': [CredentialType.GOOGLE_CALENDAR_CRED],\n apify: [CredentialType.APIFY_CRED],\n 'instagram-tool': [CredentialType.APIFY_CRED],\n 'linkedin-tool': [CredentialType.APIFY_CRED],\n 'tiktok-tool': [CredentialType.APIFY_CRED],\n 'twitter-tool': [CredentialType.APIFY_CRED],\n 'google-maps-tool': [CredentialType.APIFY_CRED],\n 'youtube-tool': [CredentialType.APIFY_CRED],\n github: [CredentialType.GITHUB_TOKEN],\n 'eleven-labs': [CredentialType.ELEVENLABS_API_KEY],\n followupboss: [CredentialType.FUB_CRED],\n 'agi-inc': [CredentialType.AGI_API_KEY],\n airtable: [CredentialType.AIRTABLE_CRED, CredentialType.AIRTABLE_OAUTH],\n notion: [CredentialType.NOTION_OAUTH_TOKEN],\n firecrawl: [CredentialType.FIRECRAWL_API_KEY],\n 'insforge-db': [\n CredentialType.INSFORGE_BASE_URL,\n CredentialType.INSFORGE_API_KEY,\n ],\n browserbase: [\n CredentialType.AMAZON_CRED,\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n ],\n 'amazon-shopping-tool': [\n CredentialType.AMAZON_CRED,\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n ],\n crustdata: [CredentialType.CRUSTDATA_API_KEY],\n 'company-enrichment-tool': [CredentialType.CRUSTDATA_API_KEY],\n 'people-search-tool': [\n CredentialType.CRUSTDATA_API_KEY,\n CredentialType.FULLENRICH_API_KEY,\n ],\n jira: [CredentialType.JIRA_CRED],\n ashby: [CredentialType.ASHBY_CRED],\n fullenrich: [CredentialType.FULLENRICH_API_KEY],\n 'linkedin-connection-tool': [\n CredentialType.LINKEDIN_CRED,\n CredentialType.CLOUDFLARE_R2_ACCESS_KEY,\n CredentialType.CLOUDFLARE_R2_SECRET_KEY,\n CredentialType.CLOUDFLARE_R2_ACCOUNT_ID,\n ],\n stripe: [CredentialType.STRIPE_CRED],\n};\n\n// POST /credentials - Create credential schema\nexport const createCredentialSchema = z\n .object({\n credentialType: z.nativeEnum(CredentialType).openapi({\n description: 'Type of credential to store',\n example: CredentialType.OPENAI_CRED,\n }),\n value: z.string().min(1).openapi({\n description: 'The credential value (will be encrypted)',\n example: 'sk-1234567890abcdef',\n }),\n name: z.string().optional().openapi({\n description: 'Optional user-friendly name for the credential',\n example: 'My OpenAI Key',\n }),\n skipValidation: z.boolean().optional().openapi({\n description:\n 'Skip credential validation before storing (for testing/admin use)',\n example: false,\n }),\n credentialConfigurations: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({\n description:\n 'Optional configurations for credential validation (e.g., ignoreSSL for PostgreSQL)',\n example: { ignoreSSL: true },\n }),\n metadata: databaseMetadataSchema.optional().openapi({\n description:\n 'Optional metadata for the credential (e.g., database schema for DATABASE_CRED)',\n example: {\n tables: {\n users: {\n id: 'integer',\n email: 'character varying',\n created_at: 'timestamp with time zone',\n },\n },\n rules: [\n {\n id: 'rule-1',\n text: 'No direct DELETE on users table',\n enabled: true,\n createdAt: '2024-01-01T00:00:00Z',\n updatedAt: '2024-01-01T00:00:00Z',\n },\n ],\n },\n }),\n })\n .openapi('CreateCredentialRequest');\n\n// PUT /credentials/:id - Update credential schema\nexport const updateCredentialSchema = z\n .object({\n value: z.string().optional().openapi({\n description:\n 'The credential value (will be encrypted). Leave empty to keep current value.',\n example: 'sk-1234567890abcdef',\n }),\n name: z.string().optional().openapi({\n description: 'Optional user-friendly name for the credential',\n example: 'My OpenAI Key',\n }),\n skipValidation: z.boolean().optional().openapi({\n description:\n 'Skip credential validation before storing (for testing/admin use)',\n example: false,\n }),\n credentialConfigurations: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({\n description:\n 'Optional configurations for credential validation (e.g., ignoreSSL for PostgreSQL)',\n example: { ignoreSSL: true },\n }),\n metadata: databaseMetadataSchema.optional().openapi({\n description:\n 'Optional metadata for the credential (e.g., database schema for DATABASE_CRED)',\n example: {\n tables: {\n users: {\n id: 'integer',\n email: 'character varying',\n created_at: 'timestamp with time zone',\n },\n },\n },\n }),\n })\n .openapi('UpdateCredentialRequest');\n// GET /credentials - List credentials response\nexport const credentialResponseSchema = z\n .object({\n id: z.number().openapi({ description: 'Credential ID' }),\n credentialType: z.string().openapi({ description: 'Type of credential' }),\n name: z.string().optional().openapi({ description: 'Credential name' }),\n metadata: z\n .union([\n databaseMetadataSchema,\n jiraOAuthMetadataSchema,\n slackOAuthMetadataSchema,\n airtableOAuthMetadataSchema,\n ])\n .optional()\n .openapi({\n description:\n 'Credential metadata (DatabaseMetadata, JiraOAuthMetadata, SlackOAuthMetadata, or AirtableOAuthMetadata)',\n }),\n createdAt: z.string().openapi({ description: 'Creation timestamp' }),\n\n // OAuth-specific fields\n isOauth: z\n .boolean()\n .optional()\n .openapi({ description: 'Whether this is an OAuth credential' }),\n oauthProvider: z\n .string()\n .optional()\n .openapi({ description: 'OAuth provider name' }),\n oauthExpiresAt: z\n .string()\n .optional()\n .openapi({ description: 'OAuth token expiration timestamp' }),\n oauthScopes: z\n .array(z.string())\n .optional()\n .openapi({ description: 'OAuth scopes granted' }),\n oauthStatus: z\n .enum(['active', 'expired', 'needs_refresh'])\n .optional()\n .openapi({ description: 'OAuth token status' }),\n\n // Browser session-specific fields\n isBrowserSession: z\n .boolean()\n .optional()\n .openapi({ description: 'Whether this is a browser session credential' }),\n browserbaseSessionData: z\n .object({\n capturedAt: z.string(),\n cookieCount: z.number(),\n domain: z.string(),\n })\n .optional()\n .openapi({ description: 'Browser session metadata' }),\n\n // Master/Child credential relationship (for Slack OAuth)\n masterCredentialId: z.number().optional().openapi({\n description:\n 'ID of the master credential this credential uses for tokens (null means this is a master)',\n }),\n })\n .openapi('CredentialResponse');\n\n// POST /credentials - Create credential response\nexport const createCredentialResponseSchema = z\n .object({\n id: z.number().openapi({ description: 'Credential ID' }),\n message: z.string().openapi({ description: 'Success message' }),\n })\n .openapi('CreateCredentialResponse');\n\n// PUT /credentials/:id - Update credential response\nexport const updateCredentialResponseSchema = z\n .object({\n id: z.number().openapi({ description: 'Credential ID' }),\n message: z.string().openapi({ description: 'Success message' }),\n })\n .openapi('UpdateCredentialResponse');\n\n// General success message response (used by DELETE /credentials/:id, DELETE /bubble-flow/:id, PUT /bubble-flow/:id)\nexport const successMessageResponseSchema = z\n .object({\n message: z.string().openapi({ description: 'Success message' }),\n })\n .openapi('SuccessMessageResponse');\n\n// BrowserBase session schemas\nexport const browserbaseSessionCreateRequestSchema = z\n .object({\n credentialType: z.nativeEnum(CredentialType).openapi({\n description: 'Type of credential requiring browser authentication',\n example: CredentialType.AMAZON_CRED,\n }),\n name: z.string().optional().openapi({\n description: 'User-friendly name for the credential',\n example: 'My Amazon Account',\n }),\n })\n .openapi('BrowserbaseSessionCreateRequest');\n\nexport const browserbaseSessionCreateResponseSchema = z\n .object({\n sessionId: z.string().openapi({\n description: 'BrowserBase session ID',\n }),\n debugUrl: z.string().openapi({\n description: 'URL to open for manual browser interaction',\n }),\n contextId: z.string().openapi({\n description: 'BrowserBase context ID for session persistence',\n }),\n state: z.string().openapi({\n description: 'State token for CSRF protection',\n }),\n })\n .openapi('BrowserbaseSessionCreateResponse');\n\nexport const browserbaseSessionCompleteRequestSchema = z\n .object({\n sessionId: z.string().openapi({\n description: 'BrowserBase session ID to complete',\n }),\n state: z.string().openapi({\n description: 'State token for verification',\n }),\n name: z.string().optional().openapi({\n description: 'User-friendly name for the credential',\n }),\n })\n .openapi('BrowserbaseSessionCompleteRequest');\n\nexport const browserbaseSessionCompleteResponseSchema = z\n .object({\n id: z.number().openapi({\n description: 'Created credential ID',\n }),\n message: z.string().openapi({\n description: 'Success message',\n }),\n })\n .openapi('BrowserbaseSessionCompleteResponse');\n\nexport const browserbaseSessionReopenRequestSchema = z\n .object({\n credentialId: z.number().openapi({\n description: 'ID of the credential to reopen session for',\n }),\n })\n .openapi('BrowserbaseSessionReopenRequest');\n\nexport const browserbaseSessionReopenResponseSchema = z\n .object({\n sessionId: z.string().openapi({\n description: 'BrowserBase session ID',\n }),\n debugUrl: z.string().openapi({\n description: 'URL to open for manual browser interaction',\n }),\n })\n .openapi('BrowserbaseSessionReopenResponse');\n\nexport type CreateCredentialRequest = z.infer<typeof createCredentialSchema>;\nexport type UpdateCredentialRequest = z.infer<typeof updateCredentialSchema>;\nexport type CredentialResponse = z.infer<typeof credentialResponseSchema>;\nexport type CreateCredentialResponse = z.infer<\n typeof createCredentialResponseSchema\n>;\nexport type UpdateCredentialResponse = z.infer<\n typeof updateCredentialResponseSchema\n>;\nexport type BrowserbaseSessionCreateRequest = z.infer<\n typeof browserbaseSessionCreateRequestSchema\n>;\nexport type BrowserbaseSessionCreateResponse = z.infer<\n typeof browserbaseSessionCreateResponseSchema\n>;\nexport type BrowserbaseSessionCompleteRequest = z.infer<\n typeof browserbaseSessionCompleteRequestSchema\n>;\nexport type BrowserbaseSessionCompleteResponse = z.infer<\n typeof browserbaseSessionCompleteResponseSchema\n>;\nexport type BrowserbaseSessionReopenRequest = z.infer<\n typeof browserbaseSessionReopenRequestSchema\n>;\nexport type BrowserbaseSessionReopenResponse = z.infer<\n typeof browserbaseSessionReopenResponseSchema\n>;\n","import { z } from 'zod';\nimport { CredentialType, BubbleName } from './types';\n\n// Bubble parameter type enum\nexport enum BubbleParameterType {\n STRING = 'string',\n NUMBER = 'number',\n BOOLEAN = 'boolean',\n OBJECT = 'object',\n ARRAY = 'array',\n ENV = 'env',\n VARIABLE = 'variable',\n EXPRESSION = 'expression',\n UNKNOWN = 'unknown',\n}\n\n// Credential configuration mappings - defines what configurations are available for each credential type\nexport const CREDENTIAL_CONFIGURATION_MAP: Record<\n CredentialType,\n Record<string, BubbleParameterType>\n> = {\n [CredentialType.DATABASE_CRED]: {\n ignoreSSL: BubbleParameterType.BOOLEAN,\n },\n [CredentialType.TELEGRAM_BOT_TOKEN]: {},\n [CredentialType.AGI_API_KEY]: {},\n [CredentialType.FUB_CRED]: {},\n [CredentialType.OPENAI_CRED]: {},\n [CredentialType.GOOGLE_GEMINI_CRED]: {},\n [CredentialType.ANTHROPIC_CRED]: {},\n [CredentialType.FIRECRAWL_API_KEY]: {},\n [CredentialType.SLACK_CRED]: {},\n [CredentialType.RESEND_CRED]: {},\n [CredentialType.OPENROUTER_CRED]: {},\n [CredentialType.CLOUDFLARE_R2_ACCESS_KEY]: {},\n [CredentialType.CLOUDFLARE_R2_SECRET_KEY]: {},\n [CredentialType.CLOUDFLARE_R2_ACCOUNT_ID]: {},\n [CredentialType.APIFY_CRED]: {},\n [CredentialType.ELEVENLABS_API_KEY]: {},\n [CredentialType.GOOGLE_DRIVE_CRED]: {},\n [CredentialType.GMAIL_CRED]: {},\n [CredentialType.GOOGLE_SHEETS_CRED]: {},\n [CredentialType.GOOGLE_CALENDAR_CRED]: {},\n [CredentialType.GITHUB_TOKEN]: {},\n [CredentialType.AIRTABLE_CRED]: {},\n [CredentialType.AIRTABLE_OAUTH]: {},\n [CredentialType.NOTION_OAUTH_TOKEN]: {},\n [CredentialType.INSFORGE_BASE_URL]: {},\n [CredentialType.INSFORGE_API_KEY]: {},\n [CredentialType.CUSTOM_AUTH_KEY]: {},\n [CredentialType.AMAZON_CRED]: {},\n [CredentialType.LINKEDIN_CRED]: {},\n [CredentialType.CRUSTDATA_API_KEY]: {},\n [CredentialType.JIRA_CRED]: {},\n [CredentialType.ASHBY_CRED]: {},\n [CredentialType.FULLENRICH_API_KEY]: {},\n [CredentialType.STRIPE_CRED]: {},\n [CredentialType.CREDENTIAL_WILDCARD]: {}, // Wildcard marker, not a real credential\n};\n\n// Fixed list of bubble names that need context injection\nexport const BUBBLE_NAMES_WITH_CONTEXT_INJECTION = [\n 'database-analyzer',\n 'slack-data-assistant',\n];\n\n// Zod schemas for validation and type inference\nexport const BubbleParameterTypeSchema = z.nativeEnum(BubbleParameterType);\n\nexport const BubbleParameterSchema = z.object({\n location: z.optional(\n z.object({\n startLine: z.number(),\n startCol: z.number(),\n endLine: z.number(),\n endCol: z.number(),\n })\n ),\n variableId: z\n .number()\n .optional()\n .describe('The variable id of the parameter'),\n name: z.string().describe('The name of the parameter'),\n value: z\n .union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.unknown()),\n z.array(z.unknown()),\n ])\n .describe('The value of the parameter'),\n type: BubbleParameterTypeSchema,\n /**\n * Source of the parameter - indicates whether it came from an object literal property\n * or represents the entire first argument. Used to determine if spread pattern should be applied.\n * Ex.\n * const abc = '1234567890';\n * new GoogleDriveBubble({\n * fileId: abc,\n * })\n * source: 'object-property',\n *\n * new GoogleDriveBubble({\n * url: 'https://www.google.com',\n * ...args,\n * })\n * source: 'spread',\n *\n * source = 'first-arg'\n * new GoogleDriveBubble(args)\n */\n source: z\n .enum(['object-property', 'first-arg', 'spread'])\n .optional()\n .describe(\n 'Source of the parameter - indicates if it came from an object literal property, represents the entire first argument, or came from a spread operator'\n ),\n});\n\n// Bubble parameter from backend parser (derived from Zod schema - single source of truth)\nexport type BubbleParameter = z.infer<typeof BubbleParameterSchema>;\n\n// Parsed bubble from backend parser (matches backend ParsedBubble interface)\nexport interface ParsedBubble {\n variableName: string;\n bubbleName: BubbleName; // This comes from the registry (e.g., 'postgresql', 'slack')\n className: string; // This is the actual class name (e.g., 'PostgreSQLBubble', 'SlackBubble')\n parameters: BubbleParameter[];\n hasAwait: boolean; // Whether the original expression was awaited\n hasActionCall: boolean; // Whether the original expression called .action()\n dependencies?: BubbleName[];\n dependencyGraph?: DependencyGraphNode;\n}\n// Nested dependency graph node for a bubble\nexport interface DependencyGraphNode {\n name: BubbleName;\n /** Optional variable name for this node instance, when available */\n variableName?: string;\n nodeType: BubbleNodeType;\n /**\n * Unique hierarchical ID path for the node within a flow.\n * Constructed as parentUniqueId + \".\" + bubbleName + \"#\" + ordinal.\n * Root nodes can omit or use empty string for the parent portion.\n */\n uniqueId?: string;\n /**\n * Variable id assigned by the parser/scope manager if available.\n * Root bubble nodes will carry their declaration variable id; synthetic/child nodes\n * inferred from dependencies may be assigned a negative synthetic id.\n */\n variableId?: number;\n dependencies: DependencyGraphNode[];\n /**\n * Custom tool functions parsed as FunctionCallWorkflowNode.\n * Used when an ai-agent has customTools with func properties containing bubble instantiations.\n */\n functionCallChildren?: FunctionCallWorkflowNode[];\n}\n\n// Detailed dependency specification for factory metadata\nexport interface BubbleDependencySpec {\n name: BubbleName;\n // If this dependency is an ai-agent, include its tool dependencies\n tools?: BubbleName[];\n}\n\nexport type BubbleNodeType = 'service' | 'tool' | 'workflow' | 'unknown';\n\nexport const BubbleNodeTypeSchema = z.enum([\n 'service',\n 'tool',\n 'workflow',\n 'unknown',\n]);\n\nexport const DependencyGraphNodeSchema: z.ZodType<DependencyGraphNode> = z.lazy(\n () =>\n z.object({\n name: z.string() as z.ZodType<BubbleName>,\n variableName: z.string().optional(),\n nodeType: BubbleNodeTypeSchema,\n uniqueId: z.string().optional(),\n variableId: z.number().optional(),\n dependencies: z.array(DependencyGraphNodeSchema),\n // Use lazy reference since FunctionCallWorkflowNodeSchema is defined later\n functionCallChildren: z\n .lazy(() => z.array(FunctionCallWorkflowNodeSchema))\n .optional(),\n })\n);\n\nexport const ParsedBubbleSchema = z.object({\n variableName: z.string(),\n bubbleName: z.string() as z.ZodType<BubbleName>,\n className: z.string(),\n parameters: z.array(BubbleParameterSchema),\n hasAwait: z.boolean(),\n hasActionCall: z.boolean(),\n dependencies: z.array(z.string() as z.ZodType<BubbleName>).optional(),\n dependencyGraph: DependencyGraphNodeSchema.optional(),\n});\n\nexport const BubbleDependencySpecSchema = z.object({\n name: z.string() as z.ZodType<BubbleName>,\n tools: z.array(z.string() as z.ZodType<BubbleName>).optional(),\n});\n\nexport const ParsedBubbleWithInfoSchema = z.object({\n variableName: z.string(),\n bubbleName: z.string() as z.ZodType<BubbleName>,\n className: z.string(),\n parameters: z.array(BubbleParameterSchema),\n hasAwait: z.boolean(),\n hasActionCall: z.boolean(),\n dependencies: z.array(z.string() as z.ZodType<BubbleName>).optional(),\n dependencyGraph: DependencyGraphNodeSchema.optional(),\n variableId: z.number(),\n nodeType: BubbleNodeTypeSchema,\n location: z.object({\n startLine: z.number(),\n startCol: z.number(),\n endLine: z.number(),\n endCol: z.number(),\n }),\n description: z.string().optional(),\n invocationCallSiteKey: z.string().optional(),\n clonedFromVariableId: z.number().optional(),\n isInsideCustomTool: z.boolean().optional(),\n containingCustomToolId: z.string().optional(),\n});\n\nexport type ParsedBubbleWithInfo = z.infer<typeof ParsedBubbleWithInfoSchema>;\n// Inferred types from Zod schemas\nexport type BubbleParameterTypeInferred = z.infer<\n typeof BubbleParameterTypeSchema\n>;\n// Keep for backwards compatibility - now just an alias\nexport type BubbleParameterInferred = BubbleParameter;\nexport type BubbleNodeTypeInferred = z.infer<typeof BubbleNodeTypeSchema>;\nexport type DependencyGraphNodeInferred = z.infer<\n typeof DependencyGraphNodeSchema\n>;\nexport type ParsedBubbleInferred = z.infer<typeof ParsedBubbleSchema>;\nexport type BubbleDependencySpecInferred = z.infer<\n typeof BubbleDependencySpecSchema\n>;\nexport type ParsedBubbleWithInfoInferred = z.infer<\n typeof ParsedBubbleWithInfoSchema\n>;\n\n// Workflow node types for hierarchical workflow representation\nexport type WorkflowNodeType =\n | 'bubble'\n | 'if'\n | 'for'\n | 'while'\n | 'try_catch'\n | 'variable_declaration'\n | 'return'\n | 'function_call'\n | 'code_block'\n | 'parallel_execution'\n | 'transformation_function';\n\nexport interface BubbleWorkflowNode {\n type: 'bubble';\n variableId: number; // Reference to bubble in ParsedWorkflow.bubbles map\n}\n\nexport interface ControlFlowWorkflowNode {\n type: 'if' | 'for' | 'while';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n condition?: string; // For if/for/while conditions\n children: WorkflowNode[];\n elseBranch?: WorkflowNode[]; // For if statements\n thenTerminates?: boolean; // True if then branch contains return/throw\n elseTerminates?: boolean; // True if else branch contains return/throw\n}\n\nexport interface TryCatchWorkflowNode {\n type: 'try_catch';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n children: WorkflowNode[]; // Try block\n catchBlock?: WorkflowNode[]; // Catch block\n}\n\nexport interface CodeBlockWorkflowNode {\n type: 'code_block';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n code: string; // The actual code snippet\n children: WorkflowNode[]; // Nested bubbles/control flow within this block\n}\n\nexport interface VariableDeclarationBlockNode {\n type: 'variable_declaration';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n code: string; // The variable declarations code\n variables: Array<{\n name: string;\n type: 'const' | 'let' | 'var';\n hasInitializer: boolean;\n }>;\n children: WorkflowNode[];\n}\n\nexport interface ReturnWorkflowNode {\n type: 'return';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n code: string; // The return statement code\n value?: string; // Extracted return value expression (optional, for easier access)\n children: WorkflowNode[]; // Rare, but return could contain nested structures\n}\n\nexport interface FunctionCallWorkflowNode {\n type: 'function_call';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n functionName: string; // e.g., \"processData\"\n isMethodCall: boolean; // true for this.method(), false for helper()\n description?: string; // Method description from code comments\n arguments?: string; // The arguments as code string\n code: string; // Full call expression code\n variableId: number; // Unique variable ID for tracking execution (added for logging consistency)\n variableDeclaration?: {\n // If this function call is part of a variable declaration\n variableName: string;\n variableType: 'const' | 'let' | 'var';\n };\n methodDefinition?: {\n // If method definition found in class\n location: {\n startLine: number;\n endLine: number;\n };\n isAsync: boolean;\n parameters: string[]; // Parameter names\n };\n children: WorkflowNode[]; // If method definition found, expand its body here\n}\n\nexport interface ParallelExecutionWorkflowNode {\n type: 'parallel_execution';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n code: string; // Full Promise.all() code\n variableDeclaration?: {\n // If this parallel execution is part of a variable declaration\n variableNames: string[]; // Array destructuring names\n variableType: 'const' | 'let' | 'var';\n };\n children: WorkflowNode[]; // Parallel tasks (function calls inside Promise.all)\n}\n\nexport interface TransformationFunctionWorkflowNode {\n type: 'transformation_function';\n location: {\n startLine: number;\n startCol: number;\n endLine: number;\n endCol: number;\n };\n code: string; // Entire function call code\n functionName: string; // e.g., \"validateInput\"\n isMethodCall: boolean; // true for this.method(), false for helper()\n description?: string; // Method description from code comments\n arguments?: string; // The arguments as code string\n variableId: number; // Unique variable ID for tracking execution\n variableDeclaration?: {\n // If this function call is part of a variable declaration\n variableName: string;\n variableType: 'const' | 'let' | 'var';\n };\n methodDefinition?: {\n // If method definition found in class\n location: {\n startLine: number;\n endLine: number;\n };\n isAsync: boolean;\n parameters: string[]; // Parameter names\n };\n}\n\nexport type WorkflowNode =\n | BubbleWorkflowNode\n | ControlFlowWorkflowNode\n | TryCatchWorkflowNode\n | CodeBlockWorkflowNode\n | VariableDeclarationBlockNode\n | ReturnWorkflowNode\n | FunctionCallWorkflowNode\n | ParallelExecutionWorkflowNode\n | TransformationFunctionWorkflowNode;\n\nexport interface ParsedWorkflow {\n root: WorkflowNode[];\n bubbles: Record<number, ParsedBubbleWithInfo>; // Keep for backward compatibility\n}\n\n// Zod schemas for workflow nodes\nexport const WorkflowNodeTypeSchema = z.enum([\n 'bubble',\n 'if',\n 'for',\n 'while',\n 'try_catch',\n 'variable_declaration',\n 'return',\n 'function_call',\n 'code_block',\n 'parallel_execution',\n 'transformation_function',\n]);\n\nexport const LocationSchema = z.object({\n startLine: z.number(),\n startCol: z.number(),\n endLine: z.number(),\n endCol: z.number(),\n});\n\nexport const BubbleWorkflowNodeSchema: z.ZodType<BubbleWorkflowNode> = z.object(\n {\n type: z.literal('bubble'),\n variableId: z.number(),\n }\n);\n\nexport const ControlFlowWorkflowNodeSchema: z.ZodType<ControlFlowWorkflowNode> =\n z.lazy(() =>\n z.object({\n type: z.enum(['if', 'for', 'while']),\n location: LocationSchema,\n condition: z.string().optional(),\n children: z.array(WorkflowNodeSchema),\n elseBranch: z.array(WorkflowNodeSchema).optional(),\n thenTerminates: z.boolean().optional(),\n elseTerminates: z.boolean().optional(),\n })\n );\n\nexport const TryCatchWorkflowNodeSchema: z.ZodType<TryCatchWorkflowNode> =\n z.lazy(() =>\n z.object({\n type: z.literal('try_catch'),\n location: LocationSchema,\n children: z.array(WorkflowNodeSchema),\n catchBlock: z.array(WorkflowNodeSchema).optional(),\n })\n );\n\nexport const CodeBlockWorkflowNodeSchema: z.ZodType<CodeBlockWorkflowNode> =\n z.lazy(() =>\n z.object({\n type: z.literal('code_block'),\n location: LocationSchema,\n code: z.string(),\n children: z.array(WorkflowNodeSchema),\n })\n );\n\nexport const VariableDeclarationBlockNodeSchema: z.ZodType<VariableDeclarationBlockNode> =\n z.lazy(() =>\n z.object({\n type: z.literal('variable_declaration'),\n location: LocationSchema,\n code: z.string(),\n variables: z.array(\n z.object({\n name: z.string(),\n type: z.enum(['const', 'let', 'var']),\n hasInitializer: z.boolean(),\n })\n ),\n children: z.array(WorkflowNodeSchema),\n })\n );\n\nexport const ReturnWorkflowNodeSchema: z.ZodType<ReturnWorkflowNode> = z.lazy(\n () =>\n z.object({\n type: z.literal('return'),\n location: LocationSchema,\n code: z.string(),\n value: z.string().optional(),\n children: z.array(WorkflowNodeSchema),\n })\n);\n\nexport const FunctionCallWorkflowNodeSchema: z.ZodType<FunctionCallWorkflowNode> =\n z.lazy(() =>\n z.object({\n type: z.literal('function_call'),\n location: LocationSchema,\n functionName: z.string(),\n isMethodCall: z.boolean(),\n description: z.string().optional(),\n arguments: z.string().optional(),\n code: z.string(),\n variableId: z.number(),\n variableDeclaration: z\n .object({\n variableName: z.string(),\n variableType: z.enum(['const', 'let', 'var']),\n })\n .optional(),\n methodDefinition: z\n .object({\n location: z.object({\n startLine: z.number(),\n endLine: z.number(),\n }),\n isAsync: z.boolean(),\n parameters: z.array(z.string()),\n })\n .optional(),\n children: z.array(WorkflowNodeSchema),\n })\n );\n\nexport const ParallelExecutionWorkflowNodeSchema: z.ZodType<ParallelExecutionWorkflowNode> =\n z.lazy(() =>\n z.object({\n type: z.literal('parallel_execution'),\n location: LocationSchema,\n code: z.string(),\n variableDeclaration: z\n .object({\n variableNames: z.array(z.string()),\n variableType: z.enum(['const', 'let', 'var']),\n })\n .optional(),\n children: z.array(WorkflowNodeSchema),\n })\n );\n\nexport const TransformationFunctionWorkflowNodeSchema: z.ZodType<TransformationFunctionWorkflowNode> =\n z.object({\n type: z.literal('transformation_function'),\n location: LocationSchema,\n code: z.string(),\n functionName: z.string(),\n isMethodCall: z.boolean(),\n description: z.string().optional(),\n arguments: z.string().optional(),\n variableId: z.number(),\n variableDeclaration: z\n .object({\n variableName: z.string(),\n variableType: z.enum(['const', 'let', 'var']),\n })\n .optional(),\n methodDefinition: z\n .object({\n location: z.object({\n startLine: z.number(),\n endLine: z.number(),\n }),\n isAsync: z.boolean(),\n parameters: z.array(z.string()),\n })\n .optional(),\n });\n\nexport const WorkflowNodeSchema: z.ZodType<WorkflowNode> = z.lazy(() =>\n z.union([\n BubbleWorkflowNodeSchema,\n ControlFlowWorkflowNodeSchema,\n TryCatchWorkflowNodeSchema,\n CodeBlockWorkflowNodeSchema,\n VariableDeclarationBlockNodeSchema,\n ReturnWorkflowNodeSchema,\n FunctionCallWorkflowNodeSchema,\n ParallelExecutionWorkflowNodeSchema,\n TransformationFunctionWorkflowNodeSchema,\n ])\n);\n\nexport const ParsedWorkflowSchema = z.object({\n root: z.array(WorkflowNodeSchema),\n bubbles: z.record(z.number(), ParsedBubbleWithInfoSchema),\n});\n","import { z } from 'zod';\n\n/**\n * Generate a UUID v4 compatible with both Node.js and browser environments\n */\nfunction generateUUID(): string {\n // Use crypto.randomUUID if available (modern browsers and Node.js 14.17+)\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback for older environments\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// Base interface that all bubble operation results must extend, at individual bubble level\nexport interface BubbleOperationResult {\n success: boolean;\n error: string;\n}\n\n// Final bubble execution result\nexport interface BubbleResult<T> extends BubbleOperationResult {\n data: T;\n executionId: string;\n timestamp: Date;\n}\n\n/**\n * Utility class for generating mock data from Zod schemas\n * Useful for testing, development, and creating sample data\n */\nexport class MockDataGenerator {\n /**\n * Generate a complete mock BubbleResult from a result schema\n */\n static generateMockResult<TResult extends BubbleOperationResult>(\n resultSchema: z.ZodObject<z.ZodRawShape>\n ): BubbleResult<TResult> {\n const mockData = this.generateMockFromSchema(resultSchema);\n\n return {\n success: true,\n data: mockData as TResult,\n executionId: generateUUID(),\n error: '',\n timestamp: new Date(),\n };\n }\n\n /**\n * Generate mock data from JSON Schema\n * Converts JSON Schema to mock data with realistic values\n */\n static generateMockFromJsonSchema(\n jsonSchema: Record<string, unknown>\n ): Record<string, unknown> {\n const mockData: Record<string, unknown> = {};\n\n if (!jsonSchema || typeof jsonSchema !== 'object') {\n return mockData;\n }\n\n // Handle object type with properties\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n const properties = jsonSchema.properties as Record<string, unknown>;\n\n for (const [key, propertySchema] of Object.entries(properties)) {\n if (propertySchema && typeof propertySchema === 'object') {\n const value = this.generateMockValueFromJsonSchema(\n propertySchema as Record<string, unknown>\n );\n if (value !== undefined) {\n mockData[key] = value;\n }\n }\n }\n }\n\n return mockData;\n }\n\n /**\n * Generate a mock value for a specific JSON Schema property\n */\n static generateMockValueFromJsonSchema(\n schema: Record<string, unknown>\n ): unknown {\n const type = schema.type as string;\n\n switch (type) {\n case 'string': {\n if (schema.enum && Array.isArray(schema.enum)) {\n return schema.enum[Math.floor(Math.random() * schema.enum.length)];\n }\n if (schema.format === 'email') {\n return 'test@example.com';\n }\n if (schema.format === 'date-time') {\n return new Date().toISOString();\n }\n if (schema.format === 'uuid') {\n return generateUUID();\n }\n const minLength =\n typeof schema.minLength === 'number' ? schema.minLength : 1;\n const maxLength =\n typeof schema.maxLength === 'number' ? schema.maxLength : 10;\n const length =\n Math.floor(Math.random() * (maxLength - minLength + 1)) + minLength;\n return (\n 'sample_' +\n Math.random()\n .toString(36)\n .substring(2, 2 + length)\n );\n }\n\n case 'number':\n case 'integer': {\n const min = typeof schema.minimum === 'number' ? schema.minimum : 0;\n const max = typeof schema.maximum === 'number' ? schema.maximum : 100;\n const value = Math.random() * (max - min) + min;\n return type === 'integer'\n ? Math.floor(value)\n : Math.round(value * 100) / 100;\n }\n\n case 'boolean': {\n return Math.random() > 0.5;\n }\n\n case 'array': {\n const items = schema.items as Record<string, unknown>;\n if (items) {\n const minItems =\n typeof schema.minItems === 'number' ? schema.minItems : 1;\n const maxItems =\n typeof schema.maxItems === 'number' ? schema.maxItems : 3;\n const length =\n Math.floor(Math.random() * (maxItems - minItems + 1)) + minItems;\n\n return Array.from({ length }, () =>\n this.generateMockValueFromJsonSchema(items)\n );\n }\n return [];\n }\n\n case 'object': {\n return this.generateMockFromJsonSchema(schema);\n }\n\n default: {\n return null;\n }\n }\n }\n\n /**\n * Generate mock data object from a Zod schema\n * Recursively handles nested objects, arrays, and primitive types\n */\n static generateMockFromSchema(\n schema: z.ZodObject<z.ZodRawShape>\n ): Record<string, unknown> {\n const mockData: Record<string, unknown> = {};\n\n if (!schema || typeof schema !== 'object' || !('shape' in schema)) {\n return mockData;\n }\n\n const shape = schema.shape;\n\n for (const [key, zodType] of Object.entries(shape)) {\n if (key === 'success' || key === 'error') {\n // Skip these as they're handled by the wrapper\n continue;\n }\n\n if (zodType && typeof zodType === 'object' && '_def' in zodType) {\n const value = this.generateMockValue(zodType as z.ZodTypeAny);\n if (value !== undefined) {\n mockData[key] = value;\n }\n }\n }\n\n return mockData;\n }\n\n /**\n * Generate a mock value for a specific Zod type\n */\n static generateMockValue(zodType: z.ZodTypeAny): unknown {\n const def = zodType._def;\n\n switch (def.typeName) {\n case 'ZodString': {\n return this.generateMockString(def);\n }\n\n case 'ZodNumber': {\n return this.generateMockNumber(def);\n }\n\n case 'ZodBoolean': {\n return Math.random() > 0.5;\n }\n\n case 'ZodDate': {\n return new Date();\n }\n\n case 'ZodArray': {\n const elementType = def.type;\n if (elementType) {\n const arrayLength = Math.floor(Math.random() * 3) + 1; // 1-3 elements\n return Array.from({ length: arrayLength }, () =>\n this.generateMockValue(elementType)\n );\n }\n return [];\n }\n\n case 'ZodObject': {\n if ('shape' in zodType) {\n const nestedMock: Record<string, unknown> = {};\n const shape = (zodType as z.ZodObject<z.ZodRawShape>).shape;\n\n for (const [key, value] of Object.entries(shape)) {\n if (value && typeof value === 'object' && '_def' in value) {\n const nestedValue = this.generateMockValue(value as z.ZodTypeAny);\n if (nestedValue !== undefined) {\n nestedMock[key] = nestedValue;\n }\n }\n }\n\n return nestedMock;\n }\n return {};\n }\n\n case 'ZodOptional': {\n // 70% chance to include optional fields\n if (Math.random() > 0.3) {\n return this.generateMockValue(def.innerType);\n }\n return undefined;\n }\n\n case 'ZodDefault': {\n // 50% chance to use default, 50% to generate mock value\n if (Math.random() > 0.5) {\n return def.defaultValue();\n }\n return this.generateMockValue(def.innerType);\n }\n\n case 'ZodEnum': {\n const values = def.values as readonly unknown[];\n return values[Math.floor(Math.random() * values.length)];\n }\n\n case 'ZodLiteral': {\n return def.value;\n }\n\n case 'ZodUnion': {\n const options = def.options as z.ZodTypeAny[];\n const randomOption =\n options[Math.floor(Math.random() * options.length)];\n return this.generateMockValue(randomOption);\n }\n\n case 'ZodDiscriminatedUnion': {\n const discriminatedOptions = def.options as z.ZodTypeAny[];\n const randomDiscriminatedOption =\n discriminatedOptions[\n Math.floor(Math.random() * discriminatedOptions.length)\n ];\n return this.generateMockValue(randomDiscriminatedOption);\n }\n\n case 'ZodRecord': {\n const recordMock: Record<string, unknown> = {};\n const numKeys = Math.floor(Math.random() * 3) + 1; // 1-3 keys\n\n for (let i = 0; i < numKeys; i++) {\n const key = `key${i + 1}`;\n const value = this.generateMockValue(def.valueType);\n if (value !== undefined) {\n recordMock[key] = value;\n }\n }\n\n return recordMock;\n }\n\n case 'ZodNullable': {\n // 80% chance to have value, 20% chance to be null\n if (Math.random() > 0.2) {\n return this.generateMockValue(def.innerType);\n }\n return null;\n }\n\n default: {\n // For unknown types, return a generic value\n console.warn(`Unknown Zod type for mock generation: ${def.typeName}`);\n return `mock_${def.typeName}`;\n }\n }\n }\n\n /**\n * Generate mock string values with format-specific handling\n */\n private static generateMockString(def: Record<string, unknown>): string {\n if (def.checks) {\n for (const check of def.checks as Array<Record<string, unknown>>) {\n switch (check.kind) {\n case 'email': {\n return 'test@example.com';\n }\n case 'url': {\n return 'https://example.com';\n }\n case 'uuid': {\n return generateUUID();\n }\n case 'regex': {\n // For regex patterns, try to generate simple matching strings\n const pattern = check.regex as RegExp;\n if (pattern.source.includes('\\\\d+')) {\n return '12345';\n }\n if (pattern.source.includes('[a-z]')) {\n return 'abcde';\n }\n return 'mock_regex_match';\n }\n case 'min': {\n return 'a'.repeat(check.value as number);\n }\n case 'max': {\n return 'mock'.substring(0, check.value as number);\n }\n }\n }\n }\n return 'mock string';\n }\n\n /**\n * Generate mock number values respecting constraints\n */\n private static generateMockNumber(def: Record<string, unknown>): number {\n let min = 0;\n let max = 100;\n let isInt = false;\n\n if (def.checks) {\n for (const check of def.checks as Array<Record<string, unknown>>) {\n switch (check.kind) {\n case 'min': {\n min = check.value as number;\n break;\n }\n case 'max': {\n max = check.value as number;\n break;\n }\n case 'int': {\n isInt = true;\n break;\n }\n }\n }\n }\n\n const value = Math.random() * (max - min) + min;\n return isInt ? Math.floor(value) : Math.round(value * 100) / 100;\n }\n\n /**\n * Generate mock data with custom seed for reproducible results\n */\n static generateMockWithSeed<TResult extends BubbleOperationResult>(\n resultSchema: z.ZodObject<z.ZodRawShape>,\n seed: number\n ): BubbleResult<TResult> {\n // Simple seeded random number generator\n let currentSeed = seed;\n const seededRandom = () => {\n currentSeed = (currentSeed * 9301 + 49297) % 233280;\n return currentSeed / 233280;\n };\n\n // Temporarily override Math.random\n const originalRandom = Math.random;\n Math.random = seededRandom;\n\n try {\n const mockData = this.generateMockFromSchema(resultSchema);\n\n // Generate executionId using crypto (not affected by seeded random)\n // to ensure execution IDs are always unique even with the same seed\n const executionId = generateUUID();\n\n return {\n success: true,\n data: mockData as TResult,\n executionId,\n error: '',\n timestamp: new Date(),\n };\n } finally {\n // Restore original Math.random\n Math.random = originalRandom;\n }\n }\n}\n","// ========================= OAuth Schemas =========================\nimport { z } from '@hono/zod-openapi';\nimport { CredentialType } from './types';\n\n// OAuth initiation request schema\nexport const oauthInitiateRequestSchema = z\n .object({\n credentialType: z.nativeEnum(CredentialType).openapi({\n description: 'The type of credential to create',\n example: CredentialType.GOOGLE_DRIVE_CRED,\n }),\n name: z.string().optional().openapi({\n description: 'Optional name for the credential',\n example: 'My Google Drive',\n }),\n scopes: z\n .array(z.string())\n .optional()\n .openapi({\n description:\n 'Optional OAuth scopes to request (defaults based on credential type)',\n example: ['https://www.googleapis.com/auth/drive.readonly'],\n }),\n })\n .openapi('OAuthInitiateRequest');\n\n// OAuth initiation response schema\nexport const oauthInitiateResponseSchema = z\n .object({\n authUrl: z.string().url().openapi({\n description: 'OAuth authorization URL to redirect user to',\n example: 'https://accounts.google.com/oauth2/auth?client_id=...',\n }),\n state: z.string().openapi({\n description: 'CSRF protection state parameter',\n example: 'abc123-def456-ghi789',\n }),\n })\n .openapi('OAuthInitiateResponse');\n\n// OAuth callback request schema (for POST callback with credential details)\nexport const oauthCallbackRequestSchema = z\n .object({\n code: z.string().openapi({\n description: 'OAuth authorization code from provider',\n example: 'abc123def456',\n }),\n state: z.string().openapi({\n description: 'CSRF protection state parameter',\n example: 'abc123-def456-ghi789',\n }),\n name: z.string().openapi({\n description: 'Name for the credential',\n example: 'My Google Drive',\n }),\n description: z.string().optional().openapi({\n description: 'Optional description for the credential',\n }),\n })\n .openapi('OAuthCallbackRequest');\n\n// OAuth token refresh response schema\nexport const oauthTokenRefreshResponseSchema = z\n .object({\n message: z.string().openapi({\n description: 'Success message',\n example: 'Token refreshed successfully',\n }),\n })\n .openapi('OAuthTokenRefreshResponse');\n\n// OAuth revoke response schema\nexport const oauthRevokeResponseSchema = z\n .object({\n message: z.string().openapi({\n description: 'Success message',\n example: 'Credential revoked successfully',\n }),\n })\n .openapi('OAuthRevokeResponse');\n\n// Export OAuth TypeScript types\nexport type OAuthInitiateRequest = z.infer<typeof oauthInitiateRequestSchema>;\nexport type OAuthInitiateResponse = z.infer<typeof oauthInitiateResponseSchema>;\nexport type OAuthCallbackRequest = z.infer<typeof oauthCallbackRequestSchema>;\nexport type OAuthTokenRefreshResponse = z.infer<\n typeof oauthTokenRefreshResponseSchema\n>;\nexport type OAuthRevokeResponse = z.infer<typeof oauthRevokeResponseSchema>;\n","import { z } from '@hono/zod-openapi';\n// ============================================================================\n// JOIN WAITLIST SCHEMAS\n// ============================================================================\n\n// POST /join-waitlist - Join waitlist request schema\nexport const joinWaitlistSchema = z\n .object({\n name: z.string().min(1, 'Name is required').openapi({\n description: 'Full name of the user',\n example: 'John Doe',\n }),\n email: z.string().email('Valid email is required').openapi({\n description: 'Email address of the user',\n example: 'john.doe@example.com',\n }),\n database: z.string().min(1, 'Database selection is required').openapi({\n description: 'Database type the user wants to use',\n example: 'postgres',\n }),\n otherDatabase: z.string().optional().openapi({\n description: 'Other database type if \"other\" was selected',\n example: 'Redis',\n }),\n })\n .openapi('JoinWaitlistRequest');\n\n// POST /join-waitlist - Join waitlist response schema\nexport const joinWaitlistResponseSchema = z\n .object({\n success: z.boolean().openapi({\n description: 'Whether the request was successful',\n example: true,\n }),\n message: z.string().openapi({\n description: 'Success message',\n example:\n 'Successfully joined the waitlist! Check your email for next steps.',\n }),\n })\n .openapi('JoinWaitlistResponse');\n\n// Export TypeScript types\nexport type JoinWaitlistRequest = z.infer<typeof joinWaitlistSchema>;\nexport type JoinWaitlistResponse = z.infer<typeof joinWaitlistResponseSchema>;\n","import { z } from '@hono/zod-openapi';\nimport {\n ParsedBubbleWithInfoSchema,\n ParsedBubbleSchema,\n BubbleParameterType,\n ParsedWorkflowSchema,\n} from './bubble-definition-schema.js';\nimport { CredentialType } from './types.js';\nimport type { BubbleName } from './types.js';\nimport { flowRoleSchema } from './permission-schema.js';\n// POST /bubble-flow - Create new BubbleFlow schema (with code)\nexport const createBubbleFlowSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'Name of the BubbleFlow',\n example: 'My First BubbleFlow',\n }),\n description: z.string().optional().openapi({\n description: 'Optional description of what this BubbleFlow does',\n example: 'A flow that processes webhook data',\n }),\n prompt: z.string().optional().openapi({\n description: 'Optional prompt used to generate the flow',\n example:\n 'Create a flow that processes webhook data and sends notifications',\n }),\n code: z.string().min(1).openapi({\n description: 'TypeScript code that defines the BubbleFlow class',\n example: 'export class MyFlow extends BubbleFlow { ... }',\n }),\n eventType: z.string().min(1).openapi({\n description: 'Event type this BubbleFlow responds to',\n example: 'webhook/http',\n }),\n webhookPath: z\n .string()\n .min(1)\n .max(50)\n .regex(/^[a-zA-Z0-9-_]+$/)\n .optional()\n .openapi({\n description: 'Custom webhook path (auto-generated if not provided)',\n example: 'my-webhook',\n }),\n webhookActive: z.boolean().default(false).optional().openapi({\n description: 'Whether the webhook should be active immediately',\n example: true,\n }),\n bubbleParameters: z\n .record(z.string(), ParsedBubbleWithInfoSchema)\n .optional()\n .openapi({\n description:\n 'Optional pre-parsed bubble parameters with descriptions (from AI generation). If provided, will be used instead of re-parsing the code.',\n }),\n triggerCredentialId: z.number().nullable().optional().openapi({\n description:\n 'ID of credential for trigger authentication (e.g., Slack OAuth)',\n }),\n })\n .openapi('CreateBubbleFlowRequest');\n\n// POST /bubble-flow - Create empty BubbleFlow schema (for async generation)\nexport const createEmptyBubbleFlowSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'Name of the BubbleFlow',\n example: 'My First BubbleFlow',\n }),\n description: z.string().optional().openapi({\n description: 'Optional description of what this BubbleFlow does',\n example: 'A flow that processes webhook data',\n }),\n prompt: z.string().openapi({\n description: 'Prompt used to generate the flow code asynchronously',\n example:\n 'Create a flow that processes webhook data and sends notifications',\n }),\n eventType: z.string().min(1).openapi({\n description: 'Event type this BubbleFlow responds to',\n example: 'webhook/http',\n }),\n webhookPath: z\n .string()\n .min(1)\n .max(50)\n .regex(/^[a-zA-Z0-9-_]+$/)\n .optional()\n .openapi({\n description: 'Custom webhook path (auto-generated if not provided)',\n example: 'my-webhook',\n }),\n webhookActive: z.boolean().default(false).optional().openapi({\n description: 'Whether the webhook should be active immediately',\n example: true,\n }),\n triggerCredentialId: z.number().nullable().optional().openapi({\n description:\n 'ID of credential for trigger authentication (e.g., Slack OAuth)',\n }),\n })\n .openapi('CreateEmptyBubbleFlowRequest');\n\n// POST /:id/execute - Execute BubbleFlow schema\nexport const executeBubbleFlowSchema = z\n .record(z.string(), z.unknown())\n .openapi('ExecuteBubbleFlowRequest');\n\n// PUT /bubble-flow/:id - Update BubbleFlow parameters schema\nexport const updateBubbleFlowParametersSchema = z\n .object({\n bubbleParameters: z.record(\n z.string(),\n z.union([ParsedBubbleWithInfoSchema, ParsedBubbleSchema])\n ),\n })\n .openapi('UpdateBubbleFlowParametersRequest');\n\n// PATCH /bubble-flow/:id/name - Update BubbleFlow name schema\nexport const updateBubbleFlowNameSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'New name for the BubbleFlow',\n example: 'My Updated Flow',\n }),\n })\n .openapi('UpdateBubbleFlowNameRequest');\n\n// ============================================================================\n// RESPONSE SCHEMAS (Output Types)\n// ============================================================================\n\n// POST /bubble-flow - Create BubbleFlow response (with code)\nexport const createBubbleFlowResponseSchema = z\n .object({\n id: z.number().openapi({\n description: 'ID of the created BubbleFlow',\n example: 123,\n }),\n message: z.string().openapi({\n description: 'Success message',\n example: 'BubbleFlow created successfully',\n }),\n inputSchema: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({\n description: 'Input schema',\n example: {\n name: 'string',\n age: 'number',\n },\n }),\n bubbleParameters: z.record(z.string(), ParsedBubbleWithInfoSchema).openapi({\n description: 'Parsed bubble parameters from the BubbleFlow code',\n }),\n workflow: ParsedWorkflowSchema.optional().openapi({\n description: 'Hierarchical workflow structure with control flow',\n }),\n requiredCredentials: z\n .record(z.string(), z.array(z.nativeEnum(CredentialType)))\n .optional()\n .openapi({\n description:\n 'Mapping of bubble names to their required credential types. Uses CREDENTIAL_WILDCARD (\"*\") for bubbles accepting any credential.',\n example: {\n 'database-connection': [CredentialType.DATABASE_CRED],\n 'slack-notification': [CredentialType.SLACK_CRED],\n 'ai-analysis': [CredentialType.GOOGLE_GEMINI_CRED],\n 'http-request': [CredentialType.CREDENTIAL_WILDCARD],\n },\n }),\n eventType: z.string().min(1).openapi({\n description: 'Event type this BubbleFlow responds to',\n example: 'webhook/http',\n }),\n triggerCredentialId: z.number().nullable().optional().openapi({\n description:\n 'ID of credential for trigger authentication (e.g., Slack OAuth)',\n }),\n webhook: z\n .object({\n id: z.number().openapi({ description: 'Webhook ID', example: 456 }),\n url: z.string().openapi({\n description: 'Full webhook URL',\n example: 'http://localhost:3001/webhook/user123/my-webhook',\n }),\n path: z.string().openapi({\n description: 'Webhook path',\n example: 'my-webhook',\n }),\n active: z.boolean().openapi({\n description: 'Whether webhook is active',\n example: true,\n }),\n })\n .optional()\n .openapi({\n description: 'Webhook information (if webhook was created)',\n }),\n })\n .openapi('CreateBubbleFlowResponse');\n\n// POST /bubble-flow - Create empty BubbleFlow response (for async generation)\nexport const createEmptyBubbleFlowResponseSchema = z\n .object({\n id: z.number().openapi({\n description:\n 'ID of the created BubbleFlow (code will be generated asynchronously)',\n example: 123,\n }),\n message: z.string().openapi({\n description: 'Success message',\n example:\n 'BubbleFlow created successfully. Code generation in progress...',\n }),\n webhook: z\n .object({\n id: z.number().openapi({ description: 'Webhook ID', example: 456 }),\n url: z.string().openapi({\n description: 'Full webhook URL',\n example: 'http://localhost:3001/webhook/user123/my-webhook',\n }),\n path: z.string().openapi({\n description: 'Webhook path',\n example: 'my-webhook',\n }),\n active: z.boolean().openapi({\n description: 'Whether webhook is active',\n example: false,\n }),\n })\n .optional()\n .openapi({\n description: 'Webhook information (if webhook was created)',\n }),\n })\n .openapi('CreateEmptyBubbleFlowResponse');\n\n// Used credential schema for credential visibility in shared workflows\nexport const usedCredentialSchema = z\n .object({\n id: z.number().openapi({\n description: 'Credential ID',\n example: 123,\n }),\n name: z.string().openapi({\n description: 'Credential name',\n example: 'My OpenAI Key',\n }),\n type: z.nativeEnum(CredentialType).openapi({\n description: 'Credential type',\n example: CredentialType.OPENAI_CRED,\n }),\n ownerId: z.string().openapi({\n description: 'User ID of the credential owner',\n example: 'user_abc',\n }),\n isMine: z.boolean().openapi({\n description: 'Whether this credential belongs to the current user',\n example: true,\n }),\n })\n .openapi('UsedCredential');\n\nexport type UsedCredential = z.infer<typeof usedCredentialSchema>;\n\n// GET /bubble-flow/:id - Get BubbleFlow details response\nexport const bubbleFlowDetailsResponseSchema = z\n .object({\n id: z.number().openapi({ description: 'BubbleFlow ID' }),\n name: z.string().openapi({ description: 'BubbleFlow name' }),\n description: z.string().optional().openapi({ description: 'Description' }),\n prompt: z\n .string()\n .optional()\n .openapi({ description: 'Original prompt used to generate the flow' }),\n eventType: z.string().openapi({ description: 'Event type' }),\n code: z.string().openapi({ description: 'TypeScript source code' }),\n generationError: z\n .string()\n .nullable()\n .optional()\n .openapi({ description: 'Error message if code generation failed' }),\n inputSchema: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({ description: 'Input schema' }),\n cron: z\n .string()\n .nullable()\n .optional()\n .openapi({ description: 'Cron expression' }),\n cronActive: z\n .boolean()\n .optional()\n .openapi({ description: 'Whether cron scheduling is active' }),\n defaultInputs: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({ description: 'Default inputs for cron scheduling' }),\n isActive: z\n .boolean()\n .openapi({ description: 'Whether the BubbleFlow is active' }),\n organizationId: z.number().optional().openapi({\n description: 'Organization ID this flow belongs to',\n example: 123,\n }),\n requiredCredentials: z\n .record(z.string(), z.array(z.nativeEnum(CredentialType)))\n .openapi({ description: 'Required credentials by bubble' }),\n usedCredentials: z.array(usedCredentialSchema).optional().openapi({\n description:\n 'Credentials used in this flow with metadata (for shared workflow visibility)',\n }),\n displayedBubbleParameters: z\n .record(\n z.string(),\n z.object({\n variableName: z.string(),\n bubbleName: z.string(),\n className: z.string(),\n parameters: z.array(\n z.object({\n name: z.string(),\n value: z.unknown(),\n type: z.nativeEnum(BubbleParameterType),\n })\n ),\n hasAwait: z.boolean(),\n hasActionCall: z.boolean(),\n })\n )\n .optional()\n .openapi({\n description: 'Displayed bubble parameters for visualization',\n }),\n bubbleParameters: z.record(z.string(), ParsedBubbleWithInfoSchema).openapi({\n description: 'Bubble parameters',\n }),\n workflow: ParsedWorkflowSchema.optional().openapi({\n description: 'Hierarchical workflow structure with control flow',\n }),\n metadata: z.record(z.string(), z.unknown()).optional().openapi({\n description:\n 'Flow metadata including conversation messages from generation',\n }),\n permission: z\n .enum(['owner', 'editor', 'runner', 'viewer'])\n .optional()\n .openapi({\n description: 'Current user permission level for this flow',\n example: 'owner',\n }),\n triggerCredentialId: z.number().nullable().optional().openapi({\n description: 'Credential ID for trigger authentication',\n }),\n triggerCredential: usedCredentialSchema.nullable().optional().openapi({\n description:\n 'Trigger credential metadata with owner info (for shared workflow visibility)',\n }),\n createdAt: z.string().openapi({ description: 'Creation timestamp' }),\n updatedAt: z.string().openapi({ description: 'Update timestamp' }),\n webhook_url: z\n .string()\n .openapi({ description: 'Webhook URL for this bubble flow' }),\n })\n .openapi('BubbleFlowDetailsResponse');\n\n// Individual BubbleFlow list item schema\nexport const bubbleFlowListItemSchema = z.object({\n id: z.number().openapi({ description: 'BubbleFlow ID' }),\n name: z.string().openapi({ description: 'BubbleFlow name' }),\n description: z.string().optional().openapi({ description: 'Description' }),\n eventType: z.string().openapi({ description: 'Event type' }),\n isActive: z\n .boolean()\n .openapi({ description: 'Whether the BubbleFlow is active' }),\n cronActive: z\n .boolean()\n .openapi({ description: 'Whether cron scheduling is active' }),\n cronSchedule: z.string().optional().openapi({ description: 'Cron schedule' }),\n webhookExecutionCount: z\n .number()\n .openapi({ description: 'Webhook execution count' }),\n webhookFailureCount: z\n .number()\n .openapi({ description: 'Webhook failure count' }),\n executionCount: z\n .number()\n .openapi({ description: 'Total number of executions in history' }),\n bubbles: z\n .array(\n z.object({\n bubbleName: z\n .string()\n .openapi({ description: 'Bubble name' }) as z.ZodType<BubbleName>,\n className: z.string().openapi({ description: 'Bubble class name' }),\n })\n )\n .optional()\n .openapi({ description: 'List of bubbles used in this flow' }),\n permission: flowRoleSchema.optional().openapi({\n description: 'User permission level for this flow',\n example: 'owner',\n }),\n organizationId: z.number().optional().openapi({\n description: 'Organization ID this flow belongs to',\n example: 123,\n }),\n ownerId: z.string().openapi({\n description: 'User ID of the flow owner',\n example: 'user_abc123',\n }),\n triggerCredentialId: z.number().nullable().optional().openapi({\n description: 'Credential ID for trigger authentication',\n }),\n createdAt: z.string().openapi({ description: 'Creation timestamp' }),\n updatedAt: z.string().openapi({ description: 'Update timestamp' }),\n});\n\n// GET /bubble-flow - List BubbleFlows response with user info\nexport const bubbleFlowListResponseSchema = z.object({\n bubbleFlows: z.array(bubbleFlowListItemSchema).default([]),\n userMonthlyUsage: z\n .object({\n count: z.number().openapi({ description: 'Current monthly usage count' }),\n })\n .openapi({ description: 'User monthly usage information' }),\n});\n// POST /bubble-flow/:id/activate - Activate workflow\nexport const activateBubbleFlowResponseSchema = z\n .object({\n success: z.boolean().openapi({\n description: 'Whether the activation was successful',\n example: true,\n }),\n webhookUrl: z.string().openapi({\n description: 'Webhook URL for the activated workflow',\n example: 'https://api.nodex.dev/webhook/user123/workflow-123',\n }),\n message: z.string().openapi({\n description: 'Success message',\n example: 'Workflow activated successfully! Your Slack bot is now ready.',\n }),\n })\n .openapi('ActivateBubbleFlowResponse');\n\nexport type ActivateBubbleFlowResponse = z.infer<\n typeof activateBubbleFlowResponseSchema\n>;\n// Keep interface for backwards compatibility\nexport type CreateBubbleFlowResponse = z.infer<\n typeof createBubbleFlowResponseSchema\n>;\nexport type CreateBubbleFlowRequest = z.infer<typeof createBubbleFlowSchema>;\nexport type CreateEmptyBubbleFlowRequest = z.infer<\n typeof createEmptyBubbleFlowSchema\n>;\nexport type CreateEmptyBubbleFlowResponse = z.infer<\n typeof createEmptyBubbleFlowResponseSchema\n>;\nexport type ExecuteBubbleFlowRequest = z.infer<typeof executeBubbleFlowSchema>;\n\nexport type UpdateBubbleFlowParametersRequest = z.infer<\n typeof updateBubbleFlowParametersSchema\n>;\nexport type UpdateBubbleFlowParametersResponse = z.infer<\n typeof updateBubbleFlowParametersSchema\n>;\nexport type UpdateBubbleFlowNameRequest = z.infer<\n typeof updateBubbleFlowNameSchema\n>;\nexport type BubbleFlowDetailsResponse = z.infer<\n typeof bubbleFlowDetailsResponseSchema\n>;\n// Response types (derived from response schemas)\nexport type BubbleFlowListResponse = z.infer<\n typeof bubbleFlowListResponseSchema\n>;\nexport type BubbleFlowListItem = z.infer<typeof bubbleFlowListItemSchema>;\n","/**\n * Zod schemas for workflow permission and trash management\n * These are shared between frontend and backend\n */\n\nimport { z } from '@hono/zod-openapi';\n\n// ============================================================================\n// Enums and Base Types\n// ============================================================================\n\nexport const flowRoleSchema = z\n .enum(['owner', 'editor', 'runner', 'viewer'])\n .openapi('FlowRole');\n\nexport type FlowRole = z.infer<typeof flowRoleSchema>;\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nexport const flowPermissionSchema = z\n .object({\n userId: z.string().openapi({\n description: 'User ID',\n example: 'user_123',\n }),\n email: z.string().openapi({\n description: 'User email',\n example: 'user@example.com',\n }),\n name: z.string().nullable().openapi({\n description: 'User display name',\n example: 'John Doe',\n }),\n avatarUrl: z.string().optional().openapi({\n description: 'User avatar URL',\n example: 'https://example.com/avatar.png',\n }),\n role: flowRoleSchema,\n grantedAt: z.string().openapi({\n description: 'ISO timestamp when permission was granted',\n example: '2024-01-01T00:00:00Z',\n }),\n grantedBy: z.string().nullable().openapi({\n description: 'User ID who granted the permission',\n example: 'user_456',\n }),\n })\n .openapi('FlowPermission');\n\nexport type FlowPermission = z.infer<typeof flowPermissionSchema>;\n\nexport const trashedFlowSchema = z\n .object({\n id: z.number().openapi({\n description: 'Flow ID',\n example: 123,\n }),\n name: z.string().openapi({\n description: 'Flow name',\n example: 'My Workflow',\n }),\n organizationId: z.number().nullable().openapi({\n description: 'Organization ID if the flow belongs to an organization',\n example: 456,\n }),\n organizationName: z.string().nullable().openapi({\n description: 'Organization name',\n example: 'My Team',\n }),\n deletedAt: z.string().openapi({\n description: 'ISO timestamp when flow was deleted',\n example: '2024-01-01T00:00:00Z',\n }),\n deletedBy: z.string().nullable().openapi({\n description: 'User ID who deleted the flow',\n example: 'user_123',\n }),\n canRestore: z.boolean().openapi({\n description: 'Whether the current user can restore this flow',\n example: true,\n }),\n canPermanentDelete: z.boolean().openapi({\n description: 'Whether the current user can permanently delete this flow',\n example: false,\n }),\n })\n .openapi('TrashedFlow');\n\nexport type TrashedFlow = z.infer<typeof trashedFlowSchema>;\n\n// ============================================================================\n// Request Schemas\n// ============================================================================\n\nexport const grantPermissionSchema = z\n .object({\n email: z.string().email().optional().openapi({\n description: 'User email to grant permission to',\n example: 'user@example.com',\n }),\n userId: z.string().optional().openapi({\n description: 'User ID to grant permission to',\n example: 'user_123',\n }),\n role: flowRoleSchema,\n })\n .refine((data) => data.email || data.userId, {\n message: 'Either email or userId must be provided',\n })\n .openapi('GrantPermissionRequest');\n\nexport type GrantPermissionRequest = z.infer<typeof grantPermissionSchema>;\n\nexport const updatePermissionSchema = z\n .object({\n role: flowRoleSchema,\n })\n .openapi('UpdatePermissionRequest');\n\nexport type UpdatePermissionRequest = z.infer<typeof updatePermissionSchema>;\n\nexport const transferOwnershipSchema = z\n .object({\n fromUserId: z.string().openapi({\n description: 'Current owner user ID',\n example: 'user_123',\n }),\n toUserId: z.string().openapi({\n description: 'New owner user ID',\n example: 'user_456',\n }),\n })\n .openapi('TransferOwnershipRequest');\n\nexport type TransferOwnershipRequest = z.infer<typeof transferOwnershipSchema>;\n\n// ============================================================================\n// List Permissions Response\n// ============================================================================\n\nexport const listFlowPermissionsResponseSchema = z\n .object({\n permissions: z.array(flowPermissionSchema),\n organizationId: z.number().nullable().openapi({\n description: 'Organization ID if the flow belongs to an organization',\n example: 456,\n }),\n isInTrash: z.boolean().openapi({\n description: 'Whether the flow is in trash',\n example: false,\n }),\n })\n .openapi('ListFlowPermissionsResponse');\n\nexport type ListFlowPermissionsResponse = z.infer<\n typeof listFlowPermissionsResponseSchema\n>;\n\n// ============================================================================\n// Grant Permission Response\n// ============================================================================\n\nexport const grantPermissionResponseSchema = z\n .object({\n userId: z.string(),\n role: flowRoleSchema,\n grantedAt: z.string(),\n })\n .openapi('GrantPermissionResponse');\n\nexport type GrantPermissionResponse = z.infer<\n typeof grantPermissionResponseSchema\n>;\n\n// ============================================================================\n// Update Permission Response\n// ============================================================================\n\nexport const updatePermissionResponseSchema = z\n .object({\n userId: z.string(),\n role: flowRoleSchema,\n updatedAt: z.string(),\n })\n .openapi('UpdatePermissionResponse');\n\nexport type UpdatePermissionResponse = z.infer<\n typeof updatePermissionResponseSchema\n>;\n\n// ============================================================================\n// Transfer Ownership Response\n// ============================================================================\n\nexport const transferOwnershipResponseSchema = z\n .object({\n previousOwner: z.string(),\n newOwner: z.string(),\n transferredAt: z.string(),\n })\n .openapi('TransferOwnershipResponse');\n\nexport type TransferOwnershipResponse = z.infer<\n typeof transferOwnershipResponseSchema\n>;\n\n// ============================================================================\n// Trash List Response\n// ============================================================================\n\nexport const listTrashResponseSchema = z\n .object({\n workflows: z.array(trashedFlowSchema),\n })\n .openapi('ListTrashResponse');\n\nexport type ListTrashResponse = z.infer<typeof listTrashResponseSchema>;\n\n// ============================================================================\n// Restore Flow Response\n// ============================================================================\n\nexport const restoreFlowResponseSchema = z\n .object({\n id: z.number(),\n restoredAt: z.string(),\n message: z.string(),\n })\n .openapi('RestoreFlowResponse');\n\nexport type RestoreFlowResponse = z.infer<typeof restoreFlowResponseSchema>;\n","import { z } from '@hono/zod-openapi';\nimport {\n ParsedBubbleWithInfoSchema,\n ParsedWorkflowSchema,\n} from './bubble-definition-schema';\nimport { CredentialType } from './types';\n\nexport const ServiceUsageSchema = z\n .object({\n service: z.nativeEnum(CredentialType).openapi({\n description: 'Service identifier',\n example: CredentialType.OPENAI_CRED,\n }),\n subService: z.string().optional().openapi({\n description: 'Sub-service identifier',\n example: 'gpt-4',\n }),\n unit: z.string().openapi({\n description: 'Unit type for this service',\n example: 'per_1m_tokens',\n }),\n usage: z.number().openapi({\n description: 'Units used this month',\n example: 2250000,\n }),\n unitCost: z.number().openapi({\n description: 'Bubble Lab price per unit (with multiplier applied)',\n example: 2.1,\n }),\n totalCost: z.number().openapi({\n description: 'Total cost for this service (usage * unitCost)',\n example: 4.725,\n }),\n })\n .openapi('ServiceUsage');\n\nexport type ServiceUsage = z.infer<typeof ServiceUsageSchema>;\n\nexport const ExecutionSummarySchema = z\n .object({\n result: z.any().optional().openapi({\n description: 'Execution result',\n example: 'Execution completed successfully',\n }),\n totalDuration: z.number().openapi({\n description: 'Total execution duration in milliseconds',\n example: 1500,\n }),\n lineExecutionCount: z.number().optional().openapi({\n description: 'Number of lines executed',\n example: 25,\n }),\n bubbleExecutionCount: z.number().optional().openapi({\n description: 'Number of bubbles executed',\n example: 5,\n }),\n errorCount: z.number().optional().openapi({\n description: 'Number of errors encountered',\n example: 0,\n }),\n totalCost: z\n .number()\n .openapi({ description: 'Total cost of the execution' }),\n warningCount: z.number().optional().openapi({\n description: 'Number of warnings encountered',\n example: 1,\n }),\n errors: z\n .array(\n z.object({\n message: z.string().openapi({\n description: 'Error message',\n example: 'Failed to execute bubble',\n }),\n timestamp: z.number().openapi({\n description: 'Error timestamp (Unix timestamp)',\n example: 1703123457000,\n }),\n bubbleName: z.string().optional().openapi({\n description: 'Name of the bubble that caused the error',\n example: 'AIAgentBubble',\n }),\n variableId: z.number().optional().openapi({\n description: 'Variable ID associated with the error',\n example: 1,\n }),\n lineNumber: z.number().optional().openapi({\n description: 'Line number where the error occurred',\n example: 15,\n }),\n additionalData: z.any().optional().openapi({\n description: 'Additional error details',\n }),\n })\n )\n .optional()\n .openapi({\n description: 'Array of errors encountered during execution',\n }),\n warnings: z\n .array(\n z.object({\n message: z.string().openapi({\n description: 'Warning message',\n example: 'Deprecated API usage detected',\n }),\n timestamp: z.number().openapi({\n description: 'Warning timestamp (Unix timestamp)',\n example: 1703123457000,\n }),\n bubbleName: z.string().optional().openapi({\n description: 'Name of the bubble that caused the warning',\n example: 'HttpBubble',\n }),\n variableId: z.number().optional().openapi({\n description: 'Variable ID associated with the warning',\n example: 2,\n }),\n lineNumber: z.number().optional().openapi({\n description: 'Line number where the warning occurred',\n example: 20,\n }),\n additionalData: z.any().optional().openapi({\n description: 'Additional warning details',\n }),\n })\n )\n .optional()\n .openapi({\n description: 'Array of warnings encountered during execution',\n }),\n averageLineExecutionTime: z.number().optional().openapi({\n description: 'Average execution time per line in milliseconds',\n example: 60,\n }),\n slowestLines: z\n .array(\n z.object({\n lineNumber: z.number().openapi({\n description: 'Line number',\n example: 15,\n }),\n duration: z.number().openapi({\n description: 'Execution duration in milliseconds',\n example: 250,\n }),\n message: z.string().openapi({\n description: 'Description of what was executed on this line',\n example: 'API call to external service',\n }),\n })\n )\n .optional()\n .openapi({\n description: 'Array of the slowest executing lines',\n }),\n memoryPeakUsage: z.any().optional().openapi({\n description:\n 'Peak memory usage during execution (NodeJS.MemoryUsage type)',\n }), // NodeJS.MemoryUsage type\n startTime: z.number().optional().openapi({\n description: 'Execution start timestamp (Unix timestamp)',\n example: 1703123456789,\n }),\n endTime: z.number().optional().openapi({\n description: 'Execution end timestamp (Unix timestamp)',\n example: 1703123458289,\n }),\n serviceUsage: z.array(ServiceUsageSchema).optional().openapi({\n description: 'Token usage during execution',\n }),\n serviceUsageByService: z\n .record(z.string(), ServiceUsageSchema)\n .optional()\n .openapi({\n description: 'Service usage breakdown by service',\n }),\n })\n .openapi('ExecutionSummary');\n\nexport type ExecutionSummary = z.infer<typeof ExecutionSummarySchema>;\n\n// BubbleFlow execution history item schema\nexport const bubbleFlowExecutionSchema = z.object({\n id: z.number().openapi({ description: 'Execution ID' }),\n status: z\n .enum(['running', 'success', 'error'])\n .openapi({ description: 'Execution status' }),\n payload: z\n .record(z.string(), z.any())\n .openapi({ description: 'Execution payload' }),\n result: z.any().optional().openapi({ description: 'Execution result data' }),\n error: z\n .string()\n .optional()\n .openapi({ description: 'Error message if failed' }),\n startedAt: z.string().openapi({ description: 'Execution start timestamp' }),\n webhook_url: z.string().openapi({ description: 'Webhook URL' }),\n completedAt: z\n .string()\n .optional()\n .openapi({ description: 'Execution completion timestamp' }),\n code: z.string().optional().openapi({\n description:\n 'The code that was executed (snapshot of the code at execution time)',\n }),\n totalCost: z.number().optional().openapi({\n description: 'Total cost of the execution in credits',\n }),\n});\n\n// GET /bubble-flow/:id/executions - List BubbleFlow executions response\nexport const listBubbleFlowExecutionsResponseSchema = z\n .object({\n items: z.array(bubbleFlowExecutionSchema).openapi({\n description: 'Array of execution records for the current page',\n }),\n total: z.number().openapi({\n description: 'Total number of executions for this flow',\n example: 42,\n }),\n })\n .openapi('ListBubbleFlowExecutionsResponse');\n\nexport type ListBubbleFlowExecutionsResponse = z.infer<\n typeof listBubbleFlowExecutionsResponseSchema\n>;\n\n// GET /bubble-flow/:id/executions/:executionId - Single execution with logs\nexport const bubbleFlowExecutionDetailSchema = bubbleFlowExecutionSchema.extend(\n {\n executionLogs: z.array(z.any()).optional().openapi({\n description: 'Array of streaming log events from the execution',\n }),\n }\n);\n\nexport type BubbleFlowExecutionDetail = z.infer<\n typeof bubbleFlowExecutionDetailSchema\n>;\n\nexport const executeBubbleFlowResponseSchema = z\n .object({\n executionId: z.number().openapi({\n description: 'ID of the execution record',\n example: 789,\n }),\n success: z.boolean().openapi({\n description: 'Whether the execution was successful',\n example: true,\n }),\n data: z\n .any()\n .optional()\n .openapi({\n description: 'Data returned by the BubbleFlow (if successful)',\n example: { result: 'processed successfully', count: 42 },\n }),\n summary: ExecutionSummarySchema.optional().openapi({\n description: 'Execution summary',\n }),\n error: z.string().optional().openapi({\n description: 'Error message (if execution failed)',\n example: 'Validation error in BubbleFlow',\n }),\n })\n .openapi('ExecuteBubbleFlowResponse');\n\nexport type ExecuteBubbleFlowResponse = z.infer<\n typeof executeBubbleFlowResponseSchema\n>;\n\n// ExecutionResult interface for internal use (matches the API response)\nexport type ExecutionResult = ExecuteBubbleFlowResponse;\n\n// Validation schemas\nexport const validateBubbleFlowCodeSchema = z.object({\n code: z.string().min(1).openapi({\n description: 'TypeScript BubbleFlow code to validate',\n example:\n 'export class TestFlow extends BubbleFlow<\"webhook/http\"> { async handle() { return {}; } }',\n }),\n options: z\n .object({\n includeDetails: z.boolean().default(true).openapi({\n description: 'Include detailed bubble analysis',\n }),\n strictMode: z.boolean().default(true).openapi({\n description: 'Enable strict TypeScript validation',\n }),\n syncInputsWithFlow: z.boolean().default(false).openapi({\n description: 'Whether to sync input values with the flow',\n }),\n })\n .optional()\n .openapi({\n description: 'Validation options',\n }),\n flowId: z.number().positive().optional().openapi({\n description:\n 'Optional BubbleFlow ID to update with validation results if user owns the flow',\n example: 123,\n }),\n credentials: z\n .record(z.string(), z.record(z.string(), z.number()))\n .optional()\n .openapi({\n description:\n 'Optional credentials mapping: bubble name -> credential type -> credential ID',\n example: {\n 'slack-sender': {\n SLACK_CRED: 123,\n },\n 'ai-agent': {\n OPENAI_CRED: 456,\n },\n },\n }),\n defaultInputs: z\n .record(z.unknown())\n .optional()\n .openapi({\n description: 'User-filled input values for cron execution',\n example: {\n message: 'Hello World',\n channel: '#general',\n },\n }),\n activateCron: z.boolean().optional().openapi({\n description: 'Whether to activate/deactivate cron scheduling',\n example: true,\n }),\n});\n\nexport const validateBubbleFlowCodeResponseSchema = z.object({\n eventType: z.string().min(1).openapi({\n description: 'Event type this BubbleFlow responds to',\n example: 'webhook/http',\n }),\n webhookPath: z.string().min(1).openapi({\n description: 'Custom webhook path (auto-generated if not provided)',\n example: 'my-webhook',\n }),\n valid: z.boolean().openapi({\n description: 'Whether the code is valid',\n }),\n errors: z.array(z.string()).optional().openapi({\n description: 'List of validation errors if any',\n }),\n bubbleCount: z.number().optional().openapi({\n description: 'Number of bubbles found in the code',\n }),\n inputSchema: z.record(z.string(), z.unknown()).openapi({\n description: 'Input schema',\n example: {\n name: 'string',\n age: 'number',\n },\n }),\n bubbles: z.record(z.string(), ParsedBubbleWithInfoSchema).optional().openapi({\n description: 'Record mapping bubble IDs to their detailed information',\n }),\n workflow: ParsedWorkflowSchema.optional().openapi({\n description: 'Hierarchical workflow structure with control flow',\n }),\n requiredCredentials: z\n .record(z.string(), z.array(z.string()))\n .optional()\n .openapi({\n description: 'Required credentials for the bubbles in the code',\n }),\n metadata: z\n .object({\n validatedAt: z.string().openapi({\n description: 'Timestamp when validation was performed',\n }),\n codeLength: z.number().openapi({\n description: 'Length of the code in characters',\n }),\n strictMode: z.boolean().openapi({\n description: 'Whether strict mode was used',\n }),\n flowUpdated: z.boolean().optional().openapi({\n description:\n 'Whether the BubbleFlow was updated with validation results',\n }),\n })\n .openapi({\n description: 'Validation metadata',\n }),\n cron: z.string().nullable().optional().openapi({\n description: 'Cron expression extracted from code',\n example: '0 0 * * *',\n }),\n cronActive: z.boolean().optional().openapi({\n description: 'Whether cron scheduling is currently active',\n example: false,\n }),\n defaultInputs: z\n .record(z.unknown())\n .optional()\n .openapi({\n description: 'User-filled input values for cron execution',\n example: {\n message: 'Hello World',\n channel: '#general',\n },\n }),\n success: z.boolean(),\n error: z.string(),\n});\nexport type ValidateBubbleFlowResponse = z.infer<\n typeof validateBubbleFlowCodeResponseSchema\n>;\nexport type BubbleFlowExecution = z.infer<typeof bubbleFlowExecutionSchema>;\n","import { ParsedBubbleWithInfoSchema } from './bubble-definition-schema';\nimport { z } from '@hono/zod-openapi';\nimport { BubbleParameterType } from './bubble-definition-schema';\nimport { CredentialType } from './types';\nimport { ServiceUsageSchema } from './bubbleflow-execution-schema';\nimport { CoffeeMessageSchema } from './coffee';\n\n// BubbleFlow generation schemas\nexport const generateBubbleFlowCodeSchema = z.object({\n prompt: z.string().min(1).openapi({\n description: 'Natural language description of the desired BubbleFlow',\n example:\n 'Create a flow that queries my database and sends results to Slack',\n }),\n flowId: z.number().optional().openapi({\n description:\n 'Optional flow ID to update with generated code (for async generation)',\n example: 123,\n }),\n // Coffee agent unified messages (for planning phase)\n messages: z.array(CoffeeMessageSchema).optional().openapi({\n description:\n 'Full conversation history including clarification Q&A, context results, plan approvals',\n }),\n // Plan context (passed to Boba for enriched code generation)\n planContext: z.string().optional().openapi({\n description:\n 'Plan context from Coffee agent (passed to Boba for enriched generation)',\n example: 'Plan: 1. Fetch data from API 2. Process with AI 3. Send to Slack',\n }),\n});\n\nexport const generateBubbleFlowCodeResponseSchema = z.object({\n generatedCode: z.string().openapi({\n description: 'The generated BubbleFlow TypeScript code',\n }),\n isValid: z.boolean().openapi({\n description: 'Whether the generated code is valid',\n }),\n success: z.boolean(),\n error: z.string(),\n bubbleParameters: z.record(z.string(), ParsedBubbleWithInfoSchema).openapi({\n description: 'Parsed bubble parameters from the generated code',\n }),\n requiredCredentials: z.record(z.string(), z.array(z.string())).openapi({\n description: 'Required credentials for the bubbles in the generated code',\n }),\n});\n\n/**\n * Schema for the result of BubbleFlow generation\n * Used by the BubbleFlowGeneratorWorkflow\n */\nexport const GenerationResultSchema = z.object({\n generatedCode: z\n .string()\n .describe('The generated BubbleFlow TypeScript code'),\n isValid: z.boolean().describe('Whether the generated code is valid'),\n success: z.boolean(),\n error: z.string(),\n flowId: z.number().optional().openapi({\n description: 'ID of the generated BubbleFlow',\n example: 123,\n }),\n toolCalls: z\n .array(z.unknown())\n .describe('The tool calls made by the AI agent'),\n summary: z\n .string()\n .default('')\n .describe('High-level instructions for using the validated flow'),\n inputsSchema: z\n .string()\n .default('')\n .describe('JSON Schema (string) representing the inputs of the flow'),\n serviceUsage: z.array(ServiceUsageSchema).optional().openapi({\n description:\n 'Service usage statistics for the generation (array of services used)',\n }),\n bubbleCount: z.number().optional().openapi({\n description: 'Number of bubbles used in the generated flow',\n }),\n codeLength: z.number().optional().openapi({\n description: 'Length of the generated code in characters',\n }),\n bubbleParameters: z\n .record(z.union([z.string(), z.number()]), ParsedBubbleWithInfoSchema)\n .optional()\n .openapi({\n description:\n 'Parsed bubble parameters with descriptions from AI generation',\n }),\n});\n// POST /bubbleflow-template/data-analyst - Generate template from description\nexport const generateBubbleFlowTemplateSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'Name for the workflow',\n example: 'Sam Dix Data Scientist Bot',\n }),\n description: z.string().min(10).max(500).openapi({\n description: 'Description of what the workflow should do',\n example:\n 'A Slack bot that helps analyze user engagement data and provides insights',\n }),\n roles: z.string().min(10).max(1000).openapi({\n description:\n \"Detailed description of the bot's roles and responsibilities\",\n example:\n 'Be prepared to answer any question on user engagement and come up with proactive insights...',\n }),\n useCase: z.literal('slack-data-scientist').openapi({\n description: 'The specific use case template to generate',\n example: 'slack-data-scientist',\n }),\n // Optional configuration parameters\n verbosity: z.enum(['1', '2', '3', '4', '5']).optional().openapi({\n description: 'Response verbosity level (1=concise, 5=comprehensive)',\n example: '3',\n }),\n technicality: z.enum(['1', '2', '3', '4', '5']).optional().openapi({\n description: 'Technical complexity level (1=plain English, 5=expert)',\n example: '2',\n }),\n includeQuery: z.boolean().optional().openapi({\n description: 'Include the SQL query in the response',\n example: true,\n }),\n includeExplanation: z.boolean().optional().openapi({\n description: 'Include query explanation in the response',\n example: true,\n }),\n maxQueries: z.number().optional().openapi({\n description: 'Maximum number of queries to run',\n example: 10,\n }),\n })\n .openapi('GenerateBubbleFlowTemplateRequest');\n\n// POST /bubbleflow-template/document-generation - Generate document processing template\nexport const generateDocumentGenerationTemplateSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'Name for the document processing workflow',\n example: 'Expense Report Generator',\n }),\n description: z\n .string()\n .max(500)\n .default('Document processing workflow')\n .openapi({\n description:\n 'Description of what the document processing workflow should do (optional)',\n example:\n 'Process receipts and invoices to generate structured expense reports',\n }),\n outputDescription: z.string().min(1).max(1000).openapi({\n description:\n 'Detailed description of the desired output format and data extraction',\n example:\n 'Extract expense tracking data with vendor name, transaction date, amount, category, and description',\n }),\n // Optional configuration parameters\n outputFormat: z.enum(['html', 'csv', 'json']).optional().openapi({\n description: 'Default output format for generated documents',\n example: 'html',\n }),\n conversionOptions: z\n .object({\n preserveStructure: z.boolean().optional().openapi({\n description: 'Preserve document structure during parsing',\n example: true,\n }),\n includeVisualDescriptions: z.boolean().optional().openapi({\n description: 'Include descriptions of visual elements',\n example: true,\n }),\n extractNumericalData: z.boolean().optional().openapi({\n description: 'Extract and process numerical data',\n example: true,\n }),\n combinePages: z.boolean().optional().openapi({\n description: 'Combine multiple pages into single output',\n example: true,\n }),\n })\n .optional(),\n imageOptions: z\n .object({\n format: z.enum(['png', 'jpg', 'jpeg']).optional().openapi({\n description: 'Image format for document conversion',\n example: 'png',\n }),\n quality: z.number().min(0.1).max(1.0).optional().openapi({\n description: 'Image quality (0.1 to 1.0)',\n example: 0.9,\n }),\n dpi: z.number().min(72).max(300).optional().openapi({\n description: 'Image DPI for conversion',\n example: 200,\n }),\n })\n .optional(),\n aiOptions: z\n .object({\n model: z.string().optional().openapi({\n description: 'AI model to use for processing',\n example: 'google/gemini-2.5-flash',\n }),\n temperature: z.number().min(0).max(2).optional().openapi({\n description: 'AI model temperature (0 to 2)',\n example: 0.2,\n }),\n maxTokens: z.number().min(1000).max(200000).optional().openapi({\n description: 'Maximum tokens for AI processing',\n example: 90000,\n }),\n jsonMode: z.boolean().optional().openapi({\n description: 'Enable JSON mode for structured output',\n example: false,\n }),\n })\n .optional(),\n metadata: z\n .record(z.string(), z.unknown())\n .optional()\n .openapi({\n description:\n 'Additional metadata for the workflow (e.g., outputDescription)',\n example: { outputDescription: 'Extract expense data from receipts' },\n }),\n })\n .openapi('GenerateDocumentGenerationTemplateRequest');\n\n// Response for template generation (extends the regular create response)\nexport const bubbleFlowTemplateResponseSchema = z\n .object({\n id: z.number().openapi({\n description: 'ID of the created BubbleFlow template',\n example: 123,\n }),\n name: z.string().openapi({\n description: 'Name of the BubbleFlow',\n example: 'Sam Dix Data Scientist Bot',\n }),\n description: z.string().openapi({\n description: 'Description of the BubbleFlow',\n example: 'A Slack bot that helps analyze user engagement data',\n }),\n eventType: z.string().openapi({\n description: 'Event type this BubbleFlow responds to',\n example: 'slack/bot_mentioned',\n }),\n displayedBubbleParameters: z.record(\n z.string(),\n z.object({\n variableName: z.string(),\n bubbleName: z.string(),\n className: z.string(),\n parameters: z.array(\n z.object({\n name: z.string(),\n value: z.unknown(),\n type: z.nativeEnum(BubbleParameterType),\n })\n ),\n hasAwait: z.boolean(),\n hasActionCall: z.boolean(),\n })\n ),\n bubbleParameters: z\n .record(\n z.string(),\n z.object({\n variableName: z.string(),\n bubbleName: z.string(),\n className: z.string(),\n parameters: z.array(\n z.object({\n name: z.string(),\n value: z.unknown(),\n type: z.nativeEnum(BubbleParameterType),\n })\n ),\n hasAwait: z.boolean(),\n hasActionCall: z.boolean(),\n })\n )\n .openapi({\n description: 'Parsed bubble parameters from the BubbleFlow code',\n }),\n requiredCredentials: z\n .record(z.string(), z.array(z.nativeEnum(CredentialType)))\n .optional()\n .openapi({\n description:\n 'Mapping of bubble names to their required credential types',\n example: {\n 'database-connection': [CredentialType.DATABASE_CRED],\n 'slack-notification': [CredentialType.SLACK_CRED],\n 'ai-analysis': [CredentialType.GOOGLE_GEMINI_CRED],\n },\n }),\n createdAt: z.string().openapi({\n description: 'ISO timestamp when the template was created',\n example: '2025-01-15T10:30:00.000Z',\n }),\n updatedAt: z.string().openapi({\n description: 'ISO timestamp when the template was last updated',\n example: '2025-01-15T10:30:00.000Z',\n }),\n\n webhook: z\n .object({\n id: z.number().openapi({ description: 'Webhook ID', example: 456 }),\n url: z.string().openapi({\n description: 'Full webhook URL',\n example: 'http://localhost:3001/webhook/user123/my-webhook',\n }),\n path: z.string().openapi({\n description: 'Webhook path',\n example: 'my-webhook',\n }),\n active: z.boolean().openapi({\n description: 'Whether webhook is active',\n example: true,\n }),\n })\n .optional()\n .openapi({\n description: 'Webhook information (if webhook was created)',\n }),\n })\n .openapi('BubbleFlowTemplateResponse');\nexport type GenerateBubbleFlowCodeResponse = z.infer<\n typeof generateBubbleFlowCodeResponseSchema\n>;\nexport type GenerateBubbleFlowTemplateRequest = z.infer<\n typeof generateBubbleFlowTemplateSchema\n>;\nexport type GenerateDocumentGenerationTemplateRequest = z.infer<\n typeof generateDocumentGenerationTemplateSchema\n>;\nexport type BubbleFlowTemplateResponse = z.infer<\n typeof bubbleFlowTemplateResponseSchema\n>;\nexport type GenerationResult = z.infer<typeof GenerationResultSchema>;\n","import { z } from 'zod';\nimport { CredentialType } from './types.js';\n\n// ============================================================================\n// Coffee Agent - Planning Phase for BubbleFlow Generation\n// ============================================================================\n// Coffee runs BEFORE Boba to gather clarification and generate an\n// implementation plan. This helps reduce ambiguity in user requests.\n\n// Constants\nexport const COFFEE_MAX_ITERATIONS = 30;\nexport const COFFEE_MAX_QUESTIONS = 5;\nexport const COFFEE_DEFAULT_MODEL = 'google/gemini-3-pro-preview' as const;\n\n// ============================================================================\n// Clarification Schemas\n// ============================================================================\n\n/** A single choice option for a clarification question */\nexport const ClarificationChoiceSchema = z.object({\n id: z.string().describe('Unique identifier for this choice'),\n label: z.string().describe('Short display label for the choice'),\n description: z\n .string()\n .optional()\n .describe('Optional longer description explaining the choice'),\n});\n\n/** A clarification question with multiple choices */\nexport const ClarificationQuestionSchema = z.object({\n id: z.string().describe('Unique identifier for this question'),\n question: z.string().describe('The question text to display to the user'),\n choices: z\n .array(ClarificationChoiceSchema)\n .min(2)\n .describe('Available choices for the user (minimum 2 options)'),\n context: z\n .string()\n .optional()\n .describe('Optional context explaining why this question is being asked'),\n allowMultiple: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'If true, user can select multiple choices. Default is false (single selection)'\n ),\n});\n\n/** Event sent to frontend containing clarification questions */\nexport const CoffeeClarificationEventSchema = z.object({\n questions: z\n .array(ClarificationQuestionSchema)\n .min(1)\n .max(COFFEE_MAX_QUESTIONS)\n .describe(`List of clarification questions (1-${COFFEE_MAX_QUESTIONS})`),\n});\n\n// ============================================================================\n// Context Gathering Schemas\n// ============================================================================\n\n/**\n * Event sent when Coffee requests external context via running a BubbleFlow.\n * This pauses the planning process until the user provides credentials and approves execution.\n */\nexport const CoffeeRequestExternalContextEventSchema = z.object({\n flowId: z.string().describe('Unique ID for this context request'),\n flowCode: z\n .string()\n .describe('Validated BubbleFlow TypeScript code to execute'),\n requiredCredentials: z\n .array(z.nativeEnum(CredentialType))\n .describe('List of credential types needed to run this flow'),\n description: z\n .string()\n .describe('User-friendly description of what this flow will do'),\n});\n\n/**\n * Answer sent back to Coffee after user provides credentials and flow executes.\n * This is used to resume the planning process with enriched context.\n */\nexport const CoffeeContextAnswerSchema = z.object({\n flowId: z.string().describe('ID of the context request being answered'),\n status: z\n .enum(['success', 'rejected', 'error'])\n .describe(\n 'Status: success (got context), rejected (user skipped), error (execution failed)'\n ),\n result: z\n .unknown()\n .optional()\n .describe('The result data from running the context-gathering flow'),\n error: z.string().optional().describe('Error message if status is error'),\n originalRequest: CoffeeRequestExternalContextEventSchema.optional().describe(\n 'The original context request that triggered this answer'\n ),\n});\n\n/**\n * Context request info that the agent generates when it wants to run a flow.\n */\nexport const CoffeeContextRequestInfoSchema = z.object({\n purpose: z.string().describe('Why this context is needed'),\n flowDescription: z\n .string()\n .describe('User-facing description of what the flow will do'),\n});\n\n/** Legacy context gathering status (used in streaming events) */\nexport const CoffeeContextEventSchema = z.object({\n status: z.enum(['gathering', 'complete']),\n miniFlowDescription: z.string().optional(),\n result: z.string().optional(),\n});\n\n// ============================================================================\n// Plan Schemas\n// ============================================================================\n\n/** A single step in the implementation plan */\nexport const PlanStepSchema = z.object({\n title: z.string().describe('Short title for this step'),\n description: z\n .string()\n .describe('Detailed description of what this step does'),\n bubblesUsed: z\n .array(z.string())\n .optional()\n .describe('Names of bubbles used in this step'),\n});\n\n/** The complete implementation plan generated by Coffee */\nexport const CoffeePlanEventSchema = z.object({\n summary: z.string().describe('Brief overview of the workflow'),\n steps: z.array(PlanStepSchema).describe('Step-by-step implementation plan'),\n estimatedBubbles: z\n .array(z.string())\n .describe('All bubbles that will be used in the workflow'),\n});\n\n// ============================================================================\n// Unified Message Types for Coffee Chat\n// ============================================================================\n// These message types allow Coffee interactions to be stored as persistent\n// messages in the chat history, rather than ephemeral state.\n\n/** Base message structure shared by all message types */\nconst BaseMessageSchema = z.object({\n id: z.string().describe('Unique message identifier'),\n timestamp: z.string().describe('ISO timestamp of message creation'),\n});\n\n/** Regular user text message */\nexport const UserMessageSchema = BaseMessageSchema.extend({\n type: z.literal('user'),\n content: z.string().describe('User message text'),\n});\n\n/** Regular assistant text message */\nexport const AssistantMessageSchema = BaseMessageSchema.extend({\n type: z.literal('assistant'),\n content: z.string().describe('Assistant response text'),\n code: z.string().optional().describe('Generated code if applicable'),\n resultType: z\n .enum(['code', 'question', 'answer', 'reject'])\n .optional()\n .describe('Type of assistant response'),\n bubbleParameters: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Bubble parameters for code responses'),\n});\n\n/** Coffee asking clarification questions */\nexport const ClarificationRequestMessageSchema = BaseMessageSchema.extend({\n type: z.literal('clarification_request'),\n questions: z\n .array(ClarificationQuestionSchema)\n .describe('Questions being asked'),\n});\n\n/** User's answers to clarification questions */\nexport const ClarificationResponseMessageSchema = BaseMessageSchema.extend({\n type: z.literal('clarification_response'),\n answers: z\n .record(z.string(), z.array(z.string()))\n .describe('questionId -> choiceIds'),\n originalQuestions: z\n .array(ClarificationQuestionSchema)\n .optional()\n .describe('The questions that were answered (for display purposes)'),\n});\n\n/** Coffee requesting external context */\nexport const ContextRequestMessageSchema = BaseMessageSchema.extend({\n type: z.literal('context_request'),\n request: CoffeeRequestExternalContextEventSchema.describe(\n 'Context gathering request details'\n ),\n});\n\n/** User's response to context request */\nexport const ContextResponseMessageSchema = BaseMessageSchema.extend({\n type: z.literal('context_response'),\n answer: CoffeeContextAnswerSchema.describe(\n 'User response to context request'\n ),\n credentialTypes: z\n .array(z.string())\n .optional()\n .describe('Credential types used (for display, not actual secrets)'),\n});\n\n/** Coffee's generated plan */\nexport const PlanMessageSchema = BaseMessageSchema.extend({\n type: z.literal('plan'),\n plan: CoffeePlanEventSchema.describe('Generated implementation plan'),\n});\n\n/** User's plan approval with optional comment */\nexport const PlanApprovalMessageSchema = BaseMessageSchema.extend({\n type: z.literal('plan_approval'),\n approved: z.boolean().describe('Whether the plan was approved'),\n comment: z.string().optional().describe('Optional user comment on the plan'),\n});\n\n/** System message (for retries, errors, etc.) */\nexport const SystemMessageSchema = BaseMessageSchema.extend({\n type: z.literal('system'),\n content: z.string().describe('System message content'),\n});\n\n/** Tool result message - persists successful tool call results */\nexport const ToolResultMessageSchema = BaseMessageSchema.extend({\n type: z.literal('tool_result'),\n toolName: z.string().describe('Name of the tool that was called'),\n toolCallId: z.string().describe('Unique ID for this tool call'),\n input: z.unknown().describe('Input parameters passed to the tool'),\n output: z.unknown().describe('Output/result from the tool'),\n duration: z.number().describe('Duration of the tool call in milliseconds'),\n success: z.boolean().describe('Whether the tool call succeeded'),\n});\n\n/** Union of all Coffee message types */\nexport const CoffeeMessageSchema = z.discriminatedUnion('type', [\n UserMessageSchema,\n AssistantMessageSchema,\n ClarificationRequestMessageSchema,\n ClarificationResponseMessageSchema,\n ContextRequestMessageSchema,\n ContextResponseMessageSchema,\n PlanMessageSchema,\n PlanApprovalMessageSchema,\n SystemMessageSchema,\n ToolResultMessageSchema,\n]);\n\n// ============================================================================\n// Request/Response Schemas\n// ============================================================================\n\n/** Request to the Generate BubbleFlow */\nexport const CoffeeRequestSchema = z.object({\n prompt: z.string().min(1).describe('The user prompt describing the workflow'),\n flowId: z\n .number()\n .optional()\n .describe('Optional flow ID if updating existing flow'),\n messages: z\n .array(CoffeeMessageSchema)\n .optional()\n .describe(\n 'Full conversation history including clarification Q&A, context results, plan approvals'\n ),\n});\n\n/** Response from the Coffee agent */\nexport const CoffeeResponseSchema = z.object({\n type: z\n .enum(['clarification', 'plan', 'context_request', 'error'])\n .describe('Response type'),\n clarification: CoffeeClarificationEventSchema.optional(),\n plan: CoffeePlanEventSchema.optional(),\n contextRequest: CoffeeRequestExternalContextEventSchema.optional(),\n error: z.string().optional(),\n success: z.boolean().describe('Whether the operation completed successfully'),\n});\n\n/** Internal output format from the Coffee AI agent */\nexport const CoffeeAgentOutputSchema = z.object({\n action: z\n .enum(['askClarification', 'generatePlan', 'requestContext'])\n .describe('The action the agent wants to take'),\n questions: z.array(ClarificationQuestionSchema).optional(),\n plan: CoffeePlanEventSchema.optional(),\n contextRequest: CoffeeContextRequestInfoSchema.optional(),\n});\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type ClarificationChoice = z.infer<typeof ClarificationChoiceSchema>;\nexport type ClarificationQuestion = z.infer<typeof ClarificationQuestionSchema>;\nexport type CoffeeClarificationEvent = z.infer<\n typeof CoffeeClarificationEventSchema\n>;\nexport type CoffeeRequestExternalContextEvent = z.infer<\n typeof CoffeeRequestExternalContextEventSchema\n>;\nexport type CoffeeContextAnswer = z.infer<typeof CoffeeContextAnswerSchema>;\nexport type CoffeeContextEvent = z.infer<typeof CoffeeContextEventSchema>;\nexport type CoffeeContextRequestInfo = z.infer<\n typeof CoffeeContextRequestInfoSchema\n>;\nexport type PlanStep = z.infer<typeof PlanStepSchema>;\nexport type CoffeePlanEvent = z.infer<typeof CoffeePlanEventSchema>;\nexport type CoffeeRequest = z.infer<typeof CoffeeRequestSchema>;\nexport type CoffeeResponse = z.infer<typeof CoffeeResponseSchema>;\nexport type CoffeeAgentOutput = z.infer<typeof CoffeeAgentOutputSchema>;\n\n// Unified message types\nexport type UserMessage = z.infer<typeof UserMessageSchema>;\nexport type AssistantMessage = z.infer<typeof AssistantMessageSchema>;\nexport type ClarificationRequestMessage = z.infer<\n typeof ClarificationRequestMessageSchema\n>;\nexport type ClarificationResponseMessage = z.infer<\n typeof ClarificationResponseMessageSchema\n>;\nexport type ContextRequestMessage = z.infer<typeof ContextRequestMessageSchema>;\nexport type ContextResponseMessage = z.infer<\n typeof ContextResponseMessageSchema\n>;\nexport type PlanMessage = z.infer<typeof PlanMessageSchema>;\nexport type PlanApprovalMessage = z.infer<typeof PlanApprovalMessageSchema>;\nexport type SystemMessage = z.infer<typeof SystemMessageSchema>;\nexport type ToolResultMessage = z.infer<typeof ToolResultMessageSchema>;\nexport type CoffeeMessage = z.infer<typeof CoffeeMessageSchema>;\n","import { z } from '@hono/zod-openapi';\n// Webhook execution response (used internally)\nexport const webhookExecutionResponseSchema = z\n .object({\n executionId: z.number().openapi({ description: 'Execution ID' }),\n success: z.boolean().openapi({ description: 'Execution success' }),\n data: z.unknown().optional().openapi({ description: 'Result data' }),\n error: z.string().optional().openapi({ description: 'Error message' }),\n webhook: z\n .object({\n userId: z.string().openapi({ description: 'User ID' }),\n path: z.string().openapi({ description: 'Webhook path' }),\n triggeredAt: z.string().openapi({ description: 'Trigger timestamp' }),\n method: z.string().openapi({ description: 'HTTP method' }),\n })\n .openapi({ description: 'Webhook info' }),\n })\n .openapi('WebhookExecutionResponse');\n\n// POST /webhook/{userId}/{path} - Webhook response\nexport const webhookResponseSchema = z\n .object({\n // Slack verification fields\n challenge: z\n .string()\n .optional()\n .openapi({ description: 'Slack URL verification challenge' }),\n // Execution fields\n executionId: z.number().optional().openapi({ description: 'Execution ID' }),\n success: z\n .boolean()\n .optional()\n .openapi({ description: 'Execution success' }),\n data: z\n .record(z.string(), z.unknown())\n .or(z.undefined())\n .optional()\n .openapi({ description: 'Result data' }),\n error: z.string().optional().openapi({ description: 'Error message' }),\n webhook: z\n .object({\n userId: z.string().openapi({ description: 'User ID' }),\n path: z.string().openapi({ description: 'Webhook path' }),\n triggeredAt: z.string().openapi({ description: 'Trigger timestamp' }),\n method: z.string().openapi({ description: 'HTTP method' }),\n })\n .optional()\n .openapi({ description: 'Webhook info' }),\n })\n .openapi('WebhookResponse');\nexport type WebhookResponse = z.infer<typeof webhookResponseSchema>;\nexport type WebhookExecutionResponse = z.infer<\n typeof webhookExecutionResponseSchema\n>;\n","import { z } from '@hono/zod-openapi';\nimport { ServiceUsageSchema } from './bubbleflow-execution-schema';\nimport { orgRoleSchema, orgTypeSchema } from './organization-schema';\n\n// ============================================================================\n// Reusable Usage Schema\n// ============================================================================\n\n/**\n * Token usage breakdown by model\n */\nexport const tokenUsageSchema = z\n .object({\n modelName: z.string().optional().openapi({\n description: 'Model name',\n example: 'gpt-4',\n }),\n inputTokens: z.number().openapi({\n description: 'Input tokens used this month',\n example: 1500,\n }),\n outputTokens: z.number().openapi({\n description: 'Output tokens used this month',\n example: 750,\n }),\n totalTokens: z.number().openapi({\n description: 'Total tokens used this month',\n example: 2250,\n }),\n })\n .openapi('TokenUsage');\n\nexport type TokenUsage = z.infer<typeof tokenUsageSchema>;\n\n/**\n * Reusable usage schema for both personal and organization usage\n */\nexport const usageSchema = z\n .object({\n executionCount: z.number().openapi({\n description: 'Current monthly execution count',\n example: 100,\n }),\n tokenUsage: z.array(tokenUsageSchema).openapi({\n description: 'Token usage breakdown by model for current month',\n }),\n serviceUsage: z.array(ServiceUsageSchema).openapi({\n description: 'Service usage and cost breakdown for current month',\n }),\n estimatedMonthlyCost: z.number().optional().openapi({\n description: 'Projected monthly cost based on current usage trend',\n example: 14.19,\n }),\n })\n .openapi('Usage');\n\nexport type Usage = z.infer<typeof usageSchema>;\n\n/**\n * Organization billing context - shows which org the billing belongs to\n */\nexport const billingOrganizationSchema = z\n .object({\n id: z.number().openapi({\n description: 'Organization ID',\n example: 123,\n }),\n name: z.string().openapi({\n description: 'Organization name',\n example: 'My Team',\n }),\n slug: z.string().openapi({\n description: 'Organization slug',\n example: 'my-team',\n }),\n type: orgTypeSchema.optional().openapi({\n description: 'Organization type (personal or organization)',\n }),\n role: orgRoleSchema.openapi({\n description: \"Current user's role in this organization\",\n }),\n memberCount: z.number().openapi({\n description: 'Number of members in the organization',\n example: 5,\n }),\n })\n .openapi('BillingOrganization');\n\nexport type BillingOrganization = z.infer<typeof billingOrganizationSchema>;\n\n// ============================================================================\n// Offer Schemas\n// ============================================================================\n\n// Hackathon offer schema for promotional code redemptions\nexport const hackathonOfferSchema = z\n .object({\n isActive: z.boolean().openapi({\n description: 'Whether a hackathon offer is currently active',\n example: true,\n }),\n expiresAt: z.string().openapi({\n description: 'ISO date when the hackathon offer expires',\n example: '2025-01-15T14:30:00.000Z',\n }),\n redeemedAt: z.string().openapi({\n description: 'ISO date when the code was redeemed',\n example: '2025-01-14T14:30:00.000Z',\n }),\n })\n .openapi('HackathonOffer');\n\nexport type HackathonOffer = z.infer<typeof hackathonOfferSchema>;\n\n// Special offer schema for private metadata overrides (exclusive members)\nexport const specialOfferSchema = z\n .object({\n isActive: z.boolean().openapi({\n description: 'Whether a special offer is currently active',\n example: true,\n }),\n plan: z.string().openapi({\n description: 'The plan granted by the special offer',\n example: 'unlimited',\n }),\n expiresAt: z.string().nullable().openapi({\n description:\n 'ISO date when the special offer expires (null = never expires)',\n example: '2025-06-15T14:30:00.000Z',\n }),\n })\n .openapi('SpecialOffer');\n\nexport type SpecialOffer = z.infer<typeof specialOfferSchema>;\n\n// Coupon redemption request schema\nexport const redeemCouponRequestSchema = z\n .object({\n code: z.string().min(1).openapi({\n description: 'The coupon code to redeem',\n example: 'HACKATHON2025',\n }),\n })\n .openapi('RedeemCouponRequest');\n\nexport type RedeemCouponRequest = z.infer<typeof redeemCouponRequestSchema>;\n\n// Coupon redemption response schema\nexport const redeemCouponResponseSchema = z\n .object({\n success: z.boolean().openapi({\n description: 'Whether the redemption was successful',\n example: true,\n }),\n message: z.string().openapi({\n description: 'Human-readable message about the redemption result',\n example: 'Coupon redeemed successfully! You now have Pro access.',\n }),\n expiresAt: z.string().optional().openapi({\n description: 'When the offer expires (if successful)',\n example: '2025-01-15T14:30:00.000Z',\n }),\n })\n .openapi('RedeemCouponResponse');\n\nexport type RedeemCouponResponse = z.infer<typeof redeemCouponResponseSchema>;\n\nexport const subscriptionStatusResponseSchema = z\n .object({\n userId: z.string().openapi({\n description: 'User ID from Clerk',\n example: 'user_30Gbwrzto1VZvAHcGUm5NLQhpkp',\n }),\n plan: z.string().openapi({\n description: 'Current subscription plan',\n example: 'pro_plus',\n }),\n planDisplayName: z.string().openapi({\n description: 'Human-readable plan name',\n example: 'Pro Plus',\n }),\n features: z.array(z.string()).openapi({\n description: 'List of features available to the user',\n example: ['unlimited_usage', 'priority_support'],\n }),\n // Organization context - which org the billing belongs to\n organization: billingOrganizationSchema.optional().openapi({\n description:\n 'Organization that owns the billing (null for personal accounts without org)',\n }),\n // Organization-level usage (what billing is based on)\n usage: z.object({\n executionCount: z.number().openapi({\n description: 'Organization monthly execution count',\n example: 100,\n }),\n executionLimit: z.number().openapi({\n description: 'Organization monthly execution limit',\n example: 42,\n }),\n creditLimit: z.number().openapi({\n description: 'Organization monthly credit limit',\n example: 100,\n }),\n activeFlowLimit: z.number().openapi({\n description: 'Organization monthly active flow limit',\n example: 2,\n }),\n estimatedMonthlyCost: z.number().openapi({\n description: 'Projected monthly cost based on current usage trend',\n example: 14.19,\n }),\n resetDate: z.string().openapi({\n description: 'ISO date when usage resets',\n example: '2025-02-01T00:00:00.000Z',\n }),\n tokenUsage: z.array(tokenUsageSchema).openapi({\n description: 'Token usage breakdown by model for current month',\n }),\n serviceUsage: z.array(ServiceUsageSchema).openapi({\n description: 'Service usage and cost breakdown for current month',\n }),\n }),\n // User's personal contribution to the organization usage\n personalUsage: usageSchema.optional().openapi({\n description:\n \"User's personal contribution to the organization's usage for current billing period\",\n }),\n isActive: z.boolean().openapi({\n description: 'Whether the subscription is active',\n example: true,\n }),\n hackathonOffer: hackathonOfferSchema.optional().openapi({\n description: 'Active hackathon promotional offer information',\n }),\n specialOffer: specialOfferSchema.optional().openapi({\n description:\n 'Special offer from private metadata (takes precedence over hackathon offer)',\n }),\n })\n .openapi('SubscriptionStatusResponse');\n\nexport type SubscriptionStatusResponse = z.infer<\n typeof subscriptionStatusResponseSchema\n>;\n\n// ============================================================================\n// Organization Usage Breakdown (Admin/Owner Only)\n// ============================================================================\n\n/**\n * User usage item in org usage breakdown (admin/owner only endpoint)\n */\nexport const userUsageItemSchema = z\n .object({\n userId: z.string().openapi({\n description: 'User ID from Clerk',\n example: 'user_30Gbwrzto1VZvAHcGUm5NLQhpkp',\n }),\n firstName: z.string().optional().openapi({\n description: \"User's first name\",\n example: 'John',\n }),\n lastName: z.string().optional().openapi({\n description: \"User's last name\",\n example: 'Doe',\n }),\n userEmail: z.string().optional().openapi({\n description: 'User email address',\n example: 'john@acme.com',\n }),\n role: orgRoleSchema.openapi({\n description: \"User's role in the organization\",\n }),\n executionCount: z.number().openapi({\n description: 'Number of executions by this user',\n example: 42,\n }),\n totalCost: z.number().openapi({\n description: 'Total cost incurred by this user',\n example: 5.67,\n }),\n })\n .openapi('UserUsageItem');\n\nexport type UserUsageItem = z.infer<typeof userUsageItemSchema>;\n\n/**\n * Organization usage breakdown response (admin/owner only)\n * Response from GET /subscription/org-usage\n */\nexport const orgUsageBreakdownResponseSchema = z\n .object({\n organizationId: z.number().openapi({\n description: 'Organization ID',\n example: 123,\n }),\n organizationName: z.string().optional().openapi({\n description: 'Organization name',\n example: 'Acme Inc',\n }),\n monthYear: z.string().openapi({\n description: 'Billing month in YYYY-MM format',\n example: '2025-01',\n }),\n totalOrgCost: z.number().openapi({\n description: 'Total organization cost for this billing period',\n example: 45.67,\n }),\n totalOrgExecutions: z.number().openapi({\n description: 'Total executions across all users',\n example: 500,\n }),\n users: z.array(userUsageItemSchema).openapi({\n description: 'Usage breakdown by user',\n }),\n })\n .openapi('OrgUsageBreakdownResponse');\n\nexport type OrgUsageBreakdownResponse = z.infer<\n typeof orgUsageBreakdownResponseSchema\n>;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Helper to check if user is admin or owner in their org\n */\nexport function isAdminOrOwner(\n subscription: SubscriptionStatusResponse\n): boolean {\n const role = subscription.organization?.role;\n return role === 'owner' || role === 'admin';\n}\n\n/**\n * Helper to check if user is a regular member\n */\nexport function isMember(subscription: SubscriptionStatusResponse): boolean {\n const role = subscription.organization?.role;\n return role === 'member';\n}\n","/**\n * Zod schemas for organization management\n * These are shared between frontend and backend\n */\n\nimport { z } from '@hono/zod-openapi';\n\n// ============================================================================\n// Enums and Base Types\n// ============================================================================\n\nexport const orgRoleSchema = z\n .enum(['owner', 'admin', 'member'])\n .openapi('OrgRole');\n\nexport type OrgRole = z.infer<typeof orgRoleSchema>;\n\nexport const orgTypeSchema = z\n .enum(['personal', 'organization'])\n .openapi('OrgType');\n\nexport type OrgType = z.infer<typeof orgTypeSchema>;\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nexport const organizationSchema = z\n .object({\n id: z.number().openapi({\n description: 'Organization ID',\n example: 123,\n }),\n name: z.string().openapi({\n description: 'Organization name',\n example: 'My Team',\n }),\n slug: z.string().openapi({\n description: 'Organization slug for URLs',\n example: 'my-team',\n }),\n type: orgTypeSchema,\n domain: z.string().nullable().optional().openapi({\n description:\n 'Email domain for auto-joining (e.g., \"acme.com\"). Users with matching email domains are automatically added as members.',\n example: 'acme.com',\n }),\n role: orgRoleSchema.openapi({\n description: \"Current user's role in this organization\",\n }),\n memberCount: z.number().openapi({\n description: 'Number of members in the organization',\n example: 5,\n }),\n createdAt: z.string().openapi({\n description: 'ISO timestamp when organization was created',\n example: '2024-01-01T00:00:00Z',\n }),\n })\n .openapi('Organization');\n\nexport type Organization = z.infer<typeof organizationSchema>;\n\nexport const organizationDetailSchema = organizationSchema\n .extend({\n workflowCount: z.number().openapi({\n description: 'Number of workflows in the organization',\n example: 10,\n }),\n updatedAt: z.string().openapi({\n description: 'ISO timestamp when organization was last updated',\n example: '2024-01-02T00:00:00Z',\n }),\n })\n .openapi('OrganizationDetail');\n\nexport type OrganizationDetail = z.infer<typeof organizationDetailSchema>;\n\nexport const organizationMemberSchema = z\n .object({\n userId: z.string().openapi({\n description: 'User ID',\n example: 'user_123',\n }),\n email: z.string().openapi({\n description: 'User email',\n example: 'user@example.com',\n }),\n name: z.string().nullable().openapi({\n description: 'User display name',\n example: 'John Doe',\n }),\n avatarUrl: z.string().optional().openapi({\n description: 'User avatar URL',\n example: 'https://example.com/avatar.png',\n }),\n role: orgRoleSchema,\n joinedAt: z.string().openapi({\n description: 'ISO timestamp when user joined the organization',\n example: '2024-01-01T00:00:00Z',\n }),\n })\n .openapi('OrganizationMember');\n\nexport type OrganizationMember = z.infer<typeof organizationMemberSchema>;\n\n// ============================================================================\n// Request Schemas\n// ============================================================================\n\nexport const createOrganizationSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({\n description: 'Organization name',\n example: 'My Team',\n }),\n slug: z\n .string()\n .min(3)\n .max(50)\n .regex(/^[a-z0-9-]+$/, 'Slug must be lowercase alphanumeric with hyphens')\n .openapi({\n description: 'Organization slug for URLs',\n example: 'my-team',\n }),\n domain: z\n .string()\n .regex(\n /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/i,\n 'Must be a valid domain (e.g., acme.com)'\n )\n .optional()\n .openapi({\n description:\n 'Email domain for auto-joining. Users with matching email domains are automatically added as members.',\n example: 'acme.com',\n }),\n })\n .openapi('CreateOrganizationRequest');\n\nexport type CreateOrganizationRequest = z.infer<\n typeof createOrganizationSchema\n>;\n\nexport const updateOrganizationSchema = z\n .object({\n name: z.string().min(1).max(100).optional().openapi({\n description: 'Organization name',\n example: 'My Team',\n }),\n slug: z\n .string()\n .min(3)\n .max(50)\n .regex(/^[a-z0-9-]+$/, 'Slug must be lowercase alphanumeric with hyphens')\n .optional()\n .openapi({\n description: 'Organization slug for URLs',\n example: 'my-team',\n }),\n domain: z\n .string()\n .regex(\n /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/i,\n 'Must be a valid domain (e.g., acme.com)'\n )\n .nullable()\n .optional()\n .openapi({\n description:\n 'Email domain for auto-joining. Set to null to disable auto-join.',\n example: 'acme.com',\n }),\n })\n .openapi('UpdateOrganizationRequest');\n\nexport type UpdateOrganizationRequest = z.infer<\n typeof updateOrganizationSchema\n>;\n\nexport const addMemberSchema = z\n .object({\n email: z.string().email().openapi({\n description: 'Email of the user to add',\n example: 'user@example.com',\n }),\n role: z.enum(['admin', 'member']).openapi({\n description: 'Role to assign to the new member',\n example: 'member',\n }),\n })\n .openapi('AddMemberRequest');\n\nexport type AddMemberRequest = z.infer<typeof addMemberSchema>;\n\nexport const updateMemberRoleSchema = z\n .object({\n role: z.enum(['admin', 'member']).openapi({\n description: 'New role for the member',\n example: 'admin',\n }),\n })\n .openapi('UpdateMemberRoleRequest');\n\nexport type UpdateMemberRoleRequest = z.infer<typeof updateMemberRoleSchema>;\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nexport const listOrganizationsResponseSchema = z\n .object({\n organizations: z.array(organizationSchema),\n })\n .openapi('ListOrganizationsResponse');\n\nexport type ListOrganizationsResponse = z.infer<\n typeof listOrganizationsResponseSchema\n>;\n\nexport const updateOrganizationResponseSchema = z\n .object({\n id: z.number(),\n name: z.string(),\n slug: z.string(),\n updatedAt: z.string(),\n })\n .openapi('UpdateOrganizationResponse');\n\nexport type UpdateOrganizationResponse = z.infer<\n typeof updateOrganizationResponseSchema\n>;\n\nexport const listMembersResponseSchema = z\n .object({\n members: z.array(organizationMemberSchema),\n })\n .openapi('ListMembersResponse');\n\nexport type ListMembersResponse = z.infer<typeof listMembersResponseSchema>;\n\nexport const addMemberResponseSchema = z\n .object({\n userId: z.string(),\n role: orgRoleSchema,\n joinedAt: z.string(),\n })\n .openapi('AddMemberResponse');\n\nexport type AddMemberResponse = z.infer<typeof addMemberResponseSchema>;\n\nexport const updateMemberRoleResponseSchema = z\n .object({\n userId: z.string(),\n role: orgRoleSchema,\n })\n .openapi('UpdateMemberRoleResponse');\n\nexport type UpdateMemberRoleResponse = z.infer<\n typeof updateMemberRoleResponseSchema\n>;\n\nexport const successResponseSchema = z\n .object({\n success: z.boolean(),\n })\n .openapi('SuccessResponse');\n\nexport type SuccessResponse = z.infer<typeof successResponseSchema>;\n","import { z } from 'zod';\nimport { AvailableModels } from './ai-models.js';\nimport { ConversationMessageSchema } from './agent-memory.js';\n/**\n * Conversation message schema for milk tea multi-turn conversations\n */\n\n/**\n * Request schema for Milk Tea agent\n * Milk Tea helps users configure bubble parameters through conversation\n */\nexport const MilkTeaRequestSchema = z.object({\n userRequest: z\n .string()\n .min(1, 'User request is required')\n .describe('The user request or question about configuring the bubble'),\n\n bubbleName: z\n .string()\n .min(1, 'Bubble name is required')\n .describe('The name of the bubble to configure (e.g., \"email-tool\")'),\n\n bubbleSchema: z\n .record(z.unknown())\n .describe(\n 'The full schema/interface definition of the bubble including parameters and types'\n ),\n\n currentCode: z\n .string()\n .optional()\n .describe('The current workflow code context for validation'),\n\n availableCredentials: z\n .array(z.string())\n .default([])\n .describe('List of credential types available to the user'),\n\n userName: z.string().describe('Name of the user making the request'),\n\n insertLocation: z\n .string()\n .optional()\n .describe('Location in code where the snippet should be inserted'),\n\n conversationHistory: z\n .array(ConversationMessageSchema)\n .optional()\n .default([])\n .describe(\n 'Previous conversation messages for multi-turn interactions (frontend manages state)'\n ),\n\n model: AvailableModels.default('google/gemini-2.5-pro').describe(\n 'AI model to use for Milk Tea agent'\n ),\n});\n\n/**\n * Response schema for Milk Tea agent\n */\nexport const MilkTeaResponseSchema = z.object({\n type: z\n .enum(['code', 'question', 'reject'])\n .describe(\n 'Type of response: code (generated snippet), question (needs clarification), reject (infeasible request)'\n ),\n\n message: z\n .string()\n .describe(\n 'Human-readable message: explanation for code, question text, or rejection reason'\n ),\n\n snippet: z\n .string()\n .optional()\n .describe(\n 'Generated TypeScript code snippet (only present when type is \"code\")'\n ),\n\n success: z.boolean().describe('Whether the operation completed successfully'),\n\n error: z\n .string()\n .optional()\n .describe('Error message if the operation failed'),\n});\n\n/**\n * Internal agent response format (JSON mode output from AI)\n */\nexport const MilkTeaAgentOutputSchema = z.object({\n type: z.enum(['code', 'question', 'reject']),\n message: z.string(),\n snippet: z.string().optional(),\n});\n\n// Export inferred TypeScript types\nexport type MilkTeaRequest = z.infer<typeof MilkTeaRequestSchema>;\nexport type MilkTeaResponse = z.infer<typeof MilkTeaResponseSchema>;\nexport type MilkTeaAgentOutput = z.infer<typeof MilkTeaAgentOutputSchema>;\n","import { z } from 'zod';\n\n// Define available models with provider/name combinations\nexport const AvailableModels = z.enum([\n // OpenAI models\n 'openai/gpt-5',\n 'openai/gpt-5-mini',\n 'openai/gpt-5.1',\n 'openai/gpt-5.2',\n // Google Gemini models\n 'google/gemini-2.5-pro',\n 'google/gemini-2.5-flash',\n 'google/gemini-2.5-flash-lite',\n 'google/gemini-2.5-flash-image-preview',\n 'google/gemini-3-pro-preview',\n 'google/gemini-3-pro-image-preview',\n 'google/gemini-3-flash-preview',\n // Anthropic models\n 'anthropic/claude-sonnet-4-5',\n 'anthropic/claude-opus-4-5',\n 'anthropic/claude-haiku-4-5',\n // OpenRouter models\n 'openrouter/x-ai/grok-code-fast-1',\n 'openrouter/z-ai/glm-4.6',\n 'openrouter/z-ai/glm-4.7',\n 'openrouter/anthropic/claude-sonnet-4.5',\n 'openrouter/anthropic/claude-opus-4.5',\n 'openrouter/google/gemini-3-pro-preview',\n 'openrouter/morph/morph-v3-large',\n 'openrouter/openai/gpt-oss-120b',\n 'openrouter/openai/o3-deep-research',\n 'openrouter/openai/o4-mini-deep-research',\n]);\n\nexport type AvailableModel = z.infer<typeof AvailableModels>;\n","import type { BubbleName } from './types.js';\nimport { z } from 'zod';\nexport const TOOL_CALL_TO_DISCARD: BubbleName[] = ['get-bubble-details-tool'];\n\nexport const ConversationMessageSchema = z.object({\n role: z\n .enum(['user', 'assistant', 'tool'])\n .describe('The role of the message sender'),\n content: z.string().describe('The message content'),\n toolCallId: z.string().optional().describe('Tool call ID for tool messages'),\n name: z.string().optional().describe('Tool name for tool messages'),\n});\nexport type ConversationMessage = z.infer<typeof ConversationMessageSchema>;\n","import { z } from 'zod';\nimport { AvailableModels, type AvailableModel } from './ai-models.js';\nimport { ParsedBubbleWithInfoSchema } from './bubble-definition-schema.js';\nimport { CredentialType } from './types.js';\nimport { ConversationMessageSchema } from './agent-memory.js';\n// Default model for Pearl AI agent\nexport const PEARL_DEFAULT_MODEL: AvailableModel =\n 'openrouter/anthropic/claude-sonnet-4.5';\n/**\n * Request schema for Pearl agent\n * Pearl helps users build complete workflows without requiring specific bubbles\n */\nexport const PearlRequestSchema = z.object({\n userRequest: z\n .string()\n .min(1, 'User request is required')\n .describe('The user request or question about building a workflow'),\n\n currentCode: z\n .string()\n .optional()\n .describe('The current workflow code for context and modification'),\n\n userName: z.string().describe('Name of the user making the request'),\n availableVariables: z\n .array(z.any())\n .describe('List of available variables in the current code'),\n conversationHistory: z\n .array(ConversationMessageSchema)\n .optional()\n .default([])\n .describe(\n 'Previous conversation messages for multi-turn interactions (frontend manages state)'\n ),\n\n model: AvailableModels.default(PEARL_DEFAULT_MODEL).describe(\n 'AI model to use for Pearl agent'\n ),\n\n additionalContext: z\n .string()\n .optional()\n .describe(\n 'Additional context information like timezone, user preferences, etc.'\n ),\n\n uploadedFiles: z\n .array(\n z.object({\n name: z.string().describe('File name'),\n content: z\n .string()\n .describe(\n 'File content: base64 for images, plain text for text files'\n ),\n fileType: z\n .enum(['image', 'text'])\n .describe('Type of file: image (base64) or text (plain text)'),\n })\n )\n .optional()\n .default([])\n .describe(\n 'Files uploaded by the user: images as base64, text files as plain text'\n ),\n});\n\n/**\n * Response schema for Pearl agent\n */\nexport const PearlResponseSchema = z.object({\n type: z\n .enum(['code', 'question', 'answer', 'reject'])\n .describe(\n 'Type of response: code (generated workflow), question (needs clarification), answer (provides information/guidance), reject (infeasible request)'\n ),\n\n message: z\n .string()\n .describe(\n 'Human-readable message: explanation for code, question text, or rejection reason'\n ),\n\n snippet: z\n .string()\n .optional()\n .describe(\n 'Generated TypeScript code for complete workflow (only present when type is \"code\")'\n ),\n\n bubbleParameters: z\n .record(z.number(), ParsedBubbleWithInfoSchema)\n .optional()\n .describe(\n 'Parsed bubble parameters from the generated workflow (only present when type is \"code\")'\n ),\n\n inputSchema: z\n .record(z.unknown())\n .optional()\n .describe(\n 'Input schema for the generated workflow (only present when type is \"code\")'\n ),\n\n requiredCredentials: z\n .record(z.string(), z.array(z.nativeEnum(CredentialType)))\n .optional()\n .describe(\n 'Required credentials for the bubbles in the workflow (only present when type is \"code\")'\n ),\n\n success: z.boolean().describe('Whether the operation completed successfully'),\n\n error: z\n .string()\n .optional()\n .describe('Error message if the operation failed'),\n});\n\n/**\n * Internal agent response format (JSON mode output from AI)\n */\nexport const PearlAgentOutputSchema = z.object({\n type: z.enum(['code', 'question', 'answer', 'reject', 'text']),\n message: z.string(),\n snippet: z.string().optional(),\n});\n\n// Export inferred TypeScript types\nexport type PearlRequest = z.infer<typeof PearlRequestSchema>;\nexport type PearlResponse = z.infer<typeof PearlResponseSchema>;\nexport type PearlAgentOutput = z.infer<typeof PearlAgentOutputSchema>;\n// Note: ConversationMessage type is exported from milk-tea.ts to avoid duplication\n","import { z } from 'zod';\nimport { AvailableModels, type AvailableModel } from './ai-models.js';\nimport { RECOMMENDED_MODELS } from './bubbleflow-generation-prompts.js';\n\n// Default model for Rice evaluation agent\nexport const RICE_DEFAULT_MODEL: AvailableModel = RECOMMENDED_MODELS.FAST;\n\n/**\n * Issue type categories for Rice evaluation\n * - setup: Configuration/credential issues (user can fix in settings, not workflow code)\n * - workflow: Logic/code issues in the workflow itself (fixable with Pearl)\n * - input: Issues with input data (user needs to provide different input)\n * - null: No issues (working=true)\n */\nexport const RiceIssueTypeSchema = z\n .enum(['setup', 'workflow', 'input'])\n .nullable();\n\nexport type RiceIssueType = z.infer<typeof RiceIssueTypeSchema>;\n\n/**\n * Evaluation result schema from Rice agent\n * This represents the AI's assessment of workflow execution quality\n */\nexport const RiceEvaluationResultSchema = z.object({\n working: z\n .boolean()\n .describe(\n 'Whether the workflow is functioning correctly (true if no errors and expected behavior)'\n ),\n\n issueType: RiceIssueTypeSchema.describe(\n 'Category of issue: \"setup\" (config/credentials), \"workflow\" (code logic), \"input\" (bad input data), or null if working'\n ),\n\n summary: z\n .string()\n .describe(\n 'Brief summary of the execution. If working: what happened and any external changes made. If not working: description of the issue.'\n ),\n\n rating: z\n .number()\n .int()\n .min(1)\n .max(10)\n .describe(\n 'Quality rating 1-10: 1-3=severe issues, 4-6=partial functionality, 7-8=working with minor issues, 9-10=excellent'\n ),\n});\n\n/**\n * Request schema for Rice evaluation agent\n * Rice evaluates workflow execution quality based on logs and code\n */\nexport const RiceRequestSchema = z.object({\n executionLogs: z\n .array(z.unknown())\n .describe('StreamingLogEvent[] from execution'),\n\n workflowCode: z\n .string()\n .describe('The original workflow code that was executed'),\n\n executionId: z.number().describe('ID of the execution being evaluated'),\n\n bubbleFlowId: z.number().describe('ID of the BubbleFlow being evaluated'),\n\n model: AvailableModels.optional()\n .default(RICE_DEFAULT_MODEL)\n .describe('AI model to use for Rice evaluation'),\n});\n\n/**\n * Response schema for Rice evaluation agent\n */\nexport const RiceResponseSchema = z.object({\n success: z\n .boolean()\n .describe('Whether the evaluation completed successfully'),\n\n evaluation: RiceEvaluationResultSchema.optional().describe(\n 'Evaluation result (only present if success=true)'\n ),\n\n error: z\n .string()\n .optional()\n .describe('Error message if the evaluation failed'),\n});\n\n// Export inferred TypeScript types\nexport type RiceEvaluationResult = z.infer<typeof RiceEvaluationResultSchema>;\n\n// Use z.input for RiceRequest to make optional fields with defaults truly optional for callers\n// z.infer would include the model field (since default is applied during parsing)\n// z.input represents what callers need to provide (before transforms/defaults are applied)\nexport type RiceRequest = z.input<typeof RiceRequestSchema>;\n\nexport type RiceResponse = z.infer<typeof RiceResponseSchema>;\n","/**\n * Recommended AI models for BubbleFlow code generation\n * This file is kept in shared-schemas for backwards compatibility\n * The full prompts have been moved to apps/bubblelab-api/src/config/bubbleflow-generation-prompts.ts\n */\n\nimport { AvailableModel } from './ai-models.js';\n\n// Model constants for AI agent instructions\nexport const RECOMMENDED_MODELS = {\n BEST: 'google/gemini-3-pro-preview',\n BEST_ALT: 'openai/gpt-5.2',\n PRO: 'google/gemini-3-flash-preview',\n PRO_ALT: 'anthropic/claude-sonnet-4-5',\n FAST: 'google/gemini-3-flash-preview',\n FAST_ALT: 'anthropic/claude-haiku-4-5',\n LITE: 'google/gemini-2.5-flash-lite',\n IMAGE: 'google/gemini-3-pro-image-preview',\n} as Record<string, AvailableModel>;\n","/**\n * Utility functions for parsing and working with cron expressions\n * Supports standard 5-field cron format: minute hour day month day-of-week\n */\n\nexport interface CronExpression {\n minute: string;\n hour: string;\n dayOfMonth: string;\n month: string;\n dayOfWeek: string;\n original: string;\n}\n\nexport interface CronScheduleInfo {\n expression: CronExpression;\n description: string;\n nextRun?: Date;\n isValid: boolean;\n error?: string;\n}\n\n/**\n * Parse a cron expression string into its components\n * @param cronString - Cron expression (e.g., \"0 0 * * *\")\n * @returns Parsed cron expression object\n */\nexport function parseCronExpression(cronString: string): CronExpression {\n const parts = cronString.trim().split(/\\s+/);\n\n if (parts.length !== 5) {\n throw new Error(\n `Invalid cron expression: expected 5 fields, got ${parts.length}`\n );\n }\n\n const [minute, hour, dayOfMonth, month, dayOfWeek] = parts;\n\n return {\n minute,\n hour,\n dayOfMonth,\n month,\n dayOfWeek,\n original: cronString,\n };\n}\n\n/**\n * Validate a cron expression\n * @param cronString - Cron expression to validate\n * @returns Object with validation result\n */\nexport function validateCronExpression(cronString: string): {\n valid: boolean;\n error?: string;\n} {\n try {\n const expr = parseCronExpression(cronString);\n\n // Validate each field\n const validations = [\n validateCronField(expr.minute, 0, 59, 'minute'),\n validateCronField(expr.hour, 0, 23, 'hour'),\n validateCronField(expr.dayOfMonth, 1, 31, 'day of month'),\n validateCronField(expr.month, 1, 12, 'month'),\n validateCronField(expr.dayOfWeek, 0, 6, 'day of week'),\n ];\n\n for (const validation of validations) {\n if (!validation.valid) {\n return validation;\n }\n }\n\n return { valid: true };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Invalid cron expression',\n };\n }\n}\n\n/**\n * Validate a single cron field\n */\nfunction validateCronField(\n field: string,\n min: number,\n max: number,\n fieldName: string\n): { valid: boolean; error?: string } {\n // Wildcard\n if (field === '*') return { valid: true };\n\n // Step values (*/n)\n if (field.startsWith('*/')) {\n const step = parseInt(field.substring(2), 10);\n if (isNaN(step) || step <= 0) {\n return {\n valid: false,\n error: `Invalid step value in ${fieldName}: ${field}`,\n };\n }\n return { valid: true };\n }\n\n // Ranges (n-m)\n if (field.includes('-')) {\n const [start, end] = field.split('-').map((v) => parseInt(v, 10));\n if (isNaN(start) || isNaN(end) || start < min || end > max || start > end) {\n return {\n valid: false,\n error: `Invalid range in ${fieldName}: ${field} (must be ${min}-${max})`,\n };\n }\n return { valid: true };\n }\n\n // Lists (n,m,o)\n if (field.includes(',')) {\n const values = field.split(',').map((v) => parseInt(v.trim(), 10));\n for (const val of values) {\n if (isNaN(val) || val < min || val > max) {\n return {\n valid: false,\n error: `Invalid value in ${fieldName} list: ${val} (must be ${min}-${max})`,\n };\n }\n }\n return { valid: true };\n }\n\n // Single value\n const value = parseInt(field, 10);\n if (isNaN(value) || value < min || value > max) {\n return {\n valid: false,\n error: `Invalid ${fieldName}: ${field} (must be ${min}-${max})`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Generate a human-readable description of a cron expression\n * @param cronString - Cron expression to describe\n * @returns Human-readable description\n */\nexport function describeCronExpression(cronString: string): string {\n try {\n const expr = parseCronExpression(cronString);\n\n // Common patterns\n if (cronString === '* * * * *') return 'Every minute';\n if (cronString === '0 * * * *') return 'Every hour';\n if (cronString === '0 0 * * *') return 'Daily at midnight';\n if (cronString === '0 0 * * 0') return 'Weekly on Sunday at midnight';\n if (cronString === '0 0 1 * *') return 'Monthly on the 1st at midnight';\n if (cronString === '0 0 1 1 *') return 'Yearly on January 1st at midnight';\n\n // Step patterns\n if (expr.minute.startsWith('*/')) {\n const step = expr.minute.substring(2);\n return `Every ${step} minute${step === '1' ? '' : 's'}`;\n }\n if (expr.hour.startsWith('*/') && expr.minute === '0') {\n const step = expr.hour.substring(2);\n return `Every ${step} hour${step === '1' ? '' : 's'}`;\n }\n\n // Weekday patterns\n if (expr.dayOfWeek === '1-5' && expr.hour === '9' && expr.minute === '0') {\n return 'Every weekday at 9:00 AM';\n }\n\n // Build description from parts\n let description = 'At ';\n\n // Time\n if (expr.minute !== '*' && expr.hour !== '*') {\n const hour = parseInt(expr.hour, 10);\n const minute = parseInt(expr.minute, 10);\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const hour12 = hour % 12 || 12;\n description += `${hour12}:${minute.toString().padStart(2, '0')} ${ampm}`;\n } else if (expr.minute !== '*') {\n description += `minute ${expr.minute}`;\n } else if (expr.hour !== '*') {\n description += `hour ${expr.hour}`;\n }\n\n // Day\n if (expr.dayOfMonth !== '*') {\n description += ` on day ${expr.dayOfMonth}`;\n }\n if (expr.dayOfWeek !== '*') {\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n if (expr.dayOfWeek.includes('-')) {\n const [start, end] = expr.dayOfWeek\n .split('-')\n .map((v) => parseInt(v, 10));\n description += ` on ${days[start]} through ${days[end]}`;\n } else {\n const day = parseInt(expr.dayOfWeek, 10);\n description += ` on ${days[day]}`;\n }\n }\n\n // Month\n if (expr.month !== '*') {\n const months = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ];\n const month = parseInt(expr.month, 10);\n description += ` in ${months[month - 1]}`;\n }\n\n return description;\n } catch (error) {\n return 'Invalid cron expression';\n }\n}\n\n/**\n * Get schedule information for a cron expression\n * @param cronString - Cron expression\n * @returns Schedule information including description and validation status\n */\nexport function getCronScheduleInfo(cronString: string): CronScheduleInfo {\n const validation = validateCronExpression(cronString);\n\n if (!validation.valid) {\n return {\n expression: parseCronExpression(\n cronString.split(/\\s+/).length === 5 ? cronString : '0 0 * * *'\n ),\n description: 'Invalid cron expression',\n isValid: false,\n error: validation.error,\n };\n }\n\n return {\n expression: parseCronExpression(cronString),\n description: describeCronExpression(cronString),\n isValid: true,\n };\n}\n","export interface BubbleTriggerEventRegistry {\n 'slack/bot_mentioned': SlackMentionEvent;\n 'slack/message_received': SlackMessageReceivedEvent;\n 'airtable/record_created': AirtableRecordCreatedEvent;\n 'airtable/record_updated': AirtableRecordUpdatedEvent;\n 'airtable/record_deleted': AirtableRecordDeletedEvent;\n 'schedule/cron': CronEvent;\n 'webhook/http': WebhookEvent;\n}\n\n// Runtime object that mirrors the interface keys\n// This allows us to validate event types at runtime\nexport const BUBBLE_TRIGGER_EVENTS = {\n 'slack/bot_mentioned': true,\n 'slack/message_received': true,\n 'airtable/record_created': true,\n 'airtable/record_updated': true,\n 'airtable/record_deleted': true,\n 'schedule/cron': true,\n 'webhook/http': true,\n} as const satisfies Record<keyof BubbleTriggerEventRegistry, true>;\n\n// Helper function to check if an event type is valid\nexport function isValidBubbleTriggerEvent(\n eventType: string\n): eventType is keyof BubbleTriggerEventRegistry {\n return eventType in BUBBLE_TRIGGER_EVENTS;\n}\n\nexport interface BubbleTriggerEvent {\n type: keyof BubbleTriggerEventRegistry;\n timestamp: string;\n executionId: string;\n path: string;\n [key: string]: unknown;\n}\n\n/**\n * Cron event payload structure\n *\n * The 'cron' field contains the cron expression in standard 5-part cron format:\n *\n * ┌───────────── minute (0 - 59)\n * │ ┌───────────── hour (0 - 23)\n * │ │ ┌───────────── day of month (1 - 31)\n * │ │ │ ┌───────────── month (1 - 12)\n * │ │ │ │ ┌───────────── day of week (0 - 6) (Sunday to Saturday)\n * │ │ │ │ │\n * * * * * *\n *\n * @example\n * ```typescript\n * // Daily at midnight\n * { cron: '0 0 * * *' }\n *\n * // Every weekday at 9am\n * { cron: '0 9 * * 1-5' }\n *\n * // Every 15 minutes\n * { cron: '*\\/15 * * * *' }\n *\n * // First day of every month at midnight\n * { cron: '0 0 1 * *' }\n * ```\n */\nexport interface CronEvent extends BubbleTriggerEvent {\n /** The cron expression defining when this event triggers */\n cron: string;\n body?: Record<string, unknown>;\n}\n\nexport interface WebhookEvent extends BubbleTriggerEvent {\n body?: Record<string, unknown>;\n}\n\nexport interface BubbleTrigger {\n type: keyof BubbleTriggerEventRegistry;\n cronSchedule?: string;\n name?: string;\n description?: string;\n timeout?: number;\n retries?: number;\n}\n\n/**\n * Slack file object - included in message events when files/images are shared\n * @see https://api.slack.com/types/file\n */\nexport interface SlackFile {\n /** Unique file identifier */\n id: string;\n /** Filename with extension */\n name: string;\n /** Display title of the file */\n title?: string;\n /** MIME type (e.g., 'image/png', 'application/pdf') */\n mimetype: string;\n /** File extension without dot (e.g., 'png', 'pdf') */\n filetype: string;\n /** File size in bytes */\n size: number;\n /** User ID who uploaded the file */\n user?: string;\n\n // File access URLs (require authentication with bot token)\n /** Private URL to view the file (requires bot token auth) */\n url_private?: string;\n /** Private URL to download the file (requires bot token auth) */\n url_private_download?: string;\n\n // Image dimensions\n /** Original image width in pixels */\n original_w?: number;\n /** Original image height in pixels */\n original_h?: number;\n\n /** Permanent link to the file */\n permalink?: string;\n}\n\n// Slack Event Wrapper (outer payload)\nexport interface SlackEventWrapper {\n token: string;\n team_id: string;\n api_app_id: string;\n event: SlackAppMentionEvent | SlackMessageEvent;\n type: 'event_callback';\n authorizations: Array<{\n enterprise_id?: string;\n team_id: string;\n user_id: string;\n is_bot: boolean;\n }>;\n event_context: string;\n event_id: string;\n event_time: number;\n}\n\n// App Mention Event (inner event data)\nexport interface SlackAppMentionEvent {\n type: 'app_mention';\n user: string;\n text: string;\n ts: string;\n channel: string;\n event_ts: string;\n thread_ts?: string;\n /** Files/images attached to the mention message */\n files?: SlackFile[];\n /** Whether this message was an upload */\n upload?: boolean;\n}\n\n// Slack Message Event (inner event data)\nexport interface SlackMessageEvent {\n type: 'message';\n user: string;\n text: string;\n ts: string;\n channel: string;\n event_ts: string;\n channel_type: 'channel' | 'group' | 'im' | 'mpim';\n /** Thread timestamp - present when this message is a reply in a thread */\n thread_ts?: string;\n /** Message subtype (e.g., 'file_share', 'bot_message', 'channel_join') */\n subtype?: string;\n // Bot message indicators - present when message is from a bot\n bot_id?: string;\n bot_profile?: {\n id: string;\n name: string;\n app_id: string;\n };\n /** Files/images attached to this message (present when subtype is 'file_share' or user uploads files) */\n files?: SlackFile[];\n /** Whether this message was an upload */\n upload?: boolean;\n}\n\n// BubbleTrigger-specific event types that wrap Slack events\nexport interface SlackMentionEvent extends BubbleTriggerEvent {\n slack_event: SlackEventWrapper;\n channel: string;\n user: string;\n text: string;\n /** Message timestamp - use this when replying to the message */\n ts?: string;\n /** Thread timestamp - present when this message is a reply in a thread */\n thread_ts?: string;\n /** Files/images attached to the mention message */\n files?: SlackFile[];\n}\n\nexport interface SlackMessageReceivedEvent extends BubbleTriggerEvent {\n slack_event: SlackEventWrapper;\n channel: string;\n user: string;\n text: string;\n /** Message timestamp - use this when replying to the message */\n ts?: string;\n /** Thread timestamp - present when this message is a reply in a thread */\n thread_ts?: string;\n channel_type: 'channel' | 'group' | 'im' | 'mpim';\n subtype?: string;\n /** Files/images attached to this message */\n files?: SlackFile[];\n}\n\n// ============================================================================\n// Airtable Event Types\n// ============================================================================\n\n/**\n * Base Airtable event structure\n */\nexport interface AirtableEventBase extends BubbleTriggerEvent {\n airtable_event: {\n baseId: string;\n webhookId: string;\n timestamp: string;\n baseTransactionNumber: number;\n actionMetadata?: {\n source: string;\n sourceMetadata?: Record<string, unknown>;\n };\n };\n base_id: string;\n table_id: string;\n}\n\n/**\n * Airtable record created event\n */\nexport interface AirtableRecordCreatedEvent extends AirtableEventBase {\n airtable_event: AirtableEventBase['airtable_event'] & {\n type: 'record_created';\n records: Record<string, { cellValuesByFieldId: Record<string, unknown> }>;\n };\n}\n\n/**\n * Airtable record updated event\n */\nexport interface AirtableRecordUpdatedEvent extends AirtableEventBase {\n airtable_event: AirtableEventBase['airtable_event'] & {\n type: 'record_updated';\n records: Record<\n string,\n {\n current: { cellValuesByFieldId: Record<string, unknown> };\n previous?: { cellValuesByFieldId: Record<string, unknown> };\n }\n >;\n };\n}\n\n/**\n * Airtable record deleted event\n */\nexport interface AirtableRecordDeletedEvent extends AirtableEventBase {\n airtable_event: AirtableEventBase['airtable_event'] & {\n type: 'record_deleted';\n recordIds: string[];\n };\n}\n\n// ============================================================================\n// Centralized Trigger Configuration\n// Single source of truth for all trigger metadata\n// ============================================================================\n\n/**\n * JSON Schema type for payload validation\n */\nexport interface JsonSchema {\n type: string;\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n additionalProperties?: boolean;\n}\n\nexport interface JsonSchemaProperty {\n type?: string;\n description?: string;\n [key: string]: unknown;\n}\n\n/**\n * Configuration for a trigger event type\n * Single source of truth for all trigger metadata\n */\nexport interface TriggerEventConfig {\n /** The bubble/service name (e.g., 'Slack') - used for logo lookup */\n serviceName: string;\n /** Human-friendly name (e.g., 'When Slack bot is mentioned') */\n friendlyName: string;\n /** Description of what this trigger does */\n description: string;\n /** Setup guide markdown for configuring this trigger */\n setupGuide: string;\n /** JSON Schema for the payload */\n payloadSchema: JsonSchema;\n}\n\n/**\n * Registry of all trigger event configurations\n * Keys must match BubbleTriggerEventRegistry\n */\nexport const TRIGGER_EVENT_CONFIGS: Record<\n keyof BubbleTriggerEventRegistry,\n TriggerEventConfig\n> = {\n 'slack/message_received': {\n serviceName: 'Slack',\n friendlyName: 'When Slack message is received',\n description:\n 'Triggered when a message is posted in a channel your bot has access to',\n setupGuide: `## Slack Message Event Setup Guide\n\n### 1. Create a Slack App\n1. Go to [Slack API Apps](https://api.slack.com/apps)\n2. Click \"Create New App\" → \"From scratch\"\n3. Name your app and select your workspace\n\n### 2. Configure OAuth Scopes\nNavigate to **OAuth & Permissions** and add these Bot Token Scopes:\n- \\`channels:history\\` - To read messages in public channels\n- \\`groups:history\\` - To read messages in private channels\n- \\`im:history\\` - To read direct messages\n- \\`mpim:history\\` - To read group direct messages\n- \\`chat:write\\` - To send messages\n\n### 3. Enable Event Subscriptions\n1. Go to **Event Subscriptions**\n2. Toggle \"Enable Events\" to ON\n3. Toggle the webhook active button above and copy the webhook URL\n4. Add your webhook URL to the Request URL field\n5. Subscribe to bot events: \\`message.channels\\`, \\`message.groups\\`, \\`message.im\\`, \\`message.mpim\\`\n\n### 4. Install to Workspace\n1. Go to **Install App**\n2. Click \"Install to Workspace\"\n3. Authorize the requested permissions\n\n### 5. Get Your Bot Token\nCopy the **Bot User OAuth Token** (starts with \\`xoxb-\\`) from the OAuth & Permissions page.`,\n payloadSchema: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'The message text' },\n channel: {\n type: 'string',\n description: 'Channel ID where message was posted',\n },\n user: { type: 'string', description: 'User ID who posted the message' },\n channel_type: {\n type: 'string',\n description: 'Type of channel (channel, group, im, mpim)',\n },\n files: {\n type: 'array',\n description:\n 'Files/images attached to the message. Present when user shares files. Use url_private with bot token to download.',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Unique file identifier' },\n name: { type: 'string', description: 'Filename with extension' },\n title: { type: 'string', description: 'Display title' },\n mimetype: {\n type: 'string',\n description: 'MIME type (e.g., image/png)',\n },\n filetype: {\n type: 'string',\n description: 'File extension (e.g., png)',\n },\n size: { type: 'number', description: 'File size in bytes' },\n url_private: {\n type: 'string',\n description: 'Private URL to access file (requires bot token)',\n },\n url_private_download: {\n type: 'string',\n description:\n 'Private URL to download file (requires bot token)',\n },\n thumb_360: {\n type: 'string',\n description: '360px thumbnail URL for images',\n },\n thumb_480: {\n type: 'string',\n description: '480px thumbnail URL for images',\n },\n original_w: {\n type: 'number',\n description: 'Original image width in pixels',\n },\n original_h: {\n type: 'number',\n description: 'Original image height in pixels',\n },\n permalink: {\n type: 'string',\n description: 'Permanent link to the file',\n },\n },\n },\n },\n slack_event: {\n type: 'object',\n description: 'Full Slack event wrapper',\n properties: {\n token: { type: 'string', description: 'Verification token' },\n team_id: { type: 'string', description: 'Workspace ID' },\n api_app_id: { type: 'string', description: 'Slack App ID' },\n type: {\n type: 'string',\n enum: ['event_callback'],\n description: 'Event type',\n },\n event_id: { type: 'string', description: 'Unique event ID' },\n event_time: { type: 'number', description: 'Event timestamp' },\n event_context: { type: 'string', description: 'Event context' },\n authorizations: {\n type: 'array',\n description: 'Bot authorizations',\n items: {\n type: 'object',\n properties: {\n enterprise_id: { type: 'string' },\n team_id: { type: 'string' },\n user_id: { type: 'string' },\n is_bot: { type: 'boolean' },\n },\n },\n },\n event: {\n type: 'object',\n description: 'Inner message event data',\n properties: {\n type: {\n type: 'string',\n enum: ['message'],\n description: 'Event type',\n },\n user: {\n type: 'string',\n description: 'User ID who sent the message',\n },\n text: { type: 'string', description: 'Message text content' },\n ts: { type: 'string', description: 'Message timestamp' },\n channel: { type: 'string', description: 'Channel ID' },\n event_ts: { type: 'string', description: 'Event timestamp' },\n channel_type: {\n type: 'string',\n enum: ['channel', 'group', 'im', 'mpim'],\n description: 'Type of channel',\n },\n subtype: {\n type: 'string',\n description:\n 'Message subtype (e.g., file_share when files attached)',\n },\n files: {\n type: 'array',\n description: 'Files attached to the message',\n },\n },\n required: [\n 'type',\n 'user',\n 'text',\n 'ts',\n 'channel',\n 'event_ts',\n 'channel_type',\n ],\n },\n },\n required: [\n 'token',\n 'team_id',\n 'api_app_id',\n 'type',\n 'event_id',\n 'event_time',\n 'event',\n ],\n },\n },\n required: ['text', 'channel', 'user', 'slack_event'],\n },\n },\n 'slack/bot_mentioned': {\n serviceName: 'Slack',\n friendlyName: 'When Slack bot is mentioned',\n description: 'Triggered when someone mentions your bot in a Slack channel',\n setupGuide: `## Slack Bot Setup Guide\n\n### 1. Create a Slack App\n1. Go to [Slack API Apps](https://api.slack.com/apps)\n2. Click \"Create New App\" → \"From scratch\"\n3. Name your app and select your workspace\n\n### 2. Configure OAuth Scopes\nNavigate to **OAuth & Permissions** and add these Bot Token Scopes:\n- \\`app_mentions:read\\` - To receive mention events\n- \\`chat:write\\` - To send messages\n- \\`channels:history\\` - To read channel messages (optional)\n\n### 3. Enable Event Subscriptions\n1. Go to **Event Subscriptions**\n2. Toggle \"Enable Events\" to ON\n3. Toggle the webhook active button above and copy the webhook URL\n4. Add your webhook URL to the Request URL field\n5. Subscribe to bot events: \\`app_mention\\`\n\n### 4. Install to Workspace\n1. Go to **Install App**\n2. Click \"Install to Workspace\"\n3. Authorize the requested permissions\n\n### 5. Get Your Bot Token\nCopy the **Bot User OAuth Token** (starts with \\`xoxb-\\`) from the OAuth & Permissions page.`,\n payloadSchema: {\n type: 'object',\n properties: {\n text: {\n type: 'string',\n description: 'The message text mentioning the bot',\n },\n channel: {\n type: 'string',\n description: 'Channel ID where bot was mentioned',\n },\n user: { type: 'string', description: 'User ID who mentioned the bot' },\n thread_ts: {\n type: 'string',\n description: 'Thread timestamp (if replying in a thread)',\n },\n files: {\n type: 'array',\n description:\n 'Files/images attached to the mention message. Use url_private with bot token to download.',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Unique file identifier' },\n name: { type: 'string', description: 'Filename with extension' },\n title: { type: 'string', description: 'Display title' },\n mimetype: {\n type: 'string',\n description: 'MIME type (e.g., image/png)',\n },\n filetype: {\n type: 'string',\n description: 'File extension (e.g., png)',\n },\n size: { type: 'number', description: 'File size in bytes' },\n url_private: {\n type: 'string',\n description: 'Private URL to access file (requires bot token)',\n },\n url_private_download: {\n type: 'string',\n description:\n 'Private URL to download file (requires bot token)',\n },\n thumb_360: {\n type: 'string',\n description: '360px thumbnail URL for images',\n },\n thumb_480: {\n type: 'string',\n description: '480px thumbnail URL for images',\n },\n original_w: {\n type: 'number',\n description: 'Original image width in pixels',\n },\n original_h: {\n type: 'number',\n description: 'Original image height in pixels',\n },\n permalink: {\n type: 'string',\n description: 'Permanent link to the file',\n },\n },\n },\n },\n slack_event: {\n type: 'object',\n description: 'Full Slack event wrapper',\n properties: {\n token: { type: 'string', description: 'Verification token' },\n team_id: { type: 'string', description: 'Workspace ID' },\n api_app_id: { type: 'string', description: 'Slack App ID' },\n type: {\n type: 'string',\n enum: ['event_callback'],\n description: 'Event type',\n },\n event_id: { type: 'string', description: 'Unique event ID' },\n event_time: { type: 'number', description: 'Event timestamp' },\n event_context: { type: 'string', description: 'Event context' },\n authorizations: {\n type: 'array',\n description: 'Bot authorizations',\n items: {\n type: 'object',\n properties: {\n enterprise_id: { type: 'string' },\n team_id: { type: 'string' },\n user_id: { type: 'string' },\n is_bot: { type: 'boolean' },\n },\n },\n },\n event: {\n type: 'object',\n description: 'Inner app_mention event data',\n properties: {\n type: {\n type: 'string',\n enum: ['app_mention'],\n description: 'Event type',\n },\n user: {\n type: 'string',\n description: 'User ID who mentioned the bot',\n },\n text: {\n type: 'string',\n description: 'Message text containing the mention',\n },\n ts: { type: 'string', description: 'Message timestamp' },\n channel: { type: 'string', description: 'Channel ID' },\n event_ts: { type: 'string', description: 'Event timestamp' },\n thread_ts: {\n type: 'string',\n description: 'Thread timestamp (if in a thread)',\n },\n files: {\n type: 'array',\n description: 'Files attached to the mention message',\n },\n },\n required: ['type', 'user', 'text', 'ts', 'channel', 'event_ts'],\n },\n },\n required: [\n 'token',\n 'team_id',\n 'api_app_id',\n 'type',\n 'event_id',\n 'event_time',\n 'event',\n ],\n },\n },\n required: ['text', 'channel', 'user', 'slack_event'],\n },\n },\n 'airtable/record_created': {\n serviceName: 'Airtable',\n friendlyName: 'When Airtable record is created',\n description: 'Triggered when a new record is created in an Airtable base',\n setupGuide: `## Airtable Record Created Setup Guide\n\n### 1. Connect Your Airtable Account\n1. Go to Credentials and add an Airtable OAuth connection\n2. Authorize access to your Airtable workspace\n\n### 2. Create a Webhook\nWebhooks must be created via the Airtable API. The system will handle this automatically when you configure the trigger.\n\n### 3. Configure the Trigger\n1. Select your Airtable credential\n2. Choose the base and table to monitor\n3. The webhook will be created automatically\n\n### Payload Structure\nThe payload includes:\n- \\`base_id\\`: The Airtable base ID\n- \\`table_id\\`: The table where records were created\n- \\`airtable_event.records\\`: Map of record IDs to their field values`,\n payloadSchema: {\n type: 'object',\n properties: {\n base_id: { type: 'string', description: 'Airtable base ID' },\n table_id: {\n type: 'string',\n description: 'Table ID where record was created',\n },\n airtable_event: {\n type: 'object',\n description: 'Full Airtable event data',\n },\n },\n required: ['base_id', 'table_id', 'airtable_event'],\n },\n },\n 'airtable/record_updated': {\n serviceName: 'Airtable',\n friendlyName: 'When Airtable record is updated',\n description: 'Triggered when a record is updated in an Airtable base',\n setupGuide: `## Airtable Record Updated Setup Guide\n\n### 1. Connect Your Airtable Account\n1. Go to Credentials and add an Airtable OAuth connection\n2. Authorize access to your Airtable workspace\n\n### 2. Configure the Trigger\n1. Select your Airtable credential\n2. Choose the base and table to monitor\n3. The webhook will be created automatically\n\n### Payload Structure\nThe payload includes:\n- \\`base_id\\`: The Airtable base ID\n- \\`table_id\\`: The table where records were updated\n- \\`airtable_event.records\\`: Map of record IDs to their current and previous field values`,\n payloadSchema: {\n type: 'object',\n properties: {\n base_id: { type: 'string', description: 'Airtable base ID' },\n table_id: {\n type: 'string',\n description: 'Table ID where record was updated',\n },\n airtable_event: {\n type: 'object',\n description:\n 'Full Airtable event data with current and previous values',\n },\n },\n required: ['base_id', 'table_id', 'airtable_event'],\n },\n },\n 'airtable/record_deleted': {\n serviceName: 'Airtable',\n friendlyName: 'When Airtable record is deleted',\n description: 'Triggered when a record is deleted from an Airtable base',\n setupGuide: `## Airtable Record Deleted Setup Guide\n\n### 1. Connect Your Airtable Account\n1. Go to Credentials and add an Airtable OAuth connection\n2. Authorize access to your Airtable workspace\n\n### 2. Configure the Trigger\n1. Select your Airtable credential\n2. Choose the base and table to monitor\n3. The webhook will be created automatically\n\n### Payload Structure\nThe payload includes:\n- \\`base_id\\`: The Airtable base ID\n- \\`table_id\\`: The table where records were deleted\n- \\`airtable_event.recordIds\\`: Array of deleted record IDs`,\n payloadSchema: {\n type: 'object',\n properties: {\n base_id: { type: 'string', description: 'Airtable base ID' },\n table_id: {\n type: 'string',\n description: 'Table ID where record was deleted',\n },\n airtable_event: {\n type: 'object',\n description: 'Full Airtable event data with deleted record IDs',\n },\n },\n required: ['base_id', 'table_id', 'airtable_event'],\n },\n },\n 'schedule/cron': {\n serviceName: 'Cron',\n friendlyName: 'On Schedule',\n description:\n 'Triggered on a recurring schedule defined by a cron expression',\n setupGuide: `## Cron Schedule Setup Guide\n\nConfigure when this flow should run using the schedule editor or a cron expression.\n\n### Common Schedules\n- **Every minute**: \\`* * * * *\\`\n- **Every hour**: \\`0 * * * *\\`\n- **Daily at midnight**: \\`0 0 * * *\\`\n- **Weekly on Monday**: \\`0 0 * * 1\\`\n- **Monthly on the 1st**: \\`0 0 1 * *\\`\n\n### Cron Format\n\\`\\`\\`\n┌───────────── minute (0-59)\n│ ┌───────────── hour (0-23)\n│ │ ┌───────────── day of month (1-31)\n│ │ │ ┌───────────── month (1-12)\n│ │ │ │ ┌───────────── day of week (0-6, Sunday=0)\n│ │ │ │ │\n* * * * *\n\\`\\`\\`\n\n### Custom Payload Interface\nDefine your own payload interface extending CronEvent for scheduled input data:\n\\`\\`\\`typescript\ninterface DailyReportPayload extends CronEvent {\n reportType: 'summary' | 'detailed';\n recipients: string[];\n}\n\nexport class DailyReportFlow extends BubbleFlow<'schedule/cron'> {\n readonly cronSchedule = '0 9 * * 1-5'; // Weekdays at 9am\n\n async handle(payload: DailyReportPayload) {\n // Access fields directly: payload.reportType, payload.recipients\n }\n}\n\\`\\`\\``,\n payloadSchema: {\n type: 'object',\n properties: {},\n additionalProperties: true,\n },\n },\n 'webhook/http': {\n serviceName: 'Webhook',\n friendlyName: 'HTTP Webhook',\n description: 'Triggered by an HTTP POST request to your webhook URL',\n setupGuide: `## Webhook Setup Guide\n\n### Your Webhook URL\nToggle the webhook active button above and copy the webhook URL to send HTTP POST requests to trigger this flow.\n\n### Request Format\n\\`\\`\\`bash\ncurl -X POST https://your-domain.com/webhook/your-path \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\"email\": \"user@example.com\", \"name\": \"John\"}'\n\\`\\`\\`\n\n### Custom Payload Interface\nDefine your own payload interface extending WebhookEvent:\n\\`\\`\\`typescript\ninterface MyPayload extends WebhookEvent {\n email: string;\n name: string;\n message?: string;\n}\n\nexport class MyFlow extends BubbleFlow<'webhook/http'> {\n async handle(payload: MyPayload) {\n // Access fields directly: payload.email, payload.name\n }\n}\n\\`\\`\\`\n\nThe JSON body fields from the HTTP request are directly available on the payload object.`,\n payloadSchema: {\n type: 'object',\n properties: {},\n additionalProperties: true,\n },\n },\n};\n\n/**\n * Get configuration for a trigger event type\n * @param eventType - The trigger event type key\n * @returns The trigger configuration or undefined if not found\n */\nexport function getTriggerEventConfig(\n eventType: keyof BubbleTriggerEventRegistry\n): TriggerEventConfig {\n return TRIGGER_EVENT_CONFIGS[eventType];\n}\n\n/**\n * Check if an event type is a service trigger (not webhook/cron)\n * Service triggers get special UI treatment with logos and friendly names\n */\nexport function isServiceTrigger(\n eventType: keyof BubbleTriggerEventRegistry\n): boolean {\n return eventType !== 'webhook/http' && eventType !== 'schedule/cron';\n}\n\n/**\n * Mapping from trigger event interface names to their event type keys.\n * Used by BubbleParser to identify when a payload interface extends a known trigger event.\n */\nexport const TRIGGER_EVENT_INTERFACE_MAP: Record<\n string,\n keyof BubbleTriggerEventRegistry\n> = {\n SlackMentionEvent: 'slack/bot_mentioned',\n SlackMessageReceivedEvent: 'slack/message_received',\n AirtableRecordCreatedEvent: 'airtable/record_created',\n AirtableRecordUpdatedEvent: 'airtable/record_updated',\n AirtableRecordDeletedEvent: 'airtable/record_deleted',\n CronEvent: 'schedule/cron',\n WebhookEvent: 'webhook/http',\n BubbleTriggerEvent: 'webhook/http', // Base type defaults to webhook\n};\n\n/**\n * Get the trigger event type key from an interface name.\n * @param interfaceName - The name of the interface (e.g., 'SlackMentionEvent')\n * @returns The trigger event type key or undefined if not a known trigger interface\n */\nexport function getTriggerEventTypeFromInterfaceName(\n interfaceName: string\n): keyof BubbleTriggerEventRegistry | undefined {\n return TRIGGER_EVENT_INTERFACE_MAP[interfaceName];\n}\n","export type StorableValue = {\n truncated: boolean;\n preview: string | unknown;\n sizeBytes: number;\n};\n\n/**\n * Prepare an object for storage with a size cap. If the JSON stringified\n * representation exceeds maxBytes, return a preview marker with metadata.\n * Also logs a warning when truncation happens.\n *\n * Returns a consistent object structure when truncated to ensure compatibility\n * with database schemas expecting JSON objects (jsonb/text with mode: 'json').\n */\nexport function prepareForStorage(\n value: unknown,\n options?: { maxBytes?: number; previewBytes?: number }\n): StorableValue {\n const maxBytes = options?.maxBytes ?? 1024 * 1024; // 1MB\n const previewBytes = options?.previewBytes ?? 4096; // 4KB\n\n try {\n const json = JSON.stringify(value);\n // Compute byte length in a way that works in both browser and Node\n const sizeBytes =\n typeof TextEncoder !== 'undefined'\n ? new TextEncoder().encode(json).length\n : ((globalThis as any).Buffer?.byteLength?.(json, 'utf8') ??\n json.length);\n if (sizeBytes > maxBytes) {\n // eslint-disable-next-line no-console\n console.warn(\n `[prepareForStorage] Size ${sizeBytes} > ${maxBytes}. Storing preview only.`\n );\n // Use Buffer.slice to ensure we slice at byte boundaries, not character boundaries\n // This prevents splitting multi-byte UTF-8 characters\n const previewBuffer =\n json.slice(0, previewBytes) + '....truncated due to size limit';\n return {\n truncated: true,\n preview: previewBuffer,\n sizeBytes,\n };\n }\n return {\n truncated: false,\n preview: value,\n sizeBytes: 0,\n };\n } catch (_err) {\n // eslint-disable-next-line no-console\n console.warn(\n '[prepareForStorage] Failed to serialize value for size check. Storing preview only.'\n );\n return {\n truncated: true,\n preview: '',\n sizeBytes: 0,\n };\n }\n}\n\nexport function cleanUpObjectForDisplayAndStorage(\n obj: unknown,\n maxBytes: number = 1024 * 1024\n): unknown {\n const storageResult = prepareForStorage(obj, { maxBytes });\n if (storageResult.truncated) {\n return storageResult.preview;\n }\n return obj;\n}\n","/**\n * Utility functions for parameter handling\n */\n\n/**\n * Sanitizes parameters by removing credential-related fields\n * @param params - The parameters object to sanitize\n * @returns A new object with credentials removed\n */\nexport function sanitizeParams(\n params: Record<string, unknown>\n): Record<string, unknown> {\n // Remove credentials from params\n return Object.fromEntries(\n Object.entries(params).filter(([key]) => !key.startsWith('credentials'))\n );\n}\n","import { BUBBLE_TRIGGER_EVENTS } from './trigger.js';\n\n/**\n * Enhances TypeScript error messages with helpful hints about available options\n * for BubbleTriggerEventRegistry, BubbleError, and LogMetadata\n */\nexport function enhanceErrorMessage(errorMessage: string): string {\n let enhanced = errorMessage;\n\n // Pattern 1: BubbleTriggerEventRegistry errors\n // Matches: \"Type 'X' does not satisfy the constraint 'keyof BubbleTriggerEventRegistry'\"\n const triggerRegistryPattern =\n /does not satisfy the constraint 'keyof BubbleTriggerEventRegistry'/;\n if (triggerRegistryPattern.test(enhanced)) {\n const availableKeys = Object.keys(BUBBLE_TRIGGER_EVENTS);\n const hint = `\\nAvailable trigger event types: ${availableKeys.map((k) => `'${k}'`).join(', ')}`;\n enhanced = enhanced + hint;\n }\n\n // Pattern 2: Generic \"keyof BubbleTriggerEventRegistry\" constraint errors\n // Matches: \"Type 'X' does not satisfy the constraint 'keyof BubbleTriggerEventRegistry'\"\n const keyofTriggerPattern =\n /Type '([^']+)' does not satisfy the constraint 'keyof BubbleTriggerEventRegistry'/;\n if (\n keyofTriggerPattern.test(enhanced) &&\n !enhanced.includes('Available trigger event types')\n ) {\n const availableKeys = Object.keys(BUBBLE_TRIGGER_EVENTS);\n const hint = `\\nAvailable trigger event types: ${availableKeys.map((k) => `'${k}'`).join(', ')}`;\n enhanced = enhanced + hint;\n }\n\n // Pattern 3: BubbleError type errors\n // Matches whenever \"BubbleError\" appears in the error message\n const bubbleErrorPattern = /BubbleError/;\n if (bubbleErrorPattern.test(enhanced)) {\n const hint =\n `\\nBubbleLogger.error() method signature:\\n` +\n `- this.logger?.error(message: string, error?: BubbleError, metadata?: Partial<LogMetadata>)\\n` +\n `\\nIMPORTANT: The second parameter must be a BubbleError instance, NOT a string!\\n` +\n `\\n❌ INCORRECT: this.logger?.error(\"msg1\", \"msg2\")\\n` +\n `❌ INCORRECT: this.logger?.error(msg1, msg2) // where msg2 is a string\\n` +\n `\\n✅ CORRECT: this.logger?.error(\"Error message\")\\n` +\n `✅ CORRECT: this.logger?.error(\"Error message\", bubbleError)\\n` +\n `✅ CORRECT: this.logger?.error(\"Error message\", bubbleError, { variableId: 1 })\\n` +\n `\\nBubbleError minimal interface:\\n` +\n `- message: string (from Error)\\n` +\n `- variableId?: number\\n` +\n `- bubbleName?: string\\n` +\n `\\nCreating a BubbleError:\\n` +\n `- new BubbleError(\"Error message\", { variableId?: number, bubbleName?: string })\\n` +\n `- new BubbleValidationError(\"Validation failed\", { variableId?: number, bubbleName?: string, validationErrors?: string[] })\\n` +\n `- new BubbleExecutionError(\"Execution failed\", { variableId?: number, bubbleName?: string, executionPhase?: 'instantiation' | 'execution' | 'validation' })\\n` +\n `\\nLogMetadata minimal interface (for metadata parameter):\\n` +\n `- variableId?: number\\n` +\n `- bubbleName?: string\\n` +\n `- lineNumber?: number\\n` +\n `- additionalData?: Record<string, unknown>\\n` +\n `\\nExample usage:\\n` +\n `- this.logger?.error(\"Bubble execution failed\", new BubbleError(\"Details\", { variableId: 1, bubbleName: \"MyBubble\" }))\\n` +\n `- this.logger?.error(\"Error occurred\", undefined, { variableId: 1, additionalData: { custom: \"data\" } })`;\n enhanced = enhanced + hint;\n }\n\n // Pattern 4: LogMetadata property errors\n // Matches: \"'X' does not exist in type 'LogMetadata'\" or \"'X' does not exist in type 'Partial<LogMetadata>'\"\n // We only allow additional data to be part of AI agent's context for simplicity\n const logMetadataPropertyPattern =\n /'(\\w+)' does not exist in type '(?:Partial<)?LogMetadata(?:>)?'/;\n const logMetadataMatch = enhanced.match(logMetadataPropertyPattern);\n if (logMetadataMatch) {\n const [, propertyName] = logMetadataMatch;\n const hint =\n `\\nLogMetadata does not support '${propertyName}'. Available properties:\\n` +\n `- additionalData?: Record<string, unknown>`;\n enhanced = enhanced + hint;\n }\n\n // Pattern 5: LogMetadata type assignment errors\n // Matches whenever \"LogMetadata\" appears in the error message\n const logMetadataTypePattern = /LogMetadata/;\n if (\n logMetadataTypePattern.test(enhanced) &&\n !enhanced.includes('Available properties:')\n ) {\n const hint =\n `\\nLogMetadata interface properties:\\n` +\n `- additionalData?: Record<string, unknown> (optional)\\n` +\n `\\nTo add custom data, use the additionalData property.`;\n enhanced = enhanced + hint;\n }\n\n // Pattern 6: Module has no exported member errors\n // Matches: \"Module 'X' has no exported member 'Y'\"\n const noExportedMemberPattern =\n /Module '([^']+)' has no exported member '(\\w+)'/;\n const noExportedMemberMatch = enhanced.match(noExportedMemberPattern);\n if (noExportedMemberMatch) {\n const [, moduleName, memberName] = noExportedMemberMatch;\n const hint =\n `\\n'${memberName}' is not exported from '${moduleName}'. ` +\n `Please remove it from your import statement or check the module's exports for the correct name.`;\n enhanced = enhanced + hint;\n }\n\n return enhanced;\n}\n","/**\n * Shared hashing utilities for generating deterministic variable IDs\n */\n\n/**\n * Generate a deterministic non-negative integer ID from a string input.\n * Uses FNV-1a hash algorithm for better distribution and fewer collisions.\n *\n * This is used to generate variableIds that remain consistent across:\n * - Bubble parsing (BubbleParser)\n * - Logger injection (LoggerInjector)\n *\n * @param input - String to hash (e.g., method name, uniqueId)\n * @returns A 6-digit integer in the range [100000, 999999]\n */\nexport function hashToVariableId(input: string): number {\n let hash = 2166136261; // FNV-1a 32-bit offset basis\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = (hash * 16777619) >>> 0; // unsigned 32-bit\n }\n // Map to 6-digit range to avoid colliding with small AST ids while readable\n const mapped = 100000 + (hash % 900000);\n return mapped;\n}\n\n/**\n * Build a call site key from method name and invocation order.\n * Using the ordinal position of the invocation within the method keeps the key\n * stable even if lines shift after instrumentation.\n *\n * @param methodName - Name of the instance method being called\n * @param invocationIndex - 1-based invocation index within that method\n * @returns A string key in the format \"methodName#invocationIndex\"\n */\nexport function buildCallSiteKey(\n methodName: string,\n invocationIndex: number\n): string {\n return `${methodName}#${invocationIndex}`;\n}\n","/**\n * Shared parameter formatting utilities for both frontend and runtime.\n * This module contains core formatting logic that can be used by:\n * - bubble-runtime (for code injection/transformation)\n * - bubble-studio (for visual editing)\n */\n\nimport type { BubbleParameter } from './bubble-definition-schema.js';\nimport { BubbleParameterType } from './bubble-definition-schema.js';\n\n/**\n * Patterns that indicate function literals in source code.\n * Used to detect when parameters contain functions that cannot be safely condensed.\n */\nconst FUNCTION_LITERAL_PATTERNS = [\n 'func:', // Object property with function value\n '=>', // Arrow function\n 'function(', // Function expression\n 'function (', // Function expression with space\n 'async(', // Async arrow function\n 'async (', // Async function with space\n] as const;\n\n/**\n * Check if a string contains function literal patterns.\n * When function literals are present, the source code must be preserved as-is\n * because functions cannot be safely serialized or condensed to single-line.\n */\nexport function containsFunctionLiteral(value: string): boolean {\n return FUNCTION_LITERAL_PATTERNS.some((pattern) => value.includes(pattern));\n}\n\n/**\n * Format a parameter value based on its type.\n * Converts values to their TypeScript code representation.\n */\nexport function formatParameterValue(value: unknown, type: string): string {\n switch (type) {\n case 'string': {\n const stringValue = String(value);\n // If it's a template literal, pass through unchanged\n if (stringValue.startsWith('`') && stringValue.endsWith('`')) {\n return stringValue;\n }\n // Always properly quote strings, regardless of input format\n // This ensures consistent quoting that survives condensation\n const escapedValue = stringValue.replace(/'/g, \"\\\\'\");\n return `'${escapedValue}'`;\n }\n case 'number':\n return String(value);\n case 'boolean':\n return String(value);\n case 'object':\n // If caller provided a source literal string, keep it as code\n if (typeof value === 'string') {\n const trimmed = value.trim();\n // Preserve source code if it contains function literals\n if (containsFunctionLiteral(trimmed)) {\n return value;\n }\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n trimmed.startsWith('new ')\n ) {\n return value;\n }\n }\n return JSON.stringify(value, null, 2);\n case 'array':\n if (typeof value === 'string') {\n const trimmed = value.trim();\n // Preserve source code if it contains function literals\n if (containsFunctionLiteral(trimmed)) {\n return value;\n }\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n return value;\n }\n }\n return JSON.stringify(value);\n case 'env':\n return `process.env.${String(value)}`;\n case 'variable':\n return String(value); // Reference to another variable\n case 'expression':\n return String(value); // Return expressions unquoted so they can be evaluated\n default:\n return JSON.stringify(value);\n }\n}\n\n/**\n * Condense a parameters string to a single line.\n * Used when parameters don't contain function literals.\n */\nexport function condenseToSingleLine(input: string): string {\n return input\n .replace(/\\s*\\n\\s*/g, ' ')\n .replace(/\\s{2,}/g, ' ')\n .replace(/\\{\\s+/g, '{ ')\n .replace(/\\s+\\}/g, ' }')\n .replace(/\\s*,\\s*/g, ', ')\n .trim();\n}\n\n/**\n * Strip // line comments and /* block comments that are outside of string and template literals.\n * This is used before we condense parameters into a single line so inline comments don't swallow code.\n */\nexport function stripCommentsOutsideStrings(input: string): string {\n let result = '';\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let inLineComment = false;\n let inBlockComment = false;\n let escapeNext = false;\n\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n const next = i + 1 < input.length ? input[i + 1] : '';\n\n if (inLineComment) {\n if (ch === '\\n') {\n inLineComment = false;\n result += ch;\n }\n continue;\n }\n\n if (inBlockComment) {\n if (ch === '*' && next === '/') {\n inBlockComment = false;\n i++; // skip '/'\n }\n continue;\n }\n\n if (inSingle) {\n if (escapeNext) {\n result += ch;\n escapeNext = false;\n continue;\n }\n if (ch === '\\\\') {\n result += ch;\n escapeNext = true;\n continue;\n }\n result += ch;\n if (ch === \"'\") inSingle = false;\n continue;\n }\n\n if (inDouble) {\n if (escapeNext) {\n result += ch;\n escapeNext = false;\n continue;\n }\n if (ch === '\\\\') {\n result += ch;\n escapeNext = true;\n continue;\n }\n result += ch;\n if (ch === '\"') inDouble = false;\n continue;\n }\n\n if (inTemplate) {\n if (escapeNext) {\n result += ch;\n escapeNext = false;\n continue;\n }\n if (ch === '\\\\') {\n result += ch;\n escapeNext = true;\n continue;\n }\n result += ch;\n if (ch === '`') inTemplate = false;\n continue;\n }\n\n // Not in any string/comment\n if (ch === '/' && next === '/') {\n inLineComment = true;\n i++; // skip next '/'\n continue;\n }\n if (ch === '/' && next === '*') {\n inBlockComment = true;\n i++; // skip next '*'\n continue;\n }\n if (ch === \"'\") {\n inSingle = true;\n result += ch;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n result += ch;\n continue;\n }\n if (ch === '`') {\n inTemplate = true;\n result += ch;\n continue;\n }\n\n result += ch;\n }\n\n return result;\n}\n\nexport interface BuildParameterObjectOptions {\n /** Whether to preserve multi-line formatting (default: false, will condense to single line) */\n preserveFormatting?: boolean;\n}\n\n/**\n * Build just the parameters object literal (no runtime metadata like logger config).\n * This is the core function used by both runtime and frontend for parameter serialization.\n *\n * @param parameters - Array of bubble parameters\n * @param options - Optional settings for formatting\n * @returns The parameters object as a TypeScript code string\n */\nexport function buildParameterObjectLiteral(\n parameters: BubbleParameter[],\n options?: BuildParameterObjectOptions\n): string {\n const { preserveFormatting = false } = options ?? {};\n\n if (!parameters || parameters.length === 0) {\n return '{}';\n }\n\n // Handle single variable parameter case (e.g., new GoogleDriveBubble(params))\n if (\n parameters.length === 1 &&\n parameters[0].type === BubbleParameterType.VARIABLE\n ) {\n const paramValue = formatParameterValue(\n parameters[0].value,\n parameters[0].type\n );\n return paramValue;\n }\n\n const nonCredentialParams = parameters.filter(\n (p) => p.name !== 'credentials'\n );\n const credentialsParam = parameters.find(\n (p) => p.name === 'credentials' && p.type === BubbleParameterType.OBJECT\n );\n\n // Handle single variable parameter + credentials case\n if (\n credentialsParam &&\n nonCredentialParams.length === 1 &&\n nonCredentialParams[0].type === BubbleParameterType.VARIABLE\n ) {\n const paramsParam = nonCredentialParams[0];\n\n // Only spread if the parameter source is 'first-arg' (represents entire first argument),\n // or if source is undefined (backward compatibility) and name is 'arg0' (parser's fallback).\n const shouldSpread =\n paramsParam.source === 'first-arg' ||\n (paramsParam.source === undefined && paramsParam.name === 'arg0');\n\n if (shouldSpread) {\n const paramsValue = formatParameterValue(\n paramsParam.value,\n paramsParam.type\n );\n const credentialsValue = formatParameterValue(\n credentialsParam.value,\n credentialsParam.type\n );\n\n return `{...${paramsValue}, credentials: ${credentialsValue}}`;\n }\n }\n\n // Separate spreads from regular properties\n const spreadParams = nonCredentialParams.filter((p) => p.source === 'spread');\n const regularParams = nonCredentialParams.filter(\n (p) => p.source !== 'spread'\n );\n\n // Build parameter entries: regular properties first, then spreads\n const regularEntries = regularParams.map((param) => {\n const value = formatParameterValue(param.value, param.type);\n return `${param.name}: ${value}`;\n });\n\n const spreadEntries = spreadParams.map((param) => {\n const value = formatParameterValue(param.value, param.type);\n return `...${value}`;\n });\n\n // Combine all entries: regular properties, spreads, then credentials\n const allEntries = [...regularEntries, ...spreadEntries];\n if (credentialsParam) {\n const credentialsValue = formatParameterValue(\n credentialsParam.value,\n credentialsParam.type\n );\n allEntries.push(`credentials: ${credentialsValue}`);\n }\n\n let paramsString = `{\\n ${allEntries.join(',\\n ')}\\n }`;\n\n // Check if parameters contain function literals before condensing\n const hasFunctions = containsFunctionLiteral(paramsString);\n\n if (!preserveFormatting && !hasFunctions) {\n // Strip comments and condense to single line\n paramsString = stripCommentsOutsideStrings(paramsString);\n paramsString = condenseToSingleLine(paramsString);\n }\n\n return paramsString;\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAEX,IAAM,sBAAsB,EAChC,OAAO;AAAA,EACN,OAAO,EAAE,OAAO,EAAE,QAAQ;AAAA,IACxB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACrC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,eAAe;AASnB,IAAM,6BAA6B,EAAE,OAAO;AAAA,EACjD,OAAO,EAAE,OAAO;AAAA,EAChB,WAAW,EAAE,OAAO;AAAA,EACpB,MAAM,EAAE,QAAQ,kBAAkB;AACpC,CAAC;AAEM,IAAM,qCAAqC,EAC/C,OAAO;AAAA,EACN,WAAW,EACR,OAAO,EACP,QAAQ,EAAE,aAAa,mCAAmC,CAAC;AAChE,CAAC,EACA,QAAQ,8BAA8B;;;AC5BzC,SAAS,KAAAA,UAAS;AAiDX,IAAM,yBAAyBA,GAAE,OAAO;AAAA;AAAA;AAAA,EAG7C,QAAQA,GAAE;AAAA,IACRA,GAAE,OAAO;AAAA;AAAA,IACTA,GAAE;AAAA,MACAA,GAAE,OAAO;AAAA;AAAA,MACTA,GAAE,OAAO;AAAA;AAAA,IACX;AAAA,EACF;AAAA;AAAA,EAEA,YAAYA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAEtD,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,EAClC,cAAcA,GACX,KAAK,CAAC,cAAc,SAAS,UAAU,SAAS,QAAQ,CAAC,EACzD,SAAS;AAAA;AAAA,EAEZ,OAAOA,GACJ;AAAA,IACCA,GAAE,OAAO;AAAA,MACP,IAAIA,GAAE,OAAO;AAAA,MACb,MAAMA,GAAE,OAAO;AAAA,MACf,SAASA,GAAE,QAAQ;AAAA,MACnB,WAAWA,GAAE,OAAO;AAAA;AAAA,MACpB,WAAWA,GAAE,OAAO;AAAA;AAAA,IACtB,CAAC;AAAA,EACH,EACC,SAAS;AAAA;AAAA,EAEZ,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AACrC,CAAC;AAOM,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EAC9C,SAASA,GAAE,OAAO;AAAA,EAClB,SAASA,GAAE,OAAO;AAAA,EAClB,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE9B,aAAaA,GAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAOM,IAAM,4BAA4BA,GAAE,OAAO;AAAA,EAChD,cAAcA,GAAE,OAAO;AAAA;AAAA,EACvB,sBAAsBA,GAAE,OAAO;AAAA;AAAA,EAC/B,UAAUA,GAAE,QAAQ;AAAA;AAAA;AAAA,EAEpB,aAAaA,GAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAOM,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EAC/C,QAAQA,GAAE,OAAO;AAAA,EACjB,UAAUA,GAAE,OAAO;AAAA,EACnB,WAAWA,GAAE,OAAO;AAAA;AAAA,EAEpB,aAAaA,GAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAOM,IAAM,8BAA8BA,GAAE,OAAO;AAAA,EAClD,gBAAgBA,GAAE,OAAO;AAAA,EACzB,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE3B,aAAaA,GAAE,OAAO,EAAE,SAAS;AACnC,CAAC;;;ACxIM,IAAK,iBAAL,kBAAKC,oBAAL;AAKL,EAAAA,gBAAA,yBAAsB;AAGtB,EAAAA,gBAAA,iBAAc;AACd,EAAAA,gBAAA,wBAAqB;AACrB,EAAAA,gBAAA,oBAAiB;AACjB,EAAAA,gBAAA,qBAAkB;AAElB,EAAAA,gBAAA,uBAAoB;AAEpB,EAAAA,gBAAA,mBAAgB;AAEhB,EAAAA,gBAAA,gBAAa;AACb,EAAAA,gBAAA,wBAAqB;AAErB,EAAAA,gBAAA,iBAAc;AAEd,EAAAA,gBAAA,8BAA2B;AAC3B,EAAAA,gBAAA,8BAA2B;AAC3B,EAAAA,gBAAA,8BAA2B;AAE3B,EAAAA,gBAAA,gBAAa;AAGb,EAAAA,gBAAA,wBAAqB;AAGrB,EAAAA,gBAAA,uBAAoB;AACpB,EAAAA,gBAAA,gBAAa;AACb,EAAAA,gBAAA,wBAAqB;AACrB,EAAAA,gBAAA,0BAAuB;AACvB,EAAAA,gBAAA,cAAW;AACX,EAAAA,gBAAA,wBAAqB;AACrB,EAAAA,gBAAA,oBAAiB;AAGjB,EAAAA,gBAAA,kBAAe;AAGf,EAAAA,gBAAA,iBAAc;AAGd,EAAAA,gBAAA,mBAAgB;AAGhB,EAAAA,gBAAA,uBAAoB;AACpB,EAAAA,gBAAA,sBAAmB;AAGnB,EAAAA,gBAAA,qBAAkB;AAGlB,EAAAA,gBAAA,iBAAc;AACd,EAAAA,gBAAA,mBAAgB;AAEhB,EAAAA,gBAAA,uBAAoB;AAGpB,EAAAA,gBAAA,eAAY;AAGZ,EAAAA,gBAAA,gBAAa;AAGb,EAAAA,gBAAA,wBAAqB;AAGrB,EAAAA,gBAAA,iBAAc;AAxEJ,SAAAA;AAAA,GAAA;;;ACDZ,SAAS,KAAAC,UAAS;AAsBX,IAAM,yBACX;AAAA,EACE,gCAA2B,GAAG;AAAA,IAC5B,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,8CAAkC,GAAG;AAAA,IACnC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,sCAA8B,GAAG;AAAA,IAC/B,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,oCAA6B,GAAG;AAAA,IAC9B,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,4CAAiC,GAAG;AAAA,IAClC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,8BAA0B,GAAG;AAAA,IAC3B,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,gCAA2B,GAAG;AAAA,IAC5B,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,wCAA+B,GAAG;AAAA,IAChC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,0DAAwC,GAAG;AAAA,IACzC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,0DAAwC,GAAG;AAAA,IACzC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,0DAAwC,GAAG;AAAA,IACzC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,8BAA0B,GAAG;AAAA,IAC3B,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,4CAAiC,GAAG;AAAA,IAClC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,8BAA0B,GAAG;AAAA,IAC3B,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,8CAAkC,GAAG;AAAA,IACnC,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,kDAAoC,GAAG;AAAA,IACrC,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,MACxB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,0BAAwB,GAAG;AAAA,IACzB,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,8CAAkC,GAAG;AAAA,IACnC,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,kCAA4B,GAAG;AAAA,IAC7B,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,8CAAkC,GAAG;AAAA,IACnC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,gCAA2B,GAAG;AAAA,IAC5B,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,8CAAkC,GAAG;AAAA,IACnC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,oCAA6B,GAAG;AAAA,IAC9B,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,sCAA8B,GAAG;AAAA,IAC/B,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,4CAAiC,GAAG;AAAA,IAClC,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,0CAAgC,GAAG;AAAA,IACjC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,4CAAiC,GAAG;AAAA,IAClC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,wCAA+B,GAAG;AAAA,IAChC,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,gCAA2B,GAAG;AAAA,IAC5B,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,oCAA6B,GAAG;AAAA,IAC9B,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,4BAAyB,GAAG;AAAA,IAC1B,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,8BAA0B,GAAG;AAAA,IAC3B,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,8CAAkC,GAAG;AAAA,IACnC,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,gCAA2B,GAAG;AAAA,IAC5B,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,8BAAmC,GAAG;AAAA,IACpC,OAAO;AAAA,IACP,aACE;AAAA,IACF,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,0BAA0B,CAAC;AAAA,EAC7B;AACF;AAKK,SAAS,6BAAqC;AACnD,QAAM,QAAkB,CAAC,iDAAiD;AAE1E,aAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,sBAAsB,GAAG;AACvE,UAAM,KAAK,KAAK,OAAO,KAAK,KAAK,QAAQ,MAAM,OAAO,WAAW,EAAE;AAAA,EACrE;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKO,IAAM,qBAAqD;AAAA,EAChE,gCAA2B,GAAG;AAAA,EAC9B,8CAAkC,GAAG;AAAA,EACrC,sCAA8B,GAAG;AAAA,EACjC,4CAAiC,GAAG;AAAA,EACpC,oCAA6B,GAAG;AAAA,EAChC,8BAA0B,GAAG;AAAA,EAC7B,8CAAkC,GAAG;AAAA,EACrC,gCAA2B,GAAG;AAAA,EAC9B,wCAA+B,GAAG;AAAA,EAClC,0DAAwC,GAAG;AAAA,EAC3C,0DAAwC,GAAG;AAAA,EAC3C,0DAAwC,GAAG;AAAA,EAC3C,8BAA0B,GAAG;AAAA,EAC7B,8CAAkC,GAAG;AAAA,EACrC,4CAAiC,GAAG;AAAA,EACpC,8BAA0B,GAAG;AAAA,EAC7B,8CAAkC,GAAG;AAAA,EACrC,kDAAoC,GAAG;AAAA,EACvC,0BAAwB,GAAG;AAAA,EAC3B,kCAA4B,GAAG;AAAA,EAC/B,gCAA2B,GAAG;AAAA,EAC9B,oCAA6B,GAAG;AAAA,EAChC,sCAA8B,GAAG;AAAA;AAAA,EACjC,8CAAkC,GAAG;AAAA,EACrC,4CAAiC,GAAG;AAAA,EACpC,0CAAgC,GAAG;AAAA,EACnC,wCAA+B,GAAG;AAAA;AAAA,EAClC,gCAA2B,GAAG;AAAA;AAAA,EAC9B,oCAA6B,GAAG;AAAA;AAAA,EAChC,4CAAiC,GAAG;AAAA,EACpC,4BAAyB,GAAG;AAAA;AAAA,EAC5B,8BAA0B,GAAG;AAAA,EAC7B,8CAAkC,GAAG;AAAA,EACrC,gCAA2B,GAAG;AAAA,EAC9B,8BAAmC,GAAG;AAAA;AACxC;AAGO,IAAM,qBAAqB,oBAAI,IAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB1D,CAAC;AAMM,IAAM,uBAAuB,oBAAI,IAAoB;AAAA;AAAA;AAG5D,CAAC;AA+CM,IAAM,kBAA8D;AAAA,EACzE,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,iBAAiB;AAAA,MACf,4CAAiC,GAAG;AAAA,QAClC,aAAa;AAAA,QACb,eAAe;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,aAAa;AAAA,QACb,mBAAmB;AAAA,UACjB;AAAA,YACE,OAAO;AAAA,YACP,aACE;AAAA,YACF,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aACE;AAAA,YACF,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,MACA,8BAA0B,GAAG;AAAA,QAC3B,aAAa;AAAA,QACb,eAAe;AAAA,UACb;AAAA,UACA;AAAA,QACF;AAAA,QACA,aAAa;AAAA,QACb,mBAAmB;AAAA,UACjB;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aACE;AAAA,YACF,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,MACA,8CAAkC,GAAG;AAAA,QACnC,aAAa;AAAA,QACb,eAAe,CAAC,8CAA8C;AAAA,QAC9D,aACE;AAAA,QACF,mBAAmB;AAAA,UACjB;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,MACA,kDAAoC,GAAG;AAAA,QACrC,aAAa;AAAA,QACb,eAAe,CAAC,0CAA0C;AAAA,QAC1D,aAAa;AAAA,QACb,mBAAmB;AAAA,UACjB;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,qBAAqB;AAAA,MACnB,aAAa;AAAA;AAAA,MACb,QAAQ;AAAA;AAAA,IACV;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,iBAAiB;AAAA,MACf,0BAAwB,GAAG;AAAA,QACzB,aAAa;AAAA,QACb,eAAe,CAAC;AAAA;AAAA,QAChB,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,qBAAqB;AAAA,MACnB,eAAe;AAAA;AAAA,MACf,QAAQ;AAAA;AAAA,IACV;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,iBAAiB;AAAA,MACf,8CAAkC,GAAG;AAAA,QACnC,aAAa;AAAA,QACb,eAAe,CAAC;AAAA;AAAA,QAChB,aACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,iBAAiB;AAAA,MACf,4BAAyB,GAAG;AAAA,QAC1B,aAAa;AAAA,QACb,eAAe;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QACF;AAAA,QACA,aACE;AAAA,QACF,mBAAmB;AAAA,UACjB;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aACE;AAAA,YACF,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,qBAAqB;AAAA,MACnB,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,iBAAiB;AAAA,MACf,8BAA0B,GAAG;AAAA,QAC3B,aAAa;AAAA,QACb,eAAe;AAAA;AAAA,UAEb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,QACF;AAAA,QACA,aAAa;AAAA;AAAA,UAEX;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,QACF;AAAA,QACA,aACE;AAAA,QACF,mBAAmB;AAAA;AAAA,UAEjB;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA;AAAA,UAEA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,iBAAiB;AAAA,MACf,sCAA8B,GAAG;AAAA,QAC/B,aAAa;AAAA,QACb,eAAe;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,aACE;AAAA,QACF,mBAAmB;AAAA,UACjB;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aACE;AAAA,YACF,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aACE;AAAA,YACF,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aACE;AAAA,YACF,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,iBACd,gBACsB;AACtB,aAAW,CAAC,cAAc,MAAM,KAAK,OAAO,QAAQ,eAAe,GAAG;AACpE,QAAI,OAAO,gBAAgB,cAAc,GAAG;AAC1C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,kBAAkB,gBAAyC;AACzE,SAAO,iBAAiB,cAAc,MAAM;AAC9C;AAMO,SAAS,qBACd,gBACoB;AACpB,QAAM,WAAW,iBAAiB,cAAc;AAChD,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,iBAAiB,gBAAgB,QAAQ;AAC/C,QAAM,mBAAmB,gBAAgB,gBAAgB,cAAc;AAEvE,MAAI,CAAC,kBAAkB,mBAAmB;AAExC,WACE,kBAAkB,cAAc,IAAI,CAAC,WAAW;AAAA,MAC9C;AAAA,MACA,aAAa,WAAW,KAAK;AAAA,MAC7B,gBAAgB;AAAA;AAAA,IAClB,EAAE,KAAK,CAAC;AAAA,EAEZ;AAEA,SAAO,iBAAiB;AAC1B;AAMO,SAAS,iBAAiB,gBAA0C;AACzE,QAAM,WAAW,iBAAiB,cAAc;AAChD,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,iBAAiB,gBAAgB,QAAQ;AAC/C,QAAM,mBAAmB,gBAAgB,gBAAgB,cAAc;AAEvE,SAAO,kBAAkB,iBAAiB,CAAC;AAC7C;AAMO,SAAS,eAAe,gBAA0C;AACvE,QAAM,WAAW,iBAAiB,cAAc;AAChD,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,iBAAiB,gBAAgB,QAAQ;AAC/C,QAAM,mBAAmB,gBAAgB,gBAAgB,cAAc;AAEvE,SAAO,kBAAkB,eAAe,CAAC;AAC3C;AAgCO,IAAM,4BAGT;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,aAAa;AAAA,IACb,iBAAiB;AAAA,MACf,gCAA2B,GAAG;AAAA,QAC5B,aAAa;AAAA,QACb,aACE;AAAA,QACF,WAAW;AAAA,QACX,cAAc;AAAA,MAChB;AAAA,MACA,oCAA6B,GAAG;AAAA,QAC9B,aAAa;AAAA,QACb,aACE;AAAA,QACF,WAAW;AAAA,QACX,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,0BACd,gBAC+B;AAC/B,aAAW,CAAC,cAAc,MAAM,KAAK,OAAO;AAAA,IAC1C;AAAA,EACF,GAAG;AACD,QAAI,OAAO,gBAAgB,cAAc,GAAG;AAC1C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,2BACd,gBACS;AACT,SAAO,0BAA0B,cAAc,MAAM;AACvD;AAgBO,IAAM,4BAGT;AAAA,EACF,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ;AAAA,EACA,YAAY,oCAA6B;AAAA,EACzC,OAAO,8BAA0B;AAAA,EACjC,UAAU,8CAAkC;AAAA,EAC5C,QAAQ,gCAA2B;AAAA,EACnC,qBAAqB,oCAA6B;AAAA,EAClD,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlB;AAAA,EACA,yBAAyB;AAAA;AAAA;AAAA;AAAA,EAIzB;AAAA,EACA,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxB;AAAA,EACA,eAAe,CAAC;AAAA,EAChB,MAAM,8BAAmC;AAAA;AAAA,EACzC,2BAA2B,CAAC;AAAA,EAC5B,2BAA2B,CAAC;AAAA,EAC5B,qBAAqB,CAAC;AAAA,EACtB,kBAAkB,oCAA6B;AAAA,EAC/C,iBAAiB,CAAC;AAAA,EAClB,8BAA8B,CAAC;AAAA,EAC/B,kBAAkB,wCAA+B;AAAA,EACjD,mBAAmB,4CAAiC;AAAA,EACpD,mBAAmB,4CAAiC;AAAA,EACpD,kBAAkB;AAAA;AAAA;AAAA,EAGlB;AAAA,EACA,oBAAoB,4CAAiC;AAAA,EACrD,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB;AAAA,EACA,sBAAsB,CAAC;AAAA,EACvB,6BAA6B,CAAC;AAAA,EAC9B,wBAAwB;AAAA;AAAA;AAAA,EAGxB;AAAA,EACA,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvB;AAAA,EACA,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpB;AAAA,EACA,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9B;AAAA,EACA,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ3B;AAAA,EACA,SAAS;AAAA;AAAA;AAAA;AAAA,EAIT;AAAA,EACA,gBAAgB,4CAAiC;AAAA,EACjD,OAAO,8BAA0B;AAAA,EACjC,iBAAiB,8CAAkC;AAAA,EACnD,mBAAmB,kDAAoC;AAAA,EACvD,OAAO,8BAA0B;AAAA,EACjC,kBAAkB,8BAA0B;AAAA,EAC5C,iBAAiB,8BAA0B;AAAA,EAC3C,eAAe,8BAA0B;AAAA,EACzC,gBAAgB,8BAA0B;AAAA,EAC1C,oBAAoB,8BAA0B;AAAA,EAC9C,gBAAgB,8BAA0B;AAAA,EAC1C,QAAQ,kCAA4B;AAAA,EACpC,eAAe,8CAAkC;AAAA,EACjD,cAAc,0BAAwB;AAAA,EACtC,WAAW,gCAA2B;AAAA,EACtC,UAAU,2EAA4D;AAAA,EACtE,QAAQ,8CAAkC;AAAA,EAC1C,WAAW,4CAAiC;AAAA,EAC5C,eAAe;AAAA;AAAA;AAAA,EAGf;AAAA,EACA,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb;AAAA,EACA,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxB;AAAA,EACA,WAAW,4CAAiC;AAAA,EAC5C,2BAA2B,4CAAiC;AAAA,EAC5D,sBAAsB;AAAA;AAAA;AAAA,EAGtB;AAAA,EACA,MAAM,4BAAyB;AAAA,EAC/B,OAAO,8BAA0B;AAAA,EACjC,YAAY,8CAAkC;AAAA,EAC9C,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B;AAAA,EACA,QAAQ,gCAA2B;AACrC;AAGO,IAAM,yBAAyBC,GACnC,OAAO;AAAA,EACN,gBAAgBA,GAAE,WAAW,cAAc,EAAE,QAAQ;AAAA,IACnD,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AAAA,EACD,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,IAC/B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAClC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,gBAAgBA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC7C,aACE;AAAA,IACF,SAAS;AAAA,EACX,CAAC;AAAA,EACD,0BAA0BA,GACvB,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,IACF,SAAS,EAAE,WAAW,KAAK;AAAA,EAC7B,CAAC;AAAA,EACH,UAAU,uBAAuB,SAAS,EAAE,QAAQ;AAAA,IAClD,aACE;AAAA,IACF,SAAS;AAAA,MACP,QAAQ;AAAA,QACN,OAAO;AAAA,UACL,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,YAAY;AAAA,QACd;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL;AAAA,UACE,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,WAAW;AAAA,UACX,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC,EACA,QAAQ,yBAAyB;AAG7B,IAAM,yBAAyBA,GACnC,OAAO;AAAA,EACN,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACnC,aACE;AAAA,IACF,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAClC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,gBAAgBA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC7C,aACE;AAAA,IACF,SAAS;AAAA,EACX,CAAC;AAAA,EACD,0BAA0BA,GACvB,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,IACF,SAAS,EAAE,WAAW,KAAK;AAAA,EAC7B,CAAC;AAAA,EACH,UAAU,uBAAuB,SAAS,EAAE,QAAQ;AAAA,IAClD,aACE;AAAA,IACF,SAAS;AAAA,MACP,QAAQ;AAAA,QACN,OAAO;AAAA,UACL,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC,EACA,QAAQ,yBAAyB;AAE7B,IAAM,2BAA2BA,GACrC,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,gBAAgB,CAAC;AAAA,EACvD,gBAAgBA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,qBAAqB,CAAC;AAAA,EACxE,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,kBAAkB,CAAC;AAAA,EACtE,UAAUA,GACP,MAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EACA,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,EACJ,CAAC;AAAA,EACH,WAAWA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,qBAAqB,CAAC;AAAA;AAAA,EAGnE,SAASA,GACN,QAAQ,EACR,SAAS,EACT,QAAQ,EAAE,aAAa,sCAAsC,CAAC;AAAA,EACjE,eAAeA,GACZ,OAAO,EACP,SAAS,EACT,QAAQ,EAAE,aAAa,sBAAsB,CAAC;AAAA,EACjD,gBAAgBA,GACb,OAAO,EACP,SAAS,EACT,QAAQ,EAAE,aAAa,mCAAmC,CAAC;AAAA,EAC9D,aAAaA,GACV,MAAMA,GAAE,OAAO,CAAC,EAChB,SAAS,EACT,QAAQ,EAAE,aAAa,uBAAuB,CAAC;AAAA,EAClD,aAAaA,GACV,KAAK,CAAC,UAAU,WAAW,eAAe,CAAC,EAC3C,SAAS,EACT,QAAQ,EAAE,aAAa,qBAAqB,CAAC;AAAA;AAAA,EAGhD,kBAAkBA,GACf,QAAQ,EACR,SAAS,EACT,QAAQ,EAAE,aAAa,+CAA+C,CAAC;AAAA,EAC1E,wBAAwBA,GACrB,OAAO;AAAA,IACN,YAAYA,GAAE,OAAO;AAAA,IACrB,aAAaA,GAAE,OAAO;AAAA,IACtB,QAAQA,GAAE,OAAO;AAAA,EACnB,CAAC,EACA,SAAS,EACT,QAAQ,EAAE,aAAa,2BAA2B,CAAC;AAAA;AAAA,EAGtD,oBAAoBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAChD,aACE;AAAA,EACJ,CAAC;AACH,CAAC,EACA,QAAQ,oBAAoB;AAGxB,IAAM,iCAAiCA,GAC3C,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,gBAAgB,CAAC;AAAA,EACvD,SAASA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,kBAAkB,CAAC;AAChE,CAAC,EACA,QAAQ,0BAA0B;AAG9B,IAAM,iCAAiCA,GAC3C,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,gBAAgB,CAAC;AAAA,EACvD,SAASA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,kBAAkB,CAAC;AAChE,CAAC,EACA,QAAQ,0BAA0B;AAG9B,IAAM,+BAA+BA,GACzC,OAAO;AAAA,EACN,SAASA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,kBAAkB,CAAC;AAChE,CAAC,EACA,QAAQ,wBAAwB;AAG5B,IAAM,wCAAwCA,GAClD,OAAO;AAAA,EACN,gBAAgBA,GAAE,WAAW,cAAc,EAAE,QAAQ;AAAA,IACnD,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAClC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,iCAAiC;AAErC,IAAM,yCAAyCA,GACnD,OAAO;AAAA,EACN,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,EACf,CAAC;AAAA,EACD,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC3B,aAAa;AAAA,EACf,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,EACf,CAAC;AAAA,EACD,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACxB,aAAa;AAAA,EACf,CAAC;AACH,CAAC,EACA,QAAQ,kCAAkC;AAEtC,IAAM,0CAA0CA,GACpD,OAAO;AAAA,EACN,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,EACf,CAAC;AAAA,EACD,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACxB,aAAa;AAAA,EACf,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAClC,aAAa;AAAA,EACf,CAAC;AACH,CAAC,EACA,QAAQ,mCAAmC;AAEvC,IAAM,2CAA2CA,GACrD,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACrB,aAAa;AAAA,EACf,CAAC;AAAA,EACD,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,aAAa;AAAA,EACf,CAAC;AACH,CAAC,EACA,QAAQ,oCAAoC;AAExC,IAAM,wCAAwCA,GAClD,OAAO;AAAA,EACN,cAAcA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC/B,aAAa;AAAA,EACf,CAAC;AACH,CAAC,EACA,QAAQ,iCAAiC;AAErC,IAAM,yCAAyCA,GACnD,OAAO;AAAA,EACN,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,EACf,CAAC;AAAA,EACD,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC3B,aAAa;AAAA,EACf,CAAC;AACH,CAAC,EACA,QAAQ,kCAAkC;;;ACjqD7C,SAAS,KAAAC,UAAS;AAIX,IAAK,sBAAL,kBAAKC,yBAAL;AACL,EAAAA,qBAAA,YAAS;AACT,EAAAA,qBAAA,YAAS;AACT,EAAAA,qBAAA,aAAU;AACV,EAAAA,qBAAA,YAAS;AACT,EAAAA,qBAAA,WAAQ;AACR,EAAAA,qBAAA,SAAM;AACN,EAAAA,qBAAA,cAAW;AACX,EAAAA,qBAAA,gBAAa;AACb,EAAAA,qBAAA,aAAU;AATA,SAAAA;AAAA,GAAA;AAaL,IAAM,+BAGT;AAAA,EACF,oCAA6B,GAAG;AAAA,IAC9B,WAAW;AAAA,EACb;AAAA,EACA,8CAAkC,GAAG,CAAC;AAAA,EACtC,gCAA2B,GAAG,CAAC;AAAA,EAC/B,0BAAwB,GAAG,CAAC;AAAA,EAC5B,gCAA2B,GAAG,CAAC;AAAA,EAC/B,8CAAkC,GAAG,CAAC;AAAA,EACtC,sCAA8B,GAAG,CAAC;AAAA,EAClC,4CAAiC,GAAG,CAAC;AAAA,EACrC,8BAA0B,GAAG,CAAC;AAAA,EAC9B,gCAA2B,GAAG,CAAC;AAAA,EAC/B,wCAA+B,GAAG,CAAC;AAAA,EACnC,0DAAwC,GAAG,CAAC;AAAA,EAC5C,0DAAwC,GAAG,CAAC;AAAA,EAC5C,0DAAwC,GAAG,CAAC;AAAA,EAC5C,8BAA0B,GAAG,CAAC;AAAA,EAC9B,8CAAkC,GAAG,CAAC;AAAA,EACtC,4CAAiC,GAAG,CAAC;AAAA,EACrC,8BAA0B,GAAG,CAAC;AAAA,EAC9B,8CAAkC,GAAG,CAAC;AAAA,EACtC,kDAAoC,GAAG,CAAC;AAAA,EACxC,kCAA4B,GAAG,CAAC;AAAA,EAChC,oCAA6B,GAAG,CAAC;AAAA,EACjC,sCAA8B,GAAG,CAAC;AAAA,EAClC,8CAAkC,GAAG,CAAC;AAAA,EACtC,4CAAiC,GAAG,CAAC;AAAA,EACrC,0CAAgC,GAAG,CAAC;AAAA,EACpC,wCAA+B,GAAG,CAAC;AAAA,EACnC,gCAA2B,GAAG,CAAC;AAAA,EAC/B,oCAA6B,GAAG,CAAC;AAAA,EACjC,4CAAiC,GAAG,CAAC;AAAA,EACrC,4BAAyB,GAAG,CAAC;AAAA,EAC7B,8BAA0B,GAAG,CAAC;AAAA,EAC9B,8CAAkC,GAAG,CAAC;AAAA,EACtC,gCAA2B,GAAG,CAAC;AAAA,EAC/B,8BAAmC,GAAG,CAAC;AAAA;AACzC;AAGO,IAAM,sCAAsC;AAAA,EACjD;AAAA,EACA;AACF;AAGO,IAAM,4BAA4BC,GAAE,WAAW,mBAAmB;AAElE,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EAC5C,UAAUA,GAAE;AAAA,IACVA,GAAE,OAAO;AAAA,MACP,WAAWA,GAAE,OAAO;AAAA,MACpB,UAAUA,GAAE,OAAO;AAAA,MACnB,SAASA,GAAE,OAAO;AAAA,MAClB,QAAQA,GAAE,OAAO;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EACA,YAAYA,GACT,OAAO,EACP,SAAS,EACT,SAAS,kCAAkC;AAAA,EAC9C,MAAMA,GAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,EACrD,OAAOA,GACJ,MAAM;AAAA,IACLA,GAAE,OAAO;AAAA,IACTA,GAAE,OAAO;AAAA,IACTA,GAAE,QAAQ;AAAA,IACVA,GAAE,OAAOA,GAAE,QAAQ,CAAC;AAAA,IACpBA,GAAE,MAAMA,GAAE,QAAQ,CAAC;AAAA,EACrB,CAAC,EACA,SAAS,4BAA4B;AAAA,EACxC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBN,QAAQA,GACL,KAAK,CAAC,mBAAmB,aAAa,QAAQ,CAAC,EAC/C,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAmDM,IAAM,uBAAuBA,GAAE,KAAK;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,4BAA4DA,GAAE;AAAA,EACzE,MACEA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,OAAO;AAAA,IACf,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,IAClC,UAAU;AAAA,IACV,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,IAChC,cAAcA,GAAE,MAAM,yBAAyB;AAAA;AAAA,IAE/C,sBAAsBA,GACnB,KAAK,MAAMA,GAAE,MAAM,8BAA8B,CAAC,EAClD,SAAS;AAAA,EACd,CAAC;AACL;AAEO,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EACzC,cAAcA,GAAE,OAAO;AAAA,EACvB,YAAYA,GAAE,OAAO;AAAA,EACrB,WAAWA,GAAE,OAAO;AAAA,EACpB,YAAYA,GAAE,MAAM,qBAAqB;AAAA,EACzC,UAAUA,GAAE,QAAQ;AAAA,EACpB,eAAeA,GAAE,QAAQ;AAAA,EACzB,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAA0B,EAAE,SAAS;AAAA,EACpE,iBAAiB,0BAA0B,SAAS;AACtD,CAAC;AAEM,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EACjD,MAAMA,GAAE,OAAO;AAAA,EACf,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAA0B,EAAE,SAAS;AAC/D,CAAC;AAEM,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EACjD,cAAcA,GAAE,OAAO;AAAA,EACvB,YAAYA,GAAE,OAAO;AAAA,EACrB,WAAWA,GAAE,OAAO;AAAA,EACpB,YAAYA,GAAE,MAAM,qBAAqB;AAAA,EACzC,UAAUA,GAAE,QAAQ;AAAA,EACpB,eAAeA,GAAE,QAAQ;AAAA,EACzB,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAA0B,EAAE,SAAS;AAAA,EACpE,iBAAiB,0BAA0B,SAAS;AAAA,EACpD,YAAYA,GAAE,OAAO;AAAA,EACrB,UAAU;AAAA,EACV,UAAUA,GAAE,OAAO;AAAA,IACjB,WAAWA,GAAE,OAAO;AAAA,IACpB,UAAUA,GAAE,OAAO;AAAA,IACnB,SAASA,GAAE,OAAO;AAAA,IAClB,QAAQA,GAAE,OAAO;AAAA,EACnB,CAAC;AAAA,EACD,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,uBAAuBA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3C,sBAAsBA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,oBAAoBA,GAAE,QAAQ,EAAE,SAAS;AAAA,EACzC,wBAAwBA,GAAE,OAAO,EAAE,SAAS;AAC9C,CAAC;AA4MM,IAAM,yBAAyBA,GAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EACrC,WAAWA,GAAE,OAAO;AAAA,EACpB,UAAUA,GAAE,OAAO;AAAA,EACnB,SAASA,GAAE,OAAO;AAAA,EAClB,QAAQA,GAAE,OAAO;AACnB,CAAC;AAEM,IAAM,2BAA0DA,GAAE;AAAA,EACvE;AAAA,IACE,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,YAAYA,GAAE,OAAO;AAAA,EACvB;AACF;AAEO,IAAM,gCACXA,GAAE;AAAA,EAAK,MACLA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,KAAK,CAAC,MAAM,OAAO,OAAO,CAAC;AAAA,IACnC,UAAU;AAAA,IACV,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,UAAUA,GAAE,MAAM,kBAAkB;AAAA,IACpC,YAAYA,GAAE,MAAM,kBAAkB,EAAE,SAAS;AAAA,IACjD,gBAAgBA,GAAE,QAAQ,EAAE,SAAS;AAAA,IACrC,gBAAgBA,GAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,CAAC;AACH;AAEK,IAAM,6BACXA,GAAE;AAAA,EAAK,MACLA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,WAAW;AAAA,IAC3B,UAAU;AAAA,IACV,UAAUA,GAAE,MAAM,kBAAkB;AAAA,IACpC,YAAYA,GAAE,MAAM,kBAAkB,EAAE,SAAS;AAAA,EACnD,CAAC;AACH;AAEK,IAAM,8BACXA,GAAE;AAAA,EAAK,MACLA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,YAAY;AAAA,IAC5B,UAAU;AAAA,IACV,MAAMA,GAAE,OAAO;AAAA,IACf,UAAUA,GAAE,MAAM,kBAAkB;AAAA,EACtC,CAAC;AACH;AAEK,IAAM,qCACXA,GAAE;AAAA,EAAK,MACLA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,sBAAsB;AAAA,IACtC,UAAU;AAAA,IACV,MAAMA,GAAE,OAAO;AAAA,IACf,WAAWA,GAAE;AAAA,MACXA,GAAE,OAAO;AAAA,QACP,MAAMA,GAAE,OAAO;AAAA,QACf,MAAMA,GAAE,KAAK,CAAC,SAAS,OAAO,KAAK,CAAC;AAAA,QACpC,gBAAgBA,GAAE,QAAQ;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,IACA,UAAUA,GAAE,MAAM,kBAAkB;AAAA,EACtC,CAAC;AACH;AAEK,IAAM,2BAA0DA,GAAE;AAAA,EACvE,MACEA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,UAAU;AAAA,IACV,MAAMA,GAAE,OAAO;AAAA,IACf,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,UAAUA,GAAE,MAAM,kBAAkB;AAAA,EACtC,CAAC;AACL;AAEO,IAAM,iCACXA,GAAE;AAAA,EAAK,MACLA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,eAAe;AAAA,IAC/B,UAAU;AAAA,IACV,cAAcA,GAAE,OAAO;AAAA,IACvB,cAAcA,GAAE,QAAQ;AAAA,IACxB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,IACjC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,MAAMA,GAAE,OAAO;AAAA,IACf,YAAYA,GAAE,OAAO;AAAA,IACrB,qBAAqBA,GAClB,OAAO;AAAA,MACN,cAAcA,GAAE,OAAO;AAAA,MACvB,cAAcA,GAAE,KAAK,CAAC,SAAS,OAAO,KAAK,CAAC;AAAA,IAC9C,CAAC,EACA,SAAS;AAAA,IACZ,kBAAkBA,GACf,OAAO;AAAA,MACN,UAAUA,GAAE,OAAO;AAAA,QACjB,WAAWA,GAAE,OAAO;AAAA,QACpB,SAASA,GAAE,OAAO;AAAA,MACpB,CAAC;AAAA,MACD,SAASA,GAAE,QAAQ;AAAA,MACnB,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,IAChC,CAAC,EACA,SAAS;AAAA,IACZ,UAAUA,GAAE,MAAM,kBAAkB;AAAA,EACtC,CAAC;AACH;AAEK,IAAM,sCACXA,GAAE;AAAA,EAAK,MACLA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,oBAAoB;AAAA,IACpC,UAAU;AAAA,IACV,MAAMA,GAAE,OAAO;AAAA,IACf,qBAAqBA,GAClB,OAAO;AAAA,MACN,eAAeA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,MACjC,cAAcA,GAAE,KAAK,CAAC,SAAS,OAAO,KAAK,CAAC;AAAA,IAC9C,CAAC,EACA,SAAS;AAAA,IACZ,UAAUA,GAAE,MAAM,kBAAkB;AAAA,EACtC,CAAC;AACH;AAEK,IAAM,2CACXA,GAAE,OAAO;AAAA,EACP,MAAMA,GAAE,QAAQ,yBAAyB;AAAA,EACzC,UAAU;AAAA,EACV,MAAMA,GAAE,OAAO;AAAA,EACf,cAAcA,GAAE,OAAO;AAAA,EACvB,cAAcA,GAAE,QAAQ;AAAA,EACxB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAYA,GAAE,OAAO;AAAA,EACrB,qBAAqBA,GAClB,OAAO;AAAA,IACN,cAAcA,GAAE,OAAO;AAAA,IACvB,cAAcA,GAAE,KAAK,CAAC,SAAS,OAAO,KAAK,CAAC;AAAA,EAC9C,CAAC,EACA,SAAS;AAAA,EACZ,kBAAkBA,GACf,OAAO;AAAA,IACN,UAAUA,GAAE,OAAO;AAAA,MACjB,WAAWA,GAAE,OAAO;AAAA,MACpB,SAASA,GAAE,OAAO;AAAA,IACpB,CAAC;AAAA,IACD,SAASA,GAAE,QAAQ;AAAA,IACnB,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAChC,CAAC,EACA,SAAS;AACd,CAAC;AAEI,IAAM,qBAA8CA,GAAE;AAAA,EAAK,MAChEA,GAAE,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEO,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EAC3C,MAAMA,GAAE,MAAM,kBAAkB;AAAA,EAChC,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAG,0BAA0B;AAC1D,CAAC;;;AClmBD,SAAS,eAAuB;AAE9B,MAAI,OAAO,WAAW,eAAe,OAAO,YAAY;AACtD,WAAO,OAAO,WAAW;AAAA,EAC3B;AAGA,SAAO,uCAAuC,QAAQ,SAAS,SAAU,GAAG;AAC1E,UAAM,IAAK,KAAK,OAAO,IAAI,KAAM;AACjC,UAAM,IAAI,MAAM,MAAM,IAAK,IAAI,IAAO;AACtC,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACH;AAmBO,IAAM,oBAAN,MAAwB;AAAA;AAAA;AAAA;AAAA,EAI7B,OAAO,mBACL,cACuB;AACvB,UAAM,WAAW,KAAK,uBAAuB,YAAY;AAEzD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,aAAa,aAAa;AAAA,MAC1B,OAAO;AAAA,MACP,WAAW,oBAAI,KAAK;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,2BACL,YACyB;AACzB,UAAM,WAAoC,CAAC;AAE3C,QAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,aAAO;AAAA,IACT;AAGA,QAAI,WAAW,SAAS,YAAY,WAAW,YAAY;AACzD,YAAM,aAAa,WAAW;AAE9B,iBAAW,CAAC,KAAK,cAAc,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC9D,YAAI,kBAAkB,OAAO,mBAAmB,UAAU;AACxD,gBAAM,QAAQ,KAAK;AAAA,YACjB;AAAA,UACF;AACA,cAAI,UAAU,QAAW;AACvB,qBAAS,GAAG,IAAI;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gCACL,QACS;AACT,UAAM,OAAO,OAAO;AAEpB,YAAQ,MAAM;AAAA,MACZ,KAAK,UAAU;AACb,YAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC7C,iBAAO,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,KAAK,MAAM,CAAC;AAAA,QACnE;AACA,YAAI,OAAO,WAAW,SAAS;AAC7B,iBAAO;AAAA,QACT;AACA,YAAI,OAAO,WAAW,aAAa;AACjC,kBAAO,oBAAI,KAAK,GAAE,YAAY;AAAA,QAChC;AACA,YAAI,OAAO,WAAW,QAAQ;AAC5B,iBAAO,aAAa;AAAA,QACtB;AACA,cAAM,YACJ,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAC5D,cAAM,YACJ,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAC5D,cAAM,SACJ,KAAK,MAAM,KAAK,OAAO,KAAK,YAAY,YAAY,EAAE,IAAI;AAC5D,eACE,YACA,KAAK,OAAO,EACT,SAAS,EAAE,EACX,UAAU,GAAG,IAAI,MAAM;AAAA,MAE9B;AAAA,MAEA,KAAK;AAAA,MACL,KAAK,WAAW;AACd,cAAM,MAAM,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AAClE,cAAM,MAAM,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AAClE,cAAM,QAAQ,KAAK,OAAO,KAAK,MAAM,OAAO;AAC5C,eAAO,SAAS,YACZ,KAAK,MAAM,KAAK,IAChB,KAAK,MAAM,QAAQ,GAAG,IAAI;AAAA,MAChC;AAAA,MAEA,KAAK,WAAW;AACd,eAAO,KAAK,OAAO,IAAI;AAAA,MACzB;AAAA,MAEA,KAAK,SAAS;AACZ,cAAM,QAAQ,OAAO;AACrB,YAAI,OAAO;AACT,gBAAM,WACJ,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AAC1D,gBAAM,WACJ,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AAC1D,gBAAM,SACJ,KAAK,MAAM,KAAK,OAAO,KAAK,WAAW,WAAW,EAAE,IAAI;AAE1D,iBAAO,MAAM;AAAA,YAAK,EAAE,OAAO;AAAA,YAAG,MAC5B,KAAK,gCAAgC,KAAK;AAAA,UAC5C;AAAA,QACF;AACA,eAAO,CAAC;AAAA,MACV;AAAA,MAEA,KAAK,UAAU;AACb,eAAO,KAAK,2BAA2B,MAAM;AAAA,MAC/C;AAAA,MAEA,SAAS;AACP,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,uBACL,QACyB;AACzB,UAAM,WAAoC,CAAC;AAE3C,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,EAAE,WAAW,SAAS;AACjE,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,OAAO;AAErB,eAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AAClD,UAAI,QAAQ,aAAa,QAAQ,SAAS;AAExC;AAAA,MACF;AAEA,UAAI,WAAW,OAAO,YAAY,YAAY,UAAU,SAAS;AAC/D,cAAM,QAAQ,KAAK,kBAAkB,OAAuB;AAC5D,YAAI,UAAU,QAAW;AACvB,mBAAS,GAAG,IAAI;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAkB,SAAgC;AACvD,UAAM,MAAM,QAAQ;AAEpB,YAAQ,IAAI,UAAU;AAAA,MACpB,KAAK,aAAa;AAChB,eAAO,KAAK,mBAAmB,GAAG;AAAA,MACpC;AAAA,MAEA,KAAK,aAAa;AAChB,eAAO,KAAK,mBAAmB,GAAG;AAAA,MACpC;AAAA,MAEA,KAAK,cAAc;AACjB,eAAO,KAAK,OAAO,IAAI;AAAA,MACzB;AAAA,MAEA,KAAK,WAAW;AACd,eAAO,oBAAI,KAAK;AAAA,MAClB;AAAA,MAEA,KAAK,YAAY;AACf,cAAM,cAAc,IAAI;AACxB,YAAI,aAAa;AACf,gBAAM,cAAc,KAAK,MAAM,KAAK,OAAO,IAAI,CAAC,IAAI;AACpD,iBAAO,MAAM;AAAA,YAAK,EAAE,QAAQ,YAAY;AAAA,YAAG,MACzC,KAAK,kBAAkB,WAAW;AAAA,UACpC;AAAA,QACF;AACA,eAAO,CAAC;AAAA,MACV;AAAA,MAEA,KAAK,aAAa;AAChB,YAAI,WAAW,SAAS;AACtB,gBAAM,aAAsC,CAAC;AAC7C,gBAAM,QAAS,QAAuC;AAEtD,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,gBAAI,SAAS,OAAO,UAAU,YAAY,UAAU,OAAO;AACzD,oBAAM,cAAc,KAAK,kBAAkB,KAAqB;AAChE,kBAAI,gBAAgB,QAAW;AAC7B,2BAAW,GAAG,IAAI;AAAA,cACpB;AAAA,YACF;AAAA,UACF;AAEA,iBAAO;AAAA,QACT;AACA,eAAO,CAAC;AAAA,MACV;AAAA,MAEA,KAAK,eAAe;AAElB,YAAI,KAAK,OAAO,IAAI,KAAK;AACvB,iBAAO,KAAK,kBAAkB,IAAI,SAAS;AAAA,QAC7C;AACA,eAAO;AAAA,MACT;AAAA,MAEA,KAAK,cAAc;AAEjB,YAAI,KAAK,OAAO,IAAI,KAAK;AACvB,iBAAO,IAAI,aAAa;AAAA,QAC1B;AACA,eAAO,KAAK,kBAAkB,IAAI,SAAS;AAAA,MAC7C;AAAA,MAEA,KAAK,WAAW;AACd,cAAM,SAAS,IAAI;AACnB,eAAO,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,CAAC;AAAA,MACzD;AAAA,MAEA,KAAK,cAAc;AACjB,eAAO,IAAI;AAAA,MACb;AAAA,MAEA,KAAK,YAAY;AACf,cAAM,UAAU,IAAI;AACpB,cAAM,eACJ,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,QAAQ,MAAM,CAAC;AACpD,eAAO,KAAK,kBAAkB,YAAY;AAAA,MAC5C;AAAA,MAEA,KAAK,yBAAyB;AAC5B,cAAM,uBAAuB,IAAI;AACjC,cAAM,4BACJ,qBACE,KAAK,MAAM,KAAK,OAAO,IAAI,qBAAqB,MAAM,CACxD;AACF,eAAO,KAAK,kBAAkB,yBAAyB;AAAA,MACzD;AAAA,MAEA,KAAK,aAAa;AAChB,cAAM,aAAsC,CAAC;AAC7C,cAAM,UAAU,KAAK,MAAM,KAAK,OAAO,IAAI,CAAC,IAAI;AAEhD,iBAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,gBAAM,MAAM,MAAM,IAAI,CAAC;AACvB,gBAAM,QAAQ,KAAK,kBAAkB,IAAI,SAAS;AAClD,cAAI,UAAU,QAAW;AACvB,uBAAW,GAAG,IAAI;AAAA,UACpB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,KAAK,eAAe;AAElB,YAAI,KAAK,OAAO,IAAI,KAAK;AACvB,iBAAO,KAAK,kBAAkB,IAAI,SAAS;AAAA,QAC7C;AACA,eAAO;AAAA,MACT;AAAA,MAEA,SAAS;AAEP,gBAAQ,KAAK,yCAAyC,IAAI,QAAQ,EAAE;AACpE,eAAO,QAAQ,IAAI,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,mBAAmB,KAAsC;AACtE,QAAI,IAAI,QAAQ;AACd,iBAAW,SAAS,IAAI,QAA0C;AAChE,gBAAQ,MAAM,MAAM;AAAA,UAClB,KAAK,SAAS;AACZ,mBAAO;AAAA,UACT;AAAA,UACA,KAAK,OAAO;AACV,mBAAO;AAAA,UACT;AAAA,UACA,KAAK,QAAQ;AACX,mBAAO,aAAa;AAAA,UACtB;AAAA,UACA,KAAK,SAAS;AAEZ,kBAAM,UAAU,MAAM;AACtB,gBAAI,QAAQ,OAAO,SAAS,MAAM,GAAG;AACnC,qBAAO;AAAA,YACT;AACA,gBAAI,QAAQ,OAAO,SAAS,OAAO,GAAG;AACpC,qBAAO;AAAA,YACT;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAK,OAAO;AACV,mBAAO,IAAI,OAAO,MAAM,KAAe;AAAA,UACzC;AAAA,UACA,KAAK,OAAO;AACV,mBAAO,OAAO,UAAU,GAAG,MAAM,KAAe;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,mBAAmB,KAAsC;AACtE,QAAI,MAAM;AACV,QAAI,MAAM;AACV,QAAI,QAAQ;AAEZ,QAAI,IAAI,QAAQ;AACd,iBAAW,SAAS,IAAI,QAA0C;AAChE,gBAAQ,MAAM,MAAM;AAAA,UAClB,KAAK,OAAO;AACV,kBAAM,MAAM;AACZ;AAAA,UACF;AAAA,UACA,KAAK,OAAO;AACV,kBAAM,MAAM;AACZ;AAAA,UACF;AAAA,UACA,KAAK,OAAO;AACV,oBAAQ;AACR;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,OAAO,KAAK,MAAM,OAAO;AAC5C,WAAO,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,qBACL,cACA,MACuB;AAEvB,QAAI,cAAc;AAClB,UAAM,eAAe,MAAM;AACzB,qBAAe,cAAc,OAAO,SAAS;AAC7C,aAAO,cAAc;AAAA,IACvB;AAGA,UAAM,iBAAiB,KAAK;AAC5B,SAAK,SAAS;AAEd,QAAI;AACF,YAAM,WAAW,KAAK,uBAAuB,YAAY;AAIzD,YAAM,cAAc,aAAa;AAEjC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA,OAAO;AAAA,QACP,WAAW,oBAAI,KAAK;AAAA,MACtB;AAAA,IACF,UAAE;AAEA,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AACF;;;AC1aA,SAAS,KAAAC,UAAS;AAIX,IAAM,6BAA6BC,GACvC,OAAO;AAAA,EACN,gBAAgBA,GAAE,WAAW,cAAc,EAAE,QAAQ;AAAA,IACnD,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAClC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,QAAQA,GACL,MAAMA,GAAE,OAAO,CAAC,EAChB,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,IACF,SAAS,CAAC,gDAAgD;AAAA,EAC5D,CAAC;AACL,CAAC,EACA,QAAQ,sBAAsB;AAG1B,IAAM,8BAA8BA,GACxC,OAAO;AAAA,EACN,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,QAAQ;AAAA,IAChC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACxB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,uBAAuB;AAG3B,IAAM,6BAA6BA,GACvC,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACxB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACzC,aAAa;AAAA,EACf,CAAC;AACH,CAAC,EACA,QAAQ,sBAAsB;AAG1B,IAAM,kCAAkCA,GAC5C,OAAO;AAAA,EACN,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,2BAA2B;AAG/B,IAAM,4BAA4BA,GACtC,OAAO;AAAA,EACN,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,qBAAqB;;;AC/EhC,SAAS,KAAAC,UAAS;AAMX,IAAM,qBAAqBA,GAC/B,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB,EAAE,QAAQ;AAAA,IAClD,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,OAAOA,GAAE,OAAO,EAAE,MAAM,yBAAyB,EAAE,QAAQ;AAAA,IACzD,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,UAAUA,GAAE,OAAO,EAAE,IAAI,GAAG,gCAAgC,EAAE,QAAQ;AAAA,IACpE,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,eAAeA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC3C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,qBAAqB;AAGzB,IAAM,6BAA6BA,GACvC,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,EAAE,QAAQ;AAAA,IAC3B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,aAAa;AAAA,IACb,SACE;AAAA,EACJ,CAAC;AACH,CAAC,EACA,QAAQ,sBAAsB;;;ACxCjC,SAAS,KAAAC,UAAS;;;ACKlB,SAAS,KAAAC,UAAS;AAMX,IAAM,iBAAiBA,GAC3B,KAAK,CAAC,SAAS,UAAU,UAAU,QAAQ,CAAC,EAC5C,QAAQ,UAAU;AAQd,IAAM,uBAAuBA,GACjC,OAAO;AAAA,EACN,QAAQA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACzB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACxB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAClC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAM;AAAA,EACN,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,gBAAgB;AAIpB,IAAM,oBAAoBA,GAC9B,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACrB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,gBAAgBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,kBAAkBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC9C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,YAAYA,GAAE,QAAQ,EAAE,QAAQ;AAAA,IAC9B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,oBAAoBA,GAAE,QAAQ,EAAE,QAAQ;AAAA,IACtC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,aAAa;AAQjB,IAAM,wBAAwBA,GAClC,OAAO;AAAA,EACN,OAAOA,GAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC3C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACpC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAM;AACR,CAAC,EACA,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,QAAQ;AAAA,EAC3C,SAAS;AACX,CAAC,EACA,QAAQ,wBAAwB;AAI5B,IAAM,yBAAyBA,GACnC,OAAO;AAAA,EACN,MAAM;AACR,CAAC,EACA,QAAQ,yBAAyB;AAI7B,IAAM,0BAA0BA,GACpC,OAAO;AAAA,EACN,YAAYA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC7B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC3B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,0BAA0B;AAQ9B,IAAM,oCAAoCA,GAC9C,OAAO;AAAA,EACN,aAAaA,GAAE,MAAM,oBAAoB;AAAA,EACzC,gBAAgBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,GAAE,QAAQ,EAAE,QAAQ;AAAA,IAC7B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,6BAA6B;AAUjC,IAAM,gCAAgCA,GAC1C,OAAO;AAAA,EACN,QAAQA,GAAE,OAAO;AAAA,EACjB,MAAM;AAAA,EACN,WAAWA,GAAE,OAAO;AACtB,CAAC,EACA,QAAQ,yBAAyB;AAU7B,IAAM,iCAAiCA,GAC3C,OAAO;AAAA,EACN,QAAQA,GAAE,OAAO;AAAA,EACjB,MAAM;AAAA,EACN,WAAWA,GAAE,OAAO;AACtB,CAAC,EACA,QAAQ,0BAA0B;AAU9B,IAAM,kCAAkCA,GAC5C,OAAO;AAAA,EACN,eAAeA,GAAE,OAAO;AAAA,EACxB,UAAUA,GAAE,OAAO;AAAA,EACnB,eAAeA,GAAE,OAAO;AAC1B,CAAC,EACA,QAAQ,2BAA2B;AAU/B,IAAM,0BAA0BA,GACpC,OAAO;AAAA,EACN,WAAWA,GAAE,MAAM,iBAAiB;AACtC,CAAC,EACA,QAAQ,mBAAmB;AAQvB,IAAM,4BAA4BA,GACtC,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO;AAAA,EACb,YAAYA,GAAE,OAAO;AAAA,EACrB,SAASA,GAAE,OAAO;AACpB,CAAC,EACA,QAAQ,qBAAqB;;;AD3NzB,IAAM,yBAAyBC,GACnC,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACzC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACpC,aAAa;AAAA,IACb,SACE;AAAA,EACJ,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,IAC9B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,IACnC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,GACV,OAAO,EACP,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,kBAAkB,EACxB,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACH,eAAeA,GAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC3D,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,kBAAkBA,GACf,OAAOA,GAAE,OAAO,GAAG,0BAA0B,EAC7C,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,EACJ,CAAC;AAAA,EACH,qBAAqBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5D,aACE;AAAA,EACJ,CAAC;AACH,CAAC,EACA,QAAQ,yBAAyB;AAG7B,IAAM,8BAA8BA,GACxC,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACzC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,QAAQA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACzB,aAAa;AAAA,IACb,SACE;AAAA,EACJ,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,IACnC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,GACV,OAAO,EACP,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,kBAAkB,EACxB,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACH,eAAeA,GAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC3D,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,qBAAqBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5D,aACE;AAAA,EACJ,CAAC;AACH,CAAC,EACA,QAAQ,8BAA8B;AAGlC,IAAM,0BAA0BA,GACpC,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAC9B,QAAQ,0BAA0B;AAG9B,IAAM,mCAAmCA,GAC7C,OAAO;AAAA,EACN,kBAAkBA,GAAE;AAAA,IAClBA,GAAE,OAAO;AAAA,IACTA,GAAE,MAAM,CAAC,4BAA4B,kBAAkB,CAAC;AAAA,EAC1D;AACF,CAAC,EACA,QAAQ,mCAAmC;AAGvC,IAAM,6BAA6BA,GACvC,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,6BAA6B;AAOjC,IAAM,iCAAiCA,GAC3C,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACrB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,GACV,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAAA,EACF,CAAC;AAAA,EACH,kBAAkBA,GAAE,OAAOA,GAAE,OAAO,GAAG,0BAA0B,EAAE,QAAQ;AAAA,IACzE,aAAa;AAAA,EACf,CAAC;AAAA,EACD,UAAU,qBAAqB,SAAS,EAAE,QAAQ;AAAA,IAChD,aAAa;AAAA,EACf,CAAC;AAAA,EACD,qBAAqBA,GAClB,OAAOA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,WAAW,cAAc,CAAC,CAAC,EACxD,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,IACF,SAAS;AAAA,MACP,uBAAuB,oCAA6B;AAAA,MACpD,sBAAsB,8BAA0B;AAAA,MAChD,eAAe,8CAAkC;AAAA,MACjD,gBAAgB,8BAAmC;AAAA,IACrD;AAAA,EACF,CAAC;AAAA,EACH,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,IACnC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,qBAAqBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5D,aACE;AAAA,EACJ,CAAC;AAAA,EACD,SAASA,GACN,OAAO;AAAA,IACN,IAAIA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,cAAc,SAAS,IAAI,CAAC;AAAA,IAClE,KAAKA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACtB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACvB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,QAAQA,GAAE,QAAQ,EAAE,QAAQ;AAAA,MAC1B,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH,CAAC,EACA,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AACL,CAAC,EACA,QAAQ,0BAA0B;AAG9B,IAAM,sCAAsCA,GAChD,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACrB,aACE;AAAA,IACF,SAAS;AAAA,EACX,CAAC;AAAA,EACD,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,aAAa;AAAA,IACb,SACE;AAAA,EACJ,CAAC;AAAA,EACD,SAASA,GACN,OAAO;AAAA,IACN,IAAIA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,cAAc,SAAS,IAAI,CAAC;AAAA,IAClE,KAAKA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACtB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACvB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,QAAQA,GAAE,QAAQ,EAAE,QAAQ;AAAA,MAC1B,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH,CAAC,EACA,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AACL,CAAC,EACA,QAAQ,+BAA+B;AAGnC,IAAM,uBAAuBA,GACjC,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACrB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,GAAE,WAAW,cAAc,EAAE,QAAQ;AAAA,IACzC,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AAAA,EACD,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,QAAQA,GAAE,QAAQ,EAAE,QAAQ;AAAA,IAC1B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,gBAAgB;AAKpB,IAAM,kCAAkCA,GAC5C,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,gBAAgB,CAAC;AAAA,EACvD,MAAMA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,kBAAkB,CAAC;AAAA,EAC3D,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,cAAc,CAAC;AAAA,EACzE,QAAQA,GACL,OAAO,EACP,SAAS,EACT,QAAQ,EAAE,aAAa,4CAA4C,CAAC;AAAA,EACvE,WAAWA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,aAAa,CAAC;AAAA,EAC3D,MAAMA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,yBAAyB,CAAC;AAAA,EAClE,iBAAiBA,GACd,OAAO,EACP,SAAS,EACT,SAAS,EACT,QAAQ,EAAE,aAAa,0CAA0C,CAAC;AAAA,EACrE,aAAaA,GACV,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,QAAQ,EAAE,aAAa,eAAe,CAAC;AAAA,EAC1C,MAAMA,GACH,OAAO,EACP,SAAS,EACT,SAAS,EACT,QAAQ,EAAE,aAAa,kBAAkB,CAAC;AAAA,EAC7C,YAAYA,GACT,QAAQ,EACR,SAAS,EACT,QAAQ,EAAE,aAAa,oCAAoC,CAAC;AAAA,EAC/D,eAAeA,GACZ,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,QAAQ,EAAE,aAAa,qCAAqC,CAAC;AAAA,EAChE,UAAUA,GACP,QAAQ,EACR,QAAQ,EAAE,aAAa,mCAAmC,CAAC;AAAA,EAC9D,gBAAgBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,qBAAqBA,GAClB,OAAOA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,WAAW,cAAc,CAAC,CAAC,EACxD,QAAQ,EAAE,aAAa,iCAAiC,CAAC;AAAA,EAC5D,iBAAiBA,GAAE,MAAM,oBAAoB,EAAE,SAAS,EAAE,QAAQ;AAAA,IAChE,aACE;AAAA,EACJ,CAAC;AAAA,EACD,2BAA2BA,GACxB;AAAA,IACCA,GAAE,OAAO;AAAA,IACTA,GAAE,OAAO;AAAA,MACP,cAAcA,GAAE,OAAO;AAAA,MACvB,YAAYA,GAAE,OAAO;AAAA,MACrB,WAAWA,GAAE,OAAO;AAAA,MACpB,YAAYA,GAAE;AAAA,QACZA,GAAE,OAAO;AAAA,UACP,MAAMA,GAAE,OAAO;AAAA,UACf,OAAOA,GAAE,QAAQ;AAAA,UACjB,MAAMA,GAAE,WAAW,mBAAmB;AAAA,QACxC,CAAC;AAAA,MACH;AAAA,MACA,UAAUA,GAAE,QAAQ;AAAA,MACpB,eAAeA,GAAE,QAAQ;AAAA,IAC3B,CAAC;AAAA,EACH,EACC,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AAAA,EACH,kBAAkBA,GAAE,OAAOA,GAAE,OAAO,GAAG,0BAA0B,EAAE,QAAQ;AAAA,IACzE,aAAa;AAAA,EACf,CAAC;AAAA,EACD,UAAU,qBAAqB,SAAS,EAAE,QAAQ;AAAA,IAChD,aAAa;AAAA,EACf,CAAC;AAAA,EACD,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC7D,aACE;AAAA,EACJ,CAAC;AAAA,EACD,YAAYA,GACT,KAAK,CAAC,SAAS,UAAU,UAAU,QAAQ,CAAC,EAC5C,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACH,qBAAqBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5D,aAAa;AAAA,EACf,CAAC;AAAA,EACD,mBAAmB,qBAAqB,SAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,IACpE,aACE;AAAA,EACJ,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,qBAAqB,CAAC;AAAA,EACnE,WAAWA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,mBAAmB,CAAC;AAAA,EACjE,aAAaA,GACV,OAAO,EACP,QAAQ,EAAE,aAAa,mCAAmC,CAAC;AAChE,CAAC,EACA,QAAQ,2BAA2B;AAG/B,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EAC/C,IAAIA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,gBAAgB,CAAC;AAAA,EACvD,MAAMA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,kBAAkB,CAAC;AAAA,EAC3D,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,cAAc,CAAC;AAAA,EACzE,WAAWA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,aAAa,CAAC;AAAA,EAC3D,UAAUA,GACP,QAAQ,EACR,QAAQ,EAAE,aAAa,mCAAmC,CAAC;AAAA,EAC9D,YAAYA,GACT,QAAQ,EACR,QAAQ,EAAE,aAAa,oCAAoC,CAAC;AAAA,EAC/D,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,gBAAgB,CAAC;AAAA,EAC5E,uBAAuBA,GACpB,OAAO,EACP,QAAQ,EAAE,aAAa,0BAA0B,CAAC;AAAA,EACrD,qBAAqBA,GAClB,OAAO,EACP,QAAQ,EAAE,aAAa,wBAAwB,CAAC;AAAA,EACnD,gBAAgBA,GACb,OAAO,EACP,QAAQ,EAAE,aAAa,wCAAwC,CAAC;AAAA,EACnE,SAASA,GACN;AAAA,IACCA,GAAE,OAAO;AAAA,MACP,YAAYA,GACT,OAAO,EACP,QAAQ,EAAE,aAAa,cAAc,CAAC;AAAA,MACzC,WAAWA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,oBAAoB,CAAC;AAAA,IACpE,CAAC;AAAA,EACH,EACC,SAAS,EACT,QAAQ,EAAE,aAAa,oCAAoC,CAAC;AAAA,EAC/D,YAAY,eAAe,SAAS,EAAE,QAAQ;AAAA,IAC5C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,gBAAgBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,qBAAqBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5D,aAAa;AAAA,EACf,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,qBAAqB,CAAC;AAAA,EACnE,WAAWA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,mBAAmB,CAAC;AACnE,CAAC;AAGM,IAAM,+BAA+BA,GAAE,OAAO;AAAA,EACnD,aAAaA,GAAE,MAAM,wBAAwB,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzD,kBAAkBA,GACf,OAAO;AAAA,IACN,OAAOA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,8BAA8B,CAAC;AAAA,EAC1E,CAAC,EACA,QAAQ,EAAE,aAAa,iCAAiC,CAAC;AAC9D,CAAC;AAEM,IAAM,mCAAmCA,GAC7C,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,EAAE,QAAQ;AAAA,IAC3B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,YAAYA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC7B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,4BAA4B;;;AE9bvC,SAAS,KAAAC,UAAS;AAOX,IAAM,qBAAqBC,GAC/B,OAAO;AAAA,EACN,SAASA,GAAE,WAAW,cAAc,EAAE,QAAQ;AAAA,IAC5C,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AAAA,EACD,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACxC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACxB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC3B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,cAAc;AAIlB,IAAM,yBAAyBA,GACnC,OAAO;AAAA,EACN,QAAQA,GAAE,IAAI,EAAE,SAAS,EAAE,QAAQ;AAAA,IACjC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAChC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,oBAAoBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAChD,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,sBAAsBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAClD,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACxC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,GACR,OAAO,EACP,QAAQ,EAAE,aAAa,8BAA8B,CAAC;AAAA,EACzD,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC1C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,QAAQA,GACL;AAAA,IACCA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC1B,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC5B,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,QACxC,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,QACxC,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,QACxC,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,gBAAgBA,GAAE,IAAI,EAAE,SAAS,EAAE,QAAQ;AAAA,QACzC,aAAa;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAAA,EACH,EACC,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AAAA,EACH,UAAUA,GACP;AAAA,IACCA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC1B,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC5B,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,QACxC,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,QACxC,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,QACxC,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,gBAAgBA,GAAE,IAAI,EAAE,SAAS,EAAE,QAAQ;AAAA,QACzC,aAAa;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAAA,EACH,EACC,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AAAA,EACH,0BAA0BA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACtD,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,cAAcA,GACX;AAAA,IACCA,GAAE,OAAO;AAAA,MACP,YAAYA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC7B,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC3B,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,MACD,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC1B,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH,CAAC;AAAA,EACH,EACC,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AAAA,EACH,iBAAiBA,GAAE,IAAI,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC1C,aACE;AAAA,EACJ,CAAC;AAAA;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACrC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,cAAcA,GAAE,MAAM,kBAAkB,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC3D,aAAa;AAAA,EACf,CAAC;AAAA,EACD,uBAAuBA,GACpB,OAAOA,GAAE,OAAO,GAAG,kBAAkB,EACrC,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AACL,CAAC,EACA,QAAQ,kBAAkB;AAKtB,IAAM,4BAA4BA,GAAE,OAAO;AAAA,EAChD,IAAIA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,eAAe,CAAC;AAAA,EACtD,QAAQA,GACL,KAAK,CAAC,WAAW,WAAW,OAAO,CAAC,EACpC,QAAQ,EAAE,aAAa,mBAAmB,CAAC;AAAA,EAC9C,SAASA,GACN,OAAOA,GAAE,OAAO,GAAGA,GAAE,IAAI,CAAC,EAC1B,QAAQ,EAAE,aAAa,oBAAoB,CAAC;AAAA,EAC/C,QAAQA,GAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,wBAAwB,CAAC;AAAA,EAC3E,OAAOA,GACJ,OAAO,EACP,SAAS,EACT,QAAQ,EAAE,aAAa,0BAA0B,CAAC;AAAA,EACrD,WAAWA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,4BAA4B,CAAC;AAAA,EAC1E,aAAaA,GAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,cAAc,CAAC;AAAA,EAC9D,aAAaA,GACV,OAAO,EACP,SAAS,EACT,QAAQ,EAAE,aAAa,iCAAiC,CAAC;AAAA,EAC5D,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAClC,aACE;AAAA,EACJ,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,EACf,CAAC;AACH,CAAC;AAGM,IAAM,yCAAyCA,GACnD,OAAO;AAAA,EACN,OAAOA,GAAE,MAAM,yBAAyB,EAAE,QAAQ;AAAA,IAChD,aAAa;AAAA,EACf,CAAC;AAAA,EACD,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACxB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,kCAAkC;AAOtC,IAAM,kCAAkC,0BAA0B;AAAA,EACvE;AAAA,IACE,eAAeA,GAAE,MAAMA,GAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ;AAAA,MACjD,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAMO,IAAM,kCAAkCA,GAC5C,OAAO;AAAA,EACN,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC9B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,SAASA,GAAE,QAAQ,EAAE,QAAQ;AAAA,IAC3B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,GACH,IAAI,EACJ,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,IACb,SAAS,EAAE,QAAQ,0BAA0B,OAAO,GAAG;AAAA,EACzD,CAAC;AAAA,EACH,SAAS,uBAAuB,SAAS,EAAE,QAAQ;AAAA,IACjD,aAAa;AAAA,EACf,CAAC;AAAA,EACD,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACnC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,2BAA2B;AAU/B,IAAM,+BAA+BA,GAAE,OAAO;AAAA,EACnD,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,IAC9B,aAAa;AAAA,IACb,SACE;AAAA,EACJ,CAAC;AAAA,EACD,SAASA,GACN,OAAO;AAAA,IACN,gBAAgBA,GAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,QAAQ;AAAA,MAChD,aAAa;AAAA,IACf,CAAC;AAAA,IACD,YAAYA,GAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,QAAQ;AAAA,MAC5C,aAAa;AAAA,IACf,CAAC;AAAA,IACD,oBAAoBA,GAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,QAAQ;AAAA,MACrD,aAAa;AAAA,IACf,CAAC;AAAA,EACH,CAAC,EACA,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AAAA,EACH,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC/C,aACE;AAAA,IACF,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,GACV,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,CAAC,EACnD,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,IACF,SAAS;AAAA,MACP,gBAAgB;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA,YAAY;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EACH,eAAeA,GACZ,OAAOA,GAAE,QAAQ,CAAC,EAClB,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAAA,EACH,cAAcA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC3C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC;AAEM,IAAM,uCAAuCA,GAAE,OAAO;AAAA,EAC3D,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,IACnC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,IACrC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,OAAOA,GAAE,QAAQ,EAAE,QAAQ;AAAA,IACzB,aAAa;AAAA,EACf,CAAC;AAAA,EACD,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC7C,aAAa;AAAA,EACf,CAAC;AAAA,EACD,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACzC,aAAa;AAAA,EACf,CAAC;AAAA,EACD,aAAaA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,IACrD,aAAa;AAAA,IACb,SAAS;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAAA,EACF,CAAC;AAAA,EACD,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAG,0BAA0B,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC3E,aAAa;AAAA,EACf,CAAC;AAAA,EACD,UAAU,qBAAqB,SAAS,EAAE,QAAQ;AAAA,IAChD,aAAa;AAAA,EACf,CAAC;AAAA,EACD,qBAAqBA,GAClB,OAAOA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC,EACtC,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AAAA,EACH,UAAUA,GACP,OAAO;AAAA,IACN,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAC9B,aAAa;AAAA,IACf,CAAC;AAAA,IACD,YAAYA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAC7B,aAAa;AAAA,IACf,CAAC;AAAA,IACD,YAAYA,GAAE,QAAQ,EAAE,QAAQ;AAAA,MAC9B,aAAa;AAAA,IACf,CAAC;AAAA,IACD,aAAaA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,MAC1C,aACE;AAAA,IACJ,CAAC;AAAA,EACH,CAAC,EACA,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AAAA,EACH,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC7C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,YAAYA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,IACzC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,eAAeA,GACZ,OAAOA,GAAE,QAAQ,CAAC,EAClB,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAAA,EACH,SAASA,GAAE,QAAQ;AAAA,EACnB,OAAOA,GAAE,OAAO;AAClB,CAAC;;;ACzZD,SAAS,KAAAC,WAAS;;;ACDlB,SAAS,KAAAC,WAAS;AAUX,IAAM,wBAAwB;AAC9B,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAO7B,IAAM,4BAA4BC,IAAE,OAAO;AAAA,EAChD,IAAIA,IAAE,OAAO,EAAE,SAAS,mCAAmC;AAAA,EAC3D,OAAOA,IAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,EAC/D,aAAaA,IACV,OAAO,EACP,SAAS,EACT,SAAS,mDAAmD;AACjE,CAAC;AAGM,IAAM,8BAA8BA,IAAE,OAAO;AAAA,EAClD,IAAIA,IAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,EAC7D,UAAUA,IAAE,OAAO,EAAE,SAAS,0CAA0C;AAAA,EACxE,SAASA,IACN,MAAM,yBAAyB,EAC/B,IAAI,CAAC,EACL,SAAS,oDAAoD;AAAA,EAChE,SAASA,IACN,OAAO,EACP,SAAS,EACT,SAAS,8DAA8D;AAAA,EAC1E,eAAeA,IACZ,QAAQ,EACR,SAAS,EACT,QAAQ,KAAK,EACb;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAGM,IAAM,iCAAiCA,IAAE,OAAO;AAAA,EACrD,WAAWA,IACR,MAAM,2BAA2B,EACjC,IAAI,CAAC,EACL,IAAI,oBAAoB,EACxB,SAAS,sCAAsC,oBAAoB,GAAG;AAC3E,CAAC;AAUM,IAAM,0CAA0CA,IAAE,OAAO;AAAA,EAC9D,QAAQA,IAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,EAChE,UAAUA,IACP,OAAO,EACP,SAAS,iDAAiD;AAAA,EAC7D,qBAAqBA,IAClB,MAAMA,IAAE,WAAW,cAAc,CAAC,EAClC,SAAS,kDAAkD;AAAA,EAC9D,aAAaA,IACV,OAAO,EACP,SAAS,qDAAqD;AACnE,CAAC;AAMM,IAAM,4BAA4BA,IAAE,OAAO;AAAA,EAChD,QAAQA,IAAE,OAAO,EAAE,SAAS,0CAA0C;AAAA,EACtE,QAAQA,IACL,KAAK,CAAC,WAAW,YAAY,OAAO,CAAC,EACrC;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQA,IACL,QAAQ,EACR,SAAS,EACT,SAAS,yDAAyD;AAAA,EACrE,OAAOA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,EACxE,iBAAiB,wCAAwC,SAAS,EAAE;AAAA,IAClE;AAAA,EACF;AACF,CAAC;AAKM,IAAM,iCAAiCA,IAAE,OAAO;AAAA,EACrD,SAASA,IAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,EACzD,iBAAiBA,IACd,OAAO,EACP,SAAS,kDAAkD;AAChE,CAAC;AAGM,IAAM,2BAA2BA,IAAE,OAAO;AAAA,EAC/C,QAAQA,IAAE,KAAK,CAAC,aAAa,UAAU,CAAC;AAAA,EACxC,qBAAqBA,IAAE,OAAO,EAAE,SAAS;AAAA,EACzC,QAAQA,IAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAOM,IAAM,iBAAiBA,IAAE,OAAO;AAAA,EACrC,OAAOA,IAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,EACtD,aAAaA,IACV,OAAO,EACP,SAAS,6CAA6C;AAAA,EACzD,aAAaA,IACV,MAAMA,IAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,oCAAoC;AAClD,CAAC;AAGM,IAAM,wBAAwBA,IAAE,OAAO;AAAA,EAC5C,SAASA,IAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,EAC7D,OAAOA,IAAE,MAAM,cAAc,EAAE,SAAS,kCAAkC;AAAA,EAC1E,kBAAkBA,IACf,MAAMA,IAAE,OAAO,CAAC,EAChB,SAAS,+CAA+C;AAC7D,CAAC;AASD,IAAM,oBAAoBA,IAAE,OAAO;AAAA,EACjC,IAAIA,IAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,EACnD,WAAWA,IAAE,OAAO,EAAE,SAAS,mCAAmC;AACpE,CAAC;AAGM,IAAM,oBAAoB,kBAAkB,OAAO;AAAA,EACxD,MAAMA,IAAE,QAAQ,MAAM;AAAA,EACtB,SAASA,IAAE,OAAO,EAAE,SAAS,mBAAmB;AAClD,CAAC;AAGM,IAAM,yBAAyB,kBAAkB,OAAO;AAAA,EAC7D,MAAMA,IAAE,QAAQ,WAAW;AAAA,EAC3B,SAASA,IAAE,OAAO,EAAE,SAAS,yBAAyB;AAAA,EACtD,MAAMA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8BAA8B;AAAA,EACnE,YAAYA,IACT,KAAK,CAAC,QAAQ,YAAY,UAAU,QAAQ,CAAC,EAC7C,SAAS,EACT,SAAS,4BAA4B;AAAA,EACxC,kBAAkBA,IACf,OAAOA,IAAE,OAAO,GAAGA,IAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,SAAS,sCAAsC;AACpD,CAAC;AAGM,IAAM,oCAAoC,kBAAkB,OAAO;AAAA,EACxE,MAAMA,IAAE,QAAQ,uBAAuB;AAAA,EACvC,WAAWA,IACR,MAAM,2BAA2B,EACjC,SAAS,uBAAuB;AACrC,CAAC;AAGM,IAAM,qCAAqC,kBAAkB,OAAO;AAAA,EACzE,MAAMA,IAAE,QAAQ,wBAAwB;AAAA,EACxC,SAASA,IACN,OAAOA,IAAE,OAAO,GAAGA,IAAE,MAAMA,IAAE,OAAO,CAAC,CAAC,EACtC,SAAS,yBAAyB;AAAA,EACrC,mBAAmBA,IAChB,MAAM,2BAA2B,EACjC,SAAS,EACT,SAAS,yDAAyD;AACvE,CAAC;AAGM,IAAM,8BAA8B,kBAAkB,OAAO;AAAA,EAClE,MAAMA,IAAE,QAAQ,iBAAiB;AAAA,EACjC,SAAS,wCAAwC;AAAA,IAC/C;AAAA,EACF;AACF,CAAC;AAGM,IAAM,+BAA+B,kBAAkB,OAAO;AAAA,EACnE,MAAMA,IAAE,QAAQ,kBAAkB;AAAA,EAClC,QAAQ,0BAA0B;AAAA,IAChC;AAAA,EACF;AAAA,EACA,iBAAiBA,IACd,MAAMA,IAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,yDAAyD;AACvE,CAAC;AAGM,IAAM,oBAAoB,kBAAkB,OAAO;AAAA,EACxD,MAAMA,IAAE,QAAQ,MAAM;AAAA,EACtB,MAAM,sBAAsB,SAAS,+BAA+B;AACtE,CAAC;AAGM,IAAM,4BAA4B,kBAAkB,OAAO;AAAA,EAChE,MAAMA,IAAE,QAAQ,eAAe;AAAA,EAC/B,UAAUA,IAAE,QAAQ,EAAE,SAAS,+BAA+B;AAAA,EAC9D,SAASA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAC7E,CAAC;AAGM,IAAM,sBAAsB,kBAAkB,OAAO;AAAA,EAC1D,MAAMA,IAAE,QAAQ,QAAQ;AAAA,EACxB,SAASA,IAAE,OAAO,EAAE,SAAS,wBAAwB;AACvD,CAAC;AAGM,IAAM,0BAA0B,kBAAkB,OAAO;AAAA,EAC9D,MAAMA,IAAE,QAAQ,aAAa;AAAA,EAC7B,UAAUA,IAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,EAChE,YAAYA,IAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,EAC9D,OAAOA,IAAE,QAAQ,EAAE,SAAS,qCAAqC;AAAA,EACjE,QAAQA,IAAE,QAAQ,EAAE,SAAS,6BAA6B;AAAA,EAC1D,UAAUA,IAAE,OAAO,EAAE,SAAS,2CAA2C;AAAA,EACzE,SAASA,IAAE,QAAQ,EAAE,SAAS,iCAAiC;AACjE,CAAC;AAGM,IAAM,sBAAsBA,IAAE,mBAAmB,QAAQ;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,IAAM,sBAAsBA,IAAE,OAAO;AAAA,EAC1C,QAAQA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,yCAAyC;AAAA,EAC5E,QAAQA,IACL,OAAO,EACP,SAAS,EACT,SAAS,4CAA4C;AAAA,EACxD,UAAUA,IACP,MAAM,mBAAmB,EACzB,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAGM,IAAM,uBAAuBA,IAAE,OAAO;AAAA,EAC3C,MAAMA,IACH,KAAK,CAAC,iBAAiB,QAAQ,mBAAmB,OAAO,CAAC,EAC1D,SAAS,eAAe;AAAA,EAC3B,eAAe,+BAA+B,SAAS;AAAA,EACvD,MAAM,sBAAsB,SAAS;AAAA,EACrC,gBAAgB,wCAAwC,SAAS;AAAA,EACjE,OAAOA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAASA,IAAE,QAAQ,EAAE,SAAS,8CAA8C;AAC9E,CAAC;AAGM,IAAM,0BAA0BA,IAAE,OAAO;AAAA,EAC9C,QAAQA,IACL,KAAK,CAAC,oBAAoB,gBAAgB,gBAAgB,CAAC,EAC3D,SAAS,oCAAoC;AAAA,EAChD,WAAWA,IAAE,MAAM,2BAA2B,EAAE,SAAS;AAAA,EACzD,MAAM,sBAAsB,SAAS;AAAA,EACrC,gBAAgB,+BAA+B,SAAS;AAC1D,CAAC;;;ADlSM,IAAM,+BAA+BC,IAAE,OAAO;AAAA,EACnD,QAAQA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,IAChC,aAAa;AAAA,IACb,SACE;AAAA,EACJ,CAAC;AAAA,EACD,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACpC,aACE;AAAA,IACF,SAAS;AAAA,EACX,CAAC;AAAA;AAAA,EAED,UAAUA,IAAE,MAAM,mBAAmB,EAAE,SAAS,EAAE,QAAQ;AAAA,IACxD,aACE;AAAA,EACJ,CAAC;AAAA;AAAA,EAED,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACzC,aACE;AAAA,IACF,SAAS;AAAA,EACX,CAAC;AACH,CAAC;AAEM,IAAM,uCAAuCA,IAAE,OAAO;AAAA,EAC3D,eAAeA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAChC,aAAa;AAAA,EACf,CAAC;AAAA,EACD,SAASA,IAAE,QAAQ,EAAE,QAAQ;AAAA,IAC3B,aAAa;AAAA,EACf,CAAC;AAAA,EACD,SAASA,IAAE,QAAQ;AAAA,EACnB,OAAOA,IAAE,OAAO;AAAA,EAChB,kBAAkBA,IAAE,OAAOA,IAAE,OAAO,GAAG,0BAA0B,EAAE,QAAQ;AAAA,IACzE,aAAa;AAAA,EACf,CAAC;AAAA,EACD,qBAAqBA,IAAE,OAAOA,IAAE,OAAO,GAAGA,IAAE,MAAMA,IAAE,OAAO,CAAC,CAAC,EAAE,QAAQ;AAAA,IACrE,aAAa;AAAA,EACf,CAAC;AACH,CAAC;AAMM,IAAM,yBAAyBA,IAAE,OAAO;AAAA,EAC7C,eAAeA,IACZ,OAAO,EACP,SAAS,0CAA0C;AAAA,EACtD,SAASA,IAAE,QAAQ,EAAE,SAAS,qCAAqC;AAAA,EACnE,SAASA,IAAE,QAAQ;AAAA,EACnB,OAAOA,IAAE,OAAO;AAAA,EAChB,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACpC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IACR,MAAMA,IAAE,QAAQ,CAAC,EACjB,SAAS,qCAAqC;AAAA,EACjD,SAASA,IACN,OAAO,EACP,QAAQ,EAAE,EACV,SAAS,sDAAsD;AAAA,EAClE,cAAcA,IACX,OAAO,EACP,QAAQ,EAAE,EACV,SAAS,0DAA0D;AAAA,EACtE,cAAcA,IAAE,MAAM,kBAAkB,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC3D,aACE;AAAA,EACJ,CAAC;AAAA,EACD,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACzC,aAAa;AAAA,EACf,CAAC;AAAA,EACD,YAAYA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACxC,aAAa;AAAA,EACf,CAAC;AAAA,EACD,kBAAkBA,IACf,OAAOA,IAAE,MAAM,CAACA,IAAE,OAAO,GAAGA,IAAE,OAAO,CAAC,CAAC,GAAG,0BAA0B,EACpE,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,EACJ,CAAC;AACL,CAAC;AAEM,IAAM,mCAAmCA,IAC7C,OAAO;AAAA,EACN,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,IAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,GAAG,EAAE,QAAQ;AAAA,IAC/C,aAAa;AAAA,IACb,SACE;AAAA,EACJ,CAAC;AAAA,EACD,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,GAAI,EAAE,QAAQ;AAAA,IAC1C,aACE;AAAA,IACF,SACE;AAAA,EACJ,CAAC;AAAA,EACD,SAASA,IAAE,QAAQ,sBAAsB,EAAE,QAAQ;AAAA,IACjD,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA;AAAA,EAED,WAAWA,IAAE,KAAK,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC9D,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,cAAcA,IAAE,KAAK,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ;AAAA,IACjE,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,cAAcA,IAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC3C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,oBAAoBA,IAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,IACjD,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,YAAYA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACxC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,mCAAmC;AAGvC,IAAM,2CAA2CA,IACrD,OAAO;AAAA,EACN,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,IACV,OAAO,EACP,IAAI,GAAG,EACP,QAAQ,8BAA8B,EACtC,QAAQ;AAAA,IACP,aACE;AAAA,IACF,SACE;AAAA,EACJ,CAAC;AAAA,EACH,mBAAmBA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,QAAQ;AAAA,IACrD,aACE;AAAA,IACF,SACE;AAAA,EACJ,CAAC;AAAA;AAAA,EAED,cAAcA,IAAE,KAAK,CAAC,QAAQ,OAAO,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC/D,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,mBAAmBA,IAChB,OAAO;AAAA,IACN,mBAAmBA,IAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,MAChD,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,2BAA2BA,IAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,MACxD,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,sBAAsBA,IAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,MACnD,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,cAAcA,IAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,MAC3C,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH,CAAC,EACA,SAAS;AAAA,EACZ,cAAcA,IACX,OAAO;AAAA,IACN,QAAQA,IAAE,KAAK,CAAC,OAAO,OAAO,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ;AAAA,MACxD,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,SAASA,IAAE,OAAO,EAAE,IAAI,GAAG,EAAE,IAAI,CAAG,EAAE,SAAS,EAAE,QAAQ;AAAA,MACvD,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,KAAKA,IAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ;AAAA,MAClD,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH,CAAC,EACA,SAAS;AAAA,EACZ,WAAWA,IACR,OAAO;AAAA,IACN,OAAOA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,MACnC,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,aAAaA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ;AAAA,MACvD,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,WAAWA,IAAE,OAAO,EAAE,IAAI,GAAI,EAAE,IAAI,GAAM,EAAE,SAAS,EAAE,QAAQ;AAAA,MAC7D,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,UAAUA,IAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAAA,MACvC,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH,CAAC,EACA,SAAS;AAAA,EACZ,UAAUA,IACP,OAAOA,IAAE,OAAO,GAAGA,IAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,IACF,SAAS,EAAE,mBAAmB,qCAAqC;AAAA,EACrE,CAAC;AACL,CAAC,EACA,QAAQ,2CAA2C;AAG/C,IAAM,mCAAmCA,IAC7C,OAAO;AAAA,EACN,IAAIA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACrB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC9B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,2BAA2BA,IAAE;AAAA,IAC3BA,IAAE,OAAO;AAAA,IACTA,IAAE,OAAO;AAAA,MACP,cAAcA,IAAE,OAAO;AAAA,MACvB,YAAYA,IAAE,OAAO;AAAA,MACrB,WAAWA,IAAE,OAAO;AAAA,MACpB,YAAYA,IAAE;AAAA,QACZA,IAAE,OAAO;AAAA,UACP,MAAMA,IAAE,OAAO;AAAA,UACf,OAAOA,IAAE,QAAQ;AAAA,UACjB,MAAMA,IAAE,WAAW,mBAAmB;AAAA,QACxC,CAAC;AAAA,MACH;AAAA,MACA,UAAUA,IAAE,QAAQ;AAAA,MACpB,eAAeA,IAAE,QAAQ;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EACA,kBAAkBA,IACf;AAAA,IACCA,IAAE,OAAO;AAAA,IACTA,IAAE,OAAO;AAAA,MACP,cAAcA,IAAE,OAAO;AAAA,MACvB,YAAYA,IAAE,OAAO;AAAA,MACrB,WAAWA,IAAE,OAAO;AAAA,MACpB,YAAYA,IAAE;AAAA,QACZA,IAAE,OAAO;AAAA,UACP,MAAMA,IAAE,OAAO;AAAA,UACf,OAAOA,IAAE,QAAQ;AAAA,UACjB,MAAMA,IAAE,WAAW,mBAAmB;AAAA,QACxC,CAAC;AAAA,MACH;AAAA,MACA,UAAUA,IAAE,QAAQ;AAAA,MACpB,eAAeA,IAAE,QAAQ;AAAA,IAC3B,CAAC;AAAA,EACH,EACC,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AAAA,EACH,qBAAqBA,IAClB,OAAOA,IAAE,OAAO,GAAGA,IAAE,MAAMA,IAAE,WAAW,cAAc,CAAC,CAAC,EACxD,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,IACF,SAAS;AAAA,MACP,uBAAuB,oCAA6B;AAAA,MACpD,sBAAsB,8BAA0B;AAAA,MAChD,eAAe,8CAAkC;AAAA,IACnD;AAAA,EACF,CAAC;AAAA,EACH,WAAWA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EAED,SAASA,IACN,OAAO;AAAA,IACN,IAAIA,IAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,cAAc,SAAS,IAAI,CAAC;AAAA,IAClE,KAAKA,IAAE,OAAO,EAAE,QAAQ;AAAA,MACtB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,MAAMA,IAAE,OAAO,EAAE,QAAQ;AAAA,MACvB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,QAAQA,IAAE,QAAQ,EAAE,QAAQ;AAAA,MAC1B,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH,CAAC,EACA,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AACL,CAAC,EACA,QAAQ,4BAA4B;;;AE7UvC,SAAS,KAAAC,WAAS;AAEX,IAAM,iCAAiCA,IAC3C,OAAO;AAAA,EACN,aAAaA,IAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,eAAe,CAAC;AAAA,EAC/D,SAASA,IAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,oBAAoB,CAAC;AAAA,EACjE,MAAMA,IAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,cAAc,CAAC;AAAA,EACnE,OAAOA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,gBAAgB,CAAC;AAAA,EACrE,SAASA,IACN,OAAO;AAAA,IACN,QAAQA,IAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,UAAU,CAAC;AAAA,IACrD,MAAMA,IAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,eAAe,CAAC;AAAA,IACxD,aAAaA,IAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,oBAAoB,CAAC;AAAA,IACpE,QAAQA,IAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,cAAc,CAAC;AAAA,EAC3D,CAAC,EACA,QAAQ,EAAE,aAAa,eAAe,CAAC;AAC5C,CAAC,EACA,QAAQ,0BAA0B;AAG9B,IAAM,wBAAwBA,IAClC,OAAO;AAAA;AAAA,EAEN,WAAWA,IACR,OAAO,EACP,SAAS,EACT,QAAQ,EAAE,aAAa,mCAAmC,CAAC;AAAA;AAAA,EAE9D,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,eAAe,CAAC;AAAA,EAC1E,SAASA,IACN,QAAQ,EACR,SAAS,EACT,QAAQ,EAAE,aAAa,oBAAoB,CAAC;AAAA,EAC/C,MAAMA,IACH,OAAOA,IAAE,OAAO,GAAGA,IAAE,QAAQ,CAAC,EAC9B,GAAGA,IAAE,UAAU,CAAC,EAChB,SAAS,EACT,QAAQ,EAAE,aAAa,cAAc,CAAC;AAAA,EACzC,OAAOA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,gBAAgB,CAAC;AAAA,EACrE,SAASA,IACN,OAAO;AAAA,IACN,QAAQA,IAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,UAAU,CAAC;AAAA,IACrD,MAAMA,IAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,eAAe,CAAC;AAAA,IACxD,aAAaA,IAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,oBAAoB,CAAC;AAAA,IACpE,QAAQA,IAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,cAAc,CAAC;AAAA,EAC3D,CAAC,EACA,SAAS,EACT,QAAQ,EAAE,aAAa,eAAe,CAAC;AAC5C,CAAC,EACA,QAAQ,iBAAiB;;;ACjD5B,SAAS,KAAAC,WAAS;;;ACKlB,SAAS,KAAAC,WAAS;AAMX,IAAM,gBAAgBA,IAC1B,KAAK,CAAC,SAAS,SAAS,QAAQ,CAAC,EACjC,QAAQ,SAAS;AAIb,IAAM,gBAAgBA,IAC1B,KAAK,CAAC,YAAY,cAAc,CAAC,EACjC,QAAQ,SAAS;AAQb,IAAM,qBAAqBA,IAC/B,OAAO;AAAA,EACN,IAAIA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACrB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAM;AAAA,EACN,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC/C,aACE;AAAA,IACF,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAM,cAAc,QAAQ;AAAA,IAC1B,aAAa;AAAA,EACf,CAAC;AAAA,EACD,aAAaA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC9B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,cAAc;AAIlB,IAAM,2BAA2B,mBACrC,OAAO;AAAA,EACN,eAAeA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAChC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,oBAAoB;AAIxB,IAAM,2BAA2BA,IACrC,OAAO;AAAA,EACN,QAAQA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACzB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,OAAOA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACxB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAClC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAM;AAAA,EACN,UAAUA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC3B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,oBAAoB;AAQxB,IAAM,2BAA2BA,IACrC,OAAO;AAAA,EACN,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,IACH,OAAO,EACP,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,gBAAgB,kDAAkD,EACxE,QAAQ;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACH,QAAQA,IACL,OAAO,EACP;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,IACF,SAAS;AAAA,EACX,CAAC;AACL,CAAC,EACA,QAAQ,2BAA2B;AAM/B,IAAM,2BAA2BA,IACrC,OAAO;AAAA,EACN,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ;AAAA,IAClD,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,IACH,OAAO,EACP,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,gBAAgB,kDAAkD,EACxE,SAAS,EACT,QAAQ;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACH,QAAQA,IACL,OAAO,EACP;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,SAAS,EACT,SAAS,EACT,QAAQ;AAAA,IACP,aACE;AAAA,IACF,SAAS;AAAA,EACX,CAAC;AACL,CAAC,EACA,QAAQ,2BAA2B;AAM/B,IAAM,kBAAkBA,IAC5B,OAAO;AAAA,EACN,OAAOA,IAAE,OAAO,EAAE,MAAM,EAAE,QAAQ;AAAA,IAChC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,IAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,EAAE,QAAQ;AAAA,IACxC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,kBAAkB;AAItB,IAAM,yBAAyBA,IACnC,OAAO;AAAA,EACN,MAAMA,IAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,EAAE,QAAQ;AAAA,IACxC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,yBAAyB;AAQ7B,IAAM,kCAAkCA,IAC5C,OAAO;AAAA,EACN,eAAeA,IAAE,MAAM,kBAAkB;AAC3C,CAAC,EACA,QAAQ,2BAA2B;AAM/B,IAAM,mCAAmCA,IAC7C,OAAO;AAAA,EACN,IAAIA,IAAE,OAAO;AAAA,EACb,MAAMA,IAAE,OAAO;AAAA,EACf,MAAMA,IAAE,OAAO;AAAA,EACf,WAAWA,IAAE,OAAO;AACtB,CAAC,EACA,QAAQ,4BAA4B;AAMhC,IAAM,4BAA4BA,IACtC,OAAO;AAAA,EACN,SAASA,IAAE,MAAM,wBAAwB;AAC3C,CAAC,EACA,QAAQ,qBAAqB;AAIzB,IAAM,0BAA0BA,IACpC,OAAO;AAAA,EACN,QAAQA,IAAE,OAAO;AAAA,EACjB,MAAM;AAAA,EACN,UAAUA,IAAE,OAAO;AACrB,CAAC,EACA,QAAQ,mBAAmB;AAIvB,IAAM,iCAAiCA,IAC3C,OAAO;AAAA,EACN,QAAQA,IAAE,OAAO;AAAA,EACjB,MAAM;AACR,CAAC,EACA,QAAQ,0BAA0B;AAM9B,IAAM,wBAAwBA,IAClC,OAAO;AAAA,EACN,SAASA,IAAE,QAAQ;AACrB,CAAC,EACA,QAAQ,iBAAiB;;;AD/PrB,IAAM,mBAAmBC,IAC7B,OAAO;AAAA,EACN,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC9B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,cAAcA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC/B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,aAAaA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC9B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,YAAY;AAOhB,IAAM,cAAcA,IACxB,OAAO;AAAA,EACN,gBAAgBA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACjC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,YAAYA,IAAE,MAAM,gBAAgB,EAAE,QAAQ;AAAA,IAC5C,aAAa;AAAA,EACf,CAAC;AAAA,EACD,cAAcA,IAAE,MAAM,kBAAkB,EAAE,QAAQ;AAAA,IAChD,aAAa;AAAA,EACf,CAAC;AAAA,EACD,sBAAsBA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAClD,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,OAAO;AAOX,IAAM,4BAA4BA,IACtC,OAAO;AAAA,EACN,IAAIA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACrB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAM,cAAc,SAAS,EAAE,QAAQ;AAAA,IACrC,aAAa;AAAA,EACf,CAAC;AAAA,EACD,MAAM,cAAc,QAAQ;AAAA,IAC1B,aAAa;AAAA,EACf,CAAC;AAAA,EACD,aAAaA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC9B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,qBAAqB;AASzB,IAAM,uBAAuBA,IACjC,OAAO;AAAA,EACN,UAAUA,IAAE,QAAQ,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,YAAYA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC7B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,gBAAgB;AAKpB,IAAM,qBAAqBA,IAC/B,OAAO;AAAA,EACN,UAAUA,IAAE,QAAQ,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACvC,aACE;AAAA,IACF,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,cAAc;AAKlB,IAAM,4BAA4BA,IACtC,OAAO;AAAA,EACN,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,IAC9B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,qBAAqB;AAKzB,IAAM,6BAA6BA,IACvC,OAAO;AAAA,EACN,SAASA,IAAE,QAAQ,EAAE,QAAQ;AAAA,IAC3B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,SAASA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,sBAAsB;AAI1B,IAAM,mCAAmCA,IAC7C,OAAO;AAAA,EACN,QAAQA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACzB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAMA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,iBAAiBA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAClC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,UAAUA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,IACpC,aAAa;AAAA,IACb,SAAS,CAAC,mBAAmB,kBAAkB;AAAA,EACjD,CAAC;AAAA;AAAA,EAED,cAAc,0BAA0B,SAAS,EAAE,QAAQ;AAAA,IACzD,aACE;AAAA,EACJ,CAAC;AAAA;AAAA,EAED,OAAOA,IAAE,OAAO;AAAA,IACd,gBAAgBA,IAAE,OAAO,EAAE,QAAQ;AAAA,MACjC,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,gBAAgBA,IAAE,OAAO,EAAE,QAAQ;AAAA,MACjC,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,aAAaA,IAAE,OAAO,EAAE,QAAQ;AAAA,MAC9B,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,iBAAiBA,IAAE,OAAO,EAAE,QAAQ;AAAA,MAClC,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,sBAAsBA,IAAE,OAAO,EAAE,QAAQ;AAAA,MACvC,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,WAAWA,IAAE,OAAO,EAAE,QAAQ;AAAA,MAC5B,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,YAAYA,IAAE,MAAM,gBAAgB,EAAE,QAAQ;AAAA,MAC5C,aAAa;AAAA,IACf,CAAC;AAAA,IACD,cAAcA,IAAE,MAAM,kBAAkB,EAAE,QAAQ;AAAA,MAChD,aAAa;AAAA,IACf,CAAC;AAAA,EACH,CAAC;AAAA;AAAA,EAED,eAAe,YAAY,SAAS,EAAE,QAAQ;AAAA,IAC5C,aACE;AAAA,EACJ,CAAC;AAAA,EACD,UAAUA,IAAE,QAAQ,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,gBAAgB,qBAAqB,SAAS,EAAE,QAAQ;AAAA,IACtD,aAAa;AAAA,EACf,CAAC;AAAA,EACD,cAAc,mBAAmB,SAAS,EAAE,QAAQ;AAAA,IAClD,aACE;AAAA,EACJ,CAAC;AACH,CAAC,EACA,QAAQ,4BAA4B;AAahC,IAAM,sBAAsBA,IAChC,OAAO;AAAA,EACN,QAAQA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACzB,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACtC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IACvC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAM,cAAc,QAAQ;AAAA,IAC1B,aAAa;AAAA,EACf,CAAC;AAAA,EACD,gBAAgBA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACjC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH,CAAC,EACA,QAAQ,eAAe;AAQnB,IAAM,kCAAkCA,IAC5C,OAAO;AAAA,EACN,gBAAgBA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACjC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,kBAAkBA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC9C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,WAAWA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,cAAcA,IAAE,OAAO,EAAE,QAAQ;AAAA,IAC/B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,oBAAoBA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACrC,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAAA,EACD,OAAOA,IAAE,MAAM,mBAAmB,EAAE,QAAQ;AAAA,IAC1C,aAAa;AAAA,EACf,CAAC;AACH,CAAC,EACA,QAAQ,2BAA2B;AAa/B,SAAS,eACd,cACS;AACT,QAAM,OAAO,aAAa,cAAc;AACxC,SAAO,SAAS,WAAW,SAAS;AACtC;AAKO,SAAS,SAAS,cAAmD;AAC1E,QAAM,OAAO,aAAa,cAAc;AACxC,SAAO,SAAS;AAClB;;;AEvVA,SAAS,KAAAC,WAAS;;;ACAlB,SAAS,KAAAC,WAAS;AAGX,IAAM,kBAAkBA,IAAE,KAAK;AAAA;AAAA,EAEpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;AC/BD,SAAS,KAAAC,WAAS;AACX,IAAM,uBAAqC,CAAC,yBAAyB;AAErE,IAAM,4BAA4BA,IAAE,OAAO;AAAA,EAChD,MAAMA,IACH,KAAK,CAAC,QAAQ,aAAa,MAAM,CAAC,EAClC,SAAS,gCAAgC;AAAA,EAC5C,SAASA,IAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA,EAClD,YAAYA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,EAC3E,MAAMA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AACpE,CAAC;;;AFAM,IAAM,uBAAuBC,IAAE,OAAO;AAAA,EAC3C,aAAaA,IACV,OAAO,EACP,IAAI,GAAG,0BAA0B,EACjC,SAAS,2DAA2D;AAAA,EAEvE,YAAYA,IACT,OAAO,EACP,IAAI,GAAG,yBAAyB,EAChC,SAAS,0DAA0D;AAAA,EAEtE,cAAcA,IACX,OAAOA,IAAE,QAAQ,CAAC,EAClB;AAAA,IACC;AAAA,EACF;AAAA,EAEF,aAAaA,IACV,OAAO,EACP,SAAS,EACT,SAAS,kDAAkD;AAAA,EAE9D,sBAAsBA,IACnB,MAAMA,IAAE,OAAO,CAAC,EAChB,QAAQ,CAAC,CAAC,EACV,SAAS,gDAAgD;AAAA,EAE5D,UAAUA,IAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,EAEnE,gBAAgBA,IACb,OAAO,EACP,SAAS,EACT,SAAS,uDAAuD;AAAA,EAEnE,qBAAqBA,IAClB,MAAM,yBAAyB,EAC/B,SAAS,EACT,QAAQ,CAAC,CAAC,EACV;AAAA,IACC;AAAA,EACF;AAAA,EAEF,OAAO,gBAAgB,QAAQ,uBAAuB,EAAE;AAAA,IACtD;AAAA,EACF;AACF,CAAC;AAKM,IAAM,wBAAwBA,IAAE,OAAO;AAAA,EAC5C,MAAMA,IACH,KAAK,CAAC,QAAQ,YAAY,QAAQ,CAAC,EACnC;AAAA,IACC;AAAA,EACF;AAAA,EAEF,SAASA,IACN,OAAO,EACP;AAAA,IACC;AAAA,EACF;AAAA,EAEF,SAASA,IACN,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EAEF,SAASA,IAAE,QAAQ,EAAE,SAAS,8CAA8C;AAAA,EAE5E,OAAOA,IACJ,OAAO,EACP,SAAS,EACT,SAAS,uCAAuC;AACrD,CAAC;AAKM,IAAM,2BAA2BA,IAAE,OAAO;AAAA,EAC/C,MAAMA,IAAE,KAAK,CAAC,QAAQ,YAAY,QAAQ,CAAC;AAAA,EAC3C,SAASA,IAAE,OAAO;AAAA,EAClB,SAASA,IAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;;;AGhGD,SAAS,KAAAC,WAAS;AAMX,IAAM,sBACX;AAKK,IAAM,qBAAqBC,IAAE,OAAO;AAAA,EACzC,aAAaA,IACV,OAAO,EACP,IAAI,GAAG,0BAA0B,EACjC,SAAS,wDAAwD;AAAA,EAEpE,aAAaA,IACV,OAAO,EACP,SAAS,EACT,SAAS,wDAAwD;AAAA,EAEpE,UAAUA,IAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,EACnE,oBAAoBA,IACjB,MAAMA,IAAE,IAAI,CAAC,EACb,SAAS,iDAAiD;AAAA,EAC7D,qBAAqBA,IAClB,MAAM,yBAAyB,EAC/B,SAAS,EACT,QAAQ,CAAC,CAAC,EACV;AAAA,IACC;AAAA,EACF;AAAA,EAEF,OAAO,gBAAgB,QAAQ,mBAAmB,EAAE;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,mBAAmBA,IAChB,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EAEF,eAAeA,IACZ;AAAA,IACCA,IAAE,OAAO;AAAA,MACP,MAAMA,IAAE,OAAO,EAAE,SAAS,WAAW;AAAA,MACrC,SAASA,IACN,OAAO,EACP;AAAA,QACC;AAAA,MACF;AAAA,MACF,UAAUA,IACP,KAAK,CAAC,SAAS,MAAM,CAAC,EACtB,SAAS,mDAAmD;AAAA,IACjE,CAAC;AAAA,EACH,EACC,SAAS,EACT,QAAQ,CAAC,CAAC,EACV;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAKM,IAAM,sBAAsBA,IAAE,OAAO;AAAA,EAC1C,MAAMA,IACH,KAAK,CAAC,QAAQ,YAAY,UAAU,QAAQ,CAAC,EAC7C;AAAA,IACC;AAAA,EACF;AAAA,EAEF,SAASA,IACN,OAAO,EACP;AAAA,IACC;AAAA,EACF;AAAA,EAEF,SAASA,IACN,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EAEF,kBAAkBA,IACf,OAAOA,IAAE,OAAO,GAAG,0BAA0B,EAC7C,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EAEF,aAAaA,IACV,OAAOA,IAAE,QAAQ,CAAC,EAClB,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EAEF,qBAAqBA,IAClB,OAAOA,IAAE,OAAO,GAAGA,IAAE,MAAMA,IAAE,WAAW,cAAc,CAAC,CAAC,EACxD,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EAEF,SAASA,IAAE,QAAQ,EAAE,SAAS,8CAA8C;AAAA,EAE5E,OAAOA,IACJ,OAAO,EACP,SAAS,EACT,SAAS,uCAAuC;AACrD,CAAC;AAKM,IAAM,yBAAyBA,IAAE,OAAO;AAAA,EAC7C,MAAMA,IAAE,KAAK,CAAC,QAAQ,YAAY,UAAU,UAAU,MAAM,CAAC;AAAA,EAC7D,SAASA,IAAE,OAAO;AAAA,EAClB,SAASA,IAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;;;AC9HD,SAAS,KAAAC,WAAS;;;ACSX,IAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AACT;;;ADbO,IAAM,qBAAqC,mBAAmB;AAS9D,IAAM,sBAAsBC,IAChC,KAAK,CAAC,SAAS,YAAY,OAAO,CAAC,EACnC,SAAS;AAQL,IAAM,6BAA6BA,IAAE,OAAO;AAAA,EACjD,SAASA,IACN,QAAQ,EACR;AAAA,IACC;AAAA,EACF;AAAA,EAEF,WAAW,oBAAoB;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,SAASA,IACN,OAAO,EACP;AAAA,IACC;AAAA,EACF;AAAA,EAEF,QAAQA,IACL,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,EAAE,EACN;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAMM,IAAM,oBAAoBA,IAAE,OAAO;AAAA,EACxC,eAAeA,IACZ,MAAMA,IAAE,QAAQ,CAAC,EACjB,SAAS,oCAAoC;AAAA,EAEhD,cAAcA,IACX,OAAO,EACP,SAAS,8CAA8C;AAAA,EAE1D,aAAaA,IAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,EAEtE,cAAcA,IAAE,OAAO,EAAE,SAAS,sCAAsC;AAAA,EAExE,OAAO,gBAAgB,SAAS,EAC7B,QAAQ,kBAAkB,EAC1B,SAAS,qCAAqC;AACnD,CAAC;AAKM,IAAM,qBAAqBA,IAAE,OAAO;AAAA,EACzC,SAASA,IACN,QAAQ,EACR,SAAS,+CAA+C;AAAA,EAE3D,YAAY,2BAA2B,SAAS,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,OAAOA,IACJ,OAAO,EACP,SAAS,EACT,SAAS,wCAAwC;AACtD,CAAC;;;AE9DM,SAAS,oBAAoB,YAAoC;AACtE,QAAM,QAAQ,WAAW,KAAK,EAAE,MAAM,KAAK;AAE3C,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,mDAAmD,MAAM,MAAM;AAAA,IACjE;AAAA,EACF;AAEA,QAAM,CAAC,QAAQ,MAAM,YAAY,OAAO,SAAS,IAAI;AAErD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ;AACF;AAOO,SAAS,uBAAuB,YAGrC;AACA,MAAI;AACF,UAAM,OAAO,oBAAoB,UAAU;AAG3C,UAAM,cAAc;AAAA,MAClB,kBAAkB,KAAK,QAAQ,GAAG,IAAI,QAAQ;AAAA,MAC9C,kBAAkB,KAAK,MAAM,GAAG,IAAI,MAAM;AAAA,MAC1C,kBAAkB,KAAK,YAAY,GAAG,IAAI,cAAc;AAAA,MACxD,kBAAkB,KAAK,OAAO,GAAG,IAAI,OAAO;AAAA,MAC5C,kBAAkB,KAAK,WAAW,GAAG,GAAG,aAAa;AAAA,IACvD;AAEA,eAAW,cAAc,aAAa;AACpC,UAAI,CAAC,WAAW,OAAO;AACrB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB,SAAS,OAAO;AACd,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD;AAAA,EACF;AACF;AAKA,SAAS,kBACP,OACA,KACA,KACA,WACoC;AAEpC,MAAI,UAAU,IAAK,QAAO,EAAE,OAAO,KAAK;AAGxC,MAAI,MAAM,WAAW,IAAI,GAAG;AAC1B,UAAM,OAAO,SAAS,MAAM,UAAU,CAAC,GAAG,EAAE;AAC5C,QAAI,MAAM,IAAI,KAAK,QAAQ,GAAG;AAC5B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,yBAAyB,SAAS,KAAK,KAAK;AAAA,MACrD;AAAA,IACF;AACA,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB;AAGA,MAAI,MAAM,SAAS,GAAG,GAAG;AACvB,UAAM,CAAC,OAAO,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAChE,QAAI,MAAM,KAAK,KAAK,MAAM,GAAG,KAAK,QAAQ,OAAO,MAAM,OAAO,QAAQ,KAAK;AACzE,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,oBAAoB,SAAS,KAAK,KAAK,aAAa,GAAG,IAAI,GAAG;AAAA,MACvE;AAAA,IACF;AACA,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB;AAGA,MAAI,MAAM,SAAS,GAAG,GAAG;AACvB,UAAM,SAAS,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,EAAE,KAAK,GAAG,EAAE,CAAC;AACjE,eAAW,OAAO,QAAQ;AACxB,UAAI,MAAM,GAAG,KAAK,MAAM,OAAO,MAAM,KAAK;AACxC,eAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO,oBAAoB,SAAS,UAAU,GAAG,aAAa,GAAG,IAAI,GAAG;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB;AAGA,QAAM,QAAQ,SAAS,OAAO,EAAE;AAChC,MAAI,MAAM,KAAK,KAAK,QAAQ,OAAO,QAAQ,KAAK;AAC9C,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,WAAW,SAAS,KAAK,KAAK,aAAa,GAAG,IAAI,GAAG;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAOO,SAAS,uBAAuB,YAA4B;AACjE,MAAI;AACF,UAAM,OAAO,oBAAoB,UAAU;AAG3C,QAAI,eAAe,YAAa,QAAO;AACvC,QAAI,eAAe,YAAa,QAAO;AACvC,QAAI,eAAe,YAAa,QAAO;AACvC,QAAI,eAAe,YAAa,QAAO;AACvC,QAAI,eAAe,YAAa,QAAO;AACvC,QAAI,eAAe,YAAa,QAAO;AAGvC,QAAI,KAAK,OAAO,WAAW,IAAI,GAAG;AAChC,YAAM,OAAO,KAAK,OAAO,UAAU,CAAC;AACpC,aAAO,SAAS,IAAI,UAAU,SAAS,MAAM,KAAK,GAAG;AAAA,IACvD;AACA,QAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,KAAK;AACrD,YAAM,OAAO,KAAK,KAAK,UAAU,CAAC;AAClC,aAAO,SAAS,IAAI,QAAQ,SAAS,MAAM,KAAK,GAAG;AAAA,IACrD;AAGA,QAAI,KAAK,cAAc,SAAS,KAAK,SAAS,OAAO,KAAK,WAAW,KAAK;AACxE,aAAO;AAAA,IACT;AAGA,QAAI,cAAc;AAGlB,QAAI,KAAK,WAAW,OAAO,KAAK,SAAS,KAAK;AAC5C,YAAM,OAAO,SAAS,KAAK,MAAM,EAAE;AACnC,YAAM,SAAS,SAAS,KAAK,QAAQ,EAAE;AACvC,YAAM,OAAO,QAAQ,KAAK,OAAO;AACjC,YAAM,SAAS,OAAO,MAAM;AAC5B,qBAAe,GAAG,MAAM,IAAI,OAAO,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI;AAAA,IACxE,WAAW,KAAK,WAAW,KAAK;AAC9B,qBAAe,UAAU,KAAK,MAAM;AAAA,IACtC,WAAW,KAAK,SAAS,KAAK;AAC5B,qBAAe,QAAQ,KAAK,IAAI;AAAA,IAClC;AAGA,QAAI,KAAK,eAAe,KAAK;AAC3B,qBAAe,WAAW,KAAK,UAAU;AAAA,IAC3C;AACA,QAAI,KAAK,cAAc,KAAK;AAC1B,YAAM,OAAO;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,KAAK,UAAU,SAAS,GAAG,GAAG;AAChC,cAAM,CAAC,OAAO,GAAG,IAAI,KAAK,UACvB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAC7B,uBAAe,OAAO,KAAK,KAAK,CAAC,YAAY,KAAK,GAAG,CAAC;AAAA,MACxD,OAAO;AACL,cAAM,MAAM,SAAS,KAAK,WAAW,EAAE;AACvC,uBAAe,OAAO,KAAK,GAAG,CAAC;AAAA,MACjC;AAAA,IACF;AAGA,QAAI,KAAK,UAAU,KAAK;AACtB,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,QAAQ,SAAS,KAAK,OAAO,EAAE;AACrC,qBAAe,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,IACzC;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;AAOO,SAAS,oBAAoB,YAAsC;AACxE,QAAM,aAAa,uBAAuB,UAAU;AAEpD,MAAI,CAAC,WAAW,OAAO;AACrB,WAAO;AAAA,MACL,YAAY;AAAA,QACV,WAAW,MAAM,KAAK,EAAE,WAAW,IAAI,aAAa;AAAA,MACtD;AAAA,MACA,aAAa;AAAA,MACb,SAAS;AAAA,MACT,OAAO,WAAW;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,oBAAoB,UAAU;AAAA,IAC1C,aAAa,uBAAuB,UAAU;AAAA,IAC9C,SAAS;AAAA,EACX;AACF;;;ACjQO,IAAM,wBAAwB;AAAA,EACnC,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,iBAAiB;AAAA,EACjB,gBAAgB;AAClB;AAGO,SAAS,0BACd,WAC+C;AAC/C,SAAO,aAAa;AACtB;AAyRO,IAAM,wBAGT;AAAA,EACF,0BAA0B;AAAA,IACxB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aACE;AAAA,IACF,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA6BZ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,QACxD,SAAS;AAAA,UACP,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,MAAM,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,QACtE,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aACE;AAAA,UACF,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY;AAAA,cACV,IAAI,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,cAC5D,MAAM,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,cAC/D,OAAO,EAAE,MAAM,UAAU,aAAa,gBAAgB;AAAA,cACtD,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,cAC1D,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,sBAAsB;AAAA,gBACpB,MAAM;AAAA,gBACN,aACE;AAAA,cACJ;AAAA,cACA,WAAW;AAAA,gBACT,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,WAAW;AAAA,gBACT,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,WAAW;AAAA,gBACT,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,aAAa;AAAA,UACX,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,YAC3D,SAAS,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,YACvD,YAAY,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,YAC1D,MAAM;AAAA,cACJ,MAAM;AAAA,cACN,MAAM,CAAC,gBAAgB;AAAA,cACvB,aAAa;AAAA,YACf;AAAA,YACA,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,YAC3D,YAAY,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,YAC7D,eAAe,EAAE,MAAM,UAAU,aAAa,gBAAgB;AAAA,YAC9D,gBAAgB;AAAA,cACd,MAAM;AAAA,cACN,aAAa;AAAA,cACb,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,YAAY;AAAA,kBACV,eAAe,EAAE,MAAM,SAAS;AAAA,kBAChC,SAAS,EAAE,MAAM,SAAS;AAAA,kBAC1B,SAAS,EAAE,MAAM,SAAS;AAAA,kBAC1B,QAAQ,EAAE,MAAM,UAAU;AAAA,gBAC5B;AAAA,cACF;AAAA,YACF;AAAA,YACA,OAAO;AAAA,cACL,MAAM;AAAA,cACN,aAAa;AAAA,cACb,YAAY;AAAA,gBACV,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,MAAM,CAAC,SAAS;AAAA,kBAChB,aAAa;AAAA,gBACf;AAAA,gBACA,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,aAAa;AAAA,gBACf;AAAA,gBACA,MAAM,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,gBAC5D,IAAI,EAAE,MAAM,UAAU,aAAa,oBAAoB;AAAA,gBACvD,SAAS,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,gBACrD,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,gBAC3D,cAAc;AAAA,kBACZ,MAAM;AAAA,kBACN,MAAM,CAAC,WAAW,SAAS,MAAM,MAAM;AAAA,kBACvC,aAAa;AAAA,gBACf;AAAA,gBACA,SAAS;AAAA,kBACP,MAAM;AAAA,kBACN,aACE;AAAA,gBACJ;AAAA,gBACA,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,aAAa;AAAA,gBACf;AAAA,cACF;AAAA,cACA,UAAU;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA,UAAU;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU,CAAC,QAAQ,WAAW,QAAQ,aAAa;AAAA,IACrD;AAAA,EACF;AAAA,EACA,uBAAuB;AAAA,IACrB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA2BZ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,SAAS;AAAA,UACP,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,MAAM,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,QACrE,WAAW;AAAA,UACT,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aACE;AAAA,UACF,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY;AAAA,cACV,IAAI,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,cAC5D,MAAM,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,cAC/D,OAAO,EAAE,MAAM,UAAU,aAAa,gBAAgB;AAAA,cACtD,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,cAC1D,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,sBAAsB;AAAA,gBACpB,MAAM;AAAA,gBACN,aACE;AAAA,cACJ;AAAA,cACA,WAAW;AAAA,gBACT,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,WAAW;AAAA,gBACT,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,WAAW;AAAA,gBACT,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,aAAa;AAAA,UACX,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,YAC3D,SAAS,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,YACvD,YAAY,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,YAC1D,MAAM;AAAA,cACJ,MAAM;AAAA,cACN,MAAM,CAAC,gBAAgB;AAAA,cACvB,aAAa;AAAA,YACf;AAAA,YACA,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,YAC3D,YAAY,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,YAC7D,eAAe,EAAE,MAAM,UAAU,aAAa,gBAAgB;AAAA,YAC9D,gBAAgB;AAAA,cACd,MAAM;AAAA,cACN,aAAa;AAAA,cACb,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,YAAY;AAAA,kBACV,eAAe,EAAE,MAAM,SAAS;AAAA,kBAChC,SAAS,EAAE,MAAM,SAAS;AAAA,kBAC1B,SAAS,EAAE,MAAM,SAAS;AAAA,kBAC1B,QAAQ,EAAE,MAAM,UAAU;AAAA,gBAC5B;AAAA,cACF;AAAA,YACF;AAAA,YACA,OAAO;AAAA,cACL,MAAM;AAAA,cACN,aAAa;AAAA,cACb,YAAY;AAAA,gBACV,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,MAAM,CAAC,aAAa;AAAA,kBACpB,aAAa;AAAA,gBACf;AAAA,gBACA,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,aAAa;AAAA,gBACf;AAAA,gBACA,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,aAAa;AAAA,gBACf;AAAA,gBACA,IAAI,EAAE,MAAM,UAAU,aAAa,oBAAoB;AAAA,gBACvD,SAAS,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,gBACrD,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,gBAC3D,WAAW;AAAA,kBACT,MAAM;AAAA,kBACN,aAAa;AAAA,gBACf;AAAA,gBACA,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,aAAa;AAAA,gBACf;AAAA,cACF;AAAA,cACA,UAAU,CAAC,QAAQ,QAAQ,QAAQ,MAAM,WAAW,UAAU;AAAA,YAChE;AAAA,UACF;AAAA,UACA,UAAU;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU,CAAC,QAAQ,WAAW,QAAQ,aAAa;AAAA,IACrD;AAAA,EACF;AAAA,EACA,2BAA2B;AAAA,IACzB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAmBZ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,QAC3D,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,gBAAgB;AAAA,UACd,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,WAAW,YAAY,gBAAgB;AAAA,IACpD;AAAA,EACF;AAAA,EACA,2BAA2B;AAAA,IACzB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBZ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,QAC3D,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,gBAAgB;AAAA,UACd,MAAM;AAAA,UACN,aACE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,UAAU,CAAC,WAAW,YAAY,gBAAgB;AAAA,IACpD;AAAA,EACF;AAAA,EACA,2BAA2B;AAAA,IACzB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBZ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,QAC3D,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,gBAAgB;AAAA,UACd,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,WAAW,YAAY,gBAAgB;AAAA,IACpD;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aACE;AAAA,IACF,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsCZ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,YAAY,CAAC;AAAA,MACb,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA6BZ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,YAAY,CAAC;AAAA,MACb,sBAAsB;AAAA,IACxB;AAAA,EACF;AACF;AAOO,SAAS,sBACd,WACoB;AACpB,SAAO,sBAAsB,SAAS;AACxC;AAMO,SAAS,iBACd,WACS;AACT,SAAO,cAAc,kBAAkB,cAAc;AACvD;AAMO,IAAM,8BAGT;AAAA,EACF,mBAAmB;AAAA,EACnB,2BAA2B;AAAA,EAC3B,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,WAAW;AAAA,EACX,cAAc;AAAA,EACd,oBAAoB;AAAA;AACtB;AAOO,SAAS,qCACd,eAC8C;AAC9C,SAAO,4BAA4B,aAAa;AAClD;;;ACv4BO,SAAS,kBACd,OACA,SACe;AACf,QAAM,WAAW,SAAS,YAAY,OAAO;AAC7C,QAAM,eAAe,SAAS,gBAAgB;AAE9C,MAAI;AACF,UAAM,OAAO,KAAK,UAAU,KAAK;AAEjC,UAAM,YACJ,OAAO,gBAAgB,cACnB,IAAI,YAAY,EAAE,OAAO,IAAI,EAAE,SAC7B,WAAmB,QAAQ,aAAa,MAAM,MAAM,KACtD,KAAK;AACX,QAAI,YAAY,UAAU;AAExB,cAAQ;AAAA,QACN,4BAA4B,SAAS,MAAM,QAAQ;AAAA,MACrD;AAGA,YAAM,gBACJ,KAAK,MAAM,GAAG,YAAY,IAAI;AAChC,aAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF,SAAS,MAAM;AAEb,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAEO,SAAS,kCACd,KACA,WAAmB,OAAO,MACjB;AACT,QAAM,gBAAgB,kBAAkB,KAAK,EAAE,SAAS,CAAC;AACzD,MAAI,cAAc,WAAW;AAC3B,WAAO,cAAc;AAAA,EACvB;AACA,SAAO;AACT;;;AC9DO,SAAS,eACd,QACyB;AAEzB,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,WAAW,aAAa,CAAC;AAAA,EACzE;AACF;;;ACVO,SAAS,oBAAoB,cAA8B;AAChE,MAAI,WAAW;AAIf,QAAM,yBACJ;AACF,MAAI,uBAAuB,KAAK,QAAQ,GAAG;AACzC,UAAM,gBAAgB,OAAO,KAAK,qBAAqB;AACvD,UAAM,OAAO;AAAA,iCAAoC,cAAc,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC;AAC9F,eAAW,WAAW;AAAA,EACxB;AAIA,QAAM,sBACJ;AACF,MACE,oBAAoB,KAAK,QAAQ,KACjC,CAAC,SAAS,SAAS,+BAA+B,GAClD;AACA,UAAM,gBAAgB,OAAO,KAAK,qBAAqB;AACvD,UAAM,OAAO;AAAA,iCAAoC,cAAc,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC;AAC9F,eAAW,WAAW;AAAA,EACxB;AAIA,QAAM,qBAAqB;AAC3B,MAAI,mBAAmB,KAAK,QAAQ,GAAG;AACrC,UAAM,OACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBF,eAAW,WAAW;AAAA,EACxB;AAKA,QAAM,6BACJ;AACF,QAAM,mBAAmB,SAAS,MAAM,0BAA0B;AAClE,MAAI,kBAAkB;AACpB,UAAM,CAAC,EAAE,YAAY,IAAI;AACzB,UAAM,OACJ;AAAA,gCAAmC,YAAY;AAAA;AAEjD,eAAW,WAAW;AAAA,EACxB;AAIA,QAAM,yBAAyB;AAC/B,MACE,uBAAuB,KAAK,QAAQ,KACpC,CAAC,SAAS,SAAS,uBAAuB,GAC1C;AACA,UAAM,OACJ;AAAA;AAAA;AAAA;AAAA;AAGF,eAAW,WAAW;AAAA,EACxB;AAIA,QAAM,0BACJ;AACF,QAAM,wBAAwB,SAAS,MAAM,uBAAuB;AACpE,MAAI,uBAAuB;AACzB,UAAM,CAAC,EAAE,YAAY,UAAU,IAAI;AACnC,UAAM,OACJ;AAAA,GAAM,UAAU,2BAA2B,UAAU;AAEvD,eAAW,WAAW;AAAA,EACxB;AAEA,SAAO;AACT;;;AC3FO,SAAS,iBAAiB,OAAuB;AACtD,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAQ,MAAM,WAAW,CAAC;AAC1B,WAAQ,OAAO,aAAc;AAAA,EAC/B;AAEA,QAAM,SAAS,MAAU,OAAO;AAChC,SAAO;AACT;AAWO,SAAS,iBACd,YACA,iBACQ;AACR,SAAO,GAAG,UAAU,IAAI,eAAe;AACzC;;;AC1BA,IAAM,4BAA4B;AAAA,EAChC;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAOO,SAAS,wBAAwB,OAAwB;AAC9D,SAAO,0BAA0B,KAAK,CAAC,YAAY,MAAM,SAAS,OAAO,CAAC;AAC5E;AAMO,SAAS,qBAAqB,OAAgB,MAAsB;AACzE,UAAQ,MAAM;AAAA,IACZ,KAAK,UAAU;AACb,YAAM,cAAc,OAAO,KAAK;AAEhC,UAAI,YAAY,WAAW,GAAG,KAAK,YAAY,SAAS,GAAG,GAAG;AAC5D,eAAO;AAAA,MACT;AAGA,YAAM,eAAe,YAAY,QAAQ,MAAM,KAAK;AACpD,aAAO,IAAI,YAAY;AAAA,IACzB;AAAA,IACA,KAAK;AACH,aAAO,OAAO,KAAK;AAAA,IACrB,KAAK;AACH,aAAO,OAAO,KAAK;AAAA,IACrB,KAAK;AAEH,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,UAAU,MAAM,KAAK;AAE3B,YAAI,wBAAwB,OAAO,GAAG;AACpC,iBAAO;AAAA,QACT;AACA,YACG,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAChD,QAAQ,WAAW,MAAM,GACzB;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,IACtC,KAAK;AACH,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,UAAU,MAAM,KAAK;AAE3B,YAAI,wBAAwB,OAAO,GAAG;AACpC,iBAAO;AAAA,QACT;AACA,YAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,KAAK,UAAU,KAAK;AAAA,IAC7B,KAAK;AACH,aAAO,eAAe,OAAO,KAAK,CAAC;AAAA,IACrC,KAAK;AACH,aAAO,OAAO,KAAK;AAAA;AAAA,IACrB,KAAK;AACH,aAAO,OAAO,KAAK;AAAA;AAAA,IACrB;AACE,aAAO,KAAK,UAAU,KAAK;AAAA,EAC/B;AACF;AAMO,SAAS,qBAAqB,OAAuB;AAC1D,SAAO,MACJ,QAAQ,aAAa,GAAG,EACxB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,IAAI,EACtB,QAAQ,UAAU,IAAI,EACtB,QAAQ,YAAY,IAAI,EACxB,KAAK;AACV;AAMO,SAAS,4BAA4B,OAAuB;AACjE,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,MAAI,gBAAgB;AACpB,MAAI,iBAAiB;AACrB,MAAI,aAAa;AAEjB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,KAAK,MAAM,CAAC;AAClB,UAAM,OAAO,IAAI,IAAI,MAAM,SAAS,MAAM,IAAI,CAAC,IAAI;AAEnD,QAAI,eAAe;AACjB,UAAI,OAAO,MAAM;AACf,wBAAgB;AAChB,kBAAU;AAAA,MACZ;AACA;AAAA,IACF;AAEA,QAAI,gBAAgB;AAClB,UAAI,OAAO,OAAO,SAAS,KAAK;AAC9B,yBAAiB;AACjB;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,UAAI,YAAY;AACd,kBAAU;AACV,qBAAa;AACb;AAAA,MACF;AACA,UAAI,OAAO,MAAM;AACf,kBAAU;AACV,qBAAa;AACb;AAAA,MACF;AACA,gBAAU;AACV,UAAI,OAAO,IAAK,YAAW;AAC3B;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,UAAI,YAAY;AACd,kBAAU;AACV,qBAAa;AACb;AAAA,MACF;AACA,UAAI,OAAO,MAAM;AACf,kBAAU;AACV,qBAAa;AACb;AAAA,MACF;AACA,gBAAU;AACV,UAAI,OAAO,IAAK,YAAW;AAC3B;AAAA,IACF;AAEA,QAAI,YAAY;AACd,UAAI,YAAY;AACd,kBAAU;AACV,qBAAa;AACb;AAAA,MACF;AACA,UAAI,OAAO,MAAM;AACf,kBAAU;AACV,qBAAa;AACb;AAAA,MACF;AACA,gBAAU;AACV,UAAI,OAAO,IAAK,cAAa;AAC7B;AAAA,IACF;AAGA,QAAI,OAAO,OAAO,SAAS,KAAK;AAC9B,sBAAgB;AAChB;AACA;AAAA,IACF;AACA,QAAI,OAAO,OAAO,SAAS,KAAK;AAC9B,uBAAiB;AACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,iBAAW;AACX,gBAAU;AACV;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,iBAAW;AACX,gBAAU;AACV;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,mBAAa;AACb,gBAAU;AACV;AAAA,IACF;AAEA,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAeO,SAAS,4BACd,YACA,SACQ;AACR,QAAM,EAAE,qBAAqB,MAAM,IAAI,WAAW,CAAC;AAEnD,MAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,WAAO;AAAA,EACT;AAGA,MACE,WAAW,WAAW,KACtB,WAAW,CAAC,EAAE,oCACd;AACA,UAAM,aAAa;AAAA,MACjB,WAAW,CAAC,EAAE;AAAA,MACd,WAAW,CAAC,EAAE;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,WAAW;AAAA,IACrC,CAAC,MAAM,EAAE,SAAS;AAAA,EACpB;AACA,QAAM,mBAAmB,WAAW;AAAA,IAClC,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE;AAAA,EACvC;AAGA,MACE,oBACA,oBAAoB,WAAW,KAC/B,oBAAoB,CAAC,EAAE,oCACvB;AACA,UAAM,cAAc,oBAAoB,CAAC;AAIzC,UAAM,eACJ,YAAY,WAAW,eACtB,YAAY,WAAW,UAAa,YAAY,SAAS;AAE5D,QAAI,cAAc;AAChB,YAAM,cAAc;AAAA,QAClB,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AACA,YAAM,mBAAmB;AAAA,QACvB,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,MACnB;AAEA,aAAO,OAAO,WAAW,kBAAkB,gBAAgB;AAAA,IAC7D;AAAA,EACF;AAGA,QAAM,eAAe,oBAAoB,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AAC5E,QAAM,gBAAgB,oBAAoB;AAAA,IACxC,CAAC,MAAM,EAAE,WAAW;AAAA,EACtB;AAGA,QAAM,iBAAiB,cAAc,IAAI,CAAC,UAAU;AAClD,UAAM,QAAQ,qBAAqB,MAAM,OAAO,MAAM,IAAI;AAC1D,WAAO,GAAG,MAAM,IAAI,KAAK,KAAK;AAAA,EAChC,CAAC;AAED,QAAM,gBAAgB,aAAa,IAAI,CAAC,UAAU;AAChD,UAAM,QAAQ,qBAAqB,MAAM,OAAO,MAAM,IAAI;AAC1D,WAAO,MAAM,KAAK;AAAA,EACpB,CAAC;AAGD,QAAM,aAAa,CAAC,GAAG,gBAAgB,GAAG,aAAa;AACvD,MAAI,kBAAkB;AACpB,UAAM,mBAAmB;AAAA,MACvB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AACA,eAAW,KAAK,gBAAgB,gBAAgB,EAAE;AAAA,EACpD;AAEA,MAAI,eAAe;AAAA,MAAU,WAAW,KAAK,SAAS,CAAC;AAAA;AAGvD,QAAM,eAAe,wBAAwB,YAAY;AAEzD,MAAI,CAAC,sBAAsB,CAAC,cAAc;AAExC,mBAAe,4BAA4B,YAAY;AACvD,mBAAe,qBAAqB,YAAY;AAAA,EAClD;AAEA,SAAO;AACT;","names":["z","CredentialType","z","z","z","BubbleParameterType","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z"]}
|