@mindstudio-ai/agent 0.1.22 → 0.1.24

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 CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/rate-limit.ts","../src/config.ts","../src/auth/index.ts","../src/db/sql.ts","../src/db/predicate.ts","../src/db/query.ts","../src/db/mutation.ts","../src/db/table.ts","../src/db/index.ts","../src/generated/steps.ts","../src/client.ts","../src/generated/snippets.ts","../src/generated/metadata.ts","../src/index.ts"],"sourcesContent":["/**\n * Error thrown when a MindStudio API request fails.\n *\n * Contains the HTTP status code, an error code from the API,\n * and any additional details returned in the response body.\n */\nexport class MindStudioError extends Error {\n override readonly name = 'MindStudioError';\n\n constructor(\n message: string,\n /** Machine-readable error code from the API (e.g. \"invalid_step_config\"). */\n public readonly code: string,\n /** HTTP status code of the failed request. */\n public readonly status: number,\n /** Raw error body from the API, if available. */\n public readonly details?: unknown,\n ) {\n super(message);\n }\n}\n","import { MindStudioError } from './errors.js';\nimport type { RateLimiter } from './rate-limit.js';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n token: string;\n rateLimiter: RateLimiter;\n maxRetries: number;\n}\n\nexport async function request<T>(\n config: HttpClientConfig,\n method: 'GET' | 'POST',\n path: string,\n body?: unknown,\n): Promise<{ data: T; headers: Headers }> {\n const url = `${config.baseUrl}/developer/v2${path}`;\n\n await config.rateLimiter.acquire();\n\n try {\n return await requestWithRetry<T>(config, method, url, body, 0);\n } finally {\n config.rateLimiter.release();\n }\n}\n\nasync function requestWithRetry<T>(\n config: HttpClientConfig,\n method: string,\n url: string,\n body: unknown,\n attempt: number,\n): Promise<{ data: T; headers: Headers }> {\n const res = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${config.token}`,\n 'Content-Type': 'application/json',\n 'User-Agent': '@mindstudio-ai/agent',\n },\n body: body != null ? JSON.stringify(body) : undefined,\n });\n\n // Update rate limiter with latest server-reported limits\n config.rateLimiter.updateFromHeaders(res.headers);\n\n if (res.status === 429 && attempt < config.maxRetries) {\n const retryAfter = res.headers.get('retry-after');\n const waitMs = retryAfter ? parseFloat(retryAfter) * 1000 : 1000;\n await sleep(waitMs);\n return requestWithRetry<T>(config, method, url, body, attempt + 1);\n }\n\n if (!res.ok) {\n const errorBody = await res.json().catch(() => ({}));\n throw new MindStudioError(\n (errorBody as Record<string, string>).message ||\n `${res.status} ${res.statusText}`,\n (errorBody as Record<string, string>).code || 'api_error',\n res.status,\n errorBody,\n );\n }\n\n const data = (await res.json()) as T;\n return { data, headers: res.headers };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { MindStudioError } from './errors.js';\n\nexport type AuthType = 'internal' | 'apiKey';\n\nconst DEFAULTS: Record<AuthType, { concurrency: number; callCap: number }> = {\n internal: { concurrency: 10, callCap: 500 },\n apiKey: { concurrency: 20, callCap: Infinity },\n};\n\nexport class RateLimiter {\n private inflight = 0;\n private concurrencyLimit: number;\n private callCount = 0;\n private callCap: number;\n private queue: Array<() => void> = [];\n\n constructor(readonly authType: AuthType) {\n this.concurrencyLimit = DEFAULTS[authType].concurrency;\n this.callCap = DEFAULTS[authType].callCap;\n }\n\n /** Acquire a slot. Resolves when a concurrent slot is available. */\n async acquire(): Promise<void> {\n if (this.callCount >= this.callCap) {\n throw new MindStudioError(\n `Call cap reached (${this.callCap} calls). ` +\n 'Internal tokens are limited to 500 calls per execution.',\n 'call_cap_exceeded',\n 429,\n );\n }\n\n if (this.inflight < this.concurrencyLimit) {\n this.inflight++;\n this.callCount++;\n return;\n }\n\n return new Promise<void>((resolve) => {\n this.queue.push(() => {\n this.inflight++;\n this.callCount++;\n resolve();\n });\n });\n }\n\n /** Release a slot and let the next queued request proceed. */\n release(): void {\n this.inflight--;\n const next = this.queue.shift();\n if (next) next();\n }\n\n /** Update limits from response headers. */\n updateFromHeaders(headers: Headers): void {\n const concurrency = headers.get('x-ratelimit-concurrency-limit');\n if (concurrency) {\n this.concurrencyLimit = parseInt(concurrency, 10);\n }\n const limit = headers.get('x-ratelimit-limit');\n if (limit && this.authType === 'internal') {\n this.callCap = parseInt(limit, 10);\n }\n }\n\n /** Read current rate limit state from response headers. */\n static parseHeaders(headers: Headers): {\n remaining: number | undefined;\n concurrencyRemaining: number | undefined;\n } {\n const remaining = headers.get('x-ratelimit-remaining');\n const concurrencyRemaining = headers.get(\n 'x-ratelimit-concurrency-remaining',\n );\n return {\n remaining: remaining != null ? parseInt(remaining, 10) : undefined,\n concurrencyRemaining:\n concurrencyRemaining != null\n ? parseInt(concurrencyRemaining, 10)\n : undefined,\n };\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface MindStudioConfig {\n apiKey?: string;\n baseUrl?: string;\n /** @internal Last update check metadata. */\n _updateCheck?: {\n latestVersion: string;\n checkedAt: number;\n };\n}\n\nfunction configPaths() {\n const dir = join(homedir(), '.mindstudio');\n return { dir, file: join(dir, 'config.json') };\n}\n\nexport function getConfigPath(): string {\n return configPaths().file;\n}\n\nexport function loadConfig(): MindStudioConfig {\n try {\n const raw = readFileSync(configPaths().file, 'utf-8');\n return JSON.parse(raw) as MindStudioConfig;\n } catch {\n return {};\n }\n}\n\nexport function saveConfig(config: MindStudioConfig): void {\n const { dir, file } = configPaths();\n mkdirSync(dir, { recursive: true });\n writeFileSync(file, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\nexport function clearConfig(): void {\n saveConfig({});\n}\n","/**\n * Auth namespace — role-based access control for MindStudio apps.\n *\n * Provides synchronous access to the current user's identity and roles\n * within an app. Hydrated once from app context (either sandbox globals\n * or the `GET /helpers/app-context` endpoint), then all access is sync.\n *\n * ## How it works\n *\n * 1. The platform stores role assignments per app: `{ userId, roleName }[]`\n * 2. On context hydration, the full role map is loaded into memory\n * 3. `auth.hasRole()` / `auth.requireRole()` are simple array lookups\n * 4. `auth.getUsersByRole()` scans the preloaded assignments\n *\n * ## Usage\n *\n * ```ts\n * import { auth, Roles } from '@mindstudio-ai/agent';\n *\n * // Check permissions\n * if (auth.hasRole(Roles.admin, Roles.approver)) {\n * // user has at least one of these roles\n * }\n *\n * // Gate a route — throws 403 if user lacks the role\n * auth.requireRole(Roles.admin);\n *\n * // Look up who has a role\n * const admins = auth.getUsersByRole(Roles.admin);\n * ```\n *\n * ## Roles proxy\n *\n * `Roles` is a convenience proxy: `Roles.admin` === `\"admin\"`. It provides\n * discoverability and typo prevention. In the future, the compilation\n * pipeline will generate a typed `Roles` object from `app.json`, giving\n * compile-time safety. For now, any string property access works.\n */\n\nimport { MindStudioError } from '../errors.js';\nimport type { AppAuthContext, AppRoleAssignment } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// AuthContext — the runtime auth object\n// ---------------------------------------------------------------------------\n\n/**\n * Auth context for the current execution. Created from the app's role\n * assignments and the current user's identity.\n *\n * All methods are synchronous — the full role map is preloaded at\n * context hydration time.\n */\nexport class AuthContext {\n /** The current user's ID. */\n readonly userId: string;\n\n /** The current user's roles in this app. */\n readonly roles: readonly string[];\n\n /** All role assignments for this app (all users, all roles). */\n private readonly _roleAssignments: readonly AppRoleAssignment[];\n\n constructor(ctx: AppAuthContext) {\n this.userId = ctx.userId;\n this._roleAssignments = ctx.roleAssignments;\n\n // Extract the current user's roles from the full assignment list\n this.roles = ctx.roleAssignments\n .filter((a) => a.userId === ctx.userId)\n .map((a) => a.roleName);\n }\n\n /**\n * Check if the current user has **any** of the given roles.\n * Returns true if at least one matches.\n *\n * @example\n * ```ts\n * if (auth.hasRole(Roles.admin, Roles.approver)) {\n * // user is an admin OR an approver\n * }\n * ```\n */\n hasRole(...roles: string[]): boolean {\n return roles.some((r) => this.roles.includes(r));\n }\n\n /**\n * Require the current user to have at least one of the given roles.\n * Throws a `MindStudioError` with code `'forbidden'` and status 403\n * if the user lacks all of the specified roles.\n *\n * Use this at the top of route handlers to gate access.\n *\n * @example\n * ```ts\n * auth.requireRole(Roles.admin);\n * // code below only runs if user is an admin\n * ```\n */\n requireRole(...roles: string[]): void {\n if (!this.hasRole(...roles)) {\n throw new MindStudioError(\n `User does not have required role: ${roles.join(', ')}`,\n 'forbidden',\n 403,\n );\n }\n }\n\n /**\n * Get all user IDs that have the given role in this app.\n * Synchronous — scans the preloaded role assignments.\n *\n * @example\n * ```ts\n * const reviewers = auth.getUsersByRole(Roles.reviewer);\n * // ['user-id-1', 'user-id-2', ...]\n * ```\n */\n getUsersByRole(role: string): string[] {\n return this._roleAssignments\n .filter((a) => a.roleName === role)\n .map((a) => a.userId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Roles proxy — string passthrough for role names\n// ---------------------------------------------------------------------------\n\n/**\n * Convenience proxy for referencing role names. Any property access\n * returns the property name as a string: `Roles.admin === \"admin\"`.\n *\n * This provides:\n * - Discoverability via autocomplete (in typed environments)\n * - Typo prevention (vs raw string literals)\n * - Forward compatibility with the future typed Roles generation\n *\n * In the future, the compilation pipeline will generate a typed `Roles`\n * object from `app.json` roles, replacing this proxy with compile-time\n * checked constants.\n *\n * @example\n * ```ts\n * Roles.admin // \"admin\"\n * Roles.approver // \"approver\"\n * Roles.anything // \"anything\" (no runtime error, any string works)\n * ```\n */\nexport const Roles: Record<string, string> = new Proxy(\n {} as Record<string, string>,\n {\n get(_, prop: string | symbol): string | undefined {\n // Only handle string property access (not Symbols like Symbol.toPrimitive)\n if (typeof prop === 'string') return prop;\n return undefined;\n },\n },\n);\n","/**\n * SQL builders for the `db` namespace.\n *\n * Pure functions that generate SQL strings with `?` placeholder bind params\n * for SQLite. These are used by Table and Query to translate collection\n * operations into queries executed via `POST /_internal/v2/db/query`.\n *\n * ## Parameterized queries\n *\n * All builders return `{ sql, params }` tuples. Values are passed as\n * positional bind params (`?` placeholders) rather than inlined into the\n * SQL string. This is safer and works naturally with the batch endpoint\n * which accepts `{ sql, params }` per query.\n *\n * ## RETURNING support\n *\n * INSERT and UPDATE builders append `RETURNING *` so the platform returns\n * the created/updated row in a single round trip — no separate SELECT needed.\n *\n * ## User type columns\n *\n * Columns with schema type `'user'` store values with a `@@user@@` prefix\n * in SQLite (e.g. `@@user@@550e8400-...`). The `serializeParam()` and\n * `deserializeRow()` functions handle this transparently — application\n * code always works with clean UUID strings.\n */\n\nimport type { AppDatabaseColumnSchema } from '../types.js';\nimport type { SqlQuery } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Value serialization — converts JS values to bind param values\n// ---------------------------------------------------------------------------\n\n/**\n * Serialize a JavaScript value for use as a bind param.\n *\n * - `null` / `undefined` → `null`\n * - `boolean` → `1` or `0` (SQLite convention)\n * - `number` / `string` → passed through\n * - `object` / `array` → JSON-encoded string\n */\nexport function serializeParam(val: unknown): unknown {\n if (val === null || val === undefined) return null;\n if (typeof val === 'boolean') return val ? 1 : 0;\n if (typeof val === 'number' || typeof val === 'string') return val;\n return JSON.stringify(val);\n}\n\n/**\n * Serialize a value for a specific column, handling the @@user@@ prefix\n * for user-type columns.\n */\nexport function serializeColumnParam(\n val: unknown,\n columnName: string,\n columns: AppDatabaseColumnSchema[],\n): unknown {\n const col = columns.find((c) => c.name === columnName);\n\n // User-type columns: add @@user@@ prefix to non-null string values\n if (col?.type === 'user' && typeof val === 'string') {\n return `@@user@@${val}`;\n }\n\n return serializeParam(val);\n}\n\n// ---------------------------------------------------------------------------\n// Inline value escaping — used by the predicate compiler for WHERE clauses\n// ---------------------------------------------------------------------------\n\n/**\n * Escape a JavaScript value for safe inline use in a SQL WHERE clause.\n * Used by the predicate compiler which builds WHERE strings with inlined\n * values (since predicates are parsed from function source code, not from\n * structured data).\n *\n * For structured data (INSERT/UPDATE/SELECT params), use `serializeParam()`\n * with `?` bind params instead.\n */\nexport function escapeValue(val: unknown): string {\n if (val === null || val === undefined) return 'NULL';\n if (typeof val === 'boolean') return val ? '1' : '0';\n if (typeof val === 'number') return String(val);\n if (typeof val === 'string') return `'${val.replace(/'/g, \"''\")}'`;\n const json = JSON.stringify(val);\n return `'${json.replace(/'/g, \"''\")}'`;\n}\n\n// ---------------------------------------------------------------------------\n// Row deserialization — strips @@user@@ prefixes, parses JSON columns\n// ---------------------------------------------------------------------------\n\nconst USER_PREFIX = '@@user@@';\n\n/**\n * Deserialize a row from the database, handling:\n * - Stripping `@@user@@` prefix from user-type columns\n * - Parsing JSON strings for json-type columns\n */\nexport function deserializeRow(\n row: Record<string, unknown>,\n columns: AppDatabaseColumnSchema[],\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(row)) {\n const col = columns.find((c) => c.name === key);\n\n if (col?.type === 'user' && typeof value === 'string' && value.startsWith(USER_PREFIX)) {\n result[key] = value.slice(USER_PREFIX.length);\n } else if (col?.type === 'json' && typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// SELECT builders\n// ---------------------------------------------------------------------------\n\nexport interface SelectOptions {\n /** WHERE clause (with ? placeholders). */\n where?: string;\n /** Params for the WHERE clause. */\n whereParams?: unknown[];\n orderBy?: string;\n desc?: boolean;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Build a SELECT query with bind params.\n */\nexport function buildSelect(table: string, options: SelectOptions = {}): SqlQuery {\n let sql = `SELECT * FROM ${table}`;\n const params: unknown[] = [];\n\n if (options.where) {\n sql += ` WHERE ${options.where}`;\n if (options.whereParams) params.push(...options.whereParams);\n }\n if (options.orderBy) sql += ` ORDER BY ${options.orderBy}${options.desc ? ' DESC' : ' ASC'}`;\n if (options.limit != null) sql += ` LIMIT ${options.limit}`;\n if (options.offset != null) sql += ` OFFSET ${options.offset}`;\n\n return { sql, params: params.length > 0 ? params : undefined };\n}\n\n/**\n * Build a SELECT COUNT(*) query.\n */\nexport function buildCount(table: string, where?: string, whereParams?: unknown[]): SqlQuery {\n let sql = `SELECT COUNT(*) as count FROM ${table}`;\n if (where) sql += ` WHERE ${where}`;\n return { sql, params: whereParams?.length ? whereParams : undefined };\n}\n\n/**\n * Build a SELECT EXISTS query. Used for `.some()` and `.every()`.\n */\nexport function buildExists(table: string, where?: string, whereParams?: unknown[], negate?: boolean): SqlQuery {\n const inner = where ? `SELECT 1 FROM ${table} WHERE ${where}` : `SELECT 1 FROM ${table}`;\n const fn = negate ? 'NOT EXISTS' : 'EXISTS';\n return { sql: `SELECT ${fn}(${inner}) as result`, params: whereParams?.length ? whereParams : undefined };\n}\n\n// ---------------------------------------------------------------------------\n// Write builders — all use RETURNING * for single-roundtrip results\n// ---------------------------------------------------------------------------\n\n/**\n * Build an INSERT statement with RETURNING *.\n * System columns are excluded automatically.\n * Values are passed as bind params.\n */\nexport function buildInsert(\n table: string,\n data: Record<string, unknown>,\n columns: AppDatabaseColumnSchema[],\n): SqlQuery {\n const filtered = stripSystemColumns(data);\n const keys = Object.keys(filtered);\n const placeholders = keys.map(() => '?').join(', ');\n const params = keys.map((k) => serializeColumnParam(filtered[k], k, columns));\n return {\n sql: `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders}) RETURNING *`,\n params,\n };\n}\n\n/**\n * Build an UPDATE statement with RETURNING *.\n * System columns are excluded. Values are bind params.\n */\nexport function buildUpdate(\n table: string,\n id: string,\n data: Record<string, unknown>,\n columns: AppDatabaseColumnSchema[],\n): SqlQuery {\n const filtered = stripSystemColumns(data);\n const keys = Object.keys(filtered);\n const assignments = keys.map((k) => `${k} = ?`).join(', ');\n const params = [\n ...keys.map((k) => serializeColumnParam(filtered[k], k, columns)),\n id, // for WHERE id = ?\n ];\n return {\n sql: `UPDATE ${table} SET ${assignments} WHERE id = ? RETURNING *`,\n params,\n };\n}\n\n/**\n * Build an INSERT ... ON CONFLICT ... DO UPDATE statement with RETURNING *.\n * System columns are excluded. Values are bind params.\n *\n * If all data keys are conflict columns (nothing to update), uses DO NOTHING.\n * Uses SQLite's `excluded.` prefix to reference the attempted INSERT values.\n */\nexport function buildUpsert(\n table: string,\n data: Record<string, unknown>,\n conflictColumns: string[],\n columns: AppDatabaseColumnSchema[],\n): SqlQuery {\n const filtered = stripSystemColumns(data);\n const keys = Object.keys(filtered);\n const placeholders = keys.map(() => '?').join(', ');\n const params = keys.map((k) =>\n serializeColumnParam(filtered[k], k, columns),\n );\n\n // ON CONFLICT — update all non-conflict columns\n const updateKeys = keys.filter((k) => !conflictColumns.includes(k));\n const conflict = conflictColumns.join(', ');\n\n const sql =\n updateKeys.length > 0\n ? `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${conflict}) DO UPDATE SET ${updateKeys.map((k) => `${k} = excluded.${k}`).join(', ')} RETURNING *`\n : `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${conflict}) DO NOTHING RETURNING *`;\n\n return { sql, params };\n}\n\n/**\n * Build a DELETE statement.\n */\nexport function buildDelete(table: string, where?: string, whereParams?: unknown[]): SqlQuery {\n let sql = `DELETE FROM ${table}`;\n if (where) sql += ` WHERE ${where}`;\n return { sql, params: whereParams?.length ? whereParams : undefined };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst SYSTEM_COLUMNS = new Set([\n 'id',\n 'created_at', 'createdAt',\n 'updated_at', 'updatedAt',\n 'last_updated_by', 'lastUpdatedBy',\n]);\n\nfunction stripSystemColumns(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (!SYSTEM_COLUMNS.has(key)) {\n result[key] = value;\n }\n }\n return result;\n}\n","/**\n * Predicate compiler — converts JS arrow functions to SQL WHERE clauses.\n *\n * This is the core complexity of the `db` namespace. When users write:\n *\n * ```ts\n * orders.filter(o => o.status === 'active' && o.amount > 5000)\n * ```\n *\n * ...the compiler parses the function's source code and produces:\n *\n * ```sql\n * WHERE status = 'active' AND amount > 5000\n * ```\n *\n * ## How it works\n *\n * 1. **Extract source**: Call `fn.toString()` to get the arrow function source\n * 2. **Identify parameter**: Parse the arrow function parameter name (`o` in `o => ...`)\n * 3. **Tokenize**: Break the body into tokens (identifiers, strings, numbers, operators)\n * 4. **Parse**: Recursive descent parser builds a small AST\n * 5. **Compile**: Walk the AST and emit SQL fragments\n *\n * ## Supported patterns (v1)\n *\n * - Field comparisons: `o.field === 'value'`, `!==`, `<`, `>`, `<=`, `>=`\n * - Null checks: `o.field === null`, `o.field != null`, `o.field === undefined`\n * - Logical operators: `&&` (AND), `||` (OR), `!expr` (NOT)\n * - Boolean fields: `o.active` (truthy), `!o.deleted` (falsy)\n * - Array.includes for IN: `['a','b'].includes(o.field)` → `field IN ('a','b')`\n * - Field.includes for LIKE: `o.field.includes('text')` → `field LIKE '%text%'`\n * - Closure variables: values captured from the enclosing scope\n *\n * ## Fallback strategy\n *\n * If the compiler encounters ANY pattern it doesn't recognize, it returns\n * `null` instead of a SQL string. The caller (Query/Table) then fetches\n * all rows and runs the original JS function as a filter. This means\n * filter() always works — there are no runtime errors from unsupported\n * expressions. The SQL path is a transparent performance optimization.\n *\n * A warning is logged on fallback so developers know they're on the slow path.\n *\n * ## Closure variable resolution\n *\n * When the predicate references a variable that isn't the parameter name\n * (e.g. `o => o.userId === currentUserId`), we need to resolve `currentUserId`\n * to its actual value. We do this by calling the original function with a\n * Proxy that records property accesses, then comparing against known patterns.\n * If resolution fails, we fall back to JS.\n */\n\nimport { escapeValue } from './sql.js';\nimport type { CompiledPredicate, Predicate } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Attempt to compile a predicate function to a SQL WHERE clause.\n *\n * @param fn - The predicate function (e.g. `o => o.status === 'active'`)\n * @returns A CompiledPredicate: either `{ type: 'sql', where }` or `{ type: 'js', fn }`\n *\n * @example\n * ```ts\n * const result = compilePredicate(o => o.status === 'active');\n * // { type: 'sql', where: \"status = 'active'\" }\n *\n * const result = compilePredicate(o => o.name.startsWith('A'));\n * // { type: 'js', fn: [original function] }\n * ```\n */\nexport function compilePredicate<T>(fn: Predicate<T>): CompiledPredicate<T> {\n try {\n const source = fn.toString();\n const paramName = extractParamName(source);\n if (!paramName) return { type: 'js', fn };\n\n const body = extractBody(source);\n if (!body) return { type: 'js', fn };\n\n const tokens = tokenize(body);\n if (tokens.length === 0) return { type: 'js', fn };\n\n // Parse into an AST and compile to SQL\n const parser = new Parser(tokens, paramName, fn);\n const ast = parser.parseExpression();\n if (!ast) return { type: 'js', fn };\n\n // Make sure we consumed all tokens (no trailing garbage)\n if (parser.pos < tokens.length) return { type: 'js', fn };\n\n const where = compileNode(ast);\n if (!where) return { type: 'js', fn };\n\n return { type: 'sql', where };\n } catch {\n // Any unexpected error → fall back to JS safely\n return { type: 'js', fn };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Source extraction — get the parameter name and body from fn.toString()\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the parameter name from an arrow function source.\n *\n * Handles:\n * - `x => ...`\n * - `(x) => ...`\n * - `(x: Type) => ...` (TypeScript — toString() may include types)\n *\n * Returns null if the pattern doesn't match (e.g. regular function,\n * destructured params, multiple params).\n */\nfunction extractParamName(source: string): string | null {\n // Match: `paramName =>` or `(paramName) =>` or `(paramName: type) =>`\n const match = source.match(\n /^\\s*(?:\\(?\\s*([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*(?::[^)]*?)?\\)?\\s*=>)/,\n );\n return match?.[1] ?? null;\n}\n\n/**\n * Extract the expression body from an arrow function source.\n *\n * Handles:\n * - `x => expr` (concise body)\n * - `x => { return expr; }` (block body with single return)\n * - `(x) => expr`\n *\n * Returns null for block bodies with multiple statements.\n */\nfunction extractBody(source: string): string | null {\n // Find the `=>` and take everything after it\n const arrowIdx = source.indexOf('=>');\n if (arrowIdx === -1) return null;\n\n let body = source.slice(arrowIdx + 2).trim();\n\n // Block body: `{ return expr; }` → extract the expression\n if (body.startsWith('{')) {\n const match = body.match(/^\\{\\s*return\\s+([\\s\\S]+?)\\s*;?\\s*\\}$/);\n if (!match) return null; // Multiple statements or no return\n body = match[1];\n }\n\n return body.trim() || null;\n}\n\n// ---------------------------------------------------------------------------\n// Tokenizer — breaks the expression body into typed tokens\n// ---------------------------------------------------------------------------\n\n/** Token types produced by the tokenizer. */\ntype TokenType =\n | 'identifier' // variable names, keywords (true, false, null, undefined)\n | 'number' // numeric literals\n | 'string' // string literals (single or double quoted)\n | 'operator' // ===, !==, ==, !=, <, >, <=, >=, &&, ||, !\n | 'dot' // .\n | 'lparen' // (\n | 'rparen' // )\n | 'lbracket' // [\n | 'rbracket' // ]\n | 'comma'; // ,\n\ninterface Token {\n type: TokenType;\n value: string;\n}\n\n/**\n * Tokenize an expression string into a flat array of typed tokens.\n *\n * This is intentionally simple — it handles the subset of JavaScript\n * that appears in common filter predicates. Unknown characters cause\n * the tokenizer to return an empty array (triggering JS fallback).\n */\nfunction tokenize(expr: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < expr.length) {\n const ch = expr[i];\n\n // Skip whitespace\n if (/\\s/.test(ch)) {\n i++;\n continue;\n }\n\n // String literals (single or double quoted)\n if (ch === \"'\" || ch === '\"') {\n const quote = ch;\n let str = '';\n i++; // skip opening quote\n while (i < expr.length && expr[i] !== quote) {\n if (expr[i] === '\\\\') {\n // Handle escape sequences\n i++;\n if (i < expr.length) str += expr[i];\n } else {\n str += expr[i];\n }\n i++;\n }\n if (i >= expr.length) return []; // Unterminated string\n i++; // skip closing quote\n tokens.push({ type: 'string', value: str });\n continue;\n }\n\n // Template literals — we can't reliably parse these, fall back\n if (ch === '`') return [];\n\n // Numbers (integers and decimals)\n if (/[0-9]/.test(ch) || (ch === '-' && i + 1 < expr.length && /[0-9]/.test(expr[i + 1]))) {\n let num = ch;\n i++;\n while (i < expr.length && /[0-9.]/.test(expr[i])) {\n num += expr[i];\n i++;\n }\n tokens.push({ type: 'number', value: num });\n continue;\n }\n\n // Multi-character operators (must check before single-character)\n if (expr.slice(i, i + 3) === '===' || expr.slice(i, i + 3) === '!==') {\n tokens.push({ type: 'operator', value: expr.slice(i, i + 3) });\n i += 3;\n continue;\n }\n if (expr.slice(i, i + 2) === '==' || expr.slice(i, i + 2) === '!=' ||\n expr.slice(i, i + 2) === '<=' || expr.slice(i, i + 2) === '>=' ||\n expr.slice(i, i + 2) === '&&' || expr.slice(i, i + 2) === '||') {\n tokens.push({ type: 'operator', value: expr.slice(i, i + 2) });\n i += 2;\n continue;\n }\n\n // Single-character operators and punctuation\n if (ch === '!' || ch === '<' || ch === '>') {\n tokens.push({ type: 'operator', value: ch });\n i++;\n continue;\n }\n if (ch === '.') { tokens.push({ type: 'dot', value: '.' }); i++; continue; }\n if (ch === '(') { tokens.push({ type: 'lparen', value: '(' }); i++; continue; }\n if (ch === ')') { tokens.push({ type: 'rparen', value: ')' }); i++; continue; }\n if (ch === '[') { tokens.push({ type: 'lbracket', value: '[' }); i++; continue; }\n if (ch === ']') { tokens.push({ type: 'rbracket', value: ']' }); i++; continue; }\n if (ch === ',') { tokens.push({ type: 'comma', value: ',' }); i++; continue; }\n\n // Identifiers (variable names, keywords)\n if (/[a-zA-Z_$]/.test(ch)) {\n let ident = ch;\n i++;\n while (i < expr.length && /[a-zA-Z0-9_$]/.test(expr[i])) {\n ident += expr[i];\n i++;\n }\n tokens.push({ type: 'identifier', value: ident });\n continue;\n }\n\n // Unknown character — bail out to JS fallback\n return [];\n }\n\n return tokens;\n}\n\n// ---------------------------------------------------------------------------\n// AST node types — the small tree the parser builds\n// ---------------------------------------------------------------------------\n\n/** A comparison like `field === 'value'` or `field > 5`. */\ninterface ComparisonNode {\n kind: 'comparison';\n field: string; // SQL column name (may include json_extract for nested)\n operator: string; // SQL operator: =, !=, <, >, <=, >=, IS, IS NOT\n value: unknown; // The literal value to compare against\n}\n\n/** A logical AND or OR combining two expressions. */\ninterface LogicalNode {\n kind: 'logical';\n operator: 'AND' | 'OR';\n left: AstNode;\n right: AstNode;\n}\n\n/** A NOT wrapping an expression. */\ninterface NotNode {\n kind: 'not';\n operand: AstNode;\n}\n\n/** A field IS NULL or IS NOT NULL check. */\ninterface NullCheckNode {\n kind: 'nullCheck';\n field: string;\n isNull: boolean; // true = IS NULL, false = IS NOT NULL\n}\n\n/** A field IN ('a', 'b', 'c') expression (from ['a','b'].includes(o.field)). */\ninterface InNode {\n kind: 'in';\n field: string;\n values: unknown[];\n}\n\n/** A field LIKE '%text%' expression (from o.field.includes('text')). */\ninterface LikeNode {\n kind: 'like';\n field: string;\n pattern: string; // The LIKE pattern with % wildcards\n}\n\n/** A boolean field check: `o.active` (truthy) compiles to `active = 1`. */\ninterface BooleanFieldNode {\n kind: 'booleanField';\n field: string;\n negated: boolean; // true for `!o.active`\n}\n\ntype AstNode =\n | ComparisonNode\n | LogicalNode\n | NotNode\n | NullCheckNode\n | InNode\n | LikeNode\n | BooleanFieldNode;\n\n// ---------------------------------------------------------------------------\n// Parser — recursive descent over the token stream\n// ---------------------------------------------------------------------------\n\n/**\n * Recursive descent parser that builds an AST from the token stream.\n *\n * Grammar (simplified):\n *\n * expression → or_expr\n * or_expr → and_expr ( '||' and_expr )*\n * and_expr → not_expr ( '&&' not_expr )*\n * not_expr → '!' not_expr | primary\n * primary → comparison | null_check | includes | boolean_field | '(' expression ')'\n *\n * The parser is deliberately conservative — it returns null for anything\n * it doesn't confidently understand, which triggers the JS fallback.\n */\nclass Parser {\n pos = 0;\n\n constructor(\n private tokens: Token[],\n private paramName: string,\n private originalFn: Function,\n ) {}\n\n /** Peek at the current token without consuming it. */\n private peek(): Token | undefined {\n return this.tokens[this.pos];\n }\n\n /** Consume the current token and advance. */\n private advance(): Token {\n return this.tokens[this.pos++];\n }\n\n /** Check if the current token matches an expected type and value. */\n private match(type: TokenType, value?: string): boolean {\n const t = this.peek();\n if (!t) return false;\n if (t.type !== type) return false;\n if (value !== undefined && t.value !== value) return false;\n return true;\n }\n\n /** Consume a token if it matches, otherwise return false. */\n private eat(type: TokenType, value?: string): boolean {\n if (this.match(type, value)) {\n this.advance();\n return true;\n }\n return false;\n }\n\n // --- Grammar rules ---\n\n /** Entry point: parse a full expression. */\n parseExpression(): AstNode | null {\n return this.parseOr();\n }\n\n /** or_expr → and_expr ( '||' and_expr )* */\n private parseOr(): AstNode | null {\n let left = this.parseAnd();\n if (!left) return null;\n\n while (this.match('operator', '||')) {\n this.advance();\n const right = this.parseAnd();\n if (!right) return null;\n left = { kind: 'logical', operator: 'OR', left, right };\n }\n\n return left;\n }\n\n /** and_expr → not_expr ( '&&' not_expr )* */\n private parseAnd(): AstNode | null {\n let left = this.parseNot();\n if (!left) return null;\n\n while (this.match('operator', '&&')) {\n this.advance();\n const right = this.parseNot();\n if (!right) return null;\n left = { kind: 'logical', operator: 'AND', left, right };\n }\n\n return left;\n }\n\n /** not_expr → '!' not_expr | primary */\n private parseNot(): AstNode | null {\n if (this.match('operator', '!')) {\n this.advance();\n\n // Check for `!(expr)` — parenthesized negation\n if (this.match('lparen')) {\n this.advance();\n const inner = this.parseExpression();\n if (!inner) return null;\n if (!this.eat('rparen')) return null;\n return { kind: 'not', operand: inner };\n }\n\n // Check for `!o.field` — negated boolean field\n const inner = this.parsePrimary();\n if (!inner) return null;\n\n // If it's a boolean field, just flip the negation\n if (inner.kind === 'booleanField') {\n return { ...inner, negated: !inner.negated };\n }\n\n return { kind: 'not', operand: inner };\n }\n\n return this.parsePrimary();\n }\n\n /**\n * primary → field_comparison | null_check | includes_expr | paren_expr | boolean_field\n *\n * This is the workhorse — handles the different patterns that can appear\n * as atomic expressions within a larger &&/|| combination.\n */\n private parsePrimary(): AstNode | null {\n // Parenthesized expression: `(expr)`\n if (this.match('lparen')) {\n this.advance();\n const inner = this.parseExpression();\n if (!inner) return null;\n if (!this.eat('rparen')) return null;\n return inner;\n }\n\n // Array literal: `['a', 'b'].includes(o.field)` → IN expression\n if (this.match('lbracket')) {\n return this.parseArrayIncludes();\n }\n\n // Starts with the parameter name: field access pattern\n if (this.match('identifier', this.paramName)) {\n return this.parseFieldExpression();\n }\n\n // Starts with a different identifier — could be a closure variable\n // or a keyword (true, false, null, undefined)\n if (this.match('identifier')) {\n return this.parseNonParamExpression();\n }\n\n // Literal value on the left side of a comparison (unusual but valid)\n // e.g. `null !== o.field` — too complex for v1, fall back\n return null;\n }\n\n /**\n * Parse an expression that starts with the parameter name (e.g. `o.field`).\n *\n * Could be:\n * - `o.field === value` (comparison)\n * - `o.field != null` (null check)\n * - `o.field.includes('text')` (LIKE)\n * - `o.field` alone (boolean field check)\n */\n private parseFieldExpression(): AstNode | null {\n this.advance(); // consume param name\n\n // Read the field path: o.field or o.nested.field\n const field = this.parseFieldPath();\n if (!field) return null;\n\n // Check what follows the field access\n const next = this.peek();\n\n // Field.includes('text') → LIKE\n if (next?.type === 'dot' && this.lookAheadForIncludes()) {\n return this.parseFieldIncludes(field);\n }\n\n // Comparison operator: ===, !==, ==, !=, <, >, <=, >=\n if (next?.type === 'operator' && isComparisonOp(next.value)) {\n return this.parseComparison(field);\n }\n\n // No operator follows — this is a boolean field check: `o.active`\n return { kind: 'booleanField', field, negated: false };\n }\n\n /**\n * Parse a dot-separated field path after the parameter name.\n * `o.status` → `\"status\"`, `o.address.city` → `\"json_extract(address, '$.city')\"`.\n */\n private parseFieldPath(): string | null {\n if (!this.eat('dot')) return null;\n\n if (!this.match('identifier')) return null;\n const parts: string[] = [this.advance().value];\n\n // Check for nested access: o.a.b.c\n while (this.match('dot') && this.tokens[this.pos + 1]?.type === 'identifier') {\n this.advance(); // consume dot\n parts.push(this.advance().value);\n }\n\n if (parts.length === 1) {\n return parts[0];\n }\n\n // Nested access: use json_extract for SQLite JSON columns\n // o.address.city → json_extract(address, '$.city')\n const root = parts[0];\n const jsonPath = '$.' + parts.slice(1).join('.');\n return `json_extract(${root}, '${jsonPath}')`;\n }\n\n /**\n * Parse a comparison: `field OP value`.\n * The field has already been parsed; we need the operator and right-hand value.\n */\n private parseComparison(field: string): AstNode | null {\n const opToken = this.advance(); // consume operator\n const jsOp = opToken.value;\n\n // Parse the right-hand side value\n const value = this.parseValue();\n if (value === PARSE_FAILED) return null;\n\n // Null comparisons get special SQL syntax (IS NULL / IS NOT NULL)\n if (value === null || value === undefined) {\n if (jsOp === '===' || jsOp === '==') {\n return { kind: 'nullCheck', field, isNull: true };\n }\n if (jsOp === '!==' || jsOp === '!=') {\n return { kind: 'nullCheck', field, isNull: false };\n }\n return null; // < null, > null, etc. — nonsensical, fall back\n }\n\n // Map JS operators to SQL operators\n const sqlOp = JS_TO_SQL_OP[jsOp];\n if (!sqlOp) return null;\n\n return { kind: 'comparison', field, operator: sqlOp, value };\n }\n\n /**\n * Parse `o.field.includes('text')` → LIKE expression.\n * The field name has already been parsed.\n */\n private parseFieldIncludes(field: string): AstNode | null {\n this.advance(); // consume dot\n this.advance(); // consume 'includes'\n if (!this.eat('lparen')) return null;\n\n const value = this.parseValue();\n if (value === PARSE_FAILED || typeof value !== 'string') return null;\n\n if (!this.eat('rparen')) return null;\n\n // Escape % and _ in the search string (they're LIKE wildcards)\n const escaped = value.replace(/%/g, '\\\\%').replace(/_/g, '\\\\_');\n return { kind: 'like', field, pattern: `%${escaped}%` };\n }\n\n /**\n * Parse `['a', 'b', 'c'].includes(o.field)` → IN expression.\n * The opening bracket has been peeked but not consumed.\n */\n private parseArrayIncludes(): AstNode | null {\n this.advance(); // consume [\n\n // Parse array literal values\n const values: unknown[] = [];\n while (!this.match('rbracket')) {\n if (values.length > 0) {\n if (!this.eat('comma')) return null;\n }\n const val = this.parseValue();\n if (val === PARSE_FAILED) return null;\n values.push(val);\n }\n this.advance(); // consume ]\n\n // Expect .includes(o.field)\n if (!this.eat('dot')) return null;\n if (!this.match('identifier', 'includes')) return null;\n this.advance(); // consume 'includes'\n if (!this.eat('lparen')) return null;\n\n // The argument should be a field access: o.field\n if (!this.match('identifier', this.paramName)) return null;\n this.advance(); // consume param name\n const field = this.parseFieldPath();\n if (!field) return null;\n\n if (!this.eat('rparen')) return null;\n\n return { kind: 'in', field, values };\n }\n\n /**\n * Parse an expression that starts with an identifier that is NOT the\n * parameter name. This could be:\n * - A keyword literal: `true`, `false`, `null`, `undefined`\n * - A closure variable used in a comparison (handled by backtracking)\n */\n private parseNonParamExpression(): AstNode | null {\n const ident = this.peek()!.value;\n\n // Keyword literals on their own aren't useful as filter expressions\n // They'd only appear as `true` or `false` which is a constant predicate —\n // not worth optimizing. Fall back to JS.\n if (ident === 'true' || ident === 'false') return null;\n\n // This could be a closure variable in a reversed comparison:\n // `someVar === o.field` — we don't support LHS-variable comparisons in v1\n // Fall back to JS.\n return null;\n }\n\n /**\n * Parse a literal value or closure variable reference.\n *\n * Returns the parsed value, or PARSE_FAILED if parsing fails.\n * Returns `null` or `undefined` for those keyword literals.\n */\n private parseValue(): unknown {\n const t = this.peek();\n if (!t) return PARSE_FAILED;\n\n // String literal\n if (t.type === 'string') {\n this.advance();\n return t.value;\n }\n\n // Number literal\n if (t.type === 'number') {\n this.advance();\n return Number(t.value);\n }\n\n // Keyword literals\n if (t.type === 'identifier') {\n if (t.value === 'true') { this.advance(); return true; }\n if (t.value === 'false') { this.advance(); return false; }\n if (t.value === 'null') { this.advance(); return null; }\n if (t.value === 'undefined') { this.advance(); return undefined; }\n\n // Closure variable — try to resolve its value by calling the\n // original function with a Proxy. We build a proxy that records\n // which fields are accessed, then inspect the comparison.\n return this.resolveClosureVariable();\n }\n\n // Negative number: -42\n if (t.type === 'operator' && t.value === '-') {\n this.advance();\n const next = this.peek();\n if (next?.type === 'number') {\n this.advance();\n return -Number(next.value);\n }\n return PARSE_FAILED;\n }\n\n return PARSE_FAILED;\n }\n\n /**\n * Attempt to resolve a closure variable's value.\n *\n * This handles the common pattern:\n * ```ts\n * const userId = auth.userId;\n * orders.filter(o => o.requestedBy === userId)\n * ```\n *\n * Closure variable resolution is fundamentally limited in JavaScript —\n * we can't access another function's closure scope from outside without\n * `eval`. The `===` operator can't be overridden via Proxy or\n * Symbol.toPrimitive, so we can't intercept comparisons.\n *\n * For now, this falls back to JS execution. The predicate still works\n * correctly — it just scans all rows instead of generating SQL.\n * This is the most common reason for JS fallback in practice, since\n * almost every real-world filter references a variable like `userId`.\n *\n * A future improvement could accept an explicit `vars` argument:\n * ```ts\n * orders.filter(o => o.requestedBy === $userId, { $userId: auth.userId })\n * ```\n */\n private resolveClosureVariable(): unknown {\n // Consume the identifier (and any dotted access like closureVar.prop)\n this.advance();\n while (this.match('dot') && this.tokens[this.pos + 1]?.type === 'identifier') {\n this.advance();\n this.advance();\n }\n\n return PARSE_FAILED;\n }\n\n /**\n * Look ahead to check if the next tokens form `.includes(`.\n * Used to disambiguate `o.field.includes(...)` from `o.field.nested`.\n */\n private lookAheadForIncludes(): boolean {\n // We need: dot + 'includes' + lparen\n return (\n this.tokens[this.pos]?.type === 'dot' &&\n this.tokens[this.pos + 1]?.type === 'identifier' &&\n this.tokens[this.pos + 1]?.value === 'includes' &&\n this.tokens[this.pos + 2]?.type === 'lparen'\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// AST → SQL compilation\n// ---------------------------------------------------------------------------\n\n/**\n * Compile an AST node to a SQL WHERE clause fragment.\n * Returns null if any node can't be compiled.\n */\nfunction compileNode(node: AstNode): string | null {\n switch (node.kind) {\n case 'comparison':\n return `${node.field} ${node.operator} ${escapeValue(node.value)}`;\n\n case 'nullCheck':\n return `${node.field} ${node.isNull ? 'IS NULL' : 'IS NOT NULL'}`;\n\n case 'in': {\n if (node.values.length === 0) return '0'; // empty IN → always false\n const vals = node.values.map(escapeValue).join(', ');\n return `${node.field} IN (${vals})`;\n }\n\n case 'like':\n return `${node.field} LIKE ${escapeValue(node.pattern)}`;\n\n case 'booleanField':\n // `o.active` → `active = 1`, `!o.active` → `active = 0`\n return node.negated ? `${node.field} = 0` : `${node.field} = 1`;\n\n case 'logical': {\n const left = compileNode(node.left);\n const right = compileNode(node.right);\n if (!left || !right) return null;\n return `(${left} ${node.operator} ${right})`;\n }\n\n case 'not': {\n const inner = compileNode(node.operand);\n if (!inner) return null;\n return `NOT (${inner})`;\n }\n\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Constants and helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Mapping from JavaScript comparison operators to SQL equivalents.\n * Strict and loose equality both map to `=` (SQL has no strict equality).\n */\nconst JS_TO_SQL_OP: Record<string, string> = {\n '===': '=',\n '==': '=',\n '!==': '!=',\n '!=': '!=',\n '<': '<',\n '>': '>',\n '<=': '<=',\n '>=': '>=',\n};\n\n/** Sentinel value indicating a parse failure (distinct from `undefined`). */\nconst PARSE_FAILED = Symbol('PARSE_FAILED');\n\n/** Check if a token value is a comparison operator. */\nfunction isComparisonOp(value: string): boolean {\n return value in JS_TO_SQL_OP;\n}\n","/**\n * Query chain builder — lazy, immutable query construction for database reads.\n *\n * A Query<T> represents a pending database query. It accumulates operations\n * (filter, sort, limit, skip) without executing anything. Execution happens\n * only when the query is awaited (via PromiseLike) or a terminal method\n * is called (first, last, count, some, every, min, max, groupBy).\n *\n * ## Immutability\n *\n * Every chain method returns a NEW Query instance. This means chains can\n * safely fork:\n *\n * ```ts\n * const base = Orders.filter(o => o.status === 'active');\n * const recent = base.sortBy(o => o.createdAt).reverse().take(10);\n * const count = await base.count(); // doesn't affect `recent`\n * ```\n *\n * ## Execution strategy (SQL fast path vs JS fallback)\n *\n * When a Query is executed, it attempts to compile all predicates to SQL:\n *\n * - **Fast path**: All predicates compile → single SQL query with WHERE,\n * ORDER BY, LIMIT, OFFSET. Efficient, minimal data transfer.\n *\n * - **Fallback path**: Any predicate fails to compile → fetch ALL rows\n * from the table (SELECT *), then apply the entire chain as native JS\n * array operations (Array.filter, Array.sort, Array.slice, etc.).\n * A warning is logged so developers can optimize if needed.\n *\n * Both paths produce identical results. The SQL path is a transparent\n * performance optimization.\n */\n\nimport { compilePredicate } from './predicate.js';\nimport {\n buildSelect,\n buildCount,\n buildExists,\n deserializeRow,\n} from './sql.js';\nimport type {\n Predicate,\n Accessor,\n TableConfig,\n CompiledPredicate,\n SqlQuery,\n SqlResult,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// Query class\n// ---------------------------------------------------------------------------\n\nexport class Query<T> implements PromiseLike<T[]> {\n private readonly _predicates: Predicate<T>[];\n private readonly _sortAccessor: Accessor<T> | undefined;\n private readonly _reversed: boolean;\n private readonly _limit: number | undefined;\n private readonly _offset: number | undefined;\n private readonly _config: TableConfig;\n\n constructor(\n config: TableConfig,\n options?: {\n predicates?: Predicate<T>[];\n sortAccessor?: Accessor<T>;\n reversed?: boolean;\n limit?: number;\n offset?: number;\n },\n ) {\n this._config = config;\n this._predicates = options?.predicates ?? [];\n this._sortAccessor = options?.sortAccessor;\n this._reversed = options?.reversed ?? false;\n this._limit = options?.limit;\n this._offset = options?.offset;\n }\n\n private _clone(overrides: {\n predicates?: Predicate<T>[];\n sortAccessor?: Accessor<T>;\n reversed?: boolean;\n limit?: number;\n offset?: number;\n }): Query<T> {\n return new Query<T>(this._config, {\n predicates: overrides.predicates ?? this._predicates,\n sortAccessor: overrides.sortAccessor ?? this._sortAccessor,\n reversed: overrides.reversed ?? this._reversed,\n limit: overrides.limit ?? this._limit,\n offset: overrides.offset ?? this._offset,\n });\n }\n\n // -------------------------------------------------------------------------\n // Chain methods\n // -------------------------------------------------------------------------\n\n filter(predicate: Predicate<T>): Query<T> {\n return this._clone({ predicates: [...this._predicates, predicate] });\n }\n\n sortBy(accessor: Accessor<T>): Query<T> {\n return this._clone({ sortAccessor: accessor });\n }\n\n reverse(): Query<T> {\n return this._clone({ reversed: !this._reversed });\n }\n\n take(n: number): Query<T> {\n return this._clone({ limit: n });\n }\n\n skip(n: number): Query<T> {\n return this._clone({ offset: n });\n }\n\n // -------------------------------------------------------------------------\n // Terminal methods\n // -------------------------------------------------------------------------\n\n async first(): Promise<T | null> {\n const rows = await this._clone({ limit: 1 })._execute();\n return rows[0] ?? null;\n }\n\n async last(): Promise<T | null> {\n const rows = await this._clone({ limit: 1, reversed: !this._reversed })._execute();\n return rows[0] ?? null;\n }\n\n async count(): Promise<number> {\n const compiled = this._compilePredicates();\n\n if (compiled.allSql) {\n const query = buildCount(\n this._config.tableName,\n compiled.sqlWhere || undefined,\n );\n const results = await this._config.executeBatch([query]);\n const row = results[0]?.rows[0] as { count: number } | undefined;\n return row?.count ?? 0;\n }\n\n const rows = await this._fetchAndFilterInJs(compiled);\n return rows.length;\n }\n\n async some(): Promise<boolean> {\n const compiled = this._compilePredicates();\n\n if (compiled.allSql) {\n const query = buildExists(\n this._config.tableName,\n compiled.sqlWhere || undefined,\n );\n const results = await this._config.executeBatch([query]);\n const row = results[0]?.rows[0] as { result: number } | undefined;\n return row?.result === 1;\n }\n\n const rows = await this._fetchAndFilterInJs(compiled);\n return rows.length > 0;\n }\n\n async every(): Promise<boolean> {\n const compiled = this._compilePredicates();\n\n if (compiled.allSql && compiled.sqlWhere) {\n const query = buildExists(\n this._config.tableName,\n `NOT (${compiled.sqlWhere})`,\n undefined,\n true,\n );\n const results = await this._config.executeBatch([query]);\n const row = results[0]?.rows[0] as { result: number } | undefined;\n return row?.result === 1;\n }\n\n if (this._predicates.length === 0) return true;\n\n const allRows = await this._fetchAllRows();\n return allRows.every((row) =>\n this._predicates.every((pred) => pred(row as T)),\n );\n }\n\n async min(accessor: Accessor<T, number>): Promise<T | null> {\n return this.sortBy(accessor as Accessor<T>).first();\n }\n\n async max(accessor: Accessor<T, number>): Promise<T | null> {\n return this.sortBy(accessor as Accessor<T>).reverse().first();\n }\n\n async groupBy<K extends string | number>(\n accessor: Accessor<T, K>,\n ): Promise<Map<K, T[]>> {\n const rows = await this._execute();\n const map = new Map<K, T[]>();\n for (const row of rows) {\n const key = accessor(row);\n const group = map.get(key);\n if (group) {\n group.push(row);\n } else {\n map.set(key, [row]);\n }\n }\n return map;\n }\n\n // -------------------------------------------------------------------------\n // Batch compilation — used by db.batch() to extract SQL without executing\n // -------------------------------------------------------------------------\n\n /**\n * @internal Compile this query into a SqlQuery for batch execution.\n *\n * Returns the compiled SQL query (if all predicates compile to SQL),\n * or null (if JS fallback is needed). In the fallback case, a bare\n * `SELECT *` is returned as `fallbackQuery` so the batch can fetch\n * all rows and this query can filter them in JS post-fetch.\n */\n _compile(): CompiledQuery<T> {\n const compiled = this._compilePredicates();\n const sortField = this._sortAccessor\n ? extractFieldName(this._sortAccessor)\n : undefined;\n\n if (compiled.allSql) {\n const query = buildSelect(this._config.tableName, {\n where: compiled.sqlWhere || undefined,\n orderBy: sortField ?? undefined,\n desc: this._reversed,\n limit: this._limit,\n offset: this._offset,\n });\n return { type: 'query', query, fallbackQuery: null, config: this._config };\n }\n\n // JS fallback — need all rows\n const fallbackQuery = buildSelect(this._config.tableName);\n return {\n type: 'query',\n query: null,\n fallbackQuery,\n config: this._config,\n predicates: this._predicates,\n sortAccessor: this._sortAccessor,\n reversed: this._reversed,\n limit: this._limit,\n offset: this._offset,\n };\n }\n\n /**\n * @internal Process raw SQL results into typed rows. Used by db.batch()\n * after executing the compiled query.\n *\n * For SQL-compiled queries: just deserialize the rows.\n * For JS-fallback queries: filter, sort, and slice in JS.\n */\n static _processResults<T>(\n result: SqlResult,\n compiled: CompiledQuery<T>,\n ): T[] {\n const rows = result.rows.map(\n (row) =>\n deserializeRow(\n row as Record<string, unknown>,\n compiled.config.columns,\n ) as T,\n );\n\n // SQL path — rows are already filtered/sorted/limited\n if (compiled.query) return rows;\n\n // JS fallback — apply predicates, sort, slice\n let filtered: T[] = compiled.predicates\n ? rows.filter((row) => compiled.predicates!.every((pred) => pred(row)))\n : rows;\n\n if (compiled.sortAccessor) {\n const accessor = compiled.sortAccessor;\n const reversed = compiled.reversed ?? false;\n filtered.sort((a, b) => {\n const aVal = accessor(a) as number | string;\n const bVal = accessor(b) as number | string;\n if (aVal < bVal) return reversed ? 1 : -1;\n if (aVal > bVal) return reversed ? -1 : 1;\n return 0;\n });\n }\n\n if (compiled.offset != null || compiled.limit != null) {\n const start = compiled.offset ?? 0;\n const end = compiled.limit != null ? start + compiled.limit : undefined;\n filtered = filtered.slice(start, end);\n }\n\n return filtered;\n }\n\n // -------------------------------------------------------------------------\n // PromiseLike\n // -------------------------------------------------------------------------\n\n then<TResult1 = T[], TResult2 = never>(\n onfulfilled?: ((value: T[]) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this._execute().then(onfulfilled, onrejected);\n }\n\n catch<TResult2 = never>(\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<T[] | TResult2> {\n return this._execute().catch(onrejected);\n }\n\n // -------------------------------------------------------------------------\n // Execution internals\n // -------------------------------------------------------------------------\n\n private async _execute(): Promise<T[]> {\n const compiled = this._compilePredicates();\n\n if (compiled.allSql) {\n const sortField = this._sortAccessor\n ? extractFieldName(this._sortAccessor)\n : undefined;\n\n const query = buildSelect(this._config.tableName, {\n where: compiled.sqlWhere || undefined,\n orderBy: sortField ?? undefined,\n desc: this._reversed,\n limit: this._limit,\n offset: this._offset,\n });\n\n const results = await this._config.executeBatch([query]);\n return results[0].rows.map(\n (row) =>\n deserializeRow(\n row as Record<string, unknown>,\n this._config.columns,\n ) as T,\n );\n }\n\n // Fallback: fetch all rows, process in JS\n let rows = await this._fetchAndFilterInJs(compiled);\n\n if (this._sortAccessor) {\n const accessor = this._sortAccessor;\n rows.sort((a, b) => {\n const aVal = accessor(a as T) as number | string;\n const bVal = accessor(b as T) as number | string;\n if (aVal < bVal) return this._reversed ? 1 : -1;\n if (aVal > bVal) return this._reversed ? -1 : 1;\n return 0;\n });\n }\n\n if (this._offset != null || this._limit != null) {\n const start = this._offset ?? 0;\n const end = this._limit != null ? start + this._limit : undefined;\n rows = rows.slice(start, end);\n }\n\n return rows as T[];\n }\n\n private _compilePredicates(): {\n allSql: boolean;\n sqlWhere: string;\n compiled: CompiledPredicate<T>[];\n } {\n if (this._predicates.length === 0) {\n return { allSql: true, sqlWhere: '', compiled: [] };\n }\n\n const compiled = this._predicates.map((pred) => compilePredicate(pred));\n const allSql = compiled.every((c) => c.type === 'sql');\n\n let sqlWhere = '';\n if (allSql) {\n sqlWhere = compiled\n .map((c) => (c as { type: 'sql'; where: string }).where)\n .join(' AND ');\n }\n\n return { allSql, sqlWhere, compiled };\n }\n\n private async _fetchAndFilterInJs(\n compiled: { compiled: CompiledPredicate<T>[] },\n ): Promise<Record<string, unknown>[]> {\n const allRows = await this._fetchAllRows();\n\n if (compiled.compiled.some((c) => c.type === 'js')) {\n console.warn(\n `[mindstudio] Filter on ${this._config.tableName} could not be compiled to SQL — scanning ${allRows.length} rows in JS`,\n );\n }\n\n return allRows.filter((row) =>\n this._predicates.every((pred) => pred(row as T)),\n );\n }\n\n private async _fetchAllRows(): Promise<Record<string, unknown>[]> {\n const query = buildSelect(this._config.tableName);\n const results = await this._config.executeBatch([query]);\n return results[0].rows.map((row) =>\n deserializeRow(row as Record<string, unknown>, this._config.columns),\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Result of Query._compile(). Contains either a compiled SQL query\n * (fast path) or a fallback SELECT * with JS processing metadata.\n */\nexport interface CompiledQuery<T> {\n type: 'query';\n /** Compiled SQL query, or null if JS fallback needed. */\n query: SqlQuery | null;\n /** SELECT * fallback query, or null if SQL compiled. */\n fallbackQuery: SqlQuery | null;\n /** Table config for deserialization. */\n config: TableConfig;\n /** JS predicates (only for fallback). */\n predicates?: Predicate<T>[];\n /** Sort accessor (only for fallback). */\n sortAccessor?: Accessor<T>;\n /** Sort direction (only for fallback). */\n reversed?: boolean;\n /** Limit (only for fallback). */\n limit?: number;\n /** Offset (only for fallback). */\n offset?: number;\n}\n\nexport function extractFieldName<T>(accessor: Accessor<T>): string | null {\n const source = accessor.toString();\n const match = source.match(\n /^\\s*\\(?([a-zA-Z_$][a-zA-Z0-9_$]*)\\)?\\s*=>\\s*\\1\\.([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*$/,\n );\n return match?.[2] ?? null;\n}\n","/**\n * Mutation<T> — a lazy write operation backed by SQLite.\n *\n * Created by Table write methods (push, update, remove, removeAll, clear).\n * Like Query, implements PromiseLike so `await` triggers execution. Unlike\n * Query, there's no chaining — a Mutation is a fixed set of SQL statements\n * with a result processor.\n *\n * ## Batch support\n *\n * `db.batch()` calls `_compile()` to extract the SQL without executing,\n * then bundles it with other operations into a single round trip. After\n * execution, `_processResults()` deserializes the raw SQL results.\n *\n * ## Non-batchable mutations\n *\n * Some mutations (e.g. `removeAll` with a JS-fallback predicate) require\n * multi-step execution that can't be expressed as a fixed SQL batch.\n * These are created via `Mutation.fromExecutor()` and work fine when\n * awaited standalone, but throw if passed to `db.batch()`.\n */\n\nimport type { TableConfig, SqlQuery, SqlResult } from './types.js';\n\n// ---------------------------------------------------------------------------\n// CompiledMutation — returned by _compile() for db.batch()\n// ---------------------------------------------------------------------------\n\nexport interface CompiledMutation<TResult> {\n type: 'mutation';\n queries: SqlQuery[];\n config: TableConfig;\n processResult: (results: SqlResult[]) => TResult;\n}\n\n// ---------------------------------------------------------------------------\n// Mutation class\n// ---------------------------------------------------------------------------\n\nexport class Mutation<TResult> implements PromiseLike<TResult> {\n /** @internal */\n private readonly _config: TableConfig;\n /** @internal */\n private readonly _queries: SqlQuery[];\n /** @internal */\n private readonly _processResult: (results: SqlResult[]) => TResult;\n /** @internal Non-batchable executor for complex mutations (e.g. removeAll JS fallback). */\n private readonly _executor:\n | (() => Promise<TResult>)\n | undefined;\n\n constructor(\n config: TableConfig,\n queries: SqlQuery[],\n processResult: (results: SqlResult[]) => TResult,\n ) {\n this._config = config;\n this._queries = queries;\n this._processResult = processResult;\n this._executor = undefined;\n }\n\n /**\n * Create a non-batchable mutation that wraps an async executor.\n * Used for operations that require multi-step execution (e.g. removeAll\n * with a JS-fallback predicate: fetch all rows → filter → delete).\n *\n * Works fine when awaited standalone. Throws if passed to db.batch().\n *\n * @internal\n */\n static fromExecutor<T>(\n config: TableConfig,\n executor: () => Promise<T>,\n ): Mutation<T> {\n const m = new Mutation<T>(config, [], () => undefined as T);\n // Override the private field — TypeScript doesn't allow reassigning\n // readonly in a static method, so we use Object.defineProperty.\n Object.defineProperty(m, '_executor', { value: executor });\n return m;\n }\n\n // -------------------------------------------------------------------------\n // PromiseLike — executes on await\n // -------------------------------------------------------------------------\n\n then<T1 = TResult, T2 = never>(\n onfulfilled?:\n | ((value: TResult) => T1 | PromiseLike<T1>)\n | null,\n onrejected?:\n | ((reason: unknown) => T2 | PromiseLike<T2>)\n | null,\n ): Promise<T1 | T2> {\n return this._execute().then(onfulfilled, onrejected);\n }\n\n catch<T2 = never>(\n onrejected?:\n | ((reason: unknown) => T2 | PromiseLike<T2>)\n | null,\n ): Promise<TResult | T2> {\n return this._execute().catch(onrejected);\n }\n\n // -------------------------------------------------------------------------\n // Batch compilation — used by db.batch()\n // -------------------------------------------------------------------------\n\n /**\n * @internal Compile this mutation into SQL for batch execution.\n * Returns the queries and a result processor.\n *\n * Throws if this is a non-batchable mutation (created via fromExecutor).\n */\n _compile(): CompiledMutation<TResult> {\n if (this._executor) {\n throw new Error(\n 'This operation cannot be batched (e.g. removeAll with a predicate that cannot compile to SQL). Await it separately.',\n );\n }\n\n return {\n type: 'mutation',\n queries: this._queries,\n config: this._config,\n processResult: this._processResult,\n };\n }\n\n /**\n * @internal Process raw SQL results into the typed result.\n * Used by db.batch() after executing the compiled queries.\n */\n static _processResults<T>(\n results: SqlResult[],\n compiled: CompiledMutation<T>,\n ): T {\n return compiled.processResult(results);\n }\n\n // -------------------------------------------------------------------------\n // Execution\n // -------------------------------------------------------------------------\n\n private async _execute(): Promise<TResult> {\n if (this._executor) {\n return this._executor();\n }\n\n const results = await this._config.executeBatch(this._queries);\n return this._processResult(results);\n }\n}\n","/**\n * Table<T> — a typed persistent collection backed by SQLite.\n *\n * Created via `db.defineTable<T>(name)`. Every method either returns a\n * chainable Query<T> (for lazy reads), a Mutation<T> (for lazy writes),\n * or a Promise (for terminal reads).\n *\n * ## Write operations use RETURNING\n *\n * INSERT and UPDATE use `RETURNING *` to get the created/updated row\n * back in a single round trip — no separate SELECT needed. This is\n * executed via the batch endpoint which runs all queries on a single\n * SQLite connection.\n */\n\nimport { Query, extractFieldName } from './query.js';\nimport { Mutation } from './mutation.js';\nimport { compilePredicate } from './predicate.js';\nimport { MindStudioError } from '../errors.js';\nimport {\n buildSelect,\n buildCount,\n buildExists,\n buildInsert,\n buildUpdate,\n buildUpsert,\n buildDelete,\n deserializeRow,\n escapeValue,\n} from './sql.js';\nimport type { Predicate, Accessor, PushInput, UpdateInput, SystemFields, TableConfig } from './types.js';\n\nexport class Table<T> {\n /** @internal */\n private readonly _config: TableConfig;\n\n constructor(config: TableConfig) {\n this._config = config;\n }\n\n // -------------------------------------------------------------------------\n // Reads — direct\n // -------------------------------------------------------------------------\n\n async get(id: string): Promise<T | null> {\n const query = buildSelect(this._config.tableName, {\n where: `id = ?`,\n whereParams: [id],\n limit: 1,\n });\n const results = await this._config.executeBatch([query]);\n if (results[0].rows.length === 0) return null;\n return deserializeRow(\n results[0].rows[0] as Record<string, unknown>,\n this._config.columns,\n ) as T;\n }\n\n async findOne(predicate: Predicate<T>): Promise<T | null> {\n return this.filter(predicate).first();\n }\n\n async count(predicate?: Predicate<T>): Promise<number> {\n if (predicate) return this.filter(predicate).count();\n\n const query = buildCount(this._config.tableName);\n const results = await this._config.executeBatch([query]);\n const row = results[0]?.rows[0] as { count: number } | undefined;\n return row?.count ?? 0;\n }\n\n async some(predicate: Predicate<T>): Promise<boolean> {\n return this.filter(predicate).some();\n }\n\n async every(predicate: Predicate<T>): Promise<boolean> {\n return this.filter(predicate).every();\n }\n\n async isEmpty(): Promise<boolean> {\n const query = buildExists(this._config.tableName, undefined, undefined, true);\n const results = await this._config.executeBatch([query]);\n const row = results[0]?.rows[0] as { result: number } | undefined;\n return row?.result === 1;\n }\n\n async min(accessor: Accessor<T, number>): Promise<T | null> {\n return this.sortBy(accessor as Accessor<T>).first();\n }\n\n async max(accessor: Accessor<T, number>): Promise<T | null> {\n return this.sortBy(accessor as Accessor<T>).reverse().first();\n }\n\n async groupBy<K extends string | number>(\n accessor: Accessor<T, K>,\n ): Promise<Map<K, T[]>> {\n return new Query<T>(this._config).groupBy(accessor);\n }\n\n // -------------------------------------------------------------------------\n // Reads — chainable\n // -------------------------------------------------------------------------\n\n filter(predicate: Predicate<T>): Query<T> {\n return new Query<T>(this._config).filter(predicate);\n }\n\n sortBy(accessor: Accessor<T>): Query<T> {\n return new Query<T>(this._config).sortBy(accessor);\n }\n\n // -------------------------------------------------------------------------\n // Writes — lazy Mutations, batchable via db.batch()\n //\n // All write methods return Mutation<T> which implements PromiseLike.\n // When awaited standalone, they execute immediately (same behavior as\n // before). When passed to db.batch(), their SQL is bundled into a\n // single round trip.\n // -------------------------------------------------------------------------\n\n /**\n * Insert one or more rows. Returns the created row(s) with system fields\n * populated (id, createdAt, updatedAt, lastUpdatedBy).\n *\n * Uses `INSERT ... RETURNING *` so the created row comes back in a\n * single round trip — no separate SELECT needed.\n */\n push(data: PushInput<T>): Mutation<T>;\n push(data: PushInput<T>[]): Mutation<T[]>;\n push(data: PushInput<T> | PushInput<T>[]): Mutation<T | T[]> {\n const isArray = Array.isArray(data);\n const items = (isArray ? data : [data]).map((item) =>\n this._config.defaults\n ? ({ ...this._config.defaults, ...item } as PushInput<T>)\n : item,\n );\n\n const queries = items.map((item) =>\n buildInsert(\n this._config.tableName,\n item as Record<string, unknown>,\n this._config.columns,\n ),\n );\n\n return new Mutation<T | T[]>(this._config, queries, (results) => {\n const rows = results.map((r) => {\n if (r.rows.length > 0) {\n return deserializeRow(\n r.rows[0] as Record<string, unknown>,\n this._config.columns,\n ) as T;\n }\n return undefined as unknown as T;\n });\n return isArray ? rows : rows[0];\n });\n }\n\n /**\n * Update a row by ID. Only the provided fields are changed.\n * Returns the updated row via `UPDATE ... RETURNING *`.\n */\n update(id: string, data: UpdateInput<T>): Mutation<T> {\n const query = buildUpdate(\n this._config.tableName,\n id,\n data as Record<string, unknown>,\n this._config.columns,\n );\n\n return new Mutation<T>(this._config, [query], (results) =>\n deserializeRow(\n results[0].rows[0] as Record<string, unknown>,\n this._config.columns,\n ) as T,\n );\n }\n\n remove(id: string): Mutation<void> {\n const query = buildDelete(this._config.tableName, `id = ?`, [id]);\n return new Mutation<void>(this._config, [query], () => undefined as void);\n }\n\n /**\n * Remove all rows matching a predicate. Returns the count removed.\n */\n removeAll(predicate: Predicate<T>): Mutation<number> {\n const compiled = compilePredicate(predicate);\n\n if (compiled.type === 'sql') {\n const query = buildDelete(this._config.tableName, compiled.where);\n return new Mutation<number>(this._config, [query], (results) => results[0].changes);\n }\n\n // Fallback: multi-step execution — not batchable\n return Mutation.fromExecutor<number>(this._config, async () => {\n console.warn(\n `[mindstudio] removeAll predicate on ${this._config.tableName} could not be compiled to SQL — fetching all rows first`,\n );\n\n const allQuery = buildSelect(this._config.tableName);\n const allResults = await this._config.executeBatch([allQuery]);\n const allRows = allResults[0].rows.map(\n (r) =>\n deserializeRow(\n r as Record<string, unknown>,\n this._config.columns,\n ) as Record<string, unknown>,\n );\n\n const matching = allRows.filter((row) => predicate(row as T));\n if (matching.length === 0) return 0;\n\n const deleteQueries = matching\n .filter((row) => row.id)\n .map((row) => buildDelete(this._config.tableName, `id = ?`, [row.id as string]));\n\n if (deleteQueries.length > 0) {\n await this._config.executeBatch(deleteQueries);\n }\n\n return matching.length;\n });\n }\n\n clear(): Mutation<void> {\n const query = buildDelete(this._config.tableName);\n return new Mutation<void>(this._config, [query], () => undefined as void);\n }\n\n /**\n * Insert a row, or update it if a row with the same unique key already\n * exists. The conflict key must match a `unique` constraint declared in\n * defineTable options. Returns the created or updated row.\n *\n * Uses SQLite's `INSERT ... ON CONFLICT ... DO UPDATE SET ... RETURNING *`.\n *\n * @param conflictKey - Column name(s) that form the unique constraint.\n * Pass a single string for single-column unique, or an array for compound.\n * @param data - Row data to insert (or update on conflict). Defaults apply.\n */\n upsert(\n conflictKey:\n | (keyof Omit<T, SystemFields> & string)\n | (keyof Omit<T, SystemFields> & string)[],\n data: PushInput<T>,\n ): Mutation<T> {\n const conflictColumns = (\n Array.isArray(conflictKey) ? conflictKey : [conflictKey]\n ) as string[];\n\n this._validateUniqueConstraint(conflictColumns);\n\n const withDefaults = this._config.defaults\n ? ({ ...this._config.defaults, ...data } as Record<string, unknown>)\n : (data as Record<string, unknown>);\n\n const query = buildUpsert(\n this._config.tableName,\n withDefaults,\n conflictColumns,\n this._config.columns,\n );\n\n return new Mutation<T>(this._config, [query], (results) =>\n deserializeRow(\n results[0].rows[0] as Record<string, unknown>,\n this._config.columns,\n ) as T,\n );\n }\n\n // -------------------------------------------------------------------------\n // Internal helpers\n // -------------------------------------------------------------------------\n\n /** @internal Validate that the given columns match a declared unique constraint. */\n private _validateUniqueConstraint(columns: string[]): void {\n if (!this._config.unique?.length) {\n throw new MindStudioError(\n `Cannot upsert on ${this._config.tableName}: no unique constraints declared. ` +\n `Add unique: [[${columns.map((c) => `'${c}'`).join(', ')}]] to defineTable options.`,\n 'no_unique_constraint',\n 400,\n );\n }\n const sorted = [...columns].sort().join(',');\n const match = this._config.unique.some(\n (u) => [...u].sort().join(',') === sorted,\n );\n if (!match) {\n throw new MindStudioError(\n `Cannot upsert on (${columns.join(', ')}): no matching unique constraint declared on ${this._config.tableName}.`,\n 'no_unique_constraint',\n 400,\n );\n }\n }\n}\n","/**\n * The `db` namespace — factory and time helpers for MindStudio managed databases.\n *\n * This module provides `createDb()`, which builds the `Db` object that users\n * interact with. The Db object has:\n *\n * - `defineTable<T>(name)` — creates a typed Table<T> for a given table name\n * - Time helpers: `now()`, `days()`, `hours()`, `minutes()`, `ago()`, `fromNow()`\n *\n * ## How defineTable works\n *\n * `defineTable` is a factory that binds a table name to the correct database\n * and execution context. It:\n *\n * 1. Looks up the table name in the app context database metadata\n * 2. Resolves the databaseId (implicit if only one database exists)\n * 3. Gets the column schema (for user-type handling and JSON parsing)\n * 4. Returns a Table<T> instance bound to the executeQuery function\n *\n * Tables are typically defined at module scope and imported into route handlers:\n *\n * ```ts\n * // tables/orders.ts\n * import { db } from '@mindstudio-ai/agent';\n * export const Orders = db.defineTable<Order>('orders');\n *\n * // routes/getOrders.ts\n * import { Orders } from '../tables/orders';\n * const active = await Orders.filter(o => o.status === 'active').take(10);\n * ```\n *\n * Since `defineTable()` is lazy (no queries execute until you await something\n * on the Table), it's safe to call at module scope. The actual database\n * context resolution happens on first query execution.\n *\n * ## Time helpers\n *\n * All timestamps in MindStudio databases are unix timestamps (milliseconds\n * since epoch). The time helpers make it easy to work with relative times\n * without writing `Date.now() - 48 * 60 * 60 * 1000` everywhere:\n *\n * ```ts\n * const cutoff = db.ago(db.days(2)); // 2 days ago (unix ms)\n * const deadline = db.fromNow(db.hours(48)); // 48 hours from now\n * const window = db.days(7) + db.hours(12); // composable durations\n * ```\n */\n\nimport { MindStudioError } from '../errors.js';\nimport type { AppDatabase, AppDatabaseColumnSchema } from '../types.js';\nimport { Table } from './table.js';\nimport { Query } from './query.js';\nimport { Mutation } from './mutation.js';\nimport type { TableConfig, SqlQuery, SqlResult, SystemColumns, SystemFields } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Options for defineTable\n// ---------------------------------------------------------------------------\n\n/**\n * Options for `db.defineTable()`.\n */\nexport interface DefineTableOptions<T = unknown> {\n /**\n * Database name or ID to target. Required when the app has multiple\n * databases and the table name alone is ambiguous.\n *\n * Accepts either the database's display name or its ID. The SDK\n * matches against both.\n *\n * If omitted, the SDK resolves the database automatically:\n * - Single database → used implicitly\n * - Multiple databases → searched by table name\n */\n database?: string;\n\n /**\n * Unique constraints for the table. Each entry is an array of column\n * names that together must be unique. The SDK communicates these to\n * the platform which creates the corresponding SQLite UNIQUE indexes.\n *\n * Required for `upsert()` — the conflict key must match a declared\n * unique constraint.\n *\n * @example\n * ```ts\n * // Single column unique\n * db.defineTable<User>('users', { unique: [['email']] });\n *\n * // Compound unique\n * db.defineTable<Membership>('memberships', { unique: [['userId', 'orgId']] });\n *\n * // Multiple constraints\n * db.defineTable<User>('users', { unique: [['email'], ['slug']] });\n * ```\n */\n unique?: (keyof T & string)[][];\n\n /**\n * Default values for columns, applied client-side in `push()` and\n * `upsert()`. Explicit values in the input override defaults.\n *\n * @example\n * ```ts\n * db.defineTable<Order>('orders', {\n * defaults: { status: 'pending', retryCount: 0 },\n * });\n * ```\n */\n defaults?: Partial<Omit<T, SystemFields>>;\n}\n\n// Re-export Table, Query, Mutation, and types for consumers\nexport { Table } from './table.js';\nexport { Query } from './query.js';\nexport { Mutation } from './mutation.js';\nexport type {\n Predicate,\n Accessor,\n PushInput,\n UpdateInput,\n Row,\n SystemColumns,\n SystemFields,\n TableConfig,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// Db interface — the shape of the `db` namespace object\n// ---------------------------------------------------------------------------\n\n/**\n * The `db` namespace object. Contains `defineTable()` for creating typed\n * collections and time helpers for working with unix timestamps.\n */\nexport interface Db {\n /**\n * Define a typed table. Returns a Table<T> bound to the app's managed\n * database. The table name must match a table in the app's database schema.\n *\n * Tables are lazy — nothing executes until you call a method on the Table\n * and await the result. This makes it safe to call `defineTable()` at\n * module scope.\n *\n * Database resolution:\n * - If the app has a single database (common case), it's used automatically.\n * - If the app has multiple databases, pass `{ database }` with the\n * database name or ID to target the right one. If omitted, the SDK\n * searches all databases by table name.\n *\n * @example\n * ```ts\n * // Single database (common) — no need to specify\n * const Orders = db.defineTable<Order>('orders');\n *\n * // Multiple databases — specify which one\n * const Orders = db.defineTable<Order>('orders', { database: 'main' });\n * ```\n */\n defineTable<T>(name: string, options?: DefineTableOptions<T>): Table<T & SystemColumns>;\n\n // --- Time helpers ---\n // All return numbers (unix timestamps in milliseconds or durations in ms).\n\n /** Returns the current time as a unix timestamp (ms). Equivalent to `Date.now()`. */\n now(): number;\n\n /** Returns milliseconds for n days. Composable with `+`. */\n days(n: number): number;\n\n /** Returns milliseconds for n hours. Composable with `+`. */\n hours(n: number): number;\n\n /** Returns milliseconds for n minutes. Composable with `+`. */\n minutes(n: number): number;\n\n /** Returns a unix timestamp for (now - duration). Use with days/hours/minutes. */\n ago(ms: number): number;\n\n /** Returns a unix timestamp for (now + duration). Use with days/hours/minutes. */\n fromNow(ms: number): number;\n\n // --- Batch execution ---\n\n /**\n * Execute multiple reads and writes in a single round trip. All\n * operations run on the same database connection, eliminating\n * per-operation HTTP overhead. Writes execute in argument order.\n *\n * Accepts Query objects (reads) and Mutation objects (writes from\n * push, update, remove, removeAll, clear). Compiles them to SQL,\n * sends all in one batch request, and returns typed results.\n *\n * @example\n * ```ts\n * // Mixed reads and writes in one round trip\n * const [, newCard, cards] = await db.batch(\n * Cards.update(card1.id, { position: 1 }),\n * Cards.push({ title: 'New', columnId, position: 0 }),\n * Cards.filter(c => c.columnId === columnId),\n * );\n * ```\n */\n batch<A>(q1: PromiseLike<A>): Promise<[A]>;\n batch<A, B>(q1: PromiseLike<A>, q2: PromiseLike<B>): Promise<[A, B]>;\n batch<A, B, C>(q1: PromiseLike<A>, q2: PromiseLike<B>, q3: PromiseLike<C>): Promise<[A, B, C]>;\n batch<A, B, C, D>(q1: PromiseLike<A>, q2: PromiseLike<B>, q3: PromiseLike<C>, q4: PromiseLike<D>): Promise<[A, B, C, D]>;\n batch<A, B, C, D, E>(q1: PromiseLike<A>, q2: PromiseLike<B>, q3: PromiseLike<C>, q4: PromiseLike<D>, q5: PromiseLike<E>): Promise<[A, B, C, D, E]>;\n batch(...queries: PromiseLike<unknown>[]): Promise<unknown[]>;\n}\n\n// ---------------------------------------------------------------------------\n// Factory — creates a Db instance from app context\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Db namespace object from app context database metadata.\n *\n * @param databases - Database metadata from `getAppContext()` or sandbox globals\n * @param executeBatch - Bound function that executes SQL batches via POST /_internal/v2/db/query\n * @returns The Db object with defineTable() and time helpers\n *\n * @internal Called by MindStudioAgent during context hydration. Not part of\n * the public API — users access `db` via the agent instance or top-level export.\n */\nexport function createDb(\n databases: AppDatabase[],\n executeBatch: (databaseId: string, queries: SqlQuery[]) => Promise<SqlResult[]>,\n): Db {\n return {\n defineTable<T>(name: string, options?: DefineTableOptions<T>): Table<T & SystemColumns> {\n // Resolve which database contains this table\n const resolved = resolveTable(databases, name, options?.database);\n\n const config: TableConfig = {\n databaseId: resolved.databaseId,\n tableName: name,\n columns: resolved.columns,\n unique: options?.unique as string[][] | undefined,\n defaults: options?.defaults as Record<string, unknown> | undefined,\n executeBatch: (queries: SqlQuery[]) =>\n executeBatch(resolved.databaseId, queries),\n };\n\n return new Table<T & SystemColumns>(config);\n },\n\n // --- Time helpers ---\n // Pure JS, no platform dependency. All timestamps are unix ms.\n\n now: () => Date.now(),\n days: (n: number) => n * 86_400_000,\n hours: (n: number) => n * 3_600_000,\n minutes: (n: number) => n * 60_000,\n ago: (ms: number) => Date.now() - ms,\n fromNow: (ms: number) => Date.now() + ms,\n\n // --- Batch execution ---\n\n batch: ((...operations: PromiseLike<unknown>[]) => {\n return (async () => {\n // Compile each operation into SQL\n type CompiledOp =\n | ReturnType<InstanceType<typeof Query<unknown>>['_compile']>\n | ReturnType<InstanceType<typeof Mutation<unknown>>['_compile']>;\n\n const compiled: CompiledOp[] = operations.map((op) => {\n if (op instanceof Query) {\n return (op as InstanceType<typeof Query<unknown>>)._compile();\n }\n if (op instanceof Mutation) {\n return (op as InstanceType<typeof Mutation<unknown>>)._compile();\n }\n throw new MindStudioError(\n 'db.batch() only accepts Query and Mutation objects (from .filter(), .update(), .push(), etc.)',\n 'invalid_batch_operation',\n 400,\n );\n });\n\n // Build a flat list of SQL queries, tracking which slice belongs\n // to which operation. Queries (reads) produce 1 SQL statement.\n // Mutations (writes) may produce N (e.g. push([a, b, c]) = 3 INSERTs).\n const groups = new Map<\n string,\n { opIndex: number; sqlQueries: SqlQuery[] }[]\n >();\n\n for (let i = 0; i < compiled.length; i++) {\n const c = compiled[i];\n const dbId = c.config.databaseId;\n\n if (!groups.has(dbId)) groups.set(dbId, []);\n\n if (c.type === 'query') {\n const sqlQuery = c.query ?? c.fallbackQuery!;\n groups.get(dbId)!.push({ opIndex: i, sqlQueries: [sqlQuery] });\n } else {\n groups.get(dbId)!.push({ opIndex: i, sqlQueries: c.queries });\n }\n }\n\n // Execute one batch per database, then map result slices back\n const opResults = new Map<number, SqlResult[]>();\n\n await Promise.all(\n Array.from(groups.entries()).map(async ([dbId, entries]) => {\n // Flatten all SQL for this database into one batch\n const flatQueries: SqlQuery[] = [];\n const slices: { opIndex: number; start: number; count: number }[] = [];\n\n for (const entry of entries) {\n slices.push({\n opIndex: entry.opIndex,\n start: flatQueries.length,\n count: entry.sqlQueries.length,\n });\n flatQueries.push(...entry.sqlQueries);\n }\n\n const results = await executeBatch(dbId, flatQueries);\n\n for (const { opIndex, start, count } of slices) {\n opResults.set(opIndex, results.slice(start, start + count));\n }\n }),\n );\n\n // Process results: deserialize + apply JS fallback where needed\n return compiled.map((c, i) => {\n const results = opResults.get(i)!;\n\n if (c.type === 'query') {\n // Log warning for JS fallback queries\n if (!c.query && c.predicates?.length) {\n console.warn(\n `[mindstudio] db.batch(): filter on ${c.config.tableName} could not be compiled to SQL — processing in JS`,\n );\n }\n return Query._processResults(results[0], c);\n } else {\n return Mutation._processResults(results, c);\n }\n });\n })();\n }) as Db['batch'],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Table resolution — finds the database + schema for a table name\n// ---------------------------------------------------------------------------\n\ninterface ResolvedTable {\n databaseId: string;\n columns: AppDatabaseColumnSchema[];\n}\n\n/**\n * Look up a table name in the app context database metadata.\n *\n * Resolution strategy:\n * 1. If `databaseHint` is provided, find that database (by name or ID)\n * and look for the table within it.\n * 2. If only one database exists, look for the table in that database.\n * 3. If multiple databases exist, search all of them by table name.\n * 4. Throws if the table or database is not found.\n *\n * @param databases - Database metadata from app context\n * @param tableName - The table name to find\n * @param databaseHint - Optional database name or ID to narrow the search\n * @returns The database ID and column schema for the table\n */\nfunction resolveTable(\n databases: AppDatabase[],\n tableName: string,\n databaseHint?: string,\n): ResolvedTable {\n if (databases.length === 0) {\n throw new MindStudioError(\n `No databases found in app context. Make sure the app has at least one database configured.`,\n 'no_databases',\n 400,\n );\n }\n\n // If a database hint is provided, narrow to that specific database\n if (databaseHint) {\n const targetDb = databases.find(\n (db) => db.id === databaseHint || db.name === databaseHint,\n );\n if (!targetDb) {\n const available = databases.map((db) => db.name || db.id).join(', ');\n throw new MindStudioError(\n `Database \"${databaseHint}\" not found. Available databases: ${available}`,\n 'database_not_found',\n 400,\n );\n }\n\n const table = targetDb.tables.find((t) => t.name === tableName);\n if (!table) {\n const available = targetDb.tables.map((t) => t.name).join(', ');\n throw new MindStudioError(\n `Table \"${tableName}\" not found in database \"${databaseHint}\". Available tables: ${available || '(none)'}`,\n 'table_not_found',\n 400,\n );\n }\n\n return { databaseId: targetDb.id, columns: table.schema };\n }\n\n // No hint — search all databases for a matching table name\n for (const db of databases) {\n const table = db.tables.find((t) => t.name === tableName);\n if (table) {\n return {\n databaseId: db.id,\n columns: table.schema,\n };\n }\n }\n\n // Table not found — build a helpful error message\n const availableTables = databases\n .flatMap((db) => db.tables.map((t) => t.name))\n .join(', ');\n\n throw new MindStudioError(\n `Table \"${tableName}\" not found in app databases. Available tables: ${availableTables || '(none)'}`,\n 'table_not_found',\n 400,\n );\n}\n","// AUTO-GENERATED — DO NOT EDIT\n// Run `npm run codegen` to regenerate from the OpenAPI spec.\n// Generated: 2026-03-24T14:33:23.674Z\n\n\nimport type {\n ActiveCampaignAddNoteStepInput,\n ActiveCampaignCreateContactStepInput,\n AddSubtitlesToVideoStepInput,\n AirtableCreateUpdateRecordStepInput,\n AirtableDeleteRecordStepInput,\n AirtableGetRecordStepInput,\n AirtableGetTableRecordsStepInput,\n AnalyzeImageStepInput,\n AnalyzeVideoStepInput,\n CaptureThumbnailStepInput,\n CheckAppRoleStepInput,\n CodaCreateUpdatePageStepInput,\n CodaCreateUpdateRowStepInput,\n CodaFindRowStepInput,\n CodaGetPageStepInput,\n CodaGetTableRowsStepInput,\n ConvertPdfToImagesStepInput,\n CreateDataSourceStepInput,\n CreateGmailDraftStepInput,\n CreateGoogleCalendarEventStepInput,\n CreateGoogleDocStepInput,\n CreateGoogleSheetStepInput,\n DeleteDataSourceStepInput,\n DeleteDataSourceDocumentStepInput,\n DeleteGmailEmailStepInput,\n DeleteGoogleCalendarEventStepInput,\n DeleteGoogleSheetRowsStepInput,\n DetectChangesStepInput,\n DetectPIIStepInput,\n DiscordEditMessageStepInput,\n DiscordSendFollowUpStepInput,\n DiscordSendMessageStepInput,\n DownloadVideoStepInput,\n EnhanceImageGenerationPromptStepInput,\n EnhanceVideoGenerationPromptStepInput,\n EnrichPersonStepInput,\n ExtractAudioFromVideoStepInput,\n ExtractTextStepInput,\n FetchDataSourceDocumentStepInput,\n FetchGoogleDocStepInput,\n FetchGoogleSheetStepInput,\n FetchSlackChannelHistoryStepInput,\n FetchYoutubeCaptionsStepInput,\n FetchYoutubeChannelStepInput,\n FetchYoutubeCommentsStepInput,\n FetchYoutubeVideoStepInput,\n GenerateChartStepInput,\n GenerateImageStepInput,\n GenerateLipsyncStepInput,\n GenerateMusicStepInput,\n GeneratePdfStepInput,\n GenerateStaticVideoFromImageStepInput,\n GenerateVideoStepInput,\n GetGmailAttachmentsStepInput,\n GetGmailDraftStepInput,\n GetGmailEmailStepInput,\n GetGmailUnreadCountStepInput,\n GetGoogleCalendarEventStepInput,\n GetGoogleDriveFileStepInput,\n GetGoogleSheetInfoStepInput,\n GetMediaMetadataStepInput,\n HttpRequestStepInput,\n HubspotCreateCompanyStepInput,\n HubspotCreateContactStepInput,\n HubspotGetCompanyStepInput,\n HubspotGetContactStepInput,\n HunterApiCompanyEnrichmentStepInput,\n HunterApiDomainSearchStepInput,\n HunterApiEmailFinderStepInput,\n HunterApiEmailVerificationStepInput,\n HunterApiPersonEnrichmentStepInput,\n ImageFaceSwapStepInput,\n ImageRemoveWatermarkStepInput,\n InsertVideoClipsStepInput,\n ListDataSourcesStepInput,\n ListGmailDraftsStepInput,\n ListGmailLabelsStepInput,\n ListGoogleCalendarEventsStepInput,\n ListGoogleDriveFilesStepInput,\n ListRecentGmailEmailsStepInput,\n LogicStepInput,\n MakeDotComRunScenarioStepInput,\n MergeAudioStepInput,\n MergeVideosStepInput,\n MixAudioIntoVideoStepInput,\n MuteVideoStepInput,\n N8nRunNodeStepInput,\n NotionCreatePageStepInput,\n NotionUpdatePageStepInput,\n PeopleSearchStepInput,\n PostToLinkedInStepInput,\n PostToSlackChannelStepInput,\n PostToXStepInput,\n PostToZapierStepInput,\n QueryAppDatabaseStepInput,\n QueryDataSourceStepInput,\n QueryExternalDatabaseStepInput,\n RedactPIIStepInput,\n RemoveBackgroundFromImageStepInput,\n ReplyToGmailEmailStepInput,\n ResizeVideoStepInput,\n RunFromConnectorRegistryStepInput,\n RunPackagedWorkflowStepInput,\n ScrapeFacebookPageStepInput,\n ScrapeFacebookPostsStepInput,\n ScrapeInstagramCommentsStepInput,\n ScrapeInstagramMentionsStepInput,\n ScrapeInstagramPostsStepInput,\n ScrapeInstagramProfileStepInput,\n ScrapeInstagramReelsStepInput,\n ScrapeLinkedInCompanyStepInput,\n ScrapeLinkedInProfileStepInput,\n ScrapeMetaThreadsProfileStepInput,\n ScrapeUrlStepInput,\n ScrapeXPostStepInput,\n ScrapeXProfileStepInput,\n ScreenshotUrlStepInput,\n SearchGmailEmailsStepInput,\n SearchGoogleStepInput,\n SearchGoogleCalendarEventsStepInput,\n SearchGoogleDriveStepInput,\n SearchGoogleImagesStepInput,\n SearchGoogleNewsStepInput,\n SearchGoogleTrendsStepInput,\n SearchPerplexityStepInput,\n SearchXPostsStepInput,\n SearchYoutubeStepInput,\n SearchYoutubeTrendsStepInput,\n SendEmailStepInput,\n SendGmailDraftStepInput,\n SendGmailMessageStepInput,\n SendSMSStepInput,\n SetGmailReadStatusStepInput,\n SetRunTitleStepInput,\n SetVariableStepInput,\n TelegramEditMessageStepInput,\n TelegramReplyToMessageStepInput,\n TelegramSendAudioStepInput,\n TelegramSendFileStepInput,\n TelegramSendImageStepInput,\n TelegramSendMessageStepInput,\n TelegramSendVideoStepInput,\n TelegramSetTypingStepInput,\n TextToSpeechStepInput,\n TranscribeAudioStepInput,\n TrimMediaStepInput,\n UpdateGmailLabelsStepInput,\n UpdateGoogleCalendarEventStepInput,\n UpdateGoogleDocStepInput,\n UpdateGoogleSheetStepInput,\n UploadDataSourceDocumentStepInput,\n UpscaleImageStepInput,\n UpscaleVideoStepInput,\n UserMessageStepInput,\n VideoFaceSwapStepInput,\n VideoRemoveBackgroundStepInput,\n VideoRemoveWatermarkStepInput,\n WatermarkImageStepInput,\n WatermarkVideoStepInput,\n ActiveCampaignAddNoteStepOutput,\n ActiveCampaignCreateContactStepOutput,\n AddSubtitlesToVideoStepOutput,\n AirtableCreateUpdateRecordStepOutput,\n AirtableDeleteRecordStepOutput,\n AirtableGetRecordStepOutput,\n AirtableGetTableRecordsStepOutput,\n AnalyzeImageStepOutput,\n AnalyzeVideoStepOutput,\n CaptureThumbnailStepOutput,\n CheckAppRoleStepOutput,\n CodaCreateUpdatePageStepOutput,\n CodaCreateUpdateRowStepOutput,\n CodaFindRowStepOutput,\n CodaGetPageStepOutput,\n CodaGetTableRowsStepOutput,\n ConvertPdfToImagesStepOutput,\n CreateDataSourceStepOutput,\n CreateGmailDraftStepOutput,\n CreateGoogleCalendarEventStepOutput,\n CreateGoogleDocStepOutput,\n CreateGoogleSheetStepOutput,\n DeleteDataSourceStepOutput,\n DeleteDataSourceDocumentStepOutput,\n DeleteGmailEmailStepOutput,\n DeleteGoogleCalendarEventStepOutput,\n DeleteGoogleSheetRowsStepOutput,\n DetectChangesStepOutput,\n DetectPIIStepOutput,\n DiscordEditMessageStepOutput,\n DiscordSendFollowUpStepOutput,\n DiscordSendMessageStepOutput,\n DownloadVideoStepOutput,\n EnhanceImageGenerationPromptStepOutput,\n EnhanceVideoGenerationPromptStepOutput,\n EnrichPersonStepOutput,\n ExtractAudioFromVideoStepOutput,\n ExtractTextStepOutput,\n FetchDataSourceDocumentStepOutput,\n FetchGoogleDocStepOutput,\n FetchGoogleSheetStepOutput,\n FetchSlackChannelHistoryStepOutput,\n FetchYoutubeCaptionsStepOutput,\n FetchYoutubeChannelStepOutput,\n FetchYoutubeCommentsStepOutput,\n FetchYoutubeVideoStepOutput,\n GenerateChartStepOutput,\n GenerateImageStepOutput,\n GenerateLipsyncStepOutput,\n GenerateMusicStepOutput,\n GeneratePdfStepOutput,\n GenerateStaticVideoFromImageStepOutput,\n GenerateVideoStepOutput,\n GetGmailAttachmentsStepOutput,\n GetGmailDraftStepOutput,\n GetGmailEmailStepOutput,\n GetGmailUnreadCountStepOutput,\n GetGoogleCalendarEventStepOutput,\n GetGoogleDriveFileStepOutput,\n GetGoogleSheetInfoStepOutput,\n GetMediaMetadataStepOutput,\n HttpRequestStepOutput,\n HubspotCreateCompanyStepOutput,\n HubspotCreateContactStepOutput,\n HubspotGetCompanyStepOutput,\n HubspotGetContactStepOutput,\n HunterApiCompanyEnrichmentStepOutput,\n HunterApiDomainSearchStepOutput,\n HunterApiEmailFinderStepOutput,\n HunterApiEmailVerificationStepOutput,\n HunterApiPersonEnrichmentStepOutput,\n ImageFaceSwapStepOutput,\n ImageRemoveWatermarkStepOutput,\n InsertVideoClipsStepOutput,\n ListDataSourcesStepOutput,\n ListGmailDraftsStepOutput,\n ListGmailLabelsStepOutput,\n ListGoogleCalendarEventsStepOutput,\n ListGoogleDriveFilesStepOutput,\n ListRecentGmailEmailsStepOutput,\n LogicStepOutput,\n MakeDotComRunScenarioStepOutput,\n MergeAudioStepOutput,\n MergeVideosStepOutput,\n MixAudioIntoVideoStepOutput,\n MuteVideoStepOutput,\n N8nRunNodeStepOutput,\n NotionCreatePageStepOutput,\n NotionUpdatePageStepOutput,\n PeopleSearchStepOutput,\n PostToLinkedInStepOutput,\n PostToSlackChannelStepOutput,\n PostToXStepOutput,\n PostToZapierStepOutput,\n QueryAppDatabaseStepOutput,\n QueryDataSourceStepOutput,\n QueryExternalDatabaseStepOutput,\n RedactPIIStepOutput,\n RemoveBackgroundFromImageStepOutput,\n ReplyToGmailEmailStepOutput,\n ResizeVideoStepOutput,\n RunFromConnectorRegistryStepOutput,\n RunPackagedWorkflowStepOutput,\n ScrapeFacebookPageStepOutput,\n ScrapeFacebookPostsStepOutput,\n ScrapeInstagramCommentsStepOutput,\n ScrapeInstagramMentionsStepOutput,\n ScrapeInstagramPostsStepOutput,\n ScrapeInstagramProfileStepOutput,\n ScrapeInstagramReelsStepOutput,\n ScrapeLinkedInCompanyStepOutput,\n ScrapeLinkedInProfileStepOutput,\n ScrapeMetaThreadsProfileStepOutput,\n ScrapeUrlStepOutput,\n ScrapeXPostStepOutput,\n ScrapeXProfileStepOutput,\n ScreenshotUrlStepOutput,\n SearchGmailEmailsStepOutput,\n SearchGoogleStepOutput,\n SearchGoogleCalendarEventsStepOutput,\n SearchGoogleDriveStepOutput,\n SearchGoogleImagesStepOutput,\n SearchGoogleNewsStepOutput,\n SearchGoogleTrendsStepOutput,\n SearchPerplexityStepOutput,\n SearchXPostsStepOutput,\n SearchYoutubeStepOutput,\n SearchYoutubeTrendsStepOutput,\n SendEmailStepOutput,\n SendGmailDraftStepOutput,\n SendGmailMessageStepOutput,\n SendSMSStepOutput,\n SetGmailReadStatusStepOutput,\n SetRunTitleStepOutput,\n SetVariableStepOutput,\n TelegramEditMessageStepOutput,\n TelegramReplyToMessageStepOutput,\n TelegramSendAudioStepOutput,\n TelegramSendFileStepOutput,\n TelegramSendImageStepOutput,\n TelegramSendMessageStepOutput,\n TelegramSendVideoStepOutput,\n TelegramSetTypingStepOutput,\n TextToSpeechStepOutput,\n TranscribeAudioStepOutput,\n TrimMediaStepOutput,\n UpdateGmailLabelsStepOutput,\n UpdateGoogleCalendarEventStepOutput,\n UpdateGoogleDocStepOutput,\n UpdateGoogleSheetStepOutput,\n UploadDataSourceDocumentStepOutput,\n UpscaleImageStepOutput,\n UpscaleVideoStepOutput,\n UserMessageStepOutput,\n VideoFaceSwapStepOutput,\n VideoRemoveBackgroundStepOutput,\n VideoRemoveWatermarkStepOutput,\n WatermarkImageStepOutput,\n WatermarkVideoStepOutput,\n} from \"./types.js\";\n\nimport type { StepExecutionOptions, StepExecutionResult } from \"../types.js\";\n\nexport interface StepMethods {\n /**\n * Add a note to an existing contact in ActiveCampaign.\n *\n * @remarks\n * - Requires an ActiveCampaign OAuth connection (connectionId).\n * - The contact must already exist — use the contact ID from a previous create or search step.\n *\n * @example\n * ```typescript\n * const result = await agent.activeCampaignAddNote({\n * contactId: ``,\n * note: ``,\n * });\n * ```\n */\n activeCampaignAddNote(step: ActiveCampaignAddNoteStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ActiveCampaignAddNoteStepOutput>>;\n\n /**\n * Create or sync a contact in ActiveCampaign.\n *\n * @remarks\n * - Requires an ActiveCampaign OAuth connection (connectionId).\n * - If a contact with the email already exists, it may be updated depending on ActiveCampaign settings.\n * - Custom fields are passed as a key-value map where keys are field IDs.\n *\n * @example\n * ```typescript\n * const result = await agent.activeCampaignCreateContact({\n * email: ``,\n * firstName: ``,\n * lastName: ``,\n * phone: ``,\n * accountId: ``,\n * customFields: {},\n * });\n * ```\n */\n activeCampaignCreateContact(step: ActiveCampaignCreateContactStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ActiveCampaignCreateContactStepOutput>>;\n\n /**\n * Automatically add subtitles to a video\n *\n * @remarks\n * - Can control style of text and animation\n *\n * @example\n * ```typescript\n * const result = await agent.addSubtitlesToVideo({\n * videoUrl: ``,\n * language: ``,\n * fontName: ``,\n * fontSize: 0,\n * fontWeight: \"normal\",\n * fontColor: \"white\",\n * highlightColor: \"white\",\n * strokeWidth: 0,\n * strokeColor: \"black\",\n * backgroundColor: \"black\",\n * backgroundOpacity: 0,\n * position: \"top\",\n * yOffset: 0,\n * wordsPerSubtitle: 0,\n * enableAnimation: false,\n * });\n * ```\n */\n addSubtitlesToVideo(step: AddSubtitlesToVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AddSubtitlesToVideoStepOutput>>;\n\n /**\n * Create a new record or update an existing record in an Airtable table.\n *\n * @remarks\n * - If recordId is provided, updates that record. Otherwise, creates a new one.\n * - When updating with updateMode \"onlySpecified\", unspecified fields are left as-is. With \"all\", unspecified fields are cleared.\n * - Array fields (e.g. multipleAttachments) accept arrays of values.\n *\n * @example\n * ```typescript\n * const result = await agent.airtableCreateUpdateRecord({\n * baseId: ``,\n * tableId: ``,\n * fields: ``,\n * recordData: {},\n * });\n * ```\n */\n airtableCreateUpdateRecord(step: AirtableCreateUpdateRecordStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AirtableCreateUpdateRecordStepOutput>>;\n\n /**\n * Delete a record from an Airtable table by its record ID.\n *\n * @remarks\n * - Requires an active Airtable OAuth connection (connectionId).\n * - Silently succeeds if the record does not exist.\n *\n * @example\n * ```typescript\n * const result = await agent.airtableDeleteRecord({\n * baseId: ``,\n * tableId: ``,\n * recordId: ``,\n * });\n * ```\n */\n airtableDeleteRecord(step: AirtableDeleteRecordStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AirtableDeleteRecordStepOutput>>;\n\n /**\n * Fetch a single record from an Airtable table by its record ID.\n *\n * @remarks\n * - Requires an active Airtable OAuth connection (connectionId).\n * - If the record is not found, returns a string message instead of a record object.\n *\n * @example\n * ```typescript\n * const result = await agent.airtableGetRecord({\n * baseId: ``,\n * tableId: ``,\n * recordId: ``,\n * });\n * ```\n */\n airtableGetRecord(step: AirtableGetRecordStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AirtableGetRecordStepOutput>>;\n\n /**\n * Fetch multiple records from an Airtable table with optional pagination.\n *\n * @remarks\n * - Requires an active Airtable OAuth connection (connectionId).\n * - Default limit is 100 records. Maximum is 1000.\n * - When outputFormat is 'csv', the variable receives CSV text. The direct execution output always returns parsed records.\n *\n * @example\n * ```typescript\n * const result = await agent.airtableGetTableRecords({\n * baseId: ``,\n * tableId: ``,\n * });\n * ```\n */\n airtableGetTableRecords(step: AirtableGetTableRecordsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AirtableGetTableRecordsStepOutput>>;\n\n /**\n * Analyze an image using a vision model based on a text prompt.\n *\n * @remarks\n * - Uses the configured vision model to generate a text analysis of the image.\n * - The prompt should describe what to look for or extract from the image.\n *\n * @example\n * ```typescript\n * const result = await agent.analyzeImage({\n * prompt: ``,\n * imageUrl: ``,\n * });\n * ```\n */\n analyzeImage(step: AnalyzeImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AnalyzeImageStepOutput>>;\n\n /**\n * Analyze a video using a video analysis model based on a text prompt.\n *\n * @remarks\n * - Uses the configured video analysis model to generate a text analysis of the video.\n * - The prompt should describe what to look for or extract from the video.\n *\n * @example\n * ```typescript\n * const result = await agent.analyzeVideo({\n * prompt: ``,\n * videoUrl: ``,\n * });\n * ```\n */\n analyzeVideo(step: AnalyzeVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AnalyzeVideoStepOutput>>;\n\n /**\n * Capture a thumbnail from a video at a specified timestamp\n *\n * @example\n * ```typescript\n * const result = await agent.captureThumbnail({\n * videoUrl: ``,\n * at: ``,\n * });\n * ```\n */\n captureThumbnail(step: CaptureThumbnailStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CaptureThumbnailStepOutput>>;\n\n /**\n * Check whether the current user has a specific app role and branch accordingly.\n *\n * @remarks\n * - Checks if the current user has been assigned a specific role in this app.\n * - If the user has the role, transitions to the \"has role\" path.\n * - If the user does not have the role, transitions to the \"no role\" path, or errors if no path is configured.\n * - Role names are defined by the app creator and assigned to users via the app roles system.\n * - The roleName field supports {{variables}} for dynamic role checks.\n *\n * @example\n * ```typescript\n * const result = await agent.checkAppRole({\n * roleName: ``,\n * });\n * ```\n */\n checkAppRole(step: CheckAppRoleStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CheckAppRoleStepOutput>>;\n\n /**\n * Create a new page or update an existing page in a Coda document.\n *\n * @remarks\n * - Requires a Coda OAuth connection (connectionId).\n * - If pageData.pageId is provided, updates that page. Otherwise, creates a new one.\n * - Page content is provided as markdown and converted to Coda's canvas format.\n * - When updating, insertionMode controls how content is applied (default: 'append').\n *\n * @example\n * ```typescript\n * const result = await agent.codaCreateUpdatePage({\n * pageData: {},\n * });\n * ```\n */\n codaCreateUpdatePage(step: CodaCreateUpdatePageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CodaCreateUpdatePageStepOutput>>;\n\n /**\n * Create a new row or update an existing row in a Coda table.\n *\n * @remarks\n * - Requires a Coda OAuth connection (connectionId).\n * - If rowId is provided, updates that row. Otherwise, creates a new one.\n * - Row data keys are column IDs. Empty values are excluded.\n *\n * @example\n * ```typescript\n * const result = await agent.codaCreateUpdateRow({\n * docId: ``,\n * tableId: ``,\n * rowData: {},\n * });\n * ```\n */\n codaCreateUpdateRow(step: CodaCreateUpdateRowStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CodaCreateUpdateRowStepOutput>>;\n\n /**\n * Search for a row in a Coda table by matching column values.\n *\n * @remarks\n * - Requires a Coda OAuth connection (connectionId).\n * - Returns the first row matching all specified column values, or null if no match.\n * - Search criteria in rowData are ANDed together.\n *\n * @example\n * ```typescript\n * const result = await agent.codaFindRow({\n * docId: ``,\n * tableId: ``,\n * rowData: {},\n * });\n * ```\n */\n codaFindRow(step: CodaFindRowStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CodaFindRowStepOutput>>;\n\n /**\n * Export and read the contents of a page from a Coda document.\n *\n * @remarks\n * - Requires a Coda OAuth connection (connectionId).\n * - Page export is asynchronous on Coda's side — there may be a brief delay while it processes.\n * - If a page was just created in a prior step, there is an automatic 20-second retry if the first export attempt fails.\n *\n * @example\n * ```typescript\n * const result = await agent.codaGetPage({\n * docId: ``,\n * pageId: ``,\n * });\n * ```\n */\n codaGetPage(step: CodaGetPageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CodaGetPageStepOutput>>;\n\n /**\n * Fetch rows from a Coda table with optional pagination.\n *\n * @remarks\n * - Requires a Coda OAuth connection (connectionId).\n * - Default limit is 10000 rows. Rows are fetched in pages of 500.\n * - When outputFormat is 'csv', the variable receives CSV text. The direct execution output always returns parsed rows.\n *\n * @example\n * ```typescript\n * const result = await agent.codaGetTableRows({\n * docId: ``,\n * tableId: ``,\n * });\n * ```\n */\n codaGetTableRows(step: CodaGetTableRowsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CodaGetTableRowsStepOutput>>;\n\n /**\n * Convert each page of a PDF document into a PNG image.\n *\n * @remarks\n * - Each page is converted to a separate PNG and re-hosted on the CDN.\n * - Returns an array of image URLs, one per page.\n *\n * @example\n * ```typescript\n * const result = await agent.convertPdfToImages({\n * pdfUrl: ``,\n * });\n * ```\n */\n convertPdfToImages(step: ConvertPdfToImagesStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ConvertPdfToImagesStepOutput>>;\n\n /**\n * Create a new empty vector data source for the current app.\n *\n * @remarks\n * - Creates a new data source (vector database) associated with the current app version.\n * - The data source is created empty — use the \"Upload Data Source Document\" block to add documents.\n * - Returns the new data source ID which can be used in subsequent blocks.\n *\n * @example\n * ```typescript\n * const result = await agent.createDataSource({\n * name: ``,\n * });\n * ```\n */\n createDataSource(step: CreateDataSourceStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CreateDataSourceStepOutput>>;\n\n /**\n * Create a draft email in the connected Gmail account.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail compose scope.\n * - The draft appears in the user's Gmail Drafts folder but is not sent.\n * - messageType controls the body format: \"plain\" for plain text, \"html\" for raw HTML, \"markdown\" for auto-converted markdown.\n *\n * @example\n * ```typescript\n * const result = await agent.createGmailDraft({\n * to: ``,\n * subject: ``,\n * message: ``,\n * messageType: \"plain\",\n * });\n * ```\n */\n createGmailDraft(step: CreateGmailDraftStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CreateGmailDraftStepOutput>>;\n\n /**\n * Create a new event on a Google Calendar.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - Date/time values must be ISO 8601 format (e.g. \"2025-07-02T10:00:00-07:00\").\n * - Attendees are specified as one email address per line in a single string.\n * - Set addMeetLink to true to automatically attach a Google Meet video call.\n *\n * @example\n * ```typescript\n * const result = await agent.createGoogleCalendarEvent({\n * summary: ``,\n * startDateTime: ``,\n * endDateTime: ``,\n * });\n * ```\n */\n createGoogleCalendarEvent(step: CreateGoogleCalendarEventStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CreateGoogleCalendarEventStepOutput>>;\n\n /**\n * Create a new Google Document and optionally populate it with content.\n *\n * @remarks\n * - textType determines how the text field is interpreted: \"plain\" for plain text, \"html\" for HTML markup, \"markdown\" for Markdown.\n *\n * @example\n * ```typescript\n * const result = await agent.createGoogleDoc({\n * title: ``,\n * text: ``,\n * textType: \"plain\",\n * });\n * ```\n */\n createGoogleDoc(step: CreateGoogleDocStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CreateGoogleDocStepOutput>>;\n\n /**\n * Create a new Google Spreadsheet and populate it with CSV data.\n *\n * @example\n * ```typescript\n * const result = await agent.createGoogleSheet({\n * title: ``,\n * text: ``,\n * });\n * ```\n */\n createGoogleSheet(step: CreateGoogleSheetStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CreateGoogleSheetStepOutput>>;\n\n /**\n * Delete a vector data source from the current app.\n *\n * @remarks\n * - Soft-deletes a data source (vector database) by marking it as deleted.\n * - The Milvus partition is cleaned up asynchronously by a background cron job.\n * - The data source must belong to the current app version.\n *\n * @example\n * ```typescript\n * const result = await agent.deleteDataSource({\n * dataSourceId: ``,\n * });\n * ```\n */\n deleteDataSource(step: DeleteDataSourceStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DeleteDataSourceStepOutput>>;\n\n /**\n * Delete a single document from a data source.\n *\n * @remarks\n * - Soft-deletes a document by marking it as deleted.\n * - Requires both the data source ID and document ID.\n * - After deletion, reloads vectors into Milvus so the data source reflects the change immediately.\n *\n * @example\n * ```typescript\n * const result = await agent.deleteDataSourceDocument({\n * dataSourceId: ``,\n * documentId: ``,\n * });\n * ```\n */\n deleteDataSourceDocument(step: DeleteDataSourceDocumentStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DeleteDataSourceDocumentStepOutput>>;\n\n /**\n * Move an email to trash in the connected Gmail account (recoverable delete).\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail modify scope.\n * - Uses trash (recoverable) rather than permanent delete.\n *\n * @example\n * ```typescript\n * const result = await agent.deleteGmailEmail({\n * messageId: ``,\n * });\n * ```\n */\n deleteGmailEmail(step: DeleteGmailEmailStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DeleteGmailEmailStepOutput>>;\n\n /**\n * Retrieve a specific event from a Google Calendar by event ID.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns the structured event.\n *\n * @example\n * ```typescript\n * const result = await agent.deleteGoogleCalendarEvent({\n * eventId: ``,\n * });\n * ```\n */\n deleteGoogleCalendarEvent(step: DeleteGoogleCalendarEventStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DeleteGoogleCalendarEventStepOutput>>;\n\n /**\n * Delete a range of rows from a Google Spreadsheet.\n *\n * @remarks\n * - Requires a Google OAuth connection with Drive scope.\n * - startRow and endRow are 1-based row numbers (inclusive).\n * - If sheetName is omitted, operates on the first sheet.\n *\n * @example\n * ```typescript\n * const result = await agent.deleteGoogleSheetRows({\n * documentId: ``,\n * startRow: ``,\n * endRow: ``,\n * });\n * ```\n */\n deleteGoogleSheetRows(step: DeleteGoogleSheetRowsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DeleteGoogleSheetRowsStepOutput>>;\n\n /**\n * Detect changes between runs by comparing current input against previously stored state. Routes execution based on whether a change occurred.\n *\n * @remarks\n * - Persists state across runs using a global variable keyed to the step ID.\n * - Two modes: \"comparison\" (default) uses strict string inequality; \"ai\" uses an LLM to determine if a meaningful change occurred.\n * - First run always treats the value as \"changed\" since there is no previous state.\n * - Each mode supports transitions to different steps/workflows for the \"changed\" and \"unchanged\" paths.\n * - AI mode bills normally for the LLM call.\n *\n * @example\n * ```typescript\n * const result = await agent.detectChanges({\n * mode: \"ai\",\n * input: ``,\n * });\n * ```\n */\n detectChanges(step: DetectChangesStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DetectChangesStepOutput>>;\n\n /**\n * Scan text for personally identifiable information using Microsoft Presidio.\n *\n * @remarks\n * - In workflow mode, transitions to detectedStepId if PII is found, notDetectedStepId otherwise.\n * - In direct execution, returns the detection results without transitioning.\n * - If entities is empty, returns immediately with no detections.\n *\n * @example\n * ```typescript\n * const result = await agent.detectPII({\n * input: ``,\n * language: ``,\n * entities: [],\n * });\n * ```\n */\n detectPII(step: DetectPIIStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DetectPIIStepOutput>>;\n\n /**\n * Edit a previously sent Discord channel message. Use with the message ID returned by Send Discord Message.\n *\n * @remarks\n * - Only messages sent by the bot can be edited.\n * - The messageId is returned by the Send Discord Message step.\n * - Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\n * - When editing with an attachment, the new attachment replaces any previous attachments on the message.\n * - URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\n *\n * @example\n * ```typescript\n * const result = await agent.discordEditMessage({\n * botToken: ``,\n * channelId: ``,\n * messageId: ``,\n * text: ``,\n * });\n * ```\n */\n discordEditMessage(step: DiscordEditMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DiscordEditMessageStepOutput>>;\n\n /**\n * Send a follow-up message to a Discord slash command interaction.\n *\n * @remarks\n * - Requires the applicationId and interactionToken from the Discord trigger variables.\n * - Follow-up messages appear as new messages in the channel after the initial response.\n * - Returns the sent message ID.\n * - Interaction tokens expire after 15 minutes.\n * - Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\n * - URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\n *\n * @example\n * ```typescript\n * const result = await agent.discordSendFollowUp({\n * applicationId: ``,\n * interactionToken: ``,\n * text: ``,\n * });\n * ```\n */\n discordSendFollowUp(step: DiscordSendFollowUpStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DiscordSendFollowUpStepOutput>>;\n\n /**\n * Send a message to Discord — either edit the loading message or send a new channel message.\n *\n * @remarks\n * - mode \"edit\" replaces the loading message (interaction response) with the final result. Uses applicationId and interactionToken from trigger variables. No bot permissions required.\n * - mode \"send\" sends a new message to a channel. Uses botToken and channelId from trigger variables. Returns a messageId that can be used with Edit Discord Message.\n * - Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\n * - URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\n * - Interaction tokens expire after 15 minutes.\n *\n * @example\n * ```typescript\n * const result = await agent.discordSendMessage({\n * mode: \"edit\",\n * text: ``,\n * });\n * ```\n */\n discordSendMessage(step: DiscordSendMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DiscordSendMessageStepOutput>>;\n\n /**\n * Download a video file\n *\n * @remarks\n * - Works with YouTube, TikTok, etc., by using ytdlp behind the scenes\n * - Can save as mp4 or mp3\n *\n * @example\n * ```typescript\n * const result = await agent.downloadVideo({\n * videoUrl: ``,\n * format: \"mp4\",\n * });\n * ```\n */\n downloadVideo(step: DownloadVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DownloadVideoStepOutput>>;\n\n /**\n * Generate or enhance an image generation prompt using a language model. Optionally generates a negative prompt.\n *\n * @remarks\n * - Rewrites the user's prompt with added detail about style, lighting, colors, and composition.\n * - Also useful for initial generation, it doesn't always need to be enhancing an existing prompt\n * - When includeNegativePrompt is true, a second model call generates a negative prompt.\n *\n * @example\n * ```typescript\n * const result = await agent.enhanceImageGenerationPrompt({\n * initialPrompt: ``,\n * includeNegativePrompt: false,\n * systemPrompt: ``,\n * });\n * ```\n */\n enhanceImageGenerationPrompt(step: EnhanceImageGenerationPromptStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<EnhanceImageGenerationPromptStepOutput>>;\n\n /**\n * Generate or enhance a video generation prompt using a language model. Optionally generates a negative prompt.\n *\n * @remarks\n * - Rewrites the user's prompt with added detail about style, camera movement, lighting, and composition.\n * - Also useful for initial generation, it doesn't always need to be enhancing an existing prompt\n * - When includeNegativePrompt is true, a second model call generates a negative prompt.\n *\n * @example\n * ```typescript\n * const result = await agent.enhanceVideoGenerationPrompt({\n * initialPrompt: ``,\n * includeNegativePrompt: false,\n * systemPrompt: ``,\n * });\n * ```\n */\n enhanceVideoGenerationPrompt(step: EnhanceVideoGenerationPromptStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<EnhanceVideoGenerationPromptStepOutput>>;\n\n /**\n * Look up professional information about a person using Apollo.io. Search by ID, name, LinkedIn URL, email, or domain.\n *\n * @remarks\n * - At least one search parameter must be provided.\n * - Returns enriched data from Apollo including contact details, employment info, and social profiles.\n *\n * @example\n * ```typescript\n * const result = await agent.enrichPerson({\n * params: {},\n * });\n * ```\n */\n enrichPerson(step: EnrichPersonStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<EnrichPersonStepOutput>>;\n\n /**\n * Extract audio MP3 from a video file\n *\n * @example\n * ```typescript\n * const result = await agent.extractAudioFromVideo({\n * videoUrl: ``,\n * });\n * ```\n */\n extractAudioFromVideo(step: ExtractAudioFromVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ExtractAudioFromVideoStepOutput>>;\n\n /**\n * Download a file from a URL and extract its text content. Supports PDFs, plain text files, and other document formats.\n *\n * @remarks\n * - Best suited for PDFs and raw text/document files. For web pages, use the scrapeUrl step instead.\n * - Accepts a single URL, a comma-separated list of URLs, or a JSON array of URLs.\n * - Files are rehosted on the MindStudio CDN before extraction.\n * - Maximum file size is 50MB per URL.\n *\n * @example\n * ```typescript\n * const result = await agent.extractText({\n * url: ``,\n * });\n * ```\n */\n extractText(step: ExtractTextStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ExtractTextStepOutput>>;\n\n /**\n * Fetch the full extracted text contents of a document in a data source.\n *\n * @remarks\n * - Loads a document by ID and returns its full extracted text content.\n * - The document must have been successfully processed (status \"done\").\n * - Also returns document metadata (name, summary, word count).\n *\n * @example\n * ```typescript\n * const result = await agent.fetchDataSourceDocument({\n * dataSourceId: ``,\n * documentId: ``,\n * });\n * ```\n */\n fetchDataSourceDocument(step: FetchDataSourceDocumentStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchDataSourceDocumentStepOutput>>;\n\n /**\n * Fetch the contents of an existing Google Document.\n *\n * @remarks\n * - exportType controls the output format: \"html\" for HTML markup, \"markdown\" for Markdown, \"json\" for structured JSON, \"plain\" for plain text.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchGoogleDoc({\n * documentId: ``,\n * exportType: \"html\",\n * });\n * ```\n */\n fetchGoogleDoc(step: FetchGoogleDocStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchGoogleDocStepOutput>>;\n\n /**\n * Fetch contents of a Google Spreadsheet range.\n *\n * @remarks\n * - range uses A1 notation (e.g. \"Sheet1!A1:C10\"). Omit to fetch the entire first sheet.\n * - exportType controls the output format: \"csv\" for comma-separated values, \"json\" for structured JSON.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchGoogleSheet({\n * spreadsheetId: ``,\n * range: ``,\n * exportType: \"csv\",\n * });\n * ```\n */\n fetchGoogleSheet(step: FetchGoogleSheetStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchGoogleSheetStepOutput>>;\n\n /**\n * Fetch recent message history from a Slack channel.\n *\n * @remarks\n * - The user is responsible for connecting their Slack workspace and selecting the channel\n *\n * @example\n * ```typescript\n * const result = await agent.fetchSlackChannelHistory({\n * channelId: ``,\n * });\n * ```\n */\n fetchSlackChannelHistory(step: FetchSlackChannelHistoryStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchSlackChannelHistoryStepOutput>>;\n\n /**\n * Retrieve the captions/transcript for a YouTube video.\n *\n * @remarks\n * - Supports multiple languages via the language parameter.\n * - \"text\" export produces timestamped plain text; \"json\" export produces structured transcript data.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchYoutubeCaptions({\n * videoUrl: ``,\n * exportType: \"text\",\n * language: ``,\n * });\n * ```\n */\n fetchYoutubeCaptions(step: FetchYoutubeCaptionsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchYoutubeCaptionsStepOutput>>;\n\n /**\n * Retrieve metadata and recent videos for a YouTube channel.\n *\n * @remarks\n * - Accepts a YouTube channel URL (e.g. https://www.youtube.com/@ChannelName or /channel/ID).\n * - Returns channel info and video listings as a JSON object.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchYoutubeChannel({\n * channelUrl: ``,\n * });\n * ```\n */\n fetchYoutubeChannel(step: FetchYoutubeChannelStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchYoutubeChannelStepOutput>>;\n\n /**\n * Retrieve comments for a YouTube video.\n *\n * @remarks\n * - Paginates through comments (up to 5 pages).\n * - \"text\" export produces markdown-formatted text; \"json\" export produces structured comment data.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchYoutubeComments({\n * videoUrl: ``,\n * exportType: \"text\",\n * limitPages: ``,\n * });\n * ```\n */\n fetchYoutubeComments(step: FetchYoutubeCommentsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchYoutubeCommentsStepOutput>>;\n\n /**\n * Retrieve metadata for a YouTube video (title, description, stats, channel info).\n *\n * @remarks\n * - Returns video metadata, channel info, and engagement stats.\n * - Video format data is excluded from the response.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchYoutubeVideo({\n * videoUrl: ``,\n * });\n * ```\n */\n fetchYoutubeVideo(step: FetchYoutubeVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchYoutubeVideoStepOutput>>;\n\n /**\n * Create a chart image using QuickChart (Chart.js) and return the URL.\n *\n * @remarks\n * - The data field must be a Chart.js-compatible JSON object serialized as a string.\n * - Supported chart types: bar, line, pie.\n *\n * @example\n * ```typescript\n * const result = await agent.generateChart({\n * chart: {},\n * });\n * ```\n */\n generateChart(step: GenerateChartStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateChartStepOutput>>;\n\n /**\n * Generate an image from a text prompt using an AI model.\n *\n * @remarks\n * - Prompts should be descriptive but concise (roughly 3–6 sentences).\n * - Images are automatically hosted on a CDN.\n * - In foreground mode, the image is displayed to the user. In background mode, the URL is saved to a variable.\n * - When generateVariants is true with numVariants > 1, multiple images are generated in parallel.\n * - In direct execution, foreground mode behaves as background, and userSelect variant behavior behaves as saveAll.\n *\n * @example\n * ```typescript\n * const result = await agent.generateImage({\n * prompt: ``,\n * });\n * ```\n */\n generateImage(step: GenerateImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateImageStepOutput>>;\n\n /**\n * Generate a lip sync video from provided audio and image.\n *\n * @remarks\n * - In foreground mode, the video is displayed to the user. In background mode, the URL is saved to a variable.\n *\n * @example\n * ```typescript\n * const result = await agent.generateLipsync({});\n * ```\n */\n generateLipsync(step: GenerateLipsyncStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateLipsyncStepOutput>>;\n\n /**\n * Generate an audio file from provided instructions (text) using a music model.\n *\n * @remarks\n * - The text field contains the instructions (prompt) for the music generation.\n * - In foreground mode, the audio is displayed to the user. In background mode, the URL is saved to a variable.\n *\n * @example\n * ```typescript\n * const result = await agent.generateMusic({\n * text: ``,\n * });\n * ```\n */\n generateMusic(step: GenerateMusicStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateMusicStepOutput>>;\n\n /**\n * Generate an HTML asset and export it as a webpage, PDF, or image\n *\n * @remarks\n * - Agents can generate HTML documents and export as webpage, PDFs, images, or videos. They do this by using the \"generatePdf\" block, which defines an HTML page with variables, and then the generation process renders the page to create the output and save its URL at the specified variable.\n * - The template for the HTML page is generated by a separate process, and it can only use variables that have already been defined in the workflow at the time of its execution. It has full access to handlebars to render the HTML template, including a handlebars helper to render a markdown variable string as HTML (which can be useful for creating templates that render long strings). The template can also create its own simple JavaScript to do things like format dates and strings.\n * - If PDF or composited image generation are part of the workflow, assistant adds the block and leaves the \"source\" empty. In a separate step, assistant generates a detailed request for the developer who will write the HTML.\n * - Can also auto-generate HTML from a prompt (like a generate text block to generate HTML). In these cases, create a prompt with variables in the dynamicPrompt variable describing, in detail, the document to generate\n * - Can either display output directly to user (foreground mode) or save the URL of the asset to a variable (background mode)\n *\n * @example\n * ```typescript\n * const result = await agent.generateAsset({\n * source: ``,\n * sourceType: \"html\",\n * outputFormat: \"pdf\",\n * pageSize: \"full\",\n * testData: {},\n * });\n * ```\n */\n generateAsset(step: GeneratePdfStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GeneratePdfStepOutput>>;\n\n /**\n * Convert a static image to an MP4\n *\n * @remarks\n * - Can use to create slides/intertitles/slates for video composition\n *\n * @example\n * ```typescript\n * const result = await agent.generateStaticVideoFromImage({\n * imageUrl: ``,\n * duration: ``,\n * });\n * ```\n */\n generateStaticVideoFromImage(step: GenerateStaticVideoFromImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateStaticVideoFromImageStepOutput>>;\n\n /**\n * Generate a video from a text prompt using an AI model.\n *\n * @remarks\n * - Prompts should be descriptive but concise (roughly 3–6 sentences).\n * - Videos are automatically hosted on a CDN.\n * - In foreground mode, the video is displayed to the user. In background mode, the URL is saved to a variable.\n * - When generateVariants is true with numVariants > 1, multiple videos are generated in parallel.\n * - In direct execution, foreground mode behaves as background, and userSelect variant behavior behaves as saveAll.\n *\n * @example\n * ```typescript\n * const result = await agent.generateVideo({\n * prompt: ``,\n * });\n * ```\n */\n generateVideo(step: GenerateVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateVideoStepOutput>>;\n\n /**\n * Download attachments from a Gmail email and re-host them on CDN.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Attachments are uploaded to CDN and returned as URLs.\n * - Attachments larger than 25MB are skipped.\n * - Use the message ID from Search Gmail Emails, List Recent Gmail Emails, or Get Gmail Email steps.\n *\n * @example\n * ```typescript\n * const result = await agent.getGmailAttachments({\n * messageId: ``,\n * });\n * ```\n */\n getGmailAttachments(step: GetGmailAttachmentsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGmailAttachmentsStepOutput>>;\n\n /**\n * Retrieve a specific draft from Gmail by draft ID.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns the draft content including subject, recipients, sender, and body.\n *\n * @example\n * ```typescript\n * const result = await agent.getGmailDraft({\n * draftId: ``,\n * });\n * ```\n */\n getGmailDraft(step: GetGmailDraftStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGmailDraftStepOutput>>;\n\n /**\n * Retrieve a specific email from Gmail by message ID.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns the email subject, sender, recipient, date, body (plain text preferred, falls back to HTML), and labels.\n *\n * @example\n * ```typescript\n * const result = await agent.getGmailEmail({\n * messageId: ``,\n * });\n * ```\n */\n getGmailEmail(step: GetGmailEmailStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGmailEmailStepOutput>>;\n\n /**\n * Get the number of unread emails in the connected Gmail inbox.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns the unread message count for the inbox label.\n * - This is a lightweight call that does not fetch any email content.\n *\n * @example\n * ```typescript\n * const result = await agent.getGmailUnreadCount({});\n * ```\n */\n getGmailUnreadCount(step: GetGmailUnreadCountStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGmailUnreadCountStepOutput>>;\n\n /**\n * Retrieve a specific event from a Google Calendar by event ID.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns the structured event.\n *\n * @example\n * ```typescript\n * const result = await agent.getGoogleCalendarEvent({\n * eventId: ``,\n * exportType: \"json\",\n * });\n * ```\n */\n getGoogleCalendarEvent(step: GetGoogleCalendarEventStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGoogleCalendarEventStepOutput>>;\n\n /**\n * Download a file from Google Drive and rehost it on the CDN. Returns a public CDN URL.\n *\n * @remarks\n * - Requires a Google OAuth connection with Drive scope.\n * - Google-native files (Docs, Sheets, Slides) cannot be downloaded — use dedicated steps instead.\n * - Maximum file size: 200MB.\n * - The file is downloaded and re-uploaded to the CDN; the returned URL is publicly accessible.\n *\n * @example\n * ```typescript\n * const result = await agent.getGoogleDriveFile({\n * fileId: ``,\n * });\n * ```\n */\n getGoogleDriveFile(step: GetGoogleDriveFileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGoogleDriveFileStepOutput>>;\n\n /**\n * Get metadata about a Google Spreadsheet including sheet names, row counts, and column counts.\n *\n * @remarks\n * - Requires a Google OAuth connection with Drive scope.\n * - Returns the spreadsheet title and a list of all sheets with their dimensions.\n *\n * @example\n * ```typescript\n * const result = await agent.getGoogleSheetInfo({\n * documentId: ``,\n * });\n * ```\n */\n getGoogleSheetInfo(step: GetGoogleSheetInfoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGoogleSheetInfoStepOutput>>;\n\n /**\n * Get info about a media file\n *\n * @example\n * ```typescript\n * const result = await agent.getMediaMetadata({\n * mediaUrl: ``,\n * });\n * ```\n */\n getMediaMetadata(step: GetMediaMetadataStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetMediaMetadataStepOutput>>;\n\n /**\n * Make an HTTP request to an external endpoint and return the response.\n *\n * @remarks\n * - Supports GET, POST, PATCH, DELETE, and PUT methods.\n * - Body can be raw JSON/text, URL-encoded form data, or multipart form data.\n *\n * @example\n * ```typescript\n * const result = await agent.httpRequest({\n * url: ``,\n * method: ``,\n * headers: {},\n * queryParams: {},\n * body: ``,\n * bodyItems: {},\n * contentType: \"none\",\n * customContentType: ``,\n * });\n * ```\n */\n httpRequest(step: HttpRequestStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HttpRequestStepOutput>>;\n\n /**\n * Create a new company or update an existing one in HubSpot. Matches by domain.\n *\n * @remarks\n * - Requires a HubSpot OAuth connection (connectionId).\n * - If a company with the given domain already exists, it is updated. Otherwise, a new one is created.\n * - Property values are type-checked against enabledProperties before being sent to HubSpot.\n *\n * @example\n * ```typescript\n * const result = await agent.hubspotCreateCompany({\n * company: {},\n * enabledProperties: [],\n * });\n * ```\n */\n hubspotCreateCompany(step: HubspotCreateCompanyStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HubspotCreateCompanyStepOutput>>;\n\n /**\n * Create a new contact or update an existing one in HubSpot. Matches by email address.\n *\n * @remarks\n * - Requires a HubSpot OAuth connection (connectionId).\n * - If a contact with the given email already exists, it is updated. Otherwise, a new one is created.\n * - If companyDomain is provided, the contact is associated with that company (creating the company if needed).\n * - Property values are type-checked against enabledProperties before being sent to HubSpot.\n *\n * @example\n * ```typescript\n * const result = await agent.hubspotCreateContact({\n * contact: {},\n * enabledProperties: [],\n * companyDomain: ``,\n * });\n * ```\n */\n hubspotCreateContact(step: HubspotCreateContactStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HubspotCreateContactStepOutput>>;\n\n /**\n * Look up a HubSpot company by domain name or company ID.\n *\n * @remarks\n * - Requires a HubSpot OAuth connection (connectionId).\n * - Returns null if the company is not found.\n * - When searching by domain, performs a search query then fetches the full company record.\n * - Use additionalProperties to request specific HubSpot properties beyond the defaults.\n *\n * @example\n * ```typescript\n * const result = await agent.hubspotGetCompany({\n * searchBy: \"domain\",\n * companyDomain: ``,\n * companyId: ``,\n * additionalProperties: [],\n * });\n * ```\n */\n hubspotGetCompany(step: HubspotGetCompanyStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HubspotGetCompanyStepOutput>>;\n\n /**\n * Look up a HubSpot contact by email address or contact ID.\n *\n * @remarks\n * - Requires a HubSpot OAuth connection (connectionId).\n * - Returns null if the contact is not found.\n * - Use additionalProperties to request specific HubSpot properties beyond the defaults.\n *\n * @example\n * ```typescript\n * const result = await agent.hubspotGetContact({\n * searchBy: \"email\",\n * contactEmail: ``,\n * contactId: ``,\n * additionalProperties: [],\n * });\n * ```\n */\n hubspotGetContact(step: HubspotGetContactStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HubspotGetContactStepOutput>>;\n\n /**\n * Look up company information by domain using Hunter.io.\n *\n * @remarks\n * - Returns company name, description, location, industry, size, technologies, and more.\n * - If the domain input is a full URL, the hostname is automatically extracted.\n * - Returns null if the company is not found.\n *\n * @example\n * ```typescript\n * const result = await agent.hunterApiCompanyEnrichment({\n * domain: ``,\n * });\n * ```\n */\n hunterApiCompanyEnrichment(step: HunterApiCompanyEnrichmentStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HunterApiCompanyEnrichmentStepOutput>>;\n\n /**\n * Search for email addresses associated with a domain using Hunter.io.\n *\n * @remarks\n * - If the domain input is a full URL, the hostname is automatically extracted.\n * - Returns a list of email addresses found for the domain along with organization info.\n *\n * @example\n * ```typescript\n * const result = await agent.hunterApiDomainSearch({\n * domain: ``,\n * });\n * ```\n */\n hunterApiDomainSearch(step: HunterApiDomainSearchStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HunterApiDomainSearchStepOutput>>;\n\n /**\n * Find an email address for a specific person at a domain using Hunter.io.\n *\n * @remarks\n * - Requires a first name, last name, and domain.\n * - If the domain input is a full URL, the hostname is automatically extracted.\n * - Returns the most likely email address with a confidence score.\n *\n * @example\n * ```typescript\n * const result = await agent.hunterApiEmailFinder({\n * domain: ``,\n * firstName: ``,\n * lastName: ``,\n * });\n * ```\n */\n hunterApiEmailFinder(step: HunterApiEmailFinderStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HunterApiEmailFinderStepOutput>>;\n\n /**\n * Verify whether an email address is valid and deliverable using Hunter.io.\n *\n * @remarks\n * - Checks email format, MX records, SMTP server, and mailbox deliverability.\n * - Returns a status (\"valid\", \"invalid\", \"accept_all\", \"webmail\", \"disposable\", \"unknown\") and a score.\n *\n * @example\n * ```typescript\n * const result = await agent.hunterApiEmailVerification({\n * email: ``,\n * });\n * ```\n */\n hunterApiEmailVerification(step: HunterApiEmailVerificationStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HunterApiEmailVerificationStepOutput>>;\n\n /**\n * Look up professional information about a person by their email address using Hunter.io.\n *\n * @remarks\n * - Returns name, job title, social profiles, and company information.\n * - If the person is not found, returns an object with an error message instead of throwing.\n *\n * @example\n * ```typescript\n * const result = await agent.hunterApiPersonEnrichment({\n * email: ``,\n * });\n * ```\n */\n hunterApiPersonEnrichment(step: HunterApiPersonEnrichmentStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HunterApiPersonEnrichmentStepOutput>>;\n\n /**\n * Replace a face in an image with a face from another image using AI.\n *\n * @remarks\n * - Requires both a target image and a face source image.\n * - Output is re-hosted on the CDN as a PNG.\n *\n * @example\n * ```typescript\n * const result = await agent.imageFaceSwap({\n * imageUrl: ``,\n * faceImageUrl: ``,\n * engine: ``,\n * });\n * ```\n */\n imageFaceSwap(step: ImageFaceSwapStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ImageFaceSwapStepOutput>>;\n\n /**\n * Remove watermarks from an image using AI.\n *\n * @remarks\n * - Output is re-hosted on the CDN as a PNG.\n *\n * @example\n * ```typescript\n * const result = await agent.imageRemoveWatermark({\n * imageUrl: ``,\n * engine: ``,\n * });\n * ```\n */\n imageRemoveWatermark(step: ImageRemoveWatermarkStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ImageRemoveWatermarkStepOutput>>;\n\n /**\n * Insert b-roll clips into a base video at a timecode, optionally with an xfade transition.\n *\n * @example\n * ```typescript\n * const result = await agent.insertVideoClips({\n * baseVideoUrl: ``,\n * overlayVideos: [],\n * });\n * ```\n */\n insertVideoClips(step: InsertVideoClipsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<InsertVideoClipsStepOutput>>;\n\n /**\n * List all data sources for the current app.\n *\n * @remarks\n * - Returns metadata for every data source associated with the current app version.\n * - Each entry includes the data source ID, name, description, status, and document list.\n *\n * @example\n * ```typescript\n * const result = await agent.listDataSources({});\n * ```\n */\n listDataSources(step: ListDataSourcesStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListDataSourcesStepOutput>>;\n\n /**\n * List drafts in the connected Gmail account.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns up to 50 drafts (default 10).\n * - The variable receives text or JSON depending on exportType.\n *\n * @example\n * ```typescript\n * const result = await agent.listGmailDrafts({\n * exportType: \"json\",\n * });\n * ```\n */\n listGmailDrafts(step: ListGmailDraftsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListGmailDraftsStepOutput>>;\n\n /**\n * List all labels in the connected Gmail account. Use these label IDs or names with the Update Gmail Labels step.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns both system labels (INBOX, SENT, TRASH, etc.) and user-created labels.\n * - Label type is \"system\" for built-in labels or \"user\" for custom labels.\n *\n * @example\n * ```typescript\n * const result = await agent.listGmailLabels({});\n * ```\n */\n listGmailLabels(step: ListGmailLabelsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListGmailLabelsStepOutput>>;\n\n /**\n * List upcoming events from a Google Calendar, ordered by start time.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - Only returns future events (timeMin = now).\n * - The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns structured events.\n *\n * @example\n * ```typescript\n * const result = await agent.listGoogleCalendarEvents({\n * limit: 0,\n * exportType: \"json\",\n * });\n * ```\n */\n listGoogleCalendarEvents(step: ListGoogleCalendarEventsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListGoogleCalendarEventsStepOutput>>;\n\n /**\n * List files in a Google Drive folder.\n *\n * @remarks\n * - Requires a Google OAuth connection with Drive scope.\n * - If folderId is omitted, lists files in the root folder.\n * - Returns file metadata including name, type, size, and links.\n *\n * @example\n * ```typescript\n * const result = await agent.listGoogleDriveFiles({\n * exportType: \"json\",\n * });\n * ```\n */\n listGoogleDriveFiles(step: ListGoogleDriveFilesStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListGoogleDriveFilesStepOutput>>;\n\n /**\n * List recent emails from the connected Gmail inbox.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns up to 100 emails (default 5), ordered by most recent first.\n * - Functionally equivalent to Search Gmail Emails with an \"in:inbox\" query.\n *\n * @example\n * ```typescript\n * const result = await agent.listRecentGmailEmails({\n * exportType: \"json\",\n * limit: ``,\n * });\n * ```\n */\n listRecentGmailEmails(step: ListRecentGmailEmailsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListRecentGmailEmailsStepOutput>>;\n\n /**\n * Route execution to different branches based on AI evaluation, comparison operators, or workflow jumps.\n *\n * @remarks\n * - Supports two modes: \"ai\" (default) uses an AI model to pick the most accurate statement; \"comparison\" uses operator-based checks.\n * - In AI mode, the model picks the most accurate statement from the list. All possible cases must be specified.\n * - In comparison mode, the context is the left operand and each case's condition is the right operand. First matching case wins. Use operator \"default\" as a fallback.\n * - Requires at least two cases.\n * - Each case can transition to a step in the current workflow (destinationStepId) or jump to another workflow (destinationWorkflowId).\n *\n * @example\n * ```typescript\n * const result = await agent.logic({\n * context: ``,\n * cases: [],\n * });\n * ```\n */\n logic(step: LogicStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<LogicStepOutput>>;\n\n /**\n * Trigger a Make.com (formerly Integromat) scenario via webhook and return the response.\n *\n * @remarks\n * - The webhook URL must be configured in your Make.com scenario.\n * - Input key-value pairs are sent as JSON in the POST body.\n * - Response format depends on the Make.com scenario configuration.\n *\n * @example\n * ```typescript\n * const result = await agent.makeDotComRunScenario({\n * webhookUrl: ``,\n * input: {},\n * });\n * ```\n */\n makeDotComRunScenario(step: MakeDotComRunScenarioStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<MakeDotComRunScenarioStepOutput>>;\n\n /**\n * Merge one or more clips into a single audio file.\n *\n * @example\n * ```typescript\n * const result = await agent.mergeAudio({\n * mp3Urls: [],\n * });\n * ```\n */\n mergeAudio(step: MergeAudioStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<MergeAudioStepOutput>>;\n\n /**\n * Merge one or more clips into a single video.\n *\n * @example\n * ```typescript\n * const result = await agent.mergeVideos({\n * videoUrls: [],\n * });\n * ```\n */\n mergeVideos(step: MergeVideosStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<MergeVideosStepOutput>>;\n\n /**\n * Mix an audio track into a video\n *\n * @example\n * ```typescript\n * const result = await agent.mixAudioIntoVideo({\n * videoUrl: ``,\n * audioUrl: ``,\n * options: {},\n * });\n * ```\n */\n mixAudioIntoVideo(step: MixAudioIntoVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<MixAudioIntoVideoStepOutput>>;\n\n /**\n * Mute a video file\n *\n * @example\n * ```typescript\n * const result = await agent.muteVideo({\n * videoUrl: ``,\n * });\n * ```\n */\n muteVideo(step: MuteVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<MuteVideoStepOutput>>;\n\n /**\n * Trigger an n8n workflow node via webhook and return the response.\n *\n * @remarks\n * - The webhook URL must be configured in your n8n workflow.\n * - Supports GET and POST methods with optional Basic authentication.\n * - For GET requests, input values are sent as query parameters. For POST, they are sent as JSON body.\n *\n * @example\n * ```typescript\n * const result = await agent.n8nRunNode({\n * method: ``,\n * authentication: \"none\",\n * user: ``,\n * password: ``,\n * webhookUrl: ``,\n * input: {},\n * });\n * ```\n */\n n8nRunNode(step: N8nRunNodeStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<N8nRunNodeStepOutput>>;\n\n /**\n * Create a new page in Notion as a child of an existing page.\n *\n * @remarks\n * - Requires a Notion OAuth connection (connectionId).\n * - Content is provided as markdown and converted to Notion blocks (headings, paragraphs, lists, code, quotes).\n * - The page is created as a child of the specified parent page (pageId).\n *\n * @example\n * ```typescript\n * const result = await agent.notionCreatePage({\n * pageId: ``,\n * content: ``,\n * title: ``,\n * });\n * ```\n */\n notionCreatePage(step: NotionCreatePageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<NotionCreatePageStepOutput>>;\n\n /**\n * Update the content of an existing Notion page.\n *\n * @remarks\n * - Requires a Notion OAuth connection (connectionId).\n * - Content is provided as markdown and converted to Notion blocks.\n * - \"append\" mode adds content to the end of the page. \"overwrite\" mode deletes all existing blocks first.\n *\n * @example\n * ```typescript\n * const result = await agent.notionUpdatePage({\n * pageId: ``,\n * content: ``,\n * mode: \"append\",\n * });\n * ```\n */\n notionUpdatePage(step: NotionUpdatePageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<NotionUpdatePageStepOutput>>;\n\n /**\n * Search for people matching specific criteria using Apollo.io. Supports natural language queries and advanced filters.\n *\n * @remarks\n * - Can use a natural language \"smartQuery\" which is converted to Apollo search parameters by an AI model.\n * - Advanced params can override or supplement the smart query results.\n * - Optionally enriches returned people and/or their organizations for additional detail.\n * - Results are paginated. Use limit and page to control the result window.\n *\n * @example\n * ```typescript\n * const result = await agent.peopleSearch({\n * smartQuery: ``,\n * enrichPeople: false,\n * enrichOrganizations: false,\n * limit: ``,\n * page: ``,\n * params: {},\n * });\n * ```\n */\n peopleSearch(step: PeopleSearchStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<PeopleSearchStepOutput>>;\n\n /**\n * Create a post on LinkedIn from the connected account.\n *\n * @remarks\n * - Requires a LinkedIn OAuth connection (connectionId).\n * - Supports text posts, image posts, video posts, document posts, and article posts.\n * - Attach one media type per post: image, video, document, or article.\n * - Documents support PDF, PPT, PPTX, DOC, DOCX (max 100MB, 300 pages). Displays as a slideshow carousel.\n * - Articles create a link preview with optional custom title, description, and thumbnail.\n * - Visibility controls who can see the post.\n *\n * @example\n * ```typescript\n * const result = await agent.postToLinkedIn({\n * message: ``,\n * visibility: \"PUBLIC\",\n * });\n * ```\n */\n postToLinkedIn(step: PostToLinkedInStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<PostToLinkedInStepOutput>>;\n\n /**\n * Send a message to a Slack channel via a connected bot.\n *\n * @remarks\n * - The user is responsible for connecting their Slack workspace and selecting the channel\n * - Supports both simple text messages and slack blocks messages\n * - Text messages can use limited markdown (slack-only fomatting—e.g., headers are just rendered as bold)\n *\n * @example\n * ```typescript\n * const result = await agent.postToSlackChannel({\n * channelId: ``,\n * messageType: \"string\",\n * message: ``,\n * });\n * ```\n */\n postToSlackChannel(step: PostToSlackChannelStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<PostToSlackChannelStepOutput>>;\n\n /**\n * Create a post on X (Twitter) from the connected account.\n *\n * @remarks\n * - Requires an X OAuth connection (connectionId).\n * - Maximum 280 characters of text.\n * - Optionally attach up to 4 media items (images, GIFs, or videos) via mediaUrls.\n * - Media URLs must be publicly accessible. The service fetches and uploads them to X.\n * - Supported formats: JPEG, PNG, GIF, WEBP, MP4. Images up to 5MB, videos up to 512MB.\n *\n * @example\n * ```typescript\n * const result = await agent.postToX({\n * text: ``,\n * });\n * ```\n */\n postToX(step: PostToXStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<PostToXStepOutput>>;\n\n /**\n * Send data to a Zapier Zap via webhook and return the response.\n *\n * @remarks\n * - The webhook URL must be configured in the Zapier Zap settings\n * - Input keys and values are sent as the JSON body of the POST request\n * - The webhook response (JSON or plain text) is returned as the output\n *\n * @example\n * ```typescript\n * const result = await agent.postToZapier({\n * webhookUrl: ``,\n * input: {},\n * });\n * ```\n */\n postToZapier(step: PostToZapierStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<PostToZapierStepOutput>>;\n\n /**\n * Execute a SQL query against the app managed database.\n *\n * @remarks\n * - Executes raw SQL against a SQLite database managed by the app.\n * - For SELECT queries, returns rows as JSON.\n * - For INSERT/UPDATE/DELETE, returns the number of affected rows.\n * - Use {{variables}} directly in your SQL. By default they are automatically extracted\n * and passed as safe parameterized values (preventing SQL injection).\n * Example: INSERT INTO contacts (name, comment) VALUES ({{name}}, {{comment}})\n * - Full MindStudio handlebars syntax is supported, including helpers like {{json myVar}},\n * {{get myVar \"$.path\"}}, {{global.orgName}}, etc.\n * - Set parameterize to false for raw/dynamic SQL where variables are interpolated directly\n * into the query string. Use this when another step generates full or partial SQL, e.g.\n * a bulk INSERT with a precomputed VALUES list. The user is responsible for sanitization\n * when parameterize is false.\n *\n * @example\n * ```typescript\n * const result = await agent.queryAppDatabase({\n * databaseId: ``,\n * sql: ``,\n * });\n * ```\n */\n queryAppDatabase(step: QueryAppDatabaseStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<QueryAppDatabaseStepOutput>>;\n\n /**\n * Search a vector data source (RAG) and return relevant document chunks.\n *\n * @remarks\n * - Queries a vectorized data source and returns the most relevant chunks.\n * - Useful for retrieval-augmented generation (RAG) workflows.\n *\n * @example\n * ```typescript\n * const result = await agent.queryDataSource({\n * dataSourceId: ``,\n * query: ``,\n * maxResults: 0,\n * });\n * ```\n */\n queryDataSource(step: QueryDataSourceStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<QueryDataSourceStepOutput>>;\n\n /**\n * Execute a SQL query against an external database connected to the workspace.\n *\n * @remarks\n * - Requires a database connection configured in the workspace.\n * - Supports PostgreSQL (including Supabase), MySQL, and MSSQL.\n * - Results can be returned as JSON or CSV.\n *\n * @example\n * ```typescript\n * const result = await agent.queryExternalDatabase({\n * query: ``,\n * outputFormat: \"json\",\n * });\n * ```\n */\n queryExternalDatabase(step: QueryExternalDatabaseStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<QueryExternalDatabaseStepOutput>>;\n\n /**\n * Replace personally identifiable information in text with placeholders using Microsoft Presidio.\n *\n * @remarks\n * - PII is replaced with entity type placeholders (e.g. \"Call me at <PHONE_NUMBER>\").\n * - If entities is empty, returns empty text immediately without processing.\n *\n * @example\n * ```typescript\n * const result = await agent.redactPII({\n * input: ``,\n * language: ``,\n * entities: [],\n * });\n * ```\n */\n redactPII(step: RedactPIIStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<RedactPIIStepOutput>>;\n\n /**\n * Remove the background from an image using AI, producing a transparent PNG.\n *\n * @remarks\n * - Uses the Bria background removal model via fal.ai.\n * - Output is re-hosted on the CDN as a PNG with transparency.\n *\n * @example\n * ```typescript\n * const result = await agent.removeBackgroundFromImage({\n * imageUrl: ``,\n * });\n * ```\n */\n removeBackgroundFromImage(step: RemoveBackgroundFromImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<RemoveBackgroundFromImageStepOutput>>;\n\n /**\n * Reply to an existing email in Gmail. The reply is threaded under the original message.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail compose and readonly scopes.\n * - The reply is sent to the original sender and threaded under the original message.\n * - messageType controls the body format: \"plain\", \"html\", or \"markdown\".\n *\n * @example\n * ```typescript\n * const result = await agent.replyToGmailEmail({\n * messageId: ``,\n * message: ``,\n * messageType: \"plain\",\n * });\n * ```\n */\n replyToGmailEmail(step: ReplyToGmailEmailStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ReplyToGmailEmailStepOutput>>;\n\n /**\n * Resize a video file\n *\n * @example\n * ```typescript\n * const result = await agent.resizeVideo({\n * videoUrl: ``,\n * mode: \"fit\",\n * });\n * ```\n */\n resizeVideo(step: ResizeVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ResizeVideoStepOutput>>;\n\n /**\n * Run a raw API connector to a third-party service\n *\n * @remarks\n * - Use the /developer/v2/helpers/connectors endpoint to list available services and actions.\n * - Use /developer/v2/helpers/connectors/{serviceId}/{actionId} to get the full input configuration for an action.\n * - Use /developer/v2/helpers/connections to list your available OAuth connections.\n * - The actionId format is \"serviceId/actionId\" (e.g., \"slack/send-message\").\n * - Pass a __connectionId to authenticate the request with a specific OAuth connection, otherwise the default will be used (if configured).\n *\n * @example\n * ```typescript\n * const result = await agent.runFromConnectorRegistry({\n * actionId: ``,\n * displayName: ``,\n * icon: ``,\n * configurationValues: {},\n * });\n * ```\n */\n runFromConnectorRegistry(step: RunFromConnectorRegistryStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<RunFromConnectorRegistryStepOutput>>;\n\n /**\n * Run a packaged workflow (\"custom block\")\n *\n * @remarks\n * - From the user's perspective, packaged workflows are just ordinary blocks. Behind the scenes, they operate like packages/libraries in a programming language, letting the user execute custom functionality.\n * - Some of these packaged workflows are available as part of MindStudio's \"Standard Library\" and available to every user.\n * - Available packaged workflows are documented here as individual blocks, but the runPackagedWorkflow block is how they need to be wrapped in order to be executed correctly.\n *\n * @example\n * ```typescript\n * const result = await agent.runPackagedWorkflow({\n * appId: ``,\n * workflowId: ``,\n * inputVariables: {},\n * outputVariables: {},\n * name: ``,\n * });\n * ```\n */\n runPackagedWorkflow(step: RunPackagedWorkflowStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<RunPackagedWorkflowStepOutput>>;\n\n /**\n * Scrape a Facebook page\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeFacebookPage({\n * pageUrl: ``,\n * });\n * ```\n */\n scrapeFacebookPage(step: ScrapeFacebookPageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeFacebookPageStepOutput>>;\n\n /**\n * Get all the posts for a Facebook page\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeFacebookPosts({\n * pageUrl: ``,\n * });\n * ```\n */\n scrapeFacebookPosts(step: ScrapeFacebookPostsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeFacebookPostsStepOutput>>;\n\n /**\n * Get all the comments for an Instagram post\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeInstagramComments({\n * postUrl: ``,\n * resultsLimit: ``,\n * });\n * ```\n */\n scrapeInstagramComments(step: ScrapeInstagramCommentsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeInstagramCommentsStepOutput>>;\n\n /**\n * Scrape an Instagram profile's mentions\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeInstagramMentions({\n * profileUrl: ``,\n * resultsLimit: ``,\n * });\n * ```\n */\n scrapeInstagramMentions(step: ScrapeInstagramMentionsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeInstagramMentionsStepOutput>>;\n\n /**\n * Get all the posts for an Instagram profile\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeInstagramPosts({\n * profileUrl: ``,\n * resultsLimit: ``,\n * onlyPostsNewerThan: ``,\n * });\n * ```\n */\n scrapeInstagramPosts(step: ScrapeInstagramPostsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeInstagramPostsStepOutput>>;\n\n /**\n * Scrape an Instagram profile\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeInstagramProfile({\n * profileUrl: ``,\n * });\n * ```\n */\n scrapeInstagramProfile(step: ScrapeInstagramProfileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeInstagramProfileStepOutput>>;\n\n /**\n * Get all the reels for an Instagram profile\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeInstagramReels({\n * profileUrl: ``,\n * resultsLimit: ``,\n * });\n * ```\n */\n scrapeInstagramReels(step: ScrapeInstagramReelsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeInstagramReelsStepOutput>>;\n\n /**\n * Scrape public company data from a LinkedIn company page.\n *\n * @remarks\n * - Requires a LinkedIn company URL (e.g. https://www.linkedin.com/company/mindstudioai).\n * - Returns structured company data including description, employees, updates, and similar companies.\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeLinkedInCompany({\n * url: ``,\n * });\n * ```\n */\n scrapeLinkedInCompany(step: ScrapeLinkedInCompanyStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeLinkedInCompanyStepOutput>>;\n\n /**\n * Scrape public profile data from a LinkedIn profile page.\n *\n * @remarks\n * - Requires a LinkedIn profile URL (e.g. https://www.linkedin.com/in/username).\n * - Returns structured profile data including experience, education, articles, and activities.\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeLinkedInProfile({\n * url: ``,\n * });\n * ```\n */\n scrapeLinkedInProfile(step: ScrapeLinkedInProfileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeLinkedInProfileStepOutput>>;\n\n /**\n * Scrape a Meta Threads profile\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeMetaThreadsProfile({\n * profileUrl: ``,\n * });\n * ```\n */\n scrapeMetaThreadsProfile(step: ScrapeMetaThreadsProfileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeMetaThreadsProfileStepOutput>>;\n\n /**\n * Extract text, HTML, or structured content from one or more web pages.\n *\n * @remarks\n * - Accepts a single URL or multiple URLs (as a JSON array, comma-separated, or newline-separated).\n * - Output format controls the result shape: \"text\" returns markdown, \"html\" returns raw HTML, \"json\" returns structured scraper data.\n * - Can optionally capture a screenshot of each page.\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeUrl({\n * url: ``,\n * });\n * ```\n */\n scrapeUrl(step: ScrapeUrlStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeUrlStepOutput>>;\n\n /**\n * Scrape data from a single X (Twitter) post by URL.\n *\n * @remarks\n * - Returns structured post data (text, html, optional json/screenshot/metadata).\n * - Optionally saves the text content to a variable.\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeXPost({\n * url: ``,\n * });\n * ```\n */\n scrapeXPost(step: ScrapeXPostStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeXPostStepOutput>>;\n\n /**\n * Scrape public profile data from an X (Twitter) account by URL.\n *\n * @remarks\n * - Returns structured profile data.\n * - Optionally saves the result to a variable.\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeXProfile({\n * url: ``,\n * });\n * ```\n */\n scrapeXProfile(step: ScrapeXProfileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeXProfileStepOutput>>;\n\n /**\n * Capture a screenshot of a web page as a PNG image.\n *\n * @remarks\n * - Takes a viewport or full-page screenshot of the given URL.\n * - Returns a CDN-hosted PNG image URL.\n * - Viewport mode captures only the visible area; fullPage captures the entire scrollable page.\n * - You can customize viewport width/height, add a delay, or wait for a CSS selector before capturing.\n *\n * @example\n * ```typescript\n * const result = await agent.screenshotUrl({\n * url: ``,\n * });\n * ```\n */\n screenshotUrl(step: ScreenshotUrlStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScreenshotUrlStepOutput>>;\n\n /**\n * Search for emails in the connected Gmail account using a Gmail search query. To list recent inbox emails, pass an empty query string.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Uses Gmail search syntax (e.g. \"from:user@example.com\", \"subject:invoice\", \"is:unread\").\n * - To list recent inbox emails, use an empty query string or \"in:inbox\".\n * - Returns up to 100 emails (default 5). The variable receives text or JSON depending on exportType.\n * - The direct execution output always returns structured email objects.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGmailEmails({\n * query: ``,\n * exportType: \"json\",\n * limit: ``,\n * });\n * ```\n */\n searchGmailEmails(step: SearchGmailEmailsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGmailEmailsStepOutput>>;\n\n /**\n * Search the web using Google and return structured results.\n *\n * @remarks\n * - Defaults to us/english, but can optionally specify country and/or language.\n * - Defaults to any time, but can optionally specify last hour, last day, week, month, or year.\n * - Defaults to top 30 results, but can specify 1 to 100 results to return.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogle({\n * query: ``,\n * exportType: \"text\",\n * });\n * ```\n */\n searchGoogle(step: SearchGoogleStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleStepOutput>>;\n\n /**\n * Search for events in a Google Calendar by keyword, date range, or both.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - Supports keyword search via \"query\" and date filtering via \"timeMin\"/\"timeMax\" (ISO 8601 format).\n * - Unlike \"List Events\" which only shows future events, this allows searching past events too.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogleCalendarEvents({\n * exportType: \"json\",\n * });\n * ```\n */\n searchGoogleCalendarEvents(step: SearchGoogleCalendarEventsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleCalendarEventsStepOutput>>;\n\n /**\n * Search for files in Google Drive by keyword.\n *\n * @remarks\n * - Requires a Google OAuth connection with Drive scope.\n * - Searches file content and names using Google Drive's fullText search.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogleDrive({\n * query: ``,\n * exportType: \"json\",\n * });\n * ```\n */\n searchGoogleDrive(step: SearchGoogleDriveStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleDriveStepOutput>>;\n\n /**\n * Search Google Images and return image results with URLs and metadata.\n *\n * @remarks\n * - Defaults to us/english, but can optionally specify country and/or language.\n * - Defaults to any time, but can optionally specify last hour, last day, week, month, or year.\n * - Defaults to top 30 results, but can specify 1 to 100 results to return.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogleImages({\n * query: ``,\n * exportType: \"text\",\n * });\n * ```\n */\n searchGoogleImages(step: SearchGoogleImagesStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleImagesStepOutput>>;\n\n /**\n * Search Google News for recent news articles matching a query.\n *\n * @remarks\n * - Defaults to top 30 results, but can specify 1 to 100 results to return.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogleNews({\n * text: ``,\n * exportType: \"text\",\n * });\n * ```\n */\n searchGoogleNews(step: SearchGoogleNewsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleNewsStepOutput>>;\n\n /**\n * Fetch Google Trends data for a search term.\n *\n * @remarks\n * - date accepts shorthand (\"now 1-H\", \"today 1-m\", \"today 5-y\", etc.) or custom \"yyyy-mm-dd yyyy-mm-dd\" ranges.\n * - data_type controls the shape of returned data: TIMESERIES, GEO_MAP, GEO_MAP_0, RELATED_TOPICS, or RELATED_QUERIES.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogleTrends({\n * text: ``,\n * hl: ``,\n * geo: ``,\n * data_type: \"TIMESERIES\",\n * cat: ``,\n * date: ``,\n * ts: ``,\n * });\n * ```\n */\n searchGoogleTrends(step: SearchGoogleTrendsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleTrendsStepOutput>>;\n\n /**\n * Search the web using the Perplexity API and return structured results.\n *\n * @remarks\n * - Defaults to US results. Use countryCode (ISO code) to filter by country.\n * - Returns 10 results by default, configurable from 1 to 20.\n * - The variable receives text or JSON depending on exportType. The direct execution output always returns structured results.\n *\n * @example\n * ```typescript\n * const result = await agent.searchPerplexity({\n * query: ``,\n * exportType: \"text\",\n * });\n * ```\n */\n searchPerplexity(step: SearchPerplexityStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchPerplexityStepOutput>>;\n\n /**\n * Search recent X (Twitter) posts matching a query.\n *\n * @remarks\n * - Searches only the past 7 days of posts.\n * - Query supports X API v2 search operators (up to 512 characters).\n * Available search operators in query:\n * | Operator | Description |\n * | -----------------| -------------------------------------------------|\n * | from: | Posts from a specific user (e.g., from:elonmusk) |\n * | to: | Posts sent to a specific user (e.g., to:NASA) |\n * | @ | Mentions a user (e.g., @openai) |\n * | # | Hashtag search (e.g., #AI) |\n * | is:retweet | Filters retweets |\n * | is:reply | Filters replies |\n * | has:media | Posts containing media (images, videos, or GIFs) |\n * | has:links | Posts containing URLs |\n * | lang: | Filters by language (e.g., lang:en) |\n * | - | Excludes specific terms (e.g., -spam) |\n * | () | Groups terms or operators (e.g., (AI OR ML)) |\n * | AND, OR, NOT | Boolean logic for combining or excluding terms |\n * Conjunction-Required Operators (must be combined with a standalone operator):\n * | Operator | Description |\n * | ------------ | -----------------------------------------------|\n * | has:media | Posts containing media (images, videos, or GIFs) |\n * | has:links | Posts containing URLs |\n * | is:retweet | Filters retweets |\n * | is:reply | Filters replies |\n * For example, has:media alone is invalid, but #AI has:media is valid.\n *\n * @example\n * ```typescript\n * const result = await agent.searchXPosts({\n * query: ``,\n * scope: \"recent\",\n * options: {},\n * });\n * ```\n */\n searchXPosts(step: SearchXPostsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchXPostsStepOutput>>;\n\n /**\n * Search for YouTube videos by keyword.\n *\n * @remarks\n * - Supports pagination (up to 5 pages) and country/language filters.\n * - Use the filter/filterType fields for YouTube search parameter (sp) filters.\n *\n * @example\n * ```typescript\n * const result = await agent.searchYoutube({\n * query: ``,\n * limitPages: ``,\n * filter: ``,\n * filterType: ``,\n * });\n * ```\n */\n searchYoutube(step: SearchYoutubeStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchYoutubeStepOutput>>;\n\n /**\n * Retrieve trending videos on YouTube by category and region.\n *\n * @remarks\n * - Categories: \"now\" (trending now), \"music\", \"gaming\", \"films\".\n * - Supports country and language filtering.\n *\n * @example\n * ```typescript\n * const result = await agent.searchYoutubeTrends({\n * bp: \"now\",\n * hl: ``,\n * gl: ``,\n * });\n * ```\n */\n searchYoutubeTrends(step: SearchYoutubeTrendsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchYoutubeTrendsStepOutput>>;\n\n /**\n * Send an email to one or more configured recipient addresses.\n *\n * @remarks\n * - Recipient email addresses are resolved from OAuth connections configured by the app creator. The user running the workflow does not specify the recipient directly.\n * - If the body is a URL to a hosted HTML file on the CDN, the HTML is fetched and used as the email body.\n * - When generateHtml is enabled, the body text is converted to a styled HTML email using an AI model.\n * - connectionId can be a comma-separated list to send to multiple recipients.\n * - The special connectionId \"trigger_email\" uses the email address that triggered the workflow.\n *\n * @example\n * ```typescript\n * const result = await agent.sendEmail({\n * subject: ``,\n * body: ``,\n * });\n * ```\n */\n sendEmail(step: SendEmailStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SendEmailStepOutput>>;\n\n /**\n * Send an existing draft from the connected Gmail account.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail compose scope.\n * - The draft is sent and removed from the Drafts folder.\n * - Use the draft ID returned by the Create Gmail Draft or List Gmail Drafts steps.\n *\n * @example\n * ```typescript\n * const result = await agent.sendGmailDraft({\n * draftId: ``,\n * });\n * ```\n */\n sendGmailDraft(step: SendGmailDraftStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SendGmailDraftStepOutput>>;\n\n /**\n * Send an email from the connected Gmail account.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail compose scope.\n * - messageType controls the body format: \"plain\" for plain text, \"html\" for raw HTML, \"markdown\" for auto-converted markdown.\n *\n * @example\n * ```typescript\n * const result = await agent.sendGmailMessage({\n * to: ``,\n * subject: ``,\n * message: ``,\n * messageType: \"plain\",\n * });\n * ```\n */\n sendGmailMessage(step: SendGmailMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SendGmailMessageStepOutput>>;\n\n /**\n * Send an SMS or MMS message to a phone number configured via OAuth connection.\n *\n * @remarks\n * - User is responsible for configuring the connection to the number (MindStudio requires double opt-in to prevent spam)\n * - If mediaUrls are provided, the message is sent as MMS instead of SMS\n * - MMS supports up to 10 media URLs (images, video, audio, PDF) with a 5MB limit per file\n * - MMS is only supported on US and Canadian carriers; international numbers will receive SMS only (media silently dropped)\n *\n * @example\n * ```typescript\n * const result = await agent.sendSMS({\n * body: ``,\n * });\n * ```\n */\n sendSMS(step: SendSMSStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SendSMSStepOutput>>;\n\n /**\n * Mark one or more Gmail emails as read or unread.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail modify scope.\n * - Accepts one or more message IDs as a comma-separated string or array.\n * - Set markAsRead to true to mark as read, false to mark as unread.\n *\n * @example\n * ```typescript\n * const result = await agent.setGmailReadStatus({\n * messageIds: ``,\n * markAsRead: false,\n * });\n * ```\n */\n setGmailReadStatus(step: SetGmailReadStatusStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SetGmailReadStatusStepOutput>>;\n\n /**\n * Set the title of the agent run for the user's history\n *\n * @example\n * ```typescript\n * const result = await agent.setRunTitle({\n * title: ``,\n * });\n * ```\n */\n setRunTitle(step: SetRunTitleStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SetRunTitleStepOutput>>;\n\n /**\n * Explicitly set a variable to a given value.\n *\n * @remarks\n * - Useful for bootstrapping global variables or setting constants.\n * - The variable name and value both support variable interpolation.\n * - The type field is a UI hint only (controls input widget in the editor).\n *\n * @example\n * ```typescript\n * const result = await agent.setVariable({\n * value: ``,\n * });\n * ```\n */\n setVariable(step: SetVariableStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SetVariableStepOutput>>;\n\n /**\n * Edit a previously sent Telegram message. Use with the message ID returned by Send Telegram Message.\n *\n * @remarks\n * - Only text messages sent by the bot can be edited.\n * - The messageId is returned by the Send Telegram Message step.\n * - Common pattern: send a \"Processing...\" message, do work, then edit it with the result.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramEditMessage({\n * botToken: ``,\n * chatId: ``,\n * messageId: ``,\n * text: ``,\n * });\n * ```\n */\n telegramEditMessage(step: TelegramEditMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramEditMessageStepOutput>>;\n\n /**\n * Send a reply to a specific Telegram message. The reply will be visually threaded in the chat.\n *\n * @remarks\n * - Use the rawMessage.message_id from the incoming trigger variables to reply to the user's message.\n * - Especially useful in group chats where replies provide context.\n * - Returns the sent message ID, which can be used with Edit Telegram Message.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramReplyToMessage({\n * botToken: ``,\n * chatId: ``,\n * replyToMessageId: ``,\n * text: ``,\n * });\n * ```\n */\n telegramReplyToMessage(step: TelegramReplyToMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramReplyToMessageStepOutput>>;\n\n /**\n * Send an audio file to a Telegram chat as music or a voice note via a bot.\n *\n * @remarks\n * - \"audio\" mode sends as a standard audio file. \"voice\" mode sends as a voice message (re-uploads the file for large file support).\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSendAudio({\n * botToken: ``,\n * chatId: ``,\n * audioUrl: ``,\n * mode: \"audio\",\n * });\n * ```\n */\n telegramSendAudio(step: TelegramSendAudioStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSendAudioStepOutput>>;\n\n /**\n * Send a document/file to a Telegram chat via a bot.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSendFile({\n * botToken: ``,\n * chatId: ``,\n * fileUrl: ``,\n * });\n * ```\n */\n telegramSendFile(step: TelegramSendFileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSendFileStepOutput>>;\n\n /**\n * Send an image to a Telegram chat via a bot.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSendImage({\n * botToken: ``,\n * chatId: ``,\n * imageUrl: ``,\n * });\n * ```\n */\n telegramSendImage(step: TelegramSendImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSendImageStepOutput>>;\n\n /**\n * Send a text message to a Telegram chat via a bot.\n *\n * @remarks\n * - Messages are sent using MarkdownV2 formatting. Special characters are auto-escaped.\n * - botToken format is \"botId:token\" — both parts are required.\n * - Returns the sent message ID, which can be used with Edit Telegram Message to update the message later.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSendMessage({\n * botToken: ``,\n * chatId: ``,\n * text: ``,\n * });\n * ```\n */\n telegramSendMessage(step: TelegramSendMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSendMessageStepOutput>>;\n\n /**\n * Send a video to a Telegram chat via a bot.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSendVideo({\n * botToken: ``,\n * chatId: ``,\n * videoUrl: ``,\n * });\n * ```\n */\n telegramSendVideo(step: TelegramSendVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSendVideoStepOutput>>;\n\n /**\n * Show the \"typing...\" indicator in a Telegram chat via a bot.\n *\n * @remarks\n * - The typing indicator automatically expires after a few seconds. Use this right before sending a message for a natural feel.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSetTyping({\n * botToken: ``,\n * chatId: ``,\n * });\n * ```\n */\n telegramSetTyping(step: TelegramSetTypingStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSetTypingStepOutput>>;\n\n /**\n * Generate an audio file from provided text using a speech model.\n *\n * @remarks\n * - The text field contains the exact words to be spoken (not instructions).\n * - In foreground mode, the audio is displayed to the user. In background mode, the URL is saved to a variable.\n *\n * @example\n * ```typescript\n * const result = await agent.textToSpeech({\n * text: ``,\n * });\n * ```\n */\n textToSpeech(step: TextToSpeechStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TextToSpeechStepOutput>>;\n\n /**\n * Convert an audio file to text using a transcription model.\n *\n * @remarks\n * - The prompt field provides optional context to improve transcription accuracy (e.g. language, speaker names, domain).\n *\n * @example\n * ```typescript\n * const result = await agent.transcribeAudio({\n * audioUrl: ``,\n * prompt: ``,\n * });\n * ```\n */\n transcribeAudio(step: TranscribeAudioStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TranscribeAudioStepOutput>>;\n\n /**\n * Trim an audio or video clip\n *\n * @example\n * ```typescript\n * const result = await agent.trimMedia({\n * inputUrl: ``,\n * });\n * ```\n */\n trimMedia(step: TrimMediaStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TrimMediaStepOutput>>;\n\n /**\n * Add or remove labels on Gmail messages, identified by message IDs or a search query.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail modify scope.\n * - Provide either a query (Gmail search syntax) or explicit messageIds to target messages.\n * - Label IDs can be label names or Gmail label IDs — names are resolved automatically.\n *\n * @example\n * ```typescript\n * const result = await agent.updateGmailLabels({\n * query: ``,\n * messageIds: ``,\n * addLabelIds: ``,\n * removeLabelIds: ``,\n * });\n * ```\n */\n updateGmailLabels(step: UpdateGmailLabelsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpdateGmailLabelsStepOutput>>;\n\n /**\n * Update an existing event on a Google Calendar. Only specified fields are changed.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - Fetches the existing event first, then applies only the provided updates. Omitted fields are left unchanged.\n * - Attendees are specified as one email address per line, and replace the entire attendee list.\n *\n * @example\n * ```typescript\n * const result = await agent.updateGoogleCalendarEvent({\n * eventId: ``,\n * });\n * ```\n */\n updateGoogleCalendarEvent(step: UpdateGoogleCalendarEventStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpdateGoogleCalendarEventStepOutput>>;\n\n /**\n * Update the contents of an existing Google Document.\n *\n * @remarks\n * - operationType controls how content is applied: \"addToTop\" prepends, \"addToBottom\" appends, \"overwrite\" replaces all content.\n * - textType determines how the text field is interpreted: \"plain\" for plain text, \"html\" for HTML markup, \"markdown\" for Markdown.\n *\n * @example\n * ```typescript\n * const result = await agent.updateGoogleDoc({\n * documentId: ``,\n * text: ``,\n * textType: \"plain\",\n * operationType: \"addToTop\",\n * });\n * ```\n */\n updateGoogleDoc(step: UpdateGoogleDocStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpdateGoogleDocStepOutput>>;\n\n /**\n * Update a Google Spreadsheet with new data.\n *\n * @remarks\n * - operationType controls how data is written: \"addToBottom\" appends rows, \"overwrite\" replaces all data, \"range\" writes to a specific cell range.\n * - Data should be provided as CSV in the text field.\n *\n * @example\n * ```typescript\n * const result = await agent.updateGoogleSheet({\n * text: ``,\n * spreadsheetId: ``,\n * range: ``,\n * operationType: \"addToBottom\",\n * });\n * ```\n */\n updateGoogleSheet(step: UpdateGoogleSheetStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpdateGoogleSheetStepOutput>>;\n\n /**\n * Upload a file into an existing data source from a URL or raw text content.\n *\n * @remarks\n * - If \"file\" is a single URL, the file is downloaded from that URL and uploaded.\n * - If \"file\" is any other string, a .txt document is created from that content and uploaded.\n * - The block waits (polls) for processing to complete before transitioning, up to 5 minutes.\n * - Once processing finishes, vectors are loaded into Milvus so the data source is immediately queryable.\n * - Supported file types (when using a URL) are the same as the data source upload UI (PDF, DOCX, TXT, etc.).\n *\n * @example\n * ```typescript\n * const result = await agent.uploadDataSourceDocument({\n * dataSourceId: ``,\n * file: ``,\n * fileName: ``,\n * });\n * ```\n */\n uploadDataSourceDocument(step: UploadDataSourceDocumentStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UploadDataSourceDocumentStepOutput>>;\n\n /**\n * Increase the resolution of an image using AI upscaling.\n *\n * @remarks\n * - Output is re-hosted on the CDN as a PNG.\n *\n * @example\n * ```typescript\n * const result = await agent.upscaleImage({\n * imageUrl: ``,\n * targetResolution: \"2k\",\n * engine: \"standard\",\n * });\n * ```\n */\n upscaleImage(step: UpscaleImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpscaleImageStepOutput>>;\n\n /**\n * Upscale a video file\n *\n * @example\n * ```typescript\n * const result = await agent.upscaleVideo({\n * videoUrl: ``,\n * targetResolution: \"720p\",\n * engine: \"standard\",\n * });\n * ```\n */\n upscaleVideo(step: UpscaleVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpscaleVideoStepOutput>>;\n\n /**\n * Send a message to an AI model and return the response, or echo a system message.\n *\n * @remarks\n * - Source \"user\" sends the message to an LLM and returns the model's response.\n * - Source \"system\" echoes the message content directly (no AI call).\n * - Mode \"background\" saves the result to a variable. Mode \"foreground\" streams it to the user (not available in direct execution).\n * - Structured output (JSON/CSV) can be enforced via structuredOutputType and structuredOutputExample.\n * - When executed inside a v2 app method (managed sandbox or local dev tunnel),\n * LLM token output can be streamed to the frontend in real time via an SSE\n * side-channel. The frontend opts in by passing { stream: true } to the method\n * invocation via @mindstudio-ai/interface. Tokens are published to Redis\n * pub/sub as they arrive and forwarded as SSE events on the invoke response.\n * The method code itself is unchanged — streaming is transparent to the\n * developer. See V2ExecutionService.ts and the invoke handler in V2Apps for\n * the server-side plumbing.\n *\n * @example\n * ```typescript\n * const result = await agent.generateText({\n * message: ``,\n * });\n * ```\n */\n generateText(step: UserMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UserMessageStepOutput>>;\n\n /**\n * Swap faces in a video file\n *\n * @example\n * ```typescript\n * const result = await agent.videoFaceSwap({\n * videoUrl: ``,\n * faceImageUrl: ``,\n * targetIndex: 0,\n * engine: ``,\n * });\n * ```\n */\n videoFaceSwap(step: VideoFaceSwapStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<VideoFaceSwapStepOutput>>;\n\n /**\n * Remove or replace background from a video\n *\n * @example\n * ```typescript\n * const result = await agent.videoRemoveBackground({\n * videoUrl: ``,\n * newBackground: \"transparent\",\n * engine: ``,\n * });\n * ```\n */\n videoRemoveBackground(step: VideoRemoveBackgroundStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<VideoRemoveBackgroundStepOutput>>;\n\n /**\n * Remove a watermark from a video\n *\n * @example\n * ```typescript\n * const result = await agent.videoRemoveWatermark({\n * videoUrl: ``,\n * engine: ``,\n * });\n * ```\n */\n videoRemoveWatermark(step: VideoRemoveWatermarkStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<VideoRemoveWatermarkStepOutput>>;\n\n /**\n * Overlay a watermark image onto another image.\n *\n * @remarks\n * - The watermark is placed at the specified corner with configurable padding and width.\n *\n * @example\n * ```typescript\n * const result = await agent.watermarkImage({\n * imageUrl: ``,\n * watermarkImageUrl: ``,\n * corner: \"top-left\",\n * paddingPx: 0,\n * widthPx: 0,\n * });\n * ```\n */\n watermarkImage(step: WatermarkImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<WatermarkImageStepOutput>>;\n\n /**\n * Add an image watermark to a video\n *\n * @example\n * ```typescript\n * const result = await agent.watermarkVideo({\n * videoUrl: ``,\n * imageUrl: ``,\n * corner: \"top-left\",\n * paddingPx: 0,\n * widthPx: 0,\n * });\n * ```\n */\n watermarkVideo(step: WatermarkVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<WatermarkVideoStepOutput>>;\n\n}\n\n/** @internal Attaches typed step methods to the MindStudioAgent prototype. */\nexport function applyStepMethods(AgentClass: new (...args: any[]) => any): void {\n const proto = AgentClass.prototype;\n\n proto.activeCampaignAddNote = function (step: ActiveCampaignAddNoteStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"activeCampaignAddNote\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.activeCampaignCreateContact = function (step: ActiveCampaignCreateContactStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"activeCampaignCreateContact\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.addSubtitlesToVideo = function (step: AddSubtitlesToVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"addSubtitlesToVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.airtableCreateUpdateRecord = function (step: AirtableCreateUpdateRecordStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"airtableCreateUpdateRecord\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.airtableDeleteRecord = function (step: AirtableDeleteRecordStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"airtableDeleteRecord\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.airtableGetRecord = function (step: AirtableGetRecordStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"airtableGetRecord\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.airtableGetTableRecords = function (step: AirtableGetTableRecordsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"airtableGetTableRecords\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.analyzeImage = function (step: AnalyzeImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"analyzeImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.analyzeVideo = function (step: AnalyzeVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"analyzeVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.captureThumbnail = function (step: CaptureThumbnailStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"captureThumbnail\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.checkAppRole = function (step: CheckAppRoleStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"checkAppRole\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.codaCreateUpdatePage = function (step: CodaCreateUpdatePageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"codaCreateUpdatePage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.codaCreateUpdateRow = function (step: CodaCreateUpdateRowStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"codaCreateUpdateRow\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.codaFindRow = function (step: CodaFindRowStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"codaFindRow\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.codaGetPage = function (step: CodaGetPageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"codaGetPage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.codaGetTableRows = function (step: CodaGetTableRowsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"codaGetTableRows\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.convertPdfToImages = function (step: ConvertPdfToImagesStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"convertPdfToImages\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.createDataSource = function (step: CreateDataSourceStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"createDataSource\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.createGmailDraft = function (step: CreateGmailDraftStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"createGmailDraft\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.createGoogleCalendarEvent = function (step: CreateGoogleCalendarEventStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"createGoogleCalendarEvent\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.createGoogleDoc = function (step: CreateGoogleDocStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"createGoogleDoc\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.createGoogleSheet = function (step: CreateGoogleSheetStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"createGoogleSheet\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.deleteDataSource = function (step: DeleteDataSourceStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"deleteDataSource\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.deleteDataSourceDocument = function (step: DeleteDataSourceDocumentStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"deleteDataSourceDocument\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.deleteGmailEmail = function (step: DeleteGmailEmailStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"deleteGmailEmail\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.deleteGoogleCalendarEvent = function (step: DeleteGoogleCalendarEventStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"deleteGoogleCalendarEvent\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.deleteGoogleSheetRows = function (step: DeleteGoogleSheetRowsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"deleteGoogleSheetRows\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.detectChanges = function (step: DetectChangesStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"detectChanges\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.detectPII = function (step: DetectPIIStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"detectPII\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.discordEditMessage = function (step: DiscordEditMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"discordEditMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.discordSendFollowUp = function (step: DiscordSendFollowUpStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"discordSendFollowUp\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.discordSendMessage = function (step: DiscordSendMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"discordSendMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.downloadVideo = function (step: DownloadVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"downloadVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.enhanceImageGenerationPrompt = function (step: EnhanceImageGenerationPromptStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"enhanceImageGenerationPrompt\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.enhanceVideoGenerationPrompt = function (step: EnhanceVideoGenerationPromptStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"enhanceVideoGenerationPrompt\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.enrichPerson = function (step: EnrichPersonStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"enrichPerson\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.extractAudioFromVideo = function (step: ExtractAudioFromVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"extractAudioFromVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.extractText = function (step: ExtractTextStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"extractText\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchDataSourceDocument = function (step: FetchDataSourceDocumentStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchDataSourceDocument\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchGoogleDoc = function (step: FetchGoogleDocStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchGoogleDoc\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchGoogleSheet = function (step: FetchGoogleSheetStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchGoogleSheet\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchSlackChannelHistory = function (step: FetchSlackChannelHistoryStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchSlackChannelHistory\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchYoutubeCaptions = function (step: FetchYoutubeCaptionsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchYoutubeCaptions\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchYoutubeChannel = function (step: FetchYoutubeChannelStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchYoutubeChannel\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchYoutubeComments = function (step: FetchYoutubeCommentsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchYoutubeComments\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchYoutubeVideo = function (step: FetchYoutubeVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchYoutubeVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateChart = function (step: GenerateChartStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateChart\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateImage = function (step: GenerateImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateLipsync = function (step: GenerateLipsyncStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateLipsync\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateMusic = function (step: GenerateMusicStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateMusic\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateAsset = function (step: GeneratePdfStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generatePdf\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateStaticVideoFromImage = function (step: GenerateStaticVideoFromImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateStaticVideoFromImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateVideo = function (step: GenerateVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGmailAttachments = function (step: GetGmailAttachmentsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGmailAttachments\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGmailDraft = function (step: GetGmailDraftStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGmailDraft\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGmailEmail = function (step: GetGmailEmailStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGmailEmail\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGmailUnreadCount = function (step: GetGmailUnreadCountStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGmailUnreadCount\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGoogleCalendarEvent = function (step: GetGoogleCalendarEventStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGoogleCalendarEvent\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGoogleDriveFile = function (step: GetGoogleDriveFileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGoogleDriveFile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGoogleSheetInfo = function (step: GetGoogleSheetInfoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGoogleSheetInfo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getMediaMetadata = function (step: GetMediaMetadataStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getMediaMetadata\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.httpRequest = function (step: HttpRequestStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"httpRequest\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hubspotCreateCompany = function (step: HubspotCreateCompanyStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hubspotCreateCompany\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hubspotCreateContact = function (step: HubspotCreateContactStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hubspotCreateContact\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hubspotGetCompany = function (step: HubspotGetCompanyStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hubspotGetCompany\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hubspotGetContact = function (step: HubspotGetContactStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hubspotGetContact\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hunterApiCompanyEnrichment = function (step: HunterApiCompanyEnrichmentStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hunterApiCompanyEnrichment\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hunterApiDomainSearch = function (step: HunterApiDomainSearchStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hunterApiDomainSearch\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hunterApiEmailFinder = function (step: HunterApiEmailFinderStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hunterApiEmailFinder\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hunterApiEmailVerification = function (step: HunterApiEmailVerificationStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hunterApiEmailVerification\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hunterApiPersonEnrichment = function (step: HunterApiPersonEnrichmentStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hunterApiPersonEnrichment\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.imageFaceSwap = function (step: ImageFaceSwapStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"imageFaceSwap\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.imageRemoveWatermark = function (step: ImageRemoveWatermarkStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"imageRemoveWatermark\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.insertVideoClips = function (step: InsertVideoClipsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"insertVideoClips\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listDataSources = function (step: ListDataSourcesStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listDataSources\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listGmailDrafts = function (step: ListGmailDraftsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listGmailDrafts\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listGmailLabels = function (step: ListGmailLabelsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listGmailLabels\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listGoogleCalendarEvents = function (step: ListGoogleCalendarEventsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listGoogleCalendarEvents\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listGoogleDriveFiles = function (step: ListGoogleDriveFilesStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listGoogleDriveFiles\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listRecentGmailEmails = function (step: ListRecentGmailEmailsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listRecentGmailEmails\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.logic = function (step: LogicStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"logic\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.makeDotComRunScenario = function (step: MakeDotComRunScenarioStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"makeDotComRunScenario\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.mergeAudio = function (step: MergeAudioStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"mergeAudio\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.mergeVideos = function (step: MergeVideosStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"mergeVideos\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.mixAudioIntoVideo = function (step: MixAudioIntoVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"mixAudioIntoVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.muteVideo = function (step: MuteVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"muteVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.n8nRunNode = function (step: N8nRunNodeStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"n8nRunNode\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.notionCreatePage = function (step: NotionCreatePageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"notionCreatePage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.notionUpdatePage = function (step: NotionUpdatePageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"notionUpdatePage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.peopleSearch = function (step: PeopleSearchStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"peopleSearch\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.postToLinkedIn = function (step: PostToLinkedInStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"postToLinkedIn\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.postToSlackChannel = function (step: PostToSlackChannelStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"postToSlackChannel\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.postToX = function (step: PostToXStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"postToX\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.postToZapier = function (step: PostToZapierStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"postToZapier\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.queryAppDatabase = function (step: QueryAppDatabaseStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"queryAppDatabase\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.queryDataSource = function (step: QueryDataSourceStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"queryDataSource\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.queryExternalDatabase = function (step: QueryExternalDatabaseStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"queryExternalDatabase\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.redactPII = function (step: RedactPIIStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"redactPII\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.removeBackgroundFromImage = function (step: RemoveBackgroundFromImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"removeBackgroundFromImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.replyToGmailEmail = function (step: ReplyToGmailEmailStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"replyToGmailEmail\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.resizeVideo = function (step: ResizeVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"resizeVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.runFromConnectorRegistry = function (step: RunFromConnectorRegistryStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"runFromConnectorRegistry\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.runPackagedWorkflow = function (step: RunPackagedWorkflowStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"runPackagedWorkflow\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeFacebookPage = function (step: ScrapeFacebookPageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeFacebookPage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeFacebookPosts = function (step: ScrapeFacebookPostsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeFacebookPosts\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeInstagramComments = function (step: ScrapeInstagramCommentsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeInstagramComments\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeInstagramMentions = function (step: ScrapeInstagramMentionsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeInstagramMentions\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeInstagramPosts = function (step: ScrapeInstagramPostsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeInstagramPosts\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeInstagramProfile = function (step: ScrapeInstagramProfileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeInstagramProfile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeInstagramReels = function (step: ScrapeInstagramReelsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeInstagramReels\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeLinkedInCompany = function (step: ScrapeLinkedInCompanyStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeLinkedInCompany\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeLinkedInProfile = function (step: ScrapeLinkedInProfileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeLinkedInProfile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeMetaThreadsProfile = function (step: ScrapeMetaThreadsProfileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeMetaThreadsProfile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeUrl = function (step: ScrapeUrlStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeUrl\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeXPost = function (step: ScrapeXPostStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeXPost\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeXProfile = function (step: ScrapeXProfileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeXProfile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.screenshotUrl = function (step: ScreenshotUrlStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"screenshotUrl\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGmailEmails = function (step: SearchGmailEmailsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGmailEmails\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogle = function (step: SearchGoogleStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogle\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogleCalendarEvents = function (step: SearchGoogleCalendarEventsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogleCalendarEvents\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogleDrive = function (step: SearchGoogleDriveStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogleDrive\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogleImages = function (step: SearchGoogleImagesStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogleImages\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogleNews = function (step: SearchGoogleNewsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogleNews\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogleTrends = function (step: SearchGoogleTrendsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogleTrends\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchPerplexity = function (step: SearchPerplexityStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchPerplexity\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchXPosts = function (step: SearchXPostsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchXPosts\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchYoutube = function (step: SearchYoutubeStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchYoutube\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchYoutubeTrends = function (step: SearchYoutubeTrendsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchYoutubeTrends\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.sendEmail = function (step: SendEmailStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"sendEmail\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.sendGmailDraft = function (step: SendGmailDraftStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"sendGmailDraft\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.sendGmailMessage = function (step: SendGmailMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"sendGmailMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.sendSMS = function (step: SendSMSStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"sendSMS\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.setGmailReadStatus = function (step: SetGmailReadStatusStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"setGmailReadStatus\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.setRunTitle = function (step: SetRunTitleStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"setRunTitle\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.setVariable = function (step: SetVariableStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"setVariable\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramEditMessage = function (step: TelegramEditMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramEditMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramReplyToMessage = function (step: TelegramReplyToMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramReplyToMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSendAudio = function (step: TelegramSendAudioStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSendAudio\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSendFile = function (step: TelegramSendFileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSendFile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSendImage = function (step: TelegramSendImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSendImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSendMessage = function (step: TelegramSendMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSendMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSendVideo = function (step: TelegramSendVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSendVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSetTyping = function (step: TelegramSetTypingStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSetTyping\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.textToSpeech = function (step: TextToSpeechStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"textToSpeech\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.transcribeAudio = function (step: TranscribeAudioStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"transcribeAudio\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.trimMedia = function (step: TrimMediaStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"trimMedia\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.updateGmailLabels = function (step: UpdateGmailLabelsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"updateGmailLabels\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.updateGoogleCalendarEvent = function (step: UpdateGoogleCalendarEventStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"updateGoogleCalendarEvent\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.updateGoogleDoc = function (step: UpdateGoogleDocStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"updateGoogleDoc\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.updateGoogleSheet = function (step: UpdateGoogleSheetStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"updateGoogleSheet\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.uploadDataSourceDocument = function (step: UploadDataSourceDocumentStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"uploadDataSourceDocument\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.upscaleImage = function (step: UpscaleImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"upscaleImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.upscaleVideo = function (step: UpscaleVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"upscaleVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateText = function (step: UserMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"userMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.videoFaceSwap = function (step: VideoFaceSwapStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"videoFaceSwap\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.videoRemoveBackground = function (step: VideoRemoveBackgroundStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"videoRemoveBackground\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.videoRemoveWatermark = function (step: VideoRemoveWatermarkStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"videoRemoveWatermark\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.watermarkImage = function (step: WatermarkImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"watermarkImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.watermarkVideo = function (step: WatermarkVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"watermarkVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n}\n","import { request, type HttpClientConfig } from './http.js';\nimport { MindStudioError } from './errors.js';\nimport { RateLimiter, type AuthType } from './rate-limit.js';\nimport { loadConfig, type MindStudioConfig } from './config.js';\nimport { AuthContext } from './auth/index.js';\nimport { createDb, Table, type Db, type DefineTableOptions } from './db/index.js';\nimport type {\n AgentOptions,\n StepExecutionOptions,\n StepExecutionResult,\n ListAgentsResult,\n UserInfoResult,\n RunAgentOptions,\n RunAgentResult,\n MindStudioModel,\n MindStudioModelSummary,\n ModelType,\n ConnectorService,\n ConnectorActionDetail,\n Connection,\n StepCostEstimateEntry,\n UploadFileResult,\n ResolvedUser,\n AppContextResult,\n BatchStepInput,\n BatchStepResult,\n ExecuteStepBatchOptions,\n ExecuteStepBatchResult,\n} from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://v1.mindstudio-api.com';\nconst DEFAULT_MAX_RETRIES = 3;\n\n/**\n * Client for the MindStudio direct step execution API.\n *\n * Create an instance and call typed step methods directly:\n *\n * ```ts\n * const agent = new MindStudioAgent({ apiKey: \"your-key\" });\n * const { imageUrl } = await agent.generateImage({ prompt: \"a sunset\", mode: \"background\" });\n * console.log(imageUrl);\n * ```\n *\n * Authentication is resolved in order:\n * 1. `CALLBACK_TOKEN` environment variable (auto-set inside MindStudio — always takes priority)\n * 2. `apiKey` passed to the constructor\n * 3. `MINDSTUDIO_API_KEY` environment variable\n * 4. `~/.mindstudio/config.json` (set via `mindstudio login`)\n *\n * Base URL is resolved in order:\n * 1. `baseUrl` passed to the constructor\n * 2. `MINDSTUDIO_BASE_URL` environment variable\n * 3. `REMOTE_HOSTNAME` environment variable (auto-set inside MindStudio custom functions)\n * 4. `~/.mindstudio/config.json`\n * 5. `https://v1.mindstudio-api.com` (production default)\n *\n * Rate limiting is handled automatically:\n * - Concurrent requests are queued to stay within server limits\n * - 429 responses are retried automatically using the `Retry-After` header\n * - Internal (hook) tokens are capped at 500 calls per execution\n */\nexport class MindStudioAgent {\n /** @internal */\n readonly _httpConfig: HttpClientConfig;\n /** @internal */\n private _reuseThreadId: boolean;\n /** @internal */\n private _threadId: string | undefined;\n\n /** @internal Stream ID for SSE token streaming. Set by sandbox via STREAM_ID env var. */\n private _streamId: string | undefined;\n\n // ---- App context (db + auth) ----\n\n /**\n * @internal App ID for context resolution. Resolved from:\n * constructor appId → MINDSTUDIO_APP_ID env → sandbox globals →\n * auto-detected from first executeStep response header.\n */\n private _appId: string | undefined;\n\n /**\n * @internal Cached app context (auth + databases). Populated by\n * ensureContext() and cached for the lifetime of the instance.\n */\n private _context: AppContextResult | undefined;\n\n /**\n * @internal Deduplication promise for ensureContext(). Ensures only one\n * context fetch is in-flight at a time, even if multiple db/auth\n * operations trigger it concurrently.\n */\n private _contextPromise: Promise<void> | undefined;\n\n /** @internal Cached AuthContext instance, created during context hydration. */\n private _auth: AuthContext | undefined;\n\n /** @internal Cached Db namespace instance, created during context hydration. */\n private _db: Db | undefined;\n\n /** @internal Auth type — 'internal' for CALLBACK_TOKEN (managed mode), 'apiKey' otherwise. */\n private _authType: AuthType;\n\n constructor(options: AgentOptions = {}) {\n const config = loadConfig();\n const { token, authType } = resolveToken(options.apiKey, config);\n const baseUrl =\n options.baseUrl ??\n process.env.MINDSTUDIO_BASE_URL ??\n process.env.REMOTE_HOSTNAME ??\n config.baseUrl ??\n DEFAULT_BASE_URL;\n\n this._reuseThreadId =\n options.reuseThreadId ??\n /^(true|1)$/i.test(process.env.MINDSTUDIO_REUSE_THREAD_ID ?? '');\n\n this._appId =\n options.appId ?? process.env.MINDSTUDIO_APP_ID ?? undefined;\n\n this._authType = authType;\n\n this._httpConfig = {\n baseUrl,\n token,\n rateLimiter: new RateLimiter(authType),\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n };\n\n // Sandbox fast path: if running inside MindStudio (CALLBACK_TOKEN auth),\n // try to hydrate context synchronously from globals. The platform\n // pre-populates `ai.auth` and `ai.databases` before the script runs.\n if (authType === 'internal') {\n this._trySandboxHydration();\n }\n\n this._streamId = process.env.STREAM_ID ?? undefined;\n }\n\n /**\n * Execute any step by its type name. This is the low-level method that all\n * typed step methods delegate to. Use it as an escape hatch for step types\n * not yet covered by the generated methods.\n *\n * ```ts\n * const result = await agent.executeStep(\"generateImage\", { prompt: \"hello\", mode: \"background\" });\n * ```\n */\n async executeStep<TOutput = unknown>(\n stepType: string,\n step: Record<string, unknown>,\n options?: StepExecutionOptions,\n ): Promise<StepExecutionResult<TOutput>> {\n const threadId =\n options?.threadId ?? (this._reuseThreadId ? this._threadId : undefined);\n\n const { data, headers } = await request<{\n output?: TOutput;\n outputUrl?: string;\n }>(this._httpConfig, 'POST', `/steps/${stepType}/execute`, {\n step,\n ...(options?.appId != null && { appId: options.appId }),\n ...(threadId != null && { threadId }),\n ...(this._streamId != null && { streamId: this._streamId }),\n });\n\n let output: TOutput;\n if (data.output != null) {\n output = data.output;\n } else if (data.outputUrl) {\n const res = await fetch(data.outputUrl);\n if (!res.ok) {\n throw new MindStudioError(\n `Failed to fetch output from S3: ${res.status} ${res.statusText}`,\n 'output_fetch_error',\n res.status,\n );\n }\n const envelope = (await res.json()) as { value: TOutput };\n output = envelope.value;\n } else {\n output = undefined as TOutput;\n }\n\n const returnedThreadId = headers.get('x-mindstudio-thread-id') ?? '';\n if (this._reuseThreadId && returnedThreadId) {\n this._threadId = returnedThreadId;\n }\n\n // Auto-capture appId from response headers for zero-config db/auth.\n // If no explicit appId was set, store the one from the first API response\n // so that subsequent ensureContext() calls can use it.\n const returnedAppId = headers.get('x-mindstudio-app-id');\n if (!this._appId && returnedAppId) {\n this._appId = returnedAppId;\n }\n\n const remaining = headers.get('x-ratelimit-remaining');\n const billingCost = headers.get('x-mindstudio-billing-cost');\n const billingEvents = headers.get('x-mindstudio-billing-events');\n\n return {\n ...(output as object),\n $appId: headers.get('x-mindstudio-app-id') ?? '',\n $threadId: returnedThreadId,\n $rateLimitRemaining:\n remaining != null ? parseInt(remaining, 10) : undefined,\n $billingCost:\n billingCost != null ? parseFloat(billingCost) : undefined,\n $billingEvents:\n billingEvents != null\n ? (JSON.parse(billingEvents) as Array<Record<string, unknown>>)\n : undefined,\n } as StepExecutionResult<TOutput>;\n }\n\n /**\n * Execute multiple steps in parallel in a single request.\n *\n * All steps run in parallel on the server. Results are returned in the same\n * order as the input. Individual step failures do not affect other steps —\n * partial success is possible.\n *\n * ```ts\n * const { results } = await agent.executeStepBatch([\n * { stepType: 'generateImage', step: { prompt: 'a sunset' } },\n * { stepType: 'textToSpeech', step: { text: 'Hello world' } },\n * ]);\n * ```\n */\n async executeStepBatch(\n steps: BatchStepInput[],\n options?: ExecuteStepBatchOptions,\n ): Promise<ExecuteStepBatchResult> {\n const threadId =\n options?.threadId ?? (this._reuseThreadId ? this._threadId : undefined);\n\n const { data } = await request<{\n results: Array<{\n stepType: string;\n output?: Record<string, unknown>;\n outputUrl?: string;\n billingCost?: number;\n error?: string;\n }>;\n totalBillingCost?: number;\n appId?: string;\n threadId?: string;\n }>(this._httpConfig, 'POST', '/steps/execute-batch', {\n steps,\n ...(options?.appId != null && { appId: options.appId }),\n ...(threadId != null && { threadId }),\n });\n\n // Resolve S3 outputs in parallel\n const results: BatchStepResult[] = await Promise.all(\n data.results.map(async (r) => {\n if (r.output != null) {\n return {\n stepType: r.stepType,\n output: r.output,\n billingCost: r.billingCost,\n error: r.error,\n };\n }\n if (r.outputUrl) {\n const res = await fetch(r.outputUrl);\n if (!res.ok) {\n return {\n stepType: r.stepType,\n error: `Failed to fetch output from S3: ${res.status} ${res.statusText}`,\n };\n }\n const envelope = (await res.json()) as {\n value: Record<string, unknown>;\n };\n return {\n stepType: r.stepType,\n output: envelope.value,\n billingCost: r.billingCost,\n };\n }\n return {\n stepType: r.stepType,\n billingCost: r.billingCost,\n error: r.error,\n };\n }),\n );\n\n if (this._reuseThreadId && data.threadId) {\n this._threadId = data.threadId;\n }\n\n return {\n results,\n totalBillingCost: data.totalBillingCost,\n appId: data.appId,\n threadId: data.threadId,\n };\n }\n\n /**\n * Get the authenticated user's identity and organization info.\n *\n * ```ts\n * const info = await agent.getUserInfo();\n * console.log(info.displayName, info.organizationName);\n * ```\n */\n async getUserInfo(): Promise<UserInfoResult> {\n const { data } = await request<UserInfoResult>(\n this._httpConfig,\n 'GET',\n '/account/userinfo',\n );\n return data;\n }\n\n /**\n * List all pre-built agents in the organization.\n *\n * ```ts\n * const { apps } = await agent.listAgents();\n * for (const app of apps) console.log(app.name, app.id);\n * ```\n */\n async listAgents(): Promise<ListAgentsResult> {\n const { data } = await request<ListAgentsResult>(\n this._httpConfig,\n 'GET',\n '/agents/load',\n );\n return data;\n }\n\n /**\n * Run a pre-built agent and wait for the result.\n *\n * Uses async polling internally — the request returns immediately with a\n * callback token, then polls until the run completes or fails.\n *\n * ```ts\n * const result = await agent.runAgent({\n * appId: 'your-agent-id',\n * variables: { query: 'hello' },\n * });\n * console.log(result.result);\n * ```\n */\n async runAgent(options: RunAgentOptions): Promise<RunAgentResult> {\n const pollInterval = options.pollIntervalMs ?? 1000;\n\n const { data } = await request<{\n success: boolean;\n threadId: string;\n callbackToken: string;\n }>(this._httpConfig, 'POST', '/agents/run', {\n appId: options.appId,\n async: true,\n ...(options.variables != null && { variables: options.variables }),\n ...(options.workflow != null && { workflow: options.workflow }),\n ...(options.version != null && { version: options.version }),\n ...(options.includeBillingCost != null && {\n includeBillingCost: options.includeBillingCost,\n }),\n ...(options.metadata != null && { metadata: options.metadata }),\n });\n\n const token = data.callbackToken;\n const pollUrl = `${this._httpConfig.baseUrl}/developer/v2/agents/run/poll/${token}`;\n\n // Poll until complete or error\n while (true) {\n await sleep(pollInterval);\n\n const res = await fetch(pollUrl, {\n headers: { 'User-Agent': '@mindstudio-ai/agent' },\n });\n\n if (res.status === 404) {\n throw new MindStudioError(\n 'Poll token not found or expired.',\n 'poll_token_expired',\n 404,\n );\n }\n\n if (!res.ok) {\n const errorBody = await res.json().catch(() => ({}));\n throw new MindStudioError(\n (errorBody as Record<string, string>).message ??\n (errorBody as Record<string, string>).error ??\n `Poll request failed: ${res.status} ${res.statusText}`,\n (errorBody as Record<string, string>).code ?? 'poll_error',\n res.status,\n errorBody,\n );\n }\n\n const poll = (await res.json()) as {\n status: 'pending' | 'complete' | 'error';\n result?: RunAgentResult;\n error?: string;\n };\n\n if (poll.status === 'pending') continue;\n\n if (poll.status === 'error') {\n throw new MindStudioError(\n poll.error ?? 'Agent run failed.',\n 'agent_run_error',\n 500,\n );\n }\n\n return poll.result!;\n }\n }\n\n /** @internal Used by generated action methods. */\n _request<T>(method: 'GET' | 'POST', path: string, body?: unknown) {\n return request<T>(this._httpConfig, method, path, body);\n }\n\n // -------------------------------------------------------------------------\n // Helper methods — models\n // -------------------------------------------------------------------------\n\n /** List all available AI models. */\n async listModels(): Promise<{ models: MindStudioModel[] }> {\n const { data } = await request<{ models: MindStudioModel[] }>(\n this._httpConfig,\n 'GET',\n '/helpers/models',\n );\n return data;\n }\n\n /** List AI models filtered by type. */\n async listModelsByType(\n modelType: ModelType,\n ): Promise<{ models: MindStudioModel[] }> {\n const { data } = await request<{ models: MindStudioModel[] }>(\n this._httpConfig,\n 'GET',\n `/helpers/models/${modelType}`,\n );\n return data;\n }\n\n /** List all available AI models (summary). Returns only id, name, type, and tags. */\n async listModelsSummary(): Promise<{ models: MindStudioModelSummary[] }> {\n const { data } = await request<{ models: MindStudioModelSummary[] }>(\n this._httpConfig,\n 'GET',\n '/helpers/models-summary',\n );\n return data;\n }\n\n /** List AI models (summary) filtered by type. */\n async listModelsSummaryByType(\n modelType: ModelType,\n ): Promise<{ models: MindStudioModelSummary[] }> {\n const { data } = await request<{ models: MindStudioModelSummary[] }>(\n this._httpConfig,\n 'GET',\n `/helpers/models-summary/${modelType}`,\n );\n return data;\n }\n\n // -------------------------------------------------------------------------\n // Helper methods — OAuth connectors & connections\n // -------------------------------------------------------------------------\n\n /**\n * List available OAuth connector services (Slack, Google, HubSpot, etc.).\n *\n * These are third-party integrations from the MindStudio Connector Registry.\n * For most tasks, use actions directly instead.\n */\n async listConnectors(): Promise<{ services: ConnectorService[] }> {\n const { data } = await request<{ services: ConnectorService[] }>(\n this._httpConfig,\n 'GET',\n '/helpers/connectors',\n );\n return data;\n }\n\n /** Get details for a single OAuth connector service. */\n async getConnector(\n serviceId: string,\n ): Promise<{ service: ConnectorService }> {\n const { data } = await request<{ service: ConnectorService }>(\n this._httpConfig,\n 'GET',\n `/helpers/connectors/${serviceId}`,\n );\n return data;\n }\n\n /** Get the full configuration for an OAuth connector action, including input fields. */\n async getConnectorAction(\n serviceId: string,\n actionId: string,\n ): Promise<{ action: ConnectorActionDetail }> {\n const { data } = await request<{ action: ConnectorActionDetail }>(\n this._httpConfig,\n 'GET',\n `/helpers/connectors/${serviceId}/${actionId}`,\n );\n return data;\n }\n\n /** List OAuth connections for the organization. These are authenticated third-party service links. */\n async listConnections(): Promise<{ connections: Connection[] }> {\n const { data } = await request<{ connections: Connection[] }>(\n this._httpConfig,\n 'GET',\n '/helpers/connections',\n );\n return data;\n }\n\n // -------------------------------------------------------------------------\n // Helper methods — cost estimation\n // -------------------------------------------------------------------------\n\n /** Estimate the cost of executing an action before running it. */\n async estimateStepCost(\n stepType: string,\n step?: Record<string, unknown>,\n options?: { appId?: string; workflowId?: string },\n ): Promise<{ costType?: string; estimates?: StepCostEstimateEntry[] }> {\n const { data } = await request<{\n costType?: string;\n estimates?: StepCostEstimateEntry[];\n }>(this._httpConfig, 'POST', '/helpers/step-cost-estimate', {\n step: { type: stepType, ...step },\n ...options,\n });\n return data;\n }\n\n // -------------------------------------------------------------------------\n // Streaming\n // -------------------------------------------------------------------------\n\n /**\n * Send a stream chunk to the caller via SSE.\n *\n * When invoked from a method that was called with `stream: true`, chunks\n * are delivered in real-time as Server-Sent Events. When there is no active\n * stream (no `STREAM_ID`), calls are silently ignored — so it's safe to\n * call unconditionally.\n *\n * Accepts strings (sent as `type: 'token'`) or structured data (sent as\n * `type: 'data'`). The caller receives each chunk as an SSE event.\n *\n * @example\n * ```ts\n * // Stream text tokens\n * await agent.stream('Processing item 1...');\n *\n * // Stream structured data\n * await agent.stream({ progress: 50, currentItem: 'abc' });\n * ```\n */\n stream = async (data: string | Record<string, unknown>): Promise<void> => {\n if (!this._streamId) return;\n\n const url = `${this._httpConfig.baseUrl}/_internal/v2/stream-chunk`;\n\n const body =\n typeof data === 'string'\n ? { streamId: this._streamId, type: 'token', text: data }\n : { streamId: this._streamId, type: 'data', data };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this._httpConfig.token,\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n // Best-effort — don't throw on stream failures, just warn\n const text = await res.text().catch(() => '');\n console.warn(`[mindstudio] stream chunk failed: ${res.status} ${text}`);\n }\n };\n\n // -------------------------------------------------------------------------\n // db + auth namespaces\n // -------------------------------------------------------------------------\n\n /**\n * The `auth` namespace — synchronous role-based access control.\n *\n * Provides the current user's identity and roles. All methods are\n * synchronous since the role map is preloaded during context hydration.\n *\n * **Important**: Context must be hydrated before accessing `auth`.\n * - Inside the MindStudio sandbox: automatic (populated from globals)\n * - Outside the sandbox: call `await agent.ensureContext()` first,\n * or access `auth` after any `db` operation (which auto-hydrates)\n *\n * @throws {MindStudioError} if context has not been hydrated yet\n *\n * @example\n * ```ts\n * await agent.ensureContext();\n * agent.auth.requireRole(Roles.admin);\n * const admins = agent.auth.getUsersByRole(Roles.admin);\n * ```\n */\n get auth(): AuthContext {\n if (!this._auth) {\n // Try sandbox hydration lazily — global.ai may have been set after\n // the constructor ran (e.g. ESM imports hoist before inline code)\n this._trySandboxHydration();\n }\n if (!this._auth) {\n throw new MindStudioError(\n 'Auth context not yet loaded. Call `await agent.ensureContext()` ' +\n 'or perform any db operation first (which auto-hydrates context). ' +\n 'Inside the MindStudio sandbox, context is loaded automatically.',\n 'context_not_loaded',\n 400,\n );\n }\n return this._auth;\n }\n\n /**\n * The `db` namespace — chainable collection API over managed databases.\n *\n * Use `db.defineTable<T>(name)` to get a typed Table<T>, then call\n * collection methods (filter, sortBy, push, update, etc.) on it.\n *\n * Context is auto-hydrated on first query execution — you can safely\n * call `defineTable()` at module scope without triggering any HTTP.\n *\n * @example\n * ```ts\n * const Orders = agent.db.defineTable<Order>('orders');\n * const active = await Orders.filter(o => o.status === 'active').take(10);\n * ```\n */\n get db(): Db {\n if (!this._db) {\n // Try sandbox hydration lazily — global.ai may have been set after\n // the constructor ran (e.g. ESM imports hoist before inline code)\n this._trySandboxHydration();\n }\n if (this._db) return this._db;\n\n // Return a lazy Db proxy that auto-hydrates context on first use.\n // defineTable() itself is synchronous (it just stores the table name),\n // but the Table methods are all async and will trigger ensureContext().\n return this._createLazyDb();\n }\n\n /**\n * Hydrate the app context (auth + database metadata). This must be\n * called before using `auth` synchronously. For `db`, hydration happens\n * automatically on first query.\n *\n * Context is fetched once and cached for the instance's lifetime.\n * Calling `ensureContext()` multiple times is safe (no-op after first).\n *\n * Context sources (checked in order):\n * 1. Sandbox globals (`globalThis.ai.auth`, `globalThis.ai.databases`)\n * 2. HTTP: `GET /developer/v2/helpers/app-context?appId={appId}`\n *\n * @throws {MindStudioError} if no `appId` is available\n *\n * @example\n * ```ts\n * await agent.ensureContext();\n * // auth is now available synchronously\n * agent.auth.requireRole(Roles.admin);\n * ```\n */\n async ensureContext(): Promise<void> {\n // Already hydrated — nothing to do\n if (this._context) return;\n\n // Deduplicate concurrent calls: if a fetch is already in-flight,\n // all callers await the same promise\n if (!this._contextPromise) {\n this._contextPromise = this._hydrateContext();\n }\n\n await this._contextPromise;\n }\n\n /**\n * @internal Fetch and cache app context, then create auth + db instances.\n *\n * In managed mode (CALLBACK_TOKEN), the platform resolves the app from\n * the token — no appId needed. With an API key, appId is required.\n */\n private async _hydrateContext(): Promise<void> {\n if (!this._appId && this._authType !== 'internal') {\n throw new MindStudioError(\n 'No app ID available for context resolution. Pass `appId` to the ' +\n 'constructor, set the MINDSTUDIO_APP_ID environment variable, or ' +\n 'make a step execution call first (which auto-detects the app ID).',\n 'missing_app_id',\n 400,\n );\n }\n\n const context = await this.getAppContext(this._appId);\n this._applyContext(context);\n }\n\n /**\n * @internal Apply a resolved context object — creates AuthContext and Db.\n * Used by both the HTTP path and sandbox hydration.\n */\n private _applyContext(context: AppContextResult): void {\n this._context = context;\n this._auth = new AuthContext(context.auth);\n this._db = createDb(\n context.databases,\n this._executeDbBatch.bind(this),\n );\n }\n\n /**\n * @internal Try to hydrate context synchronously from sandbox globals.\n * Called in the constructor when CALLBACK_TOKEN auth is detected.\n *\n * The MindStudio sandbox pre-populates `globalThis.ai` with:\n * - `ai.auth`: { userId, roleAssignments[] }\n * - `ai.databases`: [{ id, name, tables[] }]\n */\n private _trySandboxHydration(): void {\n const ai = (globalThis as Record<string, unknown>).ai as\n | { auth?: AppContextResult['auth']; databases?: AppContextResult['databases'] }\n | undefined;\n\n if (ai?.auth && ai?.databases) {\n this._applyContext({\n auth: ai.auth,\n databases: ai.databases,\n });\n }\n }\n\n /**\n * @internal Execute a batch of SQL queries against a managed database.\n * Used as the `executeBatch` callback for Table/Query instances.\n *\n * Calls `POST /_internal/v2/db/query` directly with the hook token\n * (raw, no Bearer prefix). All queries run on a single SQLite connection,\n * enabling RETURNING clauses and multi-statement batches.\n */\n private async _executeDbBatch(\n databaseId: string,\n queries: { sql: string; params?: unknown[] }[],\n ): Promise<{ rows: unknown[]; changes: number }[]> {\n const url = `${this._httpConfig.baseUrl}/_internal/v2/db/query`;\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this._httpConfig.token,\n },\n body: JSON.stringify({ databaseId, queries }),\n });\n\n if (!res.ok) {\n let message = `Database query failed: ${res.status} ${res.statusText}`;\n let code = 'db_query_error';\n\n try {\n const text = await res.text();\n try {\n // Try parsing as JSON — API may return { error, code, message, details }\n const body = JSON.parse(text) as Record<string, unknown>;\n // Accept various error shapes the API might use\n const errMsg =\n (body.error as string) ??\n (body.message as string) ??\n (body.details as string);\n if (errMsg) message = errMsg;\n if (body.code) code = body.code as string;\n } catch {\n // Not JSON — use raw text if it's informative\n if (text && text.length < 500) message = text;\n }\n } catch {\n // Couldn't read response body at all\n }\n\n throw new MindStudioError(\n `[db] ${message}`,\n code,\n res.status,\n );\n }\n\n const data = (await res.json()) as {\n results: { rows: unknown[]; changes: number }[];\n };\n return data.results;\n }\n\n /**\n * @internal Create a lazy Db proxy that auto-hydrates context.\n *\n * defineTable() returns Table instances immediately (no async needed).\n * But the Table's executeBatch callback is wrapped to call ensureContext()\n * before the first query, so context is fetched lazily.\n */\n private _createLazyDb(): Db {\n const agent = this;\n\n return {\n defineTable<T>(name: string, options?: DefineTableOptions) {\n // Lazy table — context hasn't been fetched yet, so executeBatch\n // calls ensureContext() first, then delegates to the real endpoint.\n const databaseHint = options?.database;\n\n return new Table<T>({\n databaseId: '',\n tableName: name,\n columns: [],\n unique: options?.unique as string[][] | undefined,\n defaults: options?.defaults as Record<string, unknown> | undefined,\n executeBatch: async (queries) => {\n await agent.ensureContext();\n const databases = agent._context!.databases;\n let targetDb;\n\n if (databaseHint) {\n targetDb = databases.find(\n (d) => d.id === databaseHint || d.name === databaseHint,\n );\n } else {\n targetDb = databases.find((d) =>\n d.tables.some((t) => t.name === name),\n );\n }\n\n const databaseId = targetDb?.id ?? databases[0]?.id ?? '';\n return agent._executeDbBatch(databaseId, queries);\n },\n });\n },\n\n // Time helpers work without context\n now: () => Date.now(),\n days: (n: number) => n * 86_400_000,\n hours: (n: number) => n * 3_600_000,\n minutes: (n: number) => n * 60_000,\n ago: (ms: number) => Date.now() - ms,\n fromNow: (ms: number) => Date.now() + ms,\n\n // Batch needs context — hydrate first, then delegate to real db\n batch: ((...queries: PromiseLike<unknown>[]) => {\n return (async () => {\n await agent.ensureContext();\n return agent._db!.batch(...queries);\n })();\n }) as Db['batch'],\n };\n }\n\n // -------------------------------------------------------------------------\n // Helper methods — user resolution\n // -------------------------------------------------------------------------\n\n /**\n * Resolve a single user ID to display info (name, email, profile picture).\n *\n * Use this when you have a `User`-typed field value and need the person's\n * display name, email, or avatar. Returns null if the user ID is not found.\n *\n * Also available as a top-level import:\n * ```ts\n * import { resolveUser } from '@mindstudio-ai/agent';\n * ```\n *\n * @param userId - The user ID to resolve (a `User` branded string or plain UUID)\n * @returns Resolved user info, or null if not found\n *\n * @example\n * ```ts\n * const user = await agent.resolveUser(order.requestedBy);\n * if (user) {\n * console.log(user.name); // \"Jane Smith\"\n * console.log(user.email); // \"jane@example.com\"\n * console.log(user.profilePictureUrl); // \"https://...\" or null\n * }\n * ```\n */\n async resolveUser(userId: string): Promise<ResolvedUser | null> {\n const { users } = await this.resolveUsers([userId]);\n return users[0] ?? null;\n }\n\n /**\n * Resolve multiple user IDs to display info in a single request.\n * Maximum 100 user IDs per request.\n *\n * Use this for batch resolution when you have multiple user references\n * to display (e.g. all approvers on a purchase order, all team members).\n *\n * @param userIds - Array of user IDs to resolve (max 100)\n * @returns Object with `users` array of resolved user info\n *\n * @example\n * ```ts\n * // Resolve all approvers at once\n * const approverIds = approvals.map(a => a.assignedTo);\n * const { users } = await agent.resolveUsers(approverIds);\n *\n * for (const u of users) {\n * console.log(`${u.name} (${u.email})`);\n * }\n * ```\n */\n async resolveUsers(\n userIds: string[],\n ): Promise<{ users: ResolvedUser[] }> {\n const { data } = await request<{ users: ResolvedUser[] }>(\n this._httpConfig,\n 'POST',\n '/helpers/resolve-users',\n { userIds },\n );\n return data;\n }\n\n // -------------------------------------------------------------------------\n // App context\n // -------------------------------------------------------------------------\n\n /**\n * Get auth and database context for an app.\n *\n * Returns role assignments and managed database schemas. Useful for\n * hydrating `auth` and `db` namespaces when running outside the sandbox.\n *\n * When called with a CALLBACK_TOKEN (managed mode), `appId` is optional —\n * the platform resolves the app from the token. With an API key, `appId`\n * is required.\n *\n * ```ts\n * const ctx = await agent.getAppContext('your-app-id');\n * console.log(ctx.auth.roleAssignments, ctx.databases);\n * ```\n */\n async getAppContext(appId?: string): Promise<AppContextResult> {\n const query = appId ? `?appId=${encodeURIComponent(appId)}` : '';\n const { data } = await request<AppContextResult>(\n this._httpConfig,\n 'GET',\n `/helpers/app-context${query}`,\n );\n return data;\n }\n\n // -------------------------------------------------------------------------\n // Account methods\n // -------------------------------------------------------------------------\n\n /** Update the display name of the authenticated user/agent. */\n async changeName(displayName: string): Promise<void> {\n await request(this._httpConfig, 'POST', '/account/change-name', {\n name: displayName,\n });\n }\n\n /** Update the profile picture of the authenticated user/agent. */\n async changeProfilePicture(url: string): Promise<void> {\n await request(this._httpConfig, 'POST', '/account/change-profile-picture', {\n url,\n });\n }\n\n /**\n * Upload a file to the MindStudio CDN.\n *\n * Gets a signed upload URL, PUTs the file content, and returns the\n * permanent public URL.\n */\n async uploadFile(\n content: Buffer | Uint8Array,\n options: { extension: string; type?: string },\n ): Promise<UploadFileResult> {\n const { data } = await request<{ uploadUrl: string; url: string }>(\n this._httpConfig,\n 'POST',\n '/account/upload',\n {\n extension: options.extension,\n ...(options.type != null && { type: options.type }),\n },\n );\n const buf = content.buffer.slice(\n content.byteOffset,\n content.byteOffset + content.byteLength,\n ) as ArrayBuffer;\n const res = await fetch(data.uploadUrl, {\n method: 'PUT',\n body: buf,\n headers: options.type ? { 'Content-Type': options.type } : {},\n });\n if (!res.ok) {\n const errorBody = await res.json().catch(() => ({}));\n throw new MindStudioError(\n (errorBody as Record<string, string>).message ??\n (errorBody as Record<string, string>).error ??\n `Upload failed: ${res.status} ${res.statusText}`,\n (errorBody as Record<string, string>).code ?? 'upload_error',\n res.status,\n errorBody,\n );\n }\n return { url: data.url };\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// Attach generated step methods to the prototype\nimport { applyStepMethods } from './generated/steps.js';\napplyStepMethods(MindStudioAgent);\n\nfunction resolveToken(\n provided?: string,\n config?: MindStudioConfig,\n): {\n token: string;\n authType: AuthType;\n} {\n // CALLBACK_TOKEN takes priority — when running inside the MindStudio\n // sandbox, the hook token must be used regardless of other auth sources.\n if (process.env.CALLBACK_TOKEN)\n return { token: process.env.CALLBACK_TOKEN, authType: 'internal' };\n if (provided) return { token: provided, authType: 'apiKey' };\n if (process.env.MINDSTUDIO_API_KEY)\n return { token: process.env.MINDSTUDIO_API_KEY, authType: 'apiKey' };\n if (config?.apiKey)\n return { token: config.apiKey, authType: 'apiKey' };\n throw new MindStudioError(\n 'No API key provided. Run `mindstudio login`, pass `apiKey` to the ' +\n 'constructor, or set the MINDSTUDIO_API_KEY environment variable.',\n 'missing_api_key',\n 401,\n );\n}\n","// AUTO-GENERATED — DO NOT EDIT\n// Run `npm run codegen` to regenerate from the OpenAPI spec.\n// Generated: 2026-03-24T14:33:23.674Z\n\n\nexport type MonacoSnippetFieldType = 'string' | 'number' | 'boolean' | 'array' | 'object' | string[];\nexport type MonacoSnippetField = [name: string, type: MonacoSnippetFieldType];\n\nexport interface MonacoSnippet {\n fields: MonacoSnippetField[];\n outputKeys: string[];\n}\n\nexport const monacoSnippets: Record<string, MonacoSnippet> = {\n \"activeCampaignAddNote\": { fields: [[\"contactId\", 'string'], [\"note\", 'string']], outputKeys: [] },\n \"activeCampaignCreateContact\": { fields: [[\"email\", 'string'], [\"firstName\", 'string'], [\"lastName\", 'string'], [\"phone\", 'string'], [\"accountId\", 'string'], [\"customFields\", 'object']], outputKeys: [\"contactId\"] },\n \"addSubtitlesToVideo\": { fields: [[\"videoUrl\", 'string'], [\"language\", 'string'], [\"fontName\", 'string'], [\"fontSize\", 'number'], [\"fontWeight\", [\"normal\", \"bold\", \"black\"]], [\"fontColor\", [\"white\", \"black\", \"red\", \"green\", \"blue\", \"yellow\", \"orange\", \"purple\", \"pink\", \"brown\", \"gray\", \"cyan\", \"magenta\"]], [\"highlightColor\", [\"white\", \"black\", \"red\", \"green\", \"blue\", \"yellow\", \"orange\", \"purple\", \"pink\", \"brown\", \"gray\", \"cyan\", \"magenta\"]], [\"strokeWidth\", 'number'], [\"strokeColor\", [\"black\", \"white\", \"red\", \"green\", \"blue\", \"yellow\", \"orange\", \"purple\", \"pink\", \"brown\", \"gray\", \"cyan\", \"magenta\"]], [\"backgroundColor\", [\"black\", \"white\", \"red\", \"green\", \"blue\", \"yellow\", \"orange\", \"purple\", \"pink\", \"brown\", \"gray\", \"cyan\", \"magenta\", \"none\"]], [\"backgroundOpacity\", 'number'], [\"position\", [\"top\", \"center\", \"bottom\"]], [\"yOffset\", 'number'], [\"wordsPerSubtitle\", 'number'], [\"enableAnimation\", 'boolean']], outputKeys: [\"videoUrl\"] },\n \"airtableCreateUpdateRecord\": { fields: [[\"baseId\", 'string'], [\"tableId\", 'string'], [\"fields\", 'string'], [\"recordData\", 'object']], outputKeys: [\"recordId\"] },\n \"airtableDeleteRecord\": { fields: [[\"baseId\", 'string'], [\"tableId\", 'string'], [\"recordId\", 'string']], outputKeys: [\"deleted\"] },\n \"airtableGetRecord\": { fields: [[\"baseId\", 'string'], [\"tableId\", 'string'], [\"recordId\", 'string']], outputKeys: [\"record\"] },\n \"airtableGetTableRecords\": { fields: [[\"baseId\", 'string'], [\"tableId\", 'string']], outputKeys: [\"records\"] },\n \"analyzeImage\": { fields: [[\"prompt\", 'string'], [\"imageUrl\", 'string']], outputKeys: [\"analysis\"] },\n \"analyzeVideo\": { fields: [[\"prompt\", 'string'], [\"videoUrl\", 'string']], outputKeys: [\"analysis\"] },\n \"captureThumbnail\": { fields: [[\"videoUrl\", 'string'], [\"at\", 'string']], outputKeys: [\"thumbnailUrl\"] },\n \"checkAppRole\": { fields: [[\"roleName\", 'string']], outputKeys: [\"hasRole\",\"userRoles\"] },\n \"codaCreateUpdatePage\": { fields: [[\"pageData\", 'object']], outputKeys: [\"pageId\"] },\n \"codaCreateUpdateRow\": { fields: [[\"docId\", 'string'], [\"tableId\", 'string'], [\"rowData\", 'object']], outputKeys: [\"rowId\"] },\n \"codaFindRow\": { fields: [[\"docId\", 'string'], [\"tableId\", 'string'], [\"rowData\", 'object']], outputKeys: [\"row\"] },\n \"codaGetPage\": { fields: [[\"docId\", 'string'], [\"pageId\", 'string']], outputKeys: [\"content\"] },\n \"codaGetTableRows\": { fields: [[\"docId\", 'string'], [\"tableId\", 'string']], outputKeys: [\"rows\"] },\n \"convertPdfToImages\": { fields: [[\"pdfUrl\", 'string']], outputKeys: [\"imageUrls\"] },\n \"createDataSource\": { fields: [[\"name\", 'string']], outputKeys: [] },\n \"createGmailDraft\": { fields: [[\"to\", 'string'], [\"subject\", 'string'], [\"message\", 'string'], [\"messageType\", [\"plain\", \"html\", \"markdown\"]]], outputKeys: [\"draftId\"] },\n \"createGoogleCalendarEvent\": { fields: [[\"summary\", 'string'], [\"startDateTime\", 'string'], [\"endDateTime\", 'string']], outputKeys: [\"eventId\",\"htmlLink\"] },\n \"createGoogleDoc\": { fields: [[\"title\", 'string'], [\"text\", 'string'], [\"textType\", [\"plain\", \"html\", \"markdown\"]]], outputKeys: [\"documentUrl\"] },\n \"createGoogleSheet\": { fields: [[\"title\", 'string'], [\"text\", 'string']], outputKeys: [\"spreadsheetUrl\"] },\n \"deleteDataSource\": { fields: [[\"dataSourceId\", 'string']], outputKeys: [] },\n \"deleteDataSourceDocument\": { fields: [[\"dataSourceId\", 'string'], [\"documentId\", 'string']], outputKeys: [] },\n \"deleteGmailEmail\": { fields: [[\"messageId\", 'string']], outputKeys: [] },\n \"deleteGoogleCalendarEvent\": { fields: [[\"eventId\", 'string']], outputKeys: [] },\n \"deleteGoogleSheetRows\": { fields: [[\"documentId\", 'string'], [\"startRow\", 'string'], [\"endRow\", 'string']], outputKeys: [] },\n \"detectChanges\": { fields: [[\"mode\", [\"ai\", \"comparison\"]], [\"input\", 'string']], outputKeys: [\"hasChanged\",\"currentValue\",\"previousValue\",\"isFirstRun\"] },\n \"detectPII\": { fields: [[\"input\", 'string'], [\"language\", 'string'], [\"entities\", 'array']], outputKeys: [\"detected\",\"detections\"] },\n \"discordEditMessage\": { fields: [[\"botToken\", 'string'], [\"channelId\", 'string'], [\"messageId\", 'string'], [\"text\", 'string']], outputKeys: [] },\n \"discordSendFollowUp\": { fields: [[\"applicationId\", 'string'], [\"interactionToken\", 'string'], [\"text\", 'string']], outputKeys: [\"messageId\"] },\n \"discordSendMessage\": { fields: [[\"mode\", [\"edit\", \"send\"]], [\"text\", 'string']], outputKeys: [] },\n \"downloadVideo\": { fields: [[\"videoUrl\", 'string'], [\"format\", [\"mp4\", \"mp3\"]]], outputKeys: [\"videoUrl\"] },\n \"enhanceImageGenerationPrompt\": { fields: [[\"initialPrompt\", 'string'], [\"includeNegativePrompt\", 'boolean'], [\"systemPrompt\", 'string']], outputKeys: [\"prompt\"] },\n \"enhanceVideoGenerationPrompt\": { fields: [[\"initialPrompt\", 'string'], [\"includeNegativePrompt\", 'boolean'], [\"systemPrompt\", 'string']], outputKeys: [\"prompt\"] },\n \"enrichPerson\": { fields: [[\"params\", 'object']], outputKeys: [\"data\"] },\n \"extractAudioFromVideo\": { fields: [[\"videoUrl\", 'string']], outputKeys: [\"audioUrl\"] },\n \"extractText\": { fields: [[\"url\", 'string']], outputKeys: [\"text\"] },\n \"fetchDataSourceDocument\": { fields: [[\"dataSourceId\", 'string'], [\"documentId\", 'string']], outputKeys: [] },\n \"fetchGoogleDoc\": { fields: [[\"documentId\", 'string'], [\"exportType\", [\"html\", \"markdown\", \"json\", \"plain\"]]], outputKeys: [\"content\"] },\n \"fetchGoogleSheet\": { fields: [[\"spreadsheetId\", 'string'], [\"range\", 'string'], [\"exportType\", [\"csv\", \"json\"]]], outputKeys: [\"content\"] },\n \"fetchSlackChannelHistory\": { fields: [[\"channelId\", 'string']], outputKeys: [\"messages\"] },\n \"fetchYoutubeCaptions\": { fields: [[\"videoUrl\", 'string'], [\"exportType\", [\"text\", \"json\"]], [\"language\", 'string']], outputKeys: [\"transcripts\"] },\n \"fetchYoutubeChannel\": { fields: [[\"channelUrl\", 'string']], outputKeys: [] },\n \"fetchYoutubeComments\": { fields: [[\"videoUrl\", 'string'], [\"exportType\", [\"text\", \"json\"]], [\"limitPages\", 'string']], outputKeys: [\"comments\"] },\n \"fetchYoutubeVideo\": { fields: [[\"videoUrl\", 'string']], outputKeys: [] },\n \"generateAsset\": { fields: [[\"source\", 'string'], [\"sourceType\", [\"html\", \"markdown\", \"spa\", \"raw\", \"dynamic\", \"customInterface\"]], [\"outputFormat\", [\"pdf\", \"png\", \"html\", \"mp4\", \"openGraph\"]], [\"pageSize\", [\"full\", \"letter\", \"A4\", \"custom\"]], [\"testData\", 'object']], outputKeys: [\"url\"] },\n \"generateChart\": { fields: [[\"chart\", 'object']], outputKeys: [\"chartUrl\"] },\n \"generateImage\": { fields: [[\"prompt\", 'string']], outputKeys: [\"imageUrl\"] },\n \"generateLipsync\": { fields: [], outputKeys: [] },\n \"generateMusic\": { fields: [[\"text\", 'string']], outputKeys: [] },\n \"generatePdf\": { fields: [[\"source\", 'string'], [\"sourceType\", [\"html\", \"markdown\", \"spa\", \"raw\", \"dynamic\", \"customInterface\"]], [\"outputFormat\", [\"pdf\", \"png\", \"html\", \"mp4\", \"openGraph\"]], [\"pageSize\", [\"full\", \"letter\", \"A4\", \"custom\"]], [\"testData\", 'object']], outputKeys: [\"url\"] },\n \"generateStaticVideoFromImage\": { fields: [[\"imageUrl\", 'string'], [\"duration\", 'string']], outputKeys: [\"videoUrl\"] },\n \"generateText\": { fields: [[\"message\", 'string']], outputKeys: [\"content\"] },\n \"generateVideo\": { fields: [[\"prompt\", 'string']], outputKeys: [\"videoUrl\"] },\n \"getGmailAttachments\": { fields: [[\"messageId\", 'string']], outputKeys: [] },\n \"getGmailDraft\": { fields: [[\"draftId\", 'string']], outputKeys: [\"draftId\",\"messageId\",\"subject\",\"to\",\"from\",\"body\"] },\n \"getGmailEmail\": { fields: [[\"messageId\", 'string']], outputKeys: [\"messageId\",\"subject\",\"from\",\"to\",\"date\",\"body\",\"labels\"] },\n \"getGmailUnreadCount\": { fields: [], outputKeys: [] },\n \"getGoogleCalendarEvent\": { fields: [[\"eventId\", 'string'], [\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"event\"] },\n \"getGoogleDriveFile\": { fields: [[\"fileId\", 'string']], outputKeys: [\"url\",\"name\",\"mimeType\",\"size\"] },\n \"getGoogleSheetInfo\": { fields: [[\"documentId\", 'string']], outputKeys: [\"title\",\"sheets\"] },\n \"getMediaMetadata\": { fields: [[\"mediaUrl\", 'string']], outputKeys: [\"metadata\"] },\n \"httpRequest\": { fields: [[\"url\", 'string'], [\"method\", 'string'], [\"headers\", 'object'], [\"queryParams\", 'object'], [\"body\", 'string'], [\"bodyItems\", 'object'], [\"contentType\", [\"none\", \"application/json\", \"application/x-www-form-urlencoded\", \"multipart/form-data\", \"custom\"]], [\"customContentType\", 'string']], outputKeys: [\"ok\",\"status\",\"statusText\",\"response\"] },\n \"hubspotCreateCompany\": { fields: [[\"company\", 'object'], [\"enabledProperties\", 'array']], outputKeys: [\"companyId\"] },\n \"hubspotCreateContact\": { fields: [[\"contact\", 'object'], [\"enabledProperties\", 'array'], [\"companyDomain\", 'string']], outputKeys: [\"contactId\"] },\n \"hubspotGetCompany\": { fields: [[\"searchBy\", [\"domain\", \"id\"]], [\"companyDomain\", 'string'], [\"companyId\", 'string'], [\"additionalProperties\", 'array']], outputKeys: [\"company\"] },\n \"hubspotGetContact\": { fields: [[\"searchBy\", [\"email\", \"id\"]], [\"contactEmail\", 'string'], [\"contactId\", 'string'], [\"additionalProperties\", 'array']], outputKeys: [\"contact\"] },\n \"hunterApiCompanyEnrichment\": { fields: [[\"domain\", 'string']], outputKeys: [\"data\"] },\n \"hunterApiDomainSearch\": { fields: [[\"domain\", 'string']], outputKeys: [\"data\"] },\n \"hunterApiEmailFinder\": { fields: [[\"domain\", 'string'], [\"firstName\", 'string'], [\"lastName\", 'string']], outputKeys: [\"data\"] },\n \"hunterApiEmailVerification\": { fields: [[\"email\", 'string']], outputKeys: [\"data\"] },\n \"hunterApiPersonEnrichment\": { fields: [[\"email\", 'string']], outputKeys: [\"data\"] },\n \"imageFaceSwap\": { fields: [[\"imageUrl\", 'string'], [\"faceImageUrl\", 'string'], [\"engine\", 'string']], outputKeys: [\"imageUrl\"] },\n \"imageRemoveWatermark\": { fields: [[\"imageUrl\", 'string'], [\"engine\", 'string']], outputKeys: [\"imageUrl\"] },\n \"insertVideoClips\": { fields: [[\"baseVideoUrl\", 'string'], [\"overlayVideos\", 'array']], outputKeys: [\"videoUrl\"] },\n \"listDataSources\": { fields: [], outputKeys: [] },\n \"listGmailDrafts\": { fields: [[\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"drafts\"] },\n \"listGmailLabels\": { fields: [], outputKeys: [] },\n \"listGoogleCalendarEvents\": { fields: [[\"limit\", 'number'], [\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"events\"] },\n \"listGoogleDriveFiles\": { fields: [[\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"files\"] },\n \"listRecentGmailEmails\": { fields: [[\"exportType\", [\"json\", \"text\"]], [\"limit\", 'string']], outputKeys: [] },\n \"logic\": { fields: [[\"context\", 'string'], [\"cases\", 'array']], outputKeys: [\"selectedCase\"] },\n \"makeDotComRunScenario\": { fields: [[\"webhookUrl\", 'string'], [\"input\", 'object']], outputKeys: [\"data\"] },\n \"mergeAudio\": { fields: [[\"mp3Urls\", 'array']], outputKeys: [\"audioUrl\"] },\n \"mergeVideos\": { fields: [[\"videoUrls\", 'array']], outputKeys: [\"videoUrl\"] },\n \"mixAudioIntoVideo\": { fields: [[\"videoUrl\", 'string'], [\"audioUrl\", 'string'], [\"options\", 'object']], outputKeys: [\"videoUrl\"] },\n \"muteVideo\": { fields: [[\"videoUrl\", 'string']], outputKeys: [\"videoUrl\"] },\n \"n8nRunNode\": { fields: [[\"method\", 'string'], [\"authentication\", [\"none\", \"basic\", \"string\"]], [\"user\", 'string'], [\"password\", 'string'], [\"webhookUrl\", 'string'], [\"input\", 'object']], outputKeys: [\"data\"] },\n \"notionCreatePage\": { fields: [[\"pageId\", 'string'], [\"content\", 'string'], [\"title\", 'string']], outputKeys: [\"pageId\",\"pageUrl\"] },\n \"notionUpdatePage\": { fields: [[\"pageId\", 'string'], [\"content\", 'string'], [\"mode\", [\"append\", \"overwrite\"]]], outputKeys: [\"pageId\",\"pageUrl\"] },\n \"peopleSearch\": { fields: [[\"smartQuery\", 'string'], [\"enrichPeople\", 'boolean'], [\"enrichOrganizations\", 'boolean'], [\"limit\", 'string'], [\"page\", 'string'], [\"params\", 'object']], outputKeys: [\"results\"] },\n \"postToLinkedIn\": { fields: [[\"message\", 'string'], [\"visibility\", [\"PUBLIC\", \"CONNECTIONS\"]]], outputKeys: [] },\n \"postToSlackChannel\": { fields: [[\"channelId\", 'string'], [\"messageType\", [\"string\", \"blocks\"]], [\"message\", 'string']], outputKeys: [] },\n \"postToX\": { fields: [[\"text\", 'string']], outputKeys: [] },\n \"postToZapier\": { fields: [[\"webhookUrl\", 'string'], [\"input\", 'object']], outputKeys: [\"data\"] },\n \"queryAppDatabase\": { fields: [[\"databaseId\", 'string'], [\"sql\", 'string']], outputKeys: [\"rows\",\"changes\"] },\n \"queryDataSource\": { fields: [[\"dataSourceId\", 'string'], [\"query\", 'string'], [\"maxResults\", 'number']], outputKeys: [\"text\",\"chunks\",\"query\",\"citations\",\"latencyMs\"] },\n \"queryExternalDatabase\": { fields: [[\"query\", 'string'], [\"outputFormat\", [\"json\", \"csv\"]]], outputKeys: [\"data\"] },\n \"redactPII\": { fields: [[\"input\", 'string'], [\"language\", 'string'], [\"entities\", 'array']], outputKeys: [\"text\"] },\n \"removeBackgroundFromImage\": { fields: [[\"imageUrl\", 'string']], outputKeys: [\"imageUrl\"] },\n \"replyToGmailEmail\": { fields: [[\"messageId\", 'string'], [\"message\", 'string'], [\"messageType\", [\"plain\", \"html\", \"markdown\"]]], outputKeys: [\"messageId\"] },\n \"resizeVideo\": { fields: [[\"videoUrl\", 'string'], [\"mode\", [\"fit\", \"exact\"]]], outputKeys: [\"videoUrl\"] },\n \"runFromConnectorRegistry\": { fields: [[\"actionId\", 'string'], [\"displayName\", 'string'], [\"icon\", 'string'], [\"configurationValues\", 'object']], outputKeys: [\"data\"] },\n \"runPackagedWorkflow\": { fields: [[\"appId\", 'string'], [\"workflowId\", 'string'], [\"inputVariables\", 'object'], [\"outputVariables\", 'object'], [\"name\", 'string']], outputKeys: [\"data\"] },\n \"scrapeFacebookPage\": { fields: [[\"pageUrl\", 'string']], outputKeys: [\"data\"] },\n \"scrapeFacebookPosts\": { fields: [[\"pageUrl\", 'string']], outputKeys: [\"data\"] },\n \"scrapeInstagramComments\": { fields: [[\"postUrl\", 'string'], [\"resultsLimit\", 'string']], outputKeys: [\"data\"] },\n \"scrapeInstagramMentions\": { fields: [[\"profileUrl\", 'string'], [\"resultsLimit\", 'string']], outputKeys: [\"data\"] },\n \"scrapeInstagramPosts\": { fields: [[\"profileUrl\", 'string'], [\"resultsLimit\", 'string'], [\"onlyPostsNewerThan\", 'string']], outputKeys: [\"data\"] },\n \"scrapeInstagramProfile\": { fields: [[\"profileUrl\", 'string']], outputKeys: [\"data\"] },\n \"scrapeInstagramReels\": { fields: [[\"profileUrl\", 'string'], [\"resultsLimit\", 'string']], outputKeys: [\"data\"] },\n \"scrapeLinkedInCompany\": { fields: [[\"url\", 'string']], outputKeys: [\"company\"] },\n \"scrapeLinkedInProfile\": { fields: [[\"url\", 'string']], outputKeys: [\"profile\"] },\n \"scrapeMetaThreadsProfile\": { fields: [[\"profileUrl\", 'string']], outputKeys: [\"data\"] },\n \"scrapeUrl\": { fields: [[\"url\", 'string']], outputKeys: [\"content\"] },\n \"scrapeXPost\": { fields: [[\"url\", 'string']], outputKeys: [\"post\"] },\n \"scrapeXProfile\": { fields: [[\"url\", 'string']], outputKeys: [\"profile\"] },\n \"screenshotUrl\": { fields: [[\"url\", 'string']], outputKeys: [\"screenshotUrl\"] },\n \"searchGmailEmails\": { fields: [[\"query\", 'string'], [\"exportType\", [\"json\", \"text\"]], [\"limit\", 'string']], outputKeys: [\"emails\"] },\n \"searchGoogle\": { fields: [[\"query\", 'string'], [\"exportType\", [\"text\", \"json\"]]], outputKeys: [\"results\"] },\n \"searchGoogleCalendarEvents\": { fields: [[\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"events\"] },\n \"searchGoogleDrive\": { fields: [[\"query\", 'string'], [\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"files\"] },\n \"searchGoogleImages\": { fields: [[\"query\", 'string'], [\"exportType\", [\"text\", \"json\"]]], outputKeys: [\"images\"] },\n \"searchGoogleNews\": { fields: [[\"text\", 'string'], [\"exportType\", [\"text\", \"json\"]]], outputKeys: [\"articles\"] },\n \"searchGoogleTrends\": { fields: [[\"text\", 'string'], [\"hl\", 'string'], [\"geo\", 'string'], [\"data_type\", [\"TIMESERIES\", \"GEO_MAP\", \"GEO_MAP_0\", \"RELATED_TOPICS\", \"RELATED_QUERIES\"]], [\"cat\", 'string'], [\"date\", 'string'], [\"ts\", 'string']], outputKeys: [\"trends\"] },\n \"searchPerplexity\": { fields: [[\"query\", 'string'], [\"exportType\", [\"text\", \"json\"]]], outputKeys: [\"results\"] },\n \"searchXPosts\": { fields: [[\"query\", 'string'], [\"scope\", [\"recent\", \"all\"]], [\"options\", 'object']], outputKeys: [\"posts\"] },\n \"searchYoutube\": { fields: [[\"query\", 'string'], [\"limitPages\", 'string'], [\"filter\", 'string'], [\"filterType\", 'string']], outputKeys: [\"results\"] },\n \"searchYoutubeTrends\": { fields: [[\"bp\", [\"now\", \"music\", \"gaming\", \"films\"]], [\"hl\", 'string'], [\"gl\", 'string']], outputKeys: [] },\n \"sendEmail\": { fields: [[\"subject\", 'string'], [\"body\", 'string']], outputKeys: [\"recipients\"] },\n \"sendGmailDraft\": { fields: [[\"draftId\", 'string']], outputKeys: [] },\n \"sendGmailMessage\": { fields: [[\"to\", 'string'], [\"subject\", 'string'], [\"message\", 'string'], [\"messageType\", [\"plain\", \"html\", \"markdown\"]]], outputKeys: [\"messageId\"] },\n \"sendSMS\": { fields: [[\"body\", 'string']], outputKeys: [] },\n \"setGmailReadStatus\": { fields: [[\"messageIds\", 'string'], [\"markAsRead\", 'boolean']], outputKeys: [] },\n \"setRunTitle\": { fields: [[\"title\", 'string']], outputKeys: [] },\n \"setVariable\": { fields: [[\"value\", 'string']], outputKeys: [] },\n \"telegramEditMessage\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"messageId\", 'string'], [\"text\", 'string']], outputKeys: [] },\n \"telegramReplyToMessage\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"replyToMessageId\", 'string'], [\"text\", 'string']], outputKeys: [\"messageId\"] },\n \"telegramSendAudio\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"audioUrl\", 'string'], [\"mode\", [\"audio\", \"voice\"]]], outputKeys: [] },\n \"telegramSendFile\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"fileUrl\", 'string']], outputKeys: [] },\n \"telegramSendImage\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"imageUrl\", 'string']], outputKeys: [] },\n \"telegramSendMessage\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"text\", 'string']], outputKeys: [\"messageId\"] },\n \"telegramSendVideo\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"videoUrl\", 'string']], outputKeys: [] },\n \"telegramSetTyping\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string']], outputKeys: [] },\n \"textToSpeech\": { fields: [[\"text\", 'string']], outputKeys: [\"audioUrl\"] },\n \"transcribeAudio\": { fields: [[\"audioUrl\", 'string'], [\"prompt\", 'string']], outputKeys: [\"text\"] },\n \"trimMedia\": { fields: [[\"inputUrl\", 'string']], outputKeys: [\"mediaUrl\"] },\n \"updateGmailLabels\": { fields: [[\"query\", 'string'], [\"messageIds\", 'string'], [\"addLabelIds\", 'string'], [\"removeLabelIds\", 'string']], outputKeys: [\"updatedMessageIds\"] },\n \"updateGoogleCalendarEvent\": { fields: [[\"eventId\", 'string']], outputKeys: [\"eventId\",\"htmlLink\"] },\n \"updateGoogleDoc\": { fields: [[\"documentId\", 'string'], [\"text\", 'string'], [\"textType\", [\"plain\", \"html\", \"markdown\"]], [\"operationType\", [\"addToTop\", \"addToBottom\", \"overwrite\"]]], outputKeys: [\"documentUrl\"] },\n \"updateGoogleSheet\": { fields: [[\"text\", 'string'], [\"spreadsheetId\", 'string'], [\"range\", 'string'], [\"operationType\", [\"addToBottom\", \"overwrite\", \"range\"]]], outputKeys: [\"spreadsheetUrl\"] },\n \"uploadDataSourceDocument\": { fields: [[\"dataSourceId\", 'string'], [\"file\", 'string'], [\"fileName\", 'string']], outputKeys: [] },\n \"upscaleImage\": { fields: [[\"imageUrl\", 'string'], [\"targetResolution\", [\"2k\", \"4k\", \"8k\"]], [\"engine\", [\"standard\", \"pro\"]]], outputKeys: [\"imageUrl\"] },\n \"upscaleVideo\": { fields: [[\"videoUrl\", 'string'], [\"targetResolution\", [\"720p\", \"1080p\", \"2K\", \"4K\"]], [\"engine\", [\"standard\", \"pro\", \"ultimate\", \"flashvsr\", \"seedance\", \"seedvr2\", \"runwayml/upscale-v1\"]]], outputKeys: [\"videoUrl\"] },\n \"userMessage\": { fields: [[\"message\", 'string']], outputKeys: [\"content\"] },\n \"videoFaceSwap\": { fields: [[\"videoUrl\", 'string'], [\"faceImageUrl\", 'string'], [\"targetIndex\", 'number'], [\"engine\", 'string']], outputKeys: [\"videoUrl\"] },\n \"videoRemoveBackground\": { fields: [[\"videoUrl\", 'string'], [\"newBackground\", [\"transparent\", \"image\"]], [\"engine\", 'string']], outputKeys: [\"videoUrl\"] },\n \"videoRemoveWatermark\": { fields: [[\"videoUrl\", 'string'], [\"engine\", 'string']], outputKeys: [\"videoUrl\"] },\n \"watermarkImage\": { fields: [[\"imageUrl\", 'string'], [\"watermarkImageUrl\", 'string'], [\"corner\", [\"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"]], [\"paddingPx\", 'number'], [\"widthPx\", 'number']], outputKeys: [\"imageUrl\"] },\n \"watermarkVideo\": { fields: [[\"videoUrl\", 'string'], [\"imageUrl\", 'string'], [\"corner\", [\"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"]], [\"paddingPx\", 'number'], [\"widthPx\", 'number']], outputKeys: [\"videoUrl\"] },\n};\n\nexport const blockTypeAliases: Record<string, string> = {\n \"userMessage\": \"generateText\",\n \"generatePdf\": \"generateAsset\",\n};\n","// AUTO-GENERATED — DO NOT EDIT\n// Run `npm run codegen` to regenerate from the OpenAPI spec.\n// Generated: 2026-03-24T14:33:23.674Z\n\n\nexport interface StepMetadata {\n stepType: string;\n description: string;\n usageNotes: string;\n inputSchema: Record<string, unknown>;\n outputSchema: Record<string, unknown> | null;\n}\n\nexport const stepMetadata: Record<string, StepMetadata> = {\n \"activeCampaignAddNote\": {\n stepType: \"activeCampaignAddNote\",\n description: \"Add a note to an existing contact in ActiveCampaign.\",\n usageNotes: \"- Requires an ActiveCampaign OAuth connection (connectionId).\\n- The contact must already exist — use the contact ID from a previous create or search step.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"contactId\":{\"type\":\"string\",\"description\":\"ActiveCampaign contact ID to add the note to\"},\"note\":{\"type\":\"string\",\"description\":\"Note text content\"},\"connectionId\":{\"type\":\"string\",\"description\":\"ActiveCampaign OAuth connection ID\"}},\"required\":[\"contactId\",\"note\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"activeCampaignCreateContact\": {\n stepType: \"activeCampaignCreateContact\",\n description: \"Create or sync a contact in ActiveCampaign.\",\n usageNotes: \"- Requires an ActiveCampaign OAuth connection (connectionId).\\n- If a contact with the email already exists, it may be updated depending on ActiveCampaign settings.\\n- Custom fields are passed as a key-value map where keys are field IDs.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"email\":{\"type\":\"string\",\"description\":\"Contact email address\"},\"firstName\":{\"type\":\"string\",\"description\":\"Contact first name\"},\"lastName\":{\"type\":\"string\",\"description\":\"Contact last name\"},\"phone\":{\"type\":\"string\",\"description\":\"Contact phone number\"},\"accountId\":{\"type\":\"string\",\"description\":\"ActiveCampaign account ID to associate the contact with\"},\"customFields\":{\"type\":\"object\",\"description\":\"Custom field values keyed by field ID\"},\"connectionId\":{\"type\":\"string\",\"description\":\"ActiveCampaign OAuth connection ID\"}},\"required\":[\"email\",\"firstName\",\"lastName\",\"phone\",\"accountId\",\"customFields\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"contactId\":{\"type\":\"string\",\"description\":\"ActiveCampaign contact ID of the created contact\"}},\"required\":[\"contactId\"]},\n },\n \"addSubtitlesToVideo\": {\n stepType: \"addSubtitlesToVideo\",\n description: \"Automatically add subtitles to a video\",\n usageNotes: \"- Can control style of text and animation\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video\"},\"language\":{\"type\":\"string\",\"description\":\"ISO language code for subtitle transcription\"},\"fontName\":{\"type\":\"string\",\"description\":\"Google Font name for subtitle text\"},\"fontSize\":{\"type\":\"number\",\"description\":\"Font size in pixels. Default: 100.\"},\"fontWeight\":{\"enum\":[\"normal\",\"bold\",\"black\"],\"type\":\"string\",\"description\":\"Font weight for subtitle text\"},\"fontColor\":{\"enum\":[\"white\",\"black\",\"red\",\"green\",\"blue\",\"yellow\",\"orange\",\"purple\",\"pink\",\"brown\",\"gray\",\"cyan\",\"magenta\"],\"type\":\"string\",\"description\":\"Color of the subtitle text\"},\"highlightColor\":{\"enum\":[\"white\",\"black\",\"red\",\"green\",\"blue\",\"yellow\",\"orange\",\"purple\",\"pink\",\"brown\",\"gray\",\"cyan\",\"magenta\"],\"type\":\"string\",\"description\":\"Color used to highlight the currently spoken word\"},\"strokeWidth\":{\"type\":\"number\",\"description\":\"Width of the text stroke outline in pixels\"},\"strokeColor\":{\"enum\":[\"black\",\"white\",\"red\",\"green\",\"blue\",\"yellow\",\"orange\",\"purple\",\"pink\",\"brown\",\"gray\",\"cyan\",\"magenta\"],\"type\":\"string\",\"description\":\"Color of the text stroke outline\"},\"backgroundColor\":{\"enum\":[\"black\",\"white\",\"red\",\"green\",\"blue\",\"yellow\",\"orange\",\"purple\",\"pink\",\"brown\",\"gray\",\"cyan\",\"magenta\",\"none\"],\"type\":\"string\",\"description\":\"Background color behind subtitle text. Use 'none' for transparent.\"},\"backgroundOpacity\":{\"type\":\"number\",\"description\":\"Opacity of the subtitle background. 0.0 = fully transparent, 1.0 = fully opaque.\"},\"position\":{\"enum\":[\"top\",\"center\",\"bottom\"],\"type\":\"string\",\"description\":\"Vertical position of subtitle text on screen\"},\"yOffset\":{\"type\":\"number\",\"description\":\"Vertical offset in pixels from the position. Positive moves down, negative moves up. Default: 75.\"},\"wordsPerSubtitle\":{\"type\":\"number\",\"description\":\"Maximum number of words per subtitle segment. Use 1 for single-word display, 2-3 for short phrases, or 8-12 for full sentences. Default: 3.\"},\"enableAnimation\":{\"type\":\"boolean\",\"description\":\"When true, enables bounce-style entrance animation for subtitles. Default: true.\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"language\",\"fontName\",\"fontSize\",\"fontWeight\",\"fontColor\",\"highlightColor\",\"strokeWidth\",\"strokeColor\",\"backgroundColor\",\"backgroundOpacity\",\"position\",\"yOffset\",\"wordsPerSubtitle\",\"enableAnimation\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video with subtitles added\"}},\"required\":[\"videoUrl\"]},\n },\n \"airtableCreateUpdateRecord\": {\n stepType: \"airtableCreateUpdateRecord\",\n description: \"Create a new record or update an existing record in an Airtable table.\",\n usageNotes: \"- If recordId is provided, updates that record. Otherwise, creates a new one.\\n- When updating with updateMode \\\"onlySpecified\\\", unspecified fields are left as-is. With \\\"all\\\", unspecified fields are cleared.\\n- Array fields (e.g. multipleAttachments) accept arrays of values.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Airtable OAuth connection ID\"},\"baseId\":{\"type\":\"string\",\"description\":\"Airtable base ID\"},\"tableId\":{\"type\":\"string\",\"description\":\"Airtable table ID\"},\"recordId\":{\"type\":\"string\",\"description\":\"Record ID to update. Omit to create a new record\"},\"updateMode\":{\"enum\":[\"onlySpecified\",\"all\"],\"type\":\"string\",\"description\":\"How to handle unspecified fields on update. 'onlySpecified' leaves them as-is, 'all' clears them\"},\"fields\":{\"description\":\"Field schema metadata used for type resolution\"},\"recordData\":{\"type\":\"object\",\"description\":\"Field values to set, keyed by field ID\"}},\"required\":[\"baseId\",\"tableId\",\"fields\",\"recordData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"recordId\":{\"type\":\"string\",\"description\":\"The Airtable record ID of the created or updated record\"}},\"required\":[\"recordId\"]},\n },\n \"airtableDeleteRecord\": {\n stepType: \"airtableDeleteRecord\",\n description: \"Delete a record from an Airtable table by its record ID.\",\n usageNotes: \"- Requires an active Airtable OAuth connection (connectionId).\\n- Silently succeeds if the record does not exist.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Airtable OAuth connection ID\"},\"baseId\":{\"type\":\"string\",\"description\":\"Airtable base ID\"},\"tableId\":{\"type\":\"string\",\"description\":\"Airtable table ID\"},\"recordId\":{\"type\":\"string\",\"description\":\"Record ID to delete\"}},\"required\":[\"baseId\",\"tableId\",\"recordId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"deleted\":{\"type\":\"boolean\",\"description\":\"Whether the record was successfully deleted\"}},\"required\":[\"deleted\"]},\n },\n \"airtableGetRecord\": {\n stepType: \"airtableGetRecord\",\n description: \"Fetch a single record from an Airtable table by its record ID.\",\n usageNotes: \"- Requires an active Airtable OAuth connection (connectionId).\\n- If the record is not found, returns a string message instead of a record object.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Airtable OAuth connection ID\"},\"baseId\":{\"type\":\"string\",\"description\":\"Airtable base ID (e.g. \\\"appXXXXXX\\\")\"},\"tableId\":{\"type\":\"string\",\"description\":\"Airtable table ID (e.g. \\\"tblXXXXXX\\\")\"},\"recordId\":{\"type\":\"string\",\"description\":\"Record ID to fetch (e.g. \\\"recXXXXXX\\\")\"}},\"required\":[\"baseId\",\"tableId\",\"recordId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"record\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Airtable record ID\"},\"createdTime\":{\"type\":\"string\",\"description\":\"ISO 8601 timestamp when the record was created\"},\"fields\":{\"type\":\"object\",\"description\":\"Field values keyed by field name\"}},\"required\":[\"id\",\"createdTime\",\"fields\"]},{\"type\":\"null\"}]}},\"required\":[\"record\"]},\n },\n \"airtableGetTableRecords\": {\n stepType: \"airtableGetTableRecords\",\n description: \"Fetch multiple records from an Airtable table with optional pagination.\",\n usageNotes: \"- Requires an active Airtable OAuth connection (connectionId).\\n- Default limit is 100 records. Maximum is 1000.\\n- When outputFormat is 'csv', the variable receives CSV text. The direct execution output always returns parsed records.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Airtable OAuth connection ID\"},\"baseId\":{\"type\":\"string\",\"description\":\"Airtable base ID (e.g. \\\"appXXXXXX\\\")\"},\"tableId\":{\"type\":\"string\",\"description\":\"Airtable table ID (e.g. \\\"tblXXXXXX\\\")\"},\"outputFormat\":{\"enum\":[\"json\",\"csv\"],\"type\":\"string\",\"description\":\"Output format for the result. Defaults to 'json'\"},\"limit\":{\"type\":\"number\",\"description\":\"Maximum number of records to return. Defaults to 100, max 1000\"}},\"required\":[\"baseId\",\"tableId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"records\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Airtable record ID\"},\"createdTime\":{\"type\":\"string\",\"description\":\"ISO 8601 timestamp when the record was created\"},\"fields\":{\"type\":\"object\",\"description\":\"Field values keyed by field name\"}},\"required\":[\"id\",\"createdTime\",\"fields\"]},\"description\":\"The list of records retrieved from the Airtable table\"}},\"required\":[\"records\"]},\n },\n \"analyzeImage\": {\n stepType: \"analyzeImage\",\n description: \"Analyze an image using a vision model based on a text prompt.\",\n usageNotes: \"- Uses the configured vision model to generate a text analysis of the image.\\n- The prompt should describe what to look for or extract from the image.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"Instructions describing what to look for or extract from the image\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the image to analyze\"},\"visionModelOverride\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\"},\"config\":{\"type\":\"object\"}},\"required\":[\"model\"]},{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"]}]}},\"required\":[\"prompt\",\"imageUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"analysis\":{\"type\":\"string\",\"description\":\"Text analysis of the image generated by the vision model\"}},\"required\":[\"analysis\"]},\n },\n \"analyzeVideo\": {\n stepType: \"analyzeVideo\",\n description: \"Analyze a video using a video analysis model based on a text prompt.\",\n usageNotes: \"- Uses the configured video analysis model to generate a text analysis of the video.\\n- The prompt should describe what to look for or extract from the video.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"Instructions describing what to look for or extract from the video\"},\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video to analyze\"},\"videoAnalysisModelOverride\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\"},\"config\":{\"type\":\"object\"}},\"required\":[\"model\"]},{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"]}]}},\"required\":[\"prompt\",\"videoUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"analysis\":{\"type\":\"string\",\"description\":\"Text analysis of the video generated by the video analysis model\"}},\"required\":[\"analysis\"]},\n },\n \"captureThumbnail\": {\n stepType: \"captureThumbnail\",\n description: \"Capture a thumbnail from a video at a specified timestamp\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video to capture a frame from\"},\"at\":{\"anyOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]}},\"required\":[\"videoUrl\",\"at\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"thumbnailUrl\":{\"type\":\"string\",\"description\":\"URL of the captured thumbnail image\"}},\"required\":[\"thumbnailUrl\"]},\n },\n \"checkAppRole\": {\n stepType: \"checkAppRole\",\n description: \"Check whether the current user has a specific app role and branch accordingly.\",\n usageNotes: \"- Checks if the current user has been assigned a specific role in this app.\\n- If the user has the role, transitions to the \\\"has role\\\" path.\\n- If the user does not have the role, transitions to the \\\"no role\\\" path, or errors if no path is configured.\\n- Role names are defined by the app creator and assigned to users via the app roles system.\\n- The roleName field supports {{variables}} for dynamic role checks.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"roleName\":{\"type\":\"string\",\"description\":\"The role name to check (supports {{variables}})\"},\"hasRoleStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if the user has the role (same workflow)\"},\"hasRoleWorkflowId\":{\"type\":\"string\",\"description\":\"Workflow to jump to if the user has the role (cross workflow)\"},\"noRoleStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if the user does not have the role (same workflow)\"},\"noRoleWorkflowId\":{\"type\":\"string\",\"description\":\"Workflow to jump to if the user does not have the role (cross workflow)\"}},\"required\":[\"roleName\"],\"description\":\"Configuration for the check app role step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"hasRole\":{\"type\":\"boolean\",\"description\":\"Whether the current user has the checked role\"},\"userRoles\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"All roles assigned to the current user for this app\"}},\"required\":[\"hasRole\",\"userRoles\"]},\n },\n \"codaCreateUpdatePage\": {\n stepType: \"codaCreateUpdatePage\",\n description: \"Create a new page or update an existing page in a Coda document.\",\n usageNotes: \"- Requires a Coda OAuth connection (connectionId).\\n- If pageData.pageId is provided, updates that page. Otherwise, creates a new one.\\n- Page content is provided as markdown and converted to Coda's canvas format.\\n- When updating, insertionMode controls how content is applied (default: 'append').\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Coda OAuth connection ID\"},\"pageData\":{\"type\":\"object\",\"properties\":{\"docId\":{\"type\":\"string\",\"description\":\"Coda document ID\"},\"pageId\":{\"type\":\"string\",\"description\":\"Page ID to update. Omit to create a new page\"},\"name\":{\"type\":\"string\",\"description\":\"Page title\"},\"subtitle\":{\"type\":\"string\",\"description\":\"Page subtitle\"},\"iconName\":{\"type\":\"string\",\"description\":\"Page icon name\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"Page cover image URL\"},\"parentPageId\":{\"type\":\"string\",\"description\":\"Parent page ID for nesting under another page\"},\"pageContent\":{\"anyOf\":[{\"type\":\"string\"},{}]},\"contentUpdate\":{\"description\":\"Content update payload for partial updates\"},\"insertionMode\":{\"type\":\"string\",\"description\":\"How to insert content on update: \\\"append\\\" or \\\"replace\\\"\"}},\"required\":[\"docId\",\"name\",\"subtitle\",\"iconName\",\"imageUrl\",\"pageContent\"],\"description\":\"Page configuration including document ID, title, content, and optional parent page\"}},\"required\":[\"pageData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"pageId\":{\"type\":\"string\",\"description\":\"The Coda page ID of the created or updated page\"}},\"required\":[\"pageId\"]},\n },\n \"codaCreateUpdateRow\": {\n stepType: \"codaCreateUpdateRow\",\n description: \"Create a new row or update an existing row in a Coda table.\",\n usageNotes: \"- Requires a Coda OAuth connection (connectionId).\\n- If rowId is provided, updates that row. Otherwise, creates a new one.\\n- Row data keys are column IDs. Empty values are excluded.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Coda OAuth connection ID\"},\"docId\":{\"type\":\"string\",\"description\":\"Coda document ID\"},\"tableId\":{\"type\":\"string\",\"description\":\"Table ID within the document\"},\"rowId\":{\"type\":\"string\",\"description\":\"Row ID to update. Omit to create a new row\"},\"rowData\":{\"type\":\"object\",\"description\":\"Column values to set, keyed by column ID\"}},\"required\":[\"docId\",\"tableId\",\"rowData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"rowId\":{\"type\":\"string\",\"description\":\"The Coda row ID of the created or updated row\"}},\"required\":[\"rowId\"]},\n },\n \"codaFindRow\": {\n stepType: \"codaFindRow\",\n description: \"Search for a row in a Coda table by matching column values.\",\n usageNotes: \"- Requires a Coda OAuth connection (connectionId).\\n- Returns the first row matching all specified column values, or null if no match.\\n- Search criteria in rowData are ANDed together.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Coda OAuth connection ID\"},\"docId\":{\"type\":\"string\",\"description\":\"Coda document ID\"},\"tableId\":{\"type\":\"string\",\"description\":\"Table ID to search within\"},\"rowData\":{\"type\":\"object\",\"description\":\"Column values to match against, keyed by column ID. All criteria are ANDed together\"}},\"required\":[\"docId\",\"tableId\",\"rowData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"row\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Coda row ID\"},\"values\":{\"type\":\"object\",\"description\":\"Column values keyed by column name\"}},\"required\":[\"id\",\"values\"]},{\"type\":\"null\"}]}},\"required\":[\"row\"]},\n },\n \"codaGetPage\": {\n stepType: \"codaGetPage\",\n description: \"Export and read the contents of a page from a Coda document.\",\n usageNotes: \"- Requires a Coda OAuth connection (connectionId).\\n- Page export is asynchronous on Coda's side — there may be a brief delay while it processes.\\n- If a page was just created in a prior step, there is an automatic 20-second retry if the first export attempt fails.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Coda OAuth connection ID\"},\"docId\":{\"type\":\"string\",\"description\":\"Coda document ID\"},\"pageId\":{\"type\":\"string\",\"description\":\"Page ID within the document\"},\"outputFormat\":{\"enum\":[\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Export format for the page content. Defaults to 'html'\"}},\"required\":[\"docId\",\"pageId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"type\":\"string\",\"description\":\"Page content in the requested format (HTML or Markdown)\"}},\"required\":[\"content\"]},\n },\n \"codaGetTableRows\": {\n stepType: \"codaGetTableRows\",\n description: \"Fetch rows from a Coda table with optional pagination.\",\n usageNotes: \"- Requires a Coda OAuth connection (connectionId).\\n- Default limit is 10000 rows. Rows are fetched in pages of 500.\\n- When outputFormat is 'csv', the variable receives CSV text. The direct execution output always returns parsed rows.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Coda OAuth connection ID\"},\"docId\":{\"type\":\"string\",\"description\":\"Coda document ID\"},\"tableId\":{\"type\":\"string\",\"description\":\"Table ID within the document\"},\"limit\":{\"type\":[\"number\",\"string\"]},\"outputFormat\":{\"enum\":[\"json\",\"csv\"],\"type\":\"string\",\"description\":\"Output format for the result. Defaults to 'json'\"}},\"required\":[\"docId\",\"tableId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Coda row ID\"},\"values\":{\"type\":\"object\",\"description\":\"Column values keyed by column name\"}},\"required\":[\"id\",\"values\"]},\"description\":\"The list of rows retrieved from the Coda table\"}},\"required\":[\"rows\"]},\n },\n \"convertPdfToImages\": {\n stepType: \"convertPdfToImages\",\n description: \"Convert each page of a PDF document into a PNG image.\",\n usageNotes: \"- Each page is converted to a separate PNG and re-hosted on the CDN.\\n- Returns an array of image URLs, one per page.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"pdfUrl\":{\"type\":\"string\",\"description\":\"URL of the PDF document to convert\"}},\"required\":[\"pdfUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrls\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"CDN URLs of the generated page images, one per page of the PDF\"}},\"required\":[\"imageUrls\"]},\n },\n \"createDataSource\": {\n stepType: \"createDataSource\",\n description: \"Create a new empty vector data source for the current app.\",\n usageNotes: \"- Creates a new data source (vector database) associated with the current app version.\\n- The data source is created empty — use the \\\"Upload Data Source Document\\\" block to add documents.\\n- Returns the new data source ID which can be used in subsequent blocks.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"description\":\"Name for the new data source (supports variable interpolation)\"}},\"required\":[\"name\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"createGmailDraft\": {\n stepType: \"createGmailDraft\",\n description: \"Create a draft email in the connected Gmail account.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail compose scope.\\n- The draft appears in the user's Gmail Drafts folder but is not sent.\\n- messageType controls the body format: \\\"plain\\\" for plain text, \\\"html\\\" for raw HTML, \\\"markdown\\\" for auto-converted markdown.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"to\":{\"type\":\"string\",\"description\":\"Recipient email address(es), comma-separated for multiple\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject line\"},\"message\":{\"type\":\"string\",\"description\":\"Email body content\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"messageType\":{\"enum\":[\"plain\",\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Body format: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\"\"}},\"required\":[\"to\",\"subject\",\"message\",\"messageType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"draftId\":{\"type\":\"string\",\"description\":\"Gmail draft ID\"}},\"required\":[\"draftId\"]},\n },\n \"createGoogleCalendarEvent\": {\n stepType: \"createGoogleCalendarEvent\",\n description: \"Create a new event on a Google Calendar.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- Date/time values must be ISO 8601 format (e.g. \\\"2025-07-02T10:00:00-07:00\\\").\\n- Attendees are specified as one email address per line in a single string.\\n- Set addMeetLink to true to automatically attach a Google Meet video call.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"summary\":{\"type\":\"string\",\"description\":\"Event title\"},\"description\":{\"type\":\"string\",\"description\":\"Event description\"},\"location\":{\"type\":\"string\",\"description\":\"Event location\"},\"startDateTime\":{\"type\":\"string\",\"description\":\"Start time in ISO 8601 format\"},\"endDateTime\":{\"type\":\"string\",\"description\":\"End time in ISO 8601 format\"},\"attendees\":{\"type\":\"string\",\"description\":\"Attendee email addresses, one per line\"},\"addMeetLink\":{\"type\":\"boolean\",\"description\":\"Whether to attach a Google Meet video call link\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\" if omitted)\"}},\"required\":[\"summary\",\"startDateTime\",\"endDateTime\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"eventId\":{\"type\":\"string\",\"description\":\"Google Calendar event ID\"},\"htmlLink\":{\"type\":\"string\",\"description\":\"URL to view the event in Google Calendar\"}},\"required\":[\"eventId\",\"htmlLink\"]},\n },\n \"createGoogleDoc\": {\n stepType: \"createGoogleDoc\",\n description: \"Create a new Google Document and optionally populate it with content.\",\n usageNotes: \"- textType determines how the text field is interpreted: \\\"plain\\\" for plain text, \\\"html\\\" for HTML markup, \\\"markdown\\\" for Markdown.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Title for the new document\"},\"text\":{\"type\":\"string\",\"description\":\"Document body content\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"textType\":{\"enum\":[\"plain\",\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Format of the text field: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\"\"}},\"required\":[\"title\",\"text\",\"textType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"documentUrl\":{\"type\":\"string\",\"description\":\"URL of the newly created Google Document\"}},\"required\":[\"documentUrl\"]},\n },\n \"createGoogleSheet\": {\n stepType: \"createGoogleSheet\",\n description: \"Create a new Google Spreadsheet and populate it with CSV data.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Title for the new spreadsheet\"},\"text\":{\"type\":\"string\",\"description\":\"CSV data to populate the sheet with\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"title\",\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"spreadsheetUrl\":{\"type\":\"string\",\"description\":\"URL of the newly created Google Spreadsheet\"}},\"required\":[\"spreadsheetUrl\"]},\n },\n \"deleteDataSource\": {\n stepType: \"deleteDataSource\",\n description: \"Delete a vector data source from the current app.\",\n usageNotes: \"- Soft-deletes a data source (vector database) by marking it as deleted.\\n- The Milvus partition is cleaned up asynchronously by a background cron job.\\n- The data source must belong to the current app version.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"dataSourceId\":{\"type\":\"string\",\"description\":\"ID of the data source to delete (supports variable interpolation)\"}},\"required\":[\"dataSourceId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"deleteDataSourceDocument\": {\n stepType: \"deleteDataSourceDocument\",\n description: \"Delete a single document from a data source.\",\n usageNotes: \"- Soft-deletes a document by marking it as deleted.\\n- Requires both the data source ID and document ID.\\n- After deletion, reloads vectors into Milvus so the data source reflects the change immediately.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"dataSourceId\":{\"type\":\"string\",\"description\":\"ID of the data source containing the document (supports variable interpolation)\"},\"documentId\":{\"type\":\"string\",\"description\":\"ID of the document to delete (supports variable interpolation)\"}},\"required\":[\"dataSourceId\",\"documentId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"deleteGmailEmail\": {\n stepType: \"deleteGmailEmail\",\n description: \"Move an email to trash in the connected Gmail account (recoverable delete).\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail modify scope.\\n- Uses trash (recoverable) rather than permanent delete.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID to delete (move to trash)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"messageId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"deleteGoogleCalendarEvent\": {\n stepType: \"deleteGoogleCalendarEvent\",\n description: \"Retrieve a specific event from a Google Calendar by event ID.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns the structured event.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"eventId\":{\"type\":\"string\",\"description\":\"Google Calendar event ID to delete\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\" if omitted)\"}},\"required\":[\"eventId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"deleteGoogleSheetRows\": {\n stepType: \"deleteGoogleSheetRows\",\n description: \"Delete a range of rows from a Google Spreadsheet.\",\n usageNotes: \"- Requires a Google OAuth connection with Drive scope.\\n- startRow and endRow are 1-based row numbers (inclusive).\\n- If sheetName is omitted, operates on the first sheet.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"description\":\"Google Spreadsheet ID or URL\"},\"sheetName\":{\"type\":\"string\",\"description\":\"Sheet/tab name (defaults to first sheet)\"},\"startRow\":{\"type\":\"string\",\"description\":\"First row to delete (1-based, inclusive)\"},\"endRow\":{\"type\":\"string\",\"description\":\"Last row to delete (1-based, inclusive)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"documentId\",\"startRow\",\"endRow\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"detectChanges\": {\n stepType: \"detectChanges\",\n description: \"Detect changes between runs by comparing current input against previously stored state. Routes execution based on whether a change occurred.\",\n usageNotes: \"- Persists state across runs using a global variable keyed to the step ID.\\n- Two modes: \\\"comparison\\\" (default) uses strict string inequality; \\\"ai\\\" uses an LLM to determine if a meaningful change occurred.\\n- First run always treats the value as \\\"changed\\\" since there is no previous state.\\n- Each mode supports transitions to different steps/workflows for the \\\"changed\\\" and \\\"unchanged\\\" paths.\\n- AI mode bills normally for the LLM call.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"mode\":{\"enum\":[\"ai\",\"comparison\"],\"type\":\"string\",\"description\":\"Detection mode: 'comparison' for strict string inequality, 'ai' for LLM-based. Default: 'comparison'\"},\"input\":{\"type\":\"string\",\"description\":\"Current value to check (variable template)\"},\"prompt\":{\"type\":\"string\",\"description\":\"AI mode: what constitutes a meaningful change\"},\"modelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"AI mode: model settings override\"},\"previousValueVariable\":{\"type\":\"string\",\"description\":\"Optional variable name to store the previous value into for downstream access\"},\"changedStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if changed (same workflow)\"},\"changedWorkflowId\":{\"type\":\"string\",\"description\":\"Workflow to jump to if changed (cross workflow)\"},\"unchangedStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if unchanged (same workflow)\"},\"unchangedWorkflowId\":{\"type\":\"string\",\"description\":\"Workflow to jump to if unchanged (cross workflow)\"}},\"required\":[\"mode\",\"input\"],\"description\":\"Configuration for the detect changes step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"hasChanged\":{\"type\":\"boolean\",\"description\":\"Whether a change was detected\"},\"currentValue\":{\"type\":\"string\",\"description\":\"The resolved input value\"},\"previousValue\":{\"type\":\"string\",\"description\":\"The stored value from last run (empty string on first run)\"},\"isFirstRun\":{\"type\":\"boolean\",\"description\":\"True when no previous state exists\"}},\"required\":[\"hasChanged\",\"currentValue\",\"previousValue\",\"isFirstRun\"]},\n },\n \"detectPII\": {\n stepType: \"detectPII\",\n description: \"Scan text for personally identifiable information using Microsoft Presidio.\",\n usageNotes: \"- In workflow mode, transitions to detectedStepId if PII is found, notDetectedStepId otherwise.\\n- In direct execution, returns the detection results without transitioning.\\n- If entities is empty, returns immediately with no detections.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"input\":{\"type\":\"string\",\"description\":\"Text to scan for personally identifiable information\"},\"language\":{\"type\":\"string\",\"description\":\"Language code of the input text (e.g. \\\"en\\\")\"},\"entities\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"PII entity types to scan for (e.g. [\\\"PHONE_NUMBER\\\", \\\"EMAIL_ADDRESS\\\"]). Empty array means nothing is scanned.\"},\"detectedStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if PII is detected (workflow mode)\"},\"notDetectedStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if no PII is detected (workflow mode)\"},\"outputLogVariable\":{\"type\":\"string\",\"description\":\"Variable name to store the raw detection results\"}},\"required\":[\"input\",\"language\",\"entities\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"detected\":{\"type\":\"boolean\",\"description\":\"Whether any PII was found in the input text\"},\"detections\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"entity_type\":{\"type\":\"string\",\"description\":\"PII entity type (e.g. \\\"PHONE_NUMBER\\\", \\\"EMAIL_ADDRESS\\\", \\\"PERSON\\\")\"},\"start\":{\"type\":\"number\",\"description\":\"Start character index in the input text\"},\"end\":{\"type\":\"number\",\"description\":\"End character index in the input text\"},\"score\":{\"type\":\"number\",\"description\":\"Confidence score between 0 and 1\"}},\"required\":[\"entity_type\",\"start\",\"end\",\"score\"]},\"description\":\"List of detected PII entities with type, location, and confidence\"}},\"required\":[\"detected\",\"detections\"]},\n },\n \"discordEditMessage\": {\n stepType: \"discordEditMessage\",\n description: \"Edit a previously sent Discord channel message. Use with the message ID returned by Send Discord Message.\",\n usageNotes: \"- Only messages sent by the bot can be edited.\\n- The messageId is returned by the Send Discord Message step.\\n- Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\\n- When editing with an attachment, the new attachment replaces any previous attachments on the message.\\n- URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Discord bot token for authentication\"},\"channelId\":{\"type\":\"string\",\"description\":\"Discord channel ID containing the message\"},\"messageId\":{\"type\":\"string\",\"description\":\"ID of the message to edit (returned by Send Discord Message)\"},\"text\":{\"type\":\"string\",\"description\":\"New message text to replace the existing content\"},\"attachmentUrl\":{\"type\":\"string\",\"description\":\"URL of a file to download and attach to the message (replaces any previous attachments)\"}},\"required\":[\"botToken\",\"channelId\",\"messageId\",\"text\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"discordSendFollowUp\": {\n stepType: \"discordSendFollowUp\",\n description: \"Send a follow-up message to a Discord slash command interaction.\",\n usageNotes: \"- Requires the applicationId and interactionToken from the Discord trigger variables.\\n- Follow-up messages appear as new messages in the channel after the initial response.\\n- Returns the sent message ID.\\n- Interaction tokens expire after 15 minutes.\\n- Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\\n- URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"applicationId\":{\"type\":\"string\",\"description\":\"Discord application ID from the bot registration\"},\"interactionToken\":{\"type\":\"string\",\"description\":\"Interaction token provided by the Discord trigger — expires after 15 minutes\"},\"text\":{\"type\":\"string\",\"description\":\"Message text to send as a follow-up\"},\"attachmentUrl\":{\"type\":\"string\",\"description\":\"URL of a file to download and attach to the message\"}},\"required\":[\"applicationId\",\"interactionToken\",\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"ID of the sent follow-up message\"}},\"required\":[\"messageId\"]},\n },\n \"discordSendMessage\": {\n stepType: \"discordSendMessage\",\n description: \"Send a message to Discord — either edit the loading message or send a new channel message.\",\n usageNotes: \"- mode \\\"edit\\\" replaces the loading message (interaction response) with the final result. Uses applicationId and interactionToken from trigger variables. No bot permissions required.\\n- mode \\\"send\\\" sends a new message to a channel. Uses botToken and channelId from trigger variables. Returns a messageId that can be used with Edit Discord Message.\\n- Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\\n- URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\\n- Interaction tokens expire after 15 minutes.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"mode\":{\"enum\":[\"edit\",\"send\"],\"type\":\"string\",\"description\":\"\\\"edit\\\" replaces the loading message, \\\"send\\\" sends a new channel message\"},\"text\":{\"type\":\"string\",\"description\":\"Message text to send\"},\"applicationId\":{\"type\":\"string\",\"description\":\"Discord application ID from the bot registration (required for \\\"reply\\\" mode)\"},\"interactionToken\":{\"type\":\"string\",\"description\":\"Interaction token provided by the Discord trigger — expires after 15 minutes (required for \\\"reply\\\" mode)\"},\"botToken\":{\"type\":\"string\",\"description\":\"Discord bot token for authentication (required for \\\"send\\\" mode)\"},\"channelId\":{\"type\":\"string\",\"description\":\"Discord channel ID to send the message to (required for \\\"send\\\" mode)\"},\"attachmentUrl\":{\"type\":\"string\",\"description\":\"URL of a file to download and attach to the message\"}},\"required\":[\"mode\",\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"ID of the sent Discord message, only present in \\\"send\\\" mode (use with Edit Discord Message)\"}}},\n },\n \"downloadVideo\": {\n stepType: \"downloadVideo\",\n description: \"Download a video file\",\n usageNotes: \"- Works with YouTube, TikTok, etc., by using ytdlp behind the scenes\\n- Can save as mp4 or mp3\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video to download (supports YouTube, TikTok, etc. via yt-dlp)\"},\"format\":{\"enum\":[\"mp4\",\"mp3\"],\"type\":\"string\",\"description\":\"Output format for the downloaded file\"}},\"required\":[\"videoUrl\",\"format\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the downloaded and re-hosted video file\"}},\"required\":[\"videoUrl\"]},\n },\n \"enhanceImageGenerationPrompt\": {\n stepType: \"enhanceImageGenerationPrompt\",\n description: \"Generate or enhance an image generation prompt using a language model. Optionally generates a negative prompt.\",\n usageNotes: \"- Rewrites the user's prompt with added detail about style, lighting, colors, and composition.\\n- Also useful for initial generation, it doesn't always need to be enhancing an existing prompt\\n- When includeNegativePrompt is true, a second model call generates a negative prompt.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"initialPrompt\":{\"type\":\"string\",\"description\":\"The raw prompt to enhance\"},\"includeNegativePrompt\":{\"type\":\"boolean\",\"description\":\"Whether to also generate a negative prompt\"},\"negativePromptDestinationVariableName\":{\"type\":\"string\",\"description\":\"Variable name to save the negative prompt into\"},\"systemPrompt\":{\"type\":\"string\",\"description\":\"Custom system prompt for the enhancement model. Uses a default prompt if not provided\"},\"modelOverride\":{\"description\":\"Model override settings. Leave undefined to use the default model\"}},\"required\":[\"initialPrompt\",\"includeNegativePrompt\",\"systemPrompt\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"The enhanced image generation prompt\"},\"negativePrompt\":{\"type\":\"string\",\"description\":\"The negative prompt, only present when includeNegativePrompt was true\"}},\"required\":[\"prompt\"]},\n },\n \"enhanceVideoGenerationPrompt\": {\n stepType: \"enhanceVideoGenerationPrompt\",\n description: \"Generate or enhance a video generation prompt using a language model. Optionally generates a negative prompt.\",\n usageNotes: \"- Rewrites the user's prompt with added detail about style, camera movement, lighting, and composition.\\n- Also useful for initial generation, it doesn't always need to be enhancing an existing prompt\\n- When includeNegativePrompt is true, a second model call generates a negative prompt.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"initialPrompt\":{\"type\":\"string\",\"description\":\"The raw prompt to enhance\"},\"includeNegativePrompt\":{\"type\":\"boolean\",\"description\":\"Whether to also generate a negative prompt\"},\"negativePromptDestinationVariableName\":{\"type\":\"string\",\"description\":\"Variable name to save the negative prompt into\"},\"systemPrompt\":{\"type\":\"string\",\"description\":\"Custom system prompt for the enhancement model. Uses a default prompt if not provided\"},\"modelOverride\":{\"description\":\"Model override settings. Leave undefined to use the default model\"}},\"required\":[\"initialPrompt\",\"includeNegativePrompt\",\"systemPrompt\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"The enhanced video generation prompt\"},\"negativePrompt\":{\"type\":\"string\",\"description\":\"The negative prompt, only present when includeNegativePrompt was true\"}},\"required\":[\"prompt\"]},\n },\n \"enrichPerson\": {\n stepType: \"enrichPerson\",\n description: \"Look up professional information about a person using Apollo.io. Search by ID, name, LinkedIn URL, email, or domain.\",\n usageNotes: \"- At least one search parameter must be provided.\\n- Returns enriched data from Apollo including contact details, employment info, and social profiles.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"params\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Apollo person ID\"},\"name\":{\"type\":\"string\",\"description\":\"Person's full name\"},\"linkedinUrl\":{\"type\":\"string\",\"description\":\"LinkedIn profile URL\"},\"email\":{\"type\":\"string\",\"description\":\"Email address\"},\"domain\":{\"type\":\"string\",\"description\":\"Company domain\"}},\"required\":[\"id\",\"name\",\"linkedinUrl\",\"email\",\"domain\"],\"description\":\"Search parameters to identify the person (ID, name, LinkedIn URL, email, or domain)\"}},\"required\":[\"params\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Apollo enrichment result with contact details, employment history, and social profiles\"}},\"required\":[\"data\"]},\n },\n \"extractAudioFromVideo\": {\n stepType: \"extractAudioFromVideo\",\n description: \"Extract audio MP3 from a video file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video to extract audio from\"}},\"required\":[\"videoUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the extracted audio MP3 file\"}},\"required\":[\"audioUrl\"]},\n },\n \"extractText\": {\n stepType: \"extractText\",\n description: \"Download a file from a URL and extract its text content. Supports PDFs, plain text files, and other document formats.\",\n usageNotes: \"- Best suited for PDFs and raw text/document files. For web pages, use the scrapeUrl step instead.\\n- Accepts a single URL, a comma-separated list of URLs, or a JSON array of URLs.\\n- Files are rehosted on the MindStudio CDN before extraction.\\n- Maximum file size is 50MB per URL.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}}]}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}}]}},\"required\":[\"text\"]},\n },\n \"fetchDataSourceDocument\": {\n stepType: \"fetchDataSourceDocument\",\n description: \"Fetch the full extracted text contents of a document in a data source.\",\n usageNotes: \"- Loads a document by ID and returns its full extracted text content.\\n- The document must have been successfully processed (status \\\"done\\\").\\n- Also returns document metadata (name, summary, word count).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"dataSourceId\":{\"type\":\"string\",\"description\":\"ID of the data source containing the document (supports variable interpolation)\"},\"documentId\":{\"type\":\"string\",\"description\":\"ID of the document to fetch (supports variable interpolation)\"}},\"required\":[\"dataSourceId\",\"documentId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"fetchGoogleDoc\": {\n stepType: \"fetchGoogleDoc\",\n description: \"Fetch the contents of an existing Google Document.\",\n usageNotes: \"- exportType controls the output format: \\\"html\\\" for HTML markup, \\\"markdown\\\" for Markdown, \\\"json\\\" for structured JSON, \\\"plain\\\" for plain text.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"description\":\"Google Document ID (from the document URL)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"html\",\"markdown\",\"json\",\"plain\"],\"type\":\"string\",\"description\":\"Output format: \\\"html\\\", \\\"markdown\\\", \\\"json\\\", or \\\"plain\\\"\"}},\"required\":[\"documentId\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"type\":\"string\",\"description\":\"Document contents in the requested export format\"}},\"required\":[\"content\"]},\n },\n \"fetchGoogleSheet\": {\n stepType: \"fetchGoogleSheet\",\n description: \"Fetch contents of a Google Spreadsheet range.\",\n usageNotes: \"- range uses A1 notation (e.g. \\\"Sheet1!A1:C10\\\"). Omit to fetch the entire first sheet.\\n- exportType controls the output format: \\\"csv\\\" for comma-separated values, \\\"json\\\" for structured JSON.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"spreadsheetId\":{\"type\":\"string\",\"description\":\"Google Spreadsheet ID (from the spreadsheet URL)\"},\"range\":{\"type\":\"string\",\"description\":\"Cell range in A1 notation (e.g. \\\"Sheet1!A1:C10\\\")\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"csv\",\"json\"],\"type\":\"string\",\"description\":\"Output format: \\\"csv\\\" or \\\"json\\\"\"}},\"required\":[\"spreadsheetId\",\"range\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"type\":\"string\",\"description\":\"Spreadsheet data in the requested export format\"}},\"required\":[\"content\"]},\n },\n \"fetchSlackChannelHistory\": {\n stepType: \"fetchSlackChannelHistory\",\n description: \"Fetch recent message history from a Slack channel.\",\n usageNotes: \"- The user is responsible for connecting their Slack workspace and selecting the channel\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Slack OAuth connection ID (leave empty to allow user to select)\"},\"channelId\":{\"type\":\"string\",\"description\":\"Slack channel ID (leave empty to allow user to select a channel)\"},\"limit\":{\"type\":\"number\",\"description\":\"Maximum number of messages to return (1-15)\"},\"startDate\":{\"type\":\"string\",\"description\":\"Earliest date to include messages from\"},\"endDate\":{\"type\":\"string\",\"description\":\"Latest date to include messages up to\"},\"includeImages\":{\"type\":\"boolean\",\"description\":\"Whether to include images in the output\"},\"includeRawMessage\":{\"type\":\"boolean\",\"description\":\"Whether to include the raw Slack message object (useful for bot messages with complex attachments)\"}},\"required\":[\"channelId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messages\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"from\":{\"type\":\"string\"},\"content\":{\"type\":\"string\"},\"timestamp\":{\"type\":\"string\"},\"images\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"rawMessage\":{\"type\":\"object\",\"properties\":{\"app_id\":{\"type\":\"string\"},\"assistant_app_thread\":{\"type\":\"object\",\"properties\":{\"first_user_thread_reply\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"title_blocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}}},\"attachments\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"actions\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"app_id\":{\"type\":\"string\"},\"app_unfurl_url\":{\"type\":\"string\"},\"author_icon\":{\"type\":\"string\"},\"author_id\":{\"type\":\"string\"},\"author_link\":{\"type\":\"string\"},\"author_name\":{\"type\":\"string\"},\"author_subname\":{\"type\":\"string\"},\"blocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"bot_id\":{\"type\":\"string\"},\"bot_team_id\":{\"type\":\"string\"},\"callback_id\":{\"type\":\"string\"},\"channel_id\":{\"type\":\"string\"},\"channel_name\":{\"type\":\"string\"},\"channel_team\":{\"type\":\"string\"},\"color\":{\"type\":\"string\"},\"fallback\":{\"type\":\"string\"},\"fields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"file_id\":{\"type\":\"string\"},\"filename\":{\"type\":\"string\"},\"files\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"footer\":{\"type\":\"string\"},\"footer_icon\":{\"type\":\"string\"},\"from_url\":{\"type\":\"string\"},\"hide_border\":{\"type\":\"boolean\"},\"hide_color\":{\"type\":\"boolean\"},\"id\":{\"type\":\"number\"},\"image_bytes\":{\"type\":\"number\"},\"image_height\":{\"type\":\"number\"},\"image_url\":{\"type\":\"string\"},\"image_width\":{\"type\":\"number\"},\"indent\":{\"type\":\"boolean\"},\"is_app_unfurl\":{\"type\":\"boolean\"},\"is_file_attachment\":{\"type\":\"boolean\"},\"is_msg_unfurl\":{\"type\":\"boolean\"},\"is_reply_unfurl\":{\"type\":\"boolean\"},\"is_thread_root_unfurl\":{\"type\":\"boolean\"},\"list\":{\"type\":\"string\"},\"list_record\":{\"type\":\"string\"},\"list_record_id\":{\"type\":\"string\"},\"list_records\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"list_schema\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"list_view\":{\"type\":\"string\"},\"list_view_id\":{\"type\":\"string\"},\"message_blocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"metadata\":{\"type\":\"string\"},\"mimetype\":{\"type\":\"string\"},\"mrkdwn_in\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"msg_subtype\":{\"type\":\"string\"},\"original_url\":{\"type\":\"string\"},\"pretext\":{\"type\":\"string\"},\"preview\":{\"type\":\"string\"},\"service_icon\":{\"type\":\"string\"},\"service_name\":{\"type\":\"string\"},\"service_url\":{\"type\":\"string\"},\"size\":{\"type\":\"number\"},\"text\":{\"type\":\"string\"},\"thumb_height\":{\"type\":\"number\"},\"thumb_url\":{\"type\":\"string\"},\"thumb_width\":{\"type\":\"number\"},\"title\":{\"type\":\"string\"},\"title_link\":{\"type\":\"string\"},\"ts\":{\"type\":\"string\"},\"url\":{\"type\":\"string\"},\"video_html\":{\"type\":\"string\"},\"video_html_height\":{\"type\":\"number\"},\"video_html_width\":{\"type\":\"number\"},\"video_url\":{\"type\":\"string\"}}}},\"blocks\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"accessory\":{\"type\":\"string\"},\"alt_text\":{\"type\":\"string\"},\"api_decoration_available\":{\"type\":\"boolean\"},\"app_collaborators\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"app_id\":{\"type\":\"string\"},\"author_name\":{\"type\":\"string\"},\"block_id\":{\"type\":\"string\"},\"bot_user_id\":{\"type\":\"string\"},\"button_label\":{\"type\":\"string\"},\"call\":{\"type\":\"string\"},\"call_id\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"developer_trace_id\":{\"type\":\"string\"},\"dispatch_action\":{\"type\":\"boolean\"},\"element\":{\"type\":\"string\"},\"elements\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"expand\":{\"type\":\"boolean\"},\"external_id\":{\"type\":\"string\"},\"fallback\":{\"type\":\"string\"},\"fields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"file\":{\"type\":\"string\"},\"file_id\":{\"type\":\"string\"},\"function_trigger_id\":{\"type\":\"string\"},\"hint\":{\"type\":\"string\"},\"image_bytes\":{\"type\":\"number\"},\"image_height\":{\"type\":\"number\"},\"image_url\":{\"type\":\"string\"},\"image_width\":{\"type\":\"number\"},\"is_animated\":{\"type\":\"boolean\"},\"is_workflow_app\":{\"type\":\"boolean\"},\"label\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"},\"owning_team_id\":{\"type\":\"string\"},\"provider_icon_url\":{\"type\":\"string\"},\"provider_name\":{\"type\":\"string\"},\"sales_home_workflow_app_type\":{\"type\":\"number\"},\"share_url\":{\"type\":\"string\"},\"slack_file\":{\"type\":\"string\"},\"source\":{\"type\":\"string\"},\"text\":{\"type\":\"string\"},\"thumbnail_url\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"title_url\":{\"type\":\"string\"},\"trigger_subtype\":{\"type\":\"string\"},\"trigger_type\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"url\":{\"type\":\"string\"},\"video_url\":{\"type\":\"string\"},\"workflow_id\":{\"type\":\"string\"}}}},\"bot_id\":{\"type\":\"string\"},\"bot_profile\":{\"type\":\"object\",\"properties\":{\"app_id\":{\"type\":\"string\"},\"deleted\":{\"type\":\"boolean\"},\"icons\":{\"type\":\"string\"},\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"team_id\":{\"type\":\"string\"},\"updated\":{\"type\":\"number\"}}},\"client_msg_id\":{\"type\":\"string\"},\"display_as_bot\":{\"type\":\"boolean\"},\"edited\":{\"type\":\"object\",\"properties\":{\"ts\":{\"type\":\"string\"},\"user\":{\"type\":\"string\"}}},\"files\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"access\":{\"type\":\"string\"},\"alt_txt\":{\"type\":\"string\"},\"app_id\":{\"type\":\"string\"},\"app_name\":{\"type\":\"string\"},\"attachments\":{\"type\":\"array\",\"items\":{}},\"blocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"bot_id\":{\"type\":\"string\"},\"can_toggle_canvas_lock\":{\"type\":\"boolean\"},\"canvas_printing_enabled\":{\"type\":\"boolean\"},\"canvas_template_mode\":{\"type\":\"string\"},\"cc\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"channel_actions_count\":{\"type\":\"number\"},\"channel_actions_ts\":{\"type\":\"string\"},\"channels\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"comments_count\":{\"type\":\"number\"},\"converted_pdf\":{\"type\":\"string\"},\"created\":{\"type\":\"number\"},\"deanimate\":{\"type\":\"string\"},\"deanimate_gif\":{\"type\":\"string\"},\"display_as_bot\":{\"type\":\"boolean\"},\"dm_mpdm_users_with_file_access\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"duration_ms\":{\"type\":\"number\"},\"edit_link\":{\"type\":\"string\"},\"edit_timestamp\":{\"type\":\"number\"},\"editable\":{\"type\":\"boolean\"},\"editor\":{\"type\":\"string\"},\"editors\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"external_id\":{\"type\":\"string\"},\"external_type\":{\"type\":\"string\"},\"external_url\":{\"type\":\"string\"},\"favorites\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"file_access\":{\"type\":\"string\"},\"filetype\":{\"type\":\"string\"},\"from\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"groups\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"has_more\":{\"type\":\"boolean\"},\"has_more_shares\":{\"type\":\"boolean\"},\"has_rich_preview\":{\"type\":\"boolean\"},\"headers\":{\"type\":\"string\"},\"hls\":{\"type\":\"string\"},\"hls_embed\":{\"type\":\"string\"},\"id\":{\"type\":\"string\"},\"image_exif_rotation\":{\"type\":\"number\"},\"ims\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"initial_comment\":{\"type\":\"string\"},\"is_channel_space\":{\"type\":\"boolean\"},\"is_external\":{\"type\":\"boolean\"},\"is_public\":{\"type\":\"boolean\"},\"is_restricted_sharing_enabled\":{\"type\":\"boolean\"},\"is_starred\":{\"type\":\"boolean\"},\"last_editor\":{\"type\":\"string\"},\"last_read\":{\"type\":\"number\"},\"lines\":{\"type\":\"number\"},\"lines_more\":{\"type\":\"number\"},\"linked_channel_id\":{\"type\":\"string\"},\"list_csv_download_url\":{\"type\":\"string\"},\"list_limits\":{\"type\":\"string\"},\"list_metadata\":{\"type\":\"string\"},\"media_display_type\":{\"type\":\"string\"},\"media_progress\":{\"type\":\"string\"},\"mimetype\":{\"type\":\"string\"},\"mode\":{\"type\":\"string\"},\"mp4\":{\"type\":\"string\"},\"mp4_low\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"non_owner_editable\":{\"type\":\"boolean\"},\"num_stars\":{\"type\":\"number\"},\"org_or_workspace_access\":{\"type\":\"string\"},\"original_attachment_count\":{\"type\":\"number\"},\"original_h\":{\"type\":\"string\"},\"original_w\":{\"type\":\"string\"},\"permalink\":{\"type\":\"string\"},\"permalink_public\":{\"type\":\"string\"},\"pinned_to\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"pjpeg\":{\"type\":\"string\"},\"plain_text\":{\"type\":\"string\"},\"pretty_type\":{\"type\":\"string\"},\"preview\":{\"type\":\"string\"},\"preview_highlight\":{\"type\":\"string\"},\"preview_is_truncated\":{\"type\":\"boolean\"},\"preview_plain_text\":{\"type\":\"string\"},\"private_channels_with_file_access_count\":{\"type\":\"number\"},\"private_file_with_access_count\":{\"type\":\"number\"},\"public_url_shared\":{\"type\":\"boolean\"},\"quip_thread_id\":{\"type\":\"string\"},\"reactions\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"saved\":{\"type\":\"string\"},\"sent_to_self\":{\"type\":\"boolean\"},\"shares\":{\"type\":\"string\"},\"show_badge\":{\"type\":\"boolean\"},\"simplified_html\":{\"type\":\"string\"},\"size\":{\"type\":\"number\"},\"source_team\":{\"type\":\"string\"},\"subject\":{\"type\":\"string\"},\"subtype\":{\"type\":\"string\"},\"team_pref_version_history_enabled\":{\"type\":\"boolean\"},\"teams_shared_with\":{\"type\":\"array\",\"items\":{}},\"template_conversion_ts\":{\"type\":\"number\"},\"template_description\":{\"type\":\"string\"},\"template_icon\":{\"type\":\"string\"},\"template_name\":{\"type\":\"string\"},\"template_title\":{\"type\":\"string\"},\"thumb_1024\":{\"type\":\"string\"},\"thumb_1024_gif\":{\"type\":\"string\"},\"thumb_1024_h\":{\"type\":\"string\"},\"thumb_1024_w\":{\"type\":\"string\"},\"thumb_160\":{\"type\":\"string\"},\"thumb_160_gif\":{\"type\":\"string\"},\"thumb_160_h\":{\"type\":\"string\"},\"thumb_160_w\":{\"type\":\"string\"},\"thumb_360\":{\"type\":\"string\"},\"thumb_360_gif\":{\"type\":\"string\"},\"thumb_360_h\":{\"type\":\"string\"},\"thumb_360_w\":{\"type\":\"string\"},\"thumb_480\":{\"type\":\"string\"},\"thumb_480_gif\":{\"type\":\"string\"},\"thumb_480_h\":{\"type\":\"string\"},\"thumb_480_w\":{\"type\":\"string\"},\"thumb_64\":{\"type\":\"string\"},\"thumb_64_gif\":{\"type\":\"string\"},\"thumb_64_h\":{\"type\":\"string\"},\"thumb_64_w\":{\"type\":\"string\"},\"thumb_720\":{\"type\":\"string\"},\"thumb_720_gif\":{\"type\":\"string\"},\"thumb_720_h\":{\"type\":\"string\"},\"thumb_720_w\":{\"type\":\"string\"},\"thumb_80\":{\"type\":\"string\"},\"thumb_800\":{\"type\":\"string\"},\"thumb_800_gif\":{\"type\":\"string\"},\"thumb_800_h\":{\"type\":\"string\"},\"thumb_800_w\":{\"type\":\"string\"},\"thumb_80_gif\":{\"type\":\"string\"},\"thumb_80_h\":{\"type\":\"string\"},\"thumb_80_w\":{\"type\":\"string\"},\"thumb_960\":{\"type\":\"string\"},\"thumb_960_gif\":{\"type\":\"string\"},\"thumb_960_h\":{\"type\":\"string\"},\"thumb_960_w\":{\"type\":\"string\"},\"thumb_gif\":{\"type\":\"string\"},\"thumb_pdf\":{\"type\":\"string\"},\"thumb_pdf_h\":{\"type\":\"string\"},\"thumb_pdf_w\":{\"type\":\"string\"},\"thumb_tiny\":{\"type\":\"string\"},\"thumb_video\":{\"type\":\"string\"},\"thumb_video_h\":{\"type\":\"number\"},\"thumb_video_w\":{\"type\":\"number\"},\"timestamp\":{\"type\":\"number\"},\"title\":{\"type\":\"string\"},\"title_blocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"to\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"transcription\":{\"type\":\"string\"},\"update_notification\":{\"type\":\"number\"},\"updated\":{\"type\":\"number\"},\"url_private\":{\"type\":\"string\"},\"url_private_download\":{\"type\":\"string\"},\"url_static_preview\":{\"type\":\"string\"},\"user\":{\"type\":\"string\"},\"user_team\":{\"type\":\"string\"},\"username\":{\"type\":\"string\"},\"vtt\":{\"type\":\"string\"}}}},\"icons\":{\"type\":\"object\",\"properties\":{\"emoji\":{\"type\":\"string\"},\"image_36\":{\"type\":\"string\"},\"image_48\":{\"type\":\"string\"},\"image_64\":{\"type\":\"string\"},\"image_72\":{\"type\":\"string\"}}},\"inviter\":{\"type\":\"string\"},\"is_locked\":{\"type\":\"boolean\"},\"latest_reply\":{\"type\":\"string\"},\"metadata\":{\"type\":\"object\",\"properties\":{\"event_payload\":{\"type\":\"string\"},\"event_type\":{\"type\":\"string\"}}},\"parent_user_id\":{\"type\":\"string\"},\"purpose\":{\"type\":\"string\"},\"reactions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"number\"},\"name\":{\"type\":\"string\"},\"url\":{\"type\":\"string\"},\"users\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}}}},\"reply_count\":{\"type\":\"number\"},\"reply_users\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"reply_users_count\":{\"type\":\"number\"},\"root\":{\"type\":\"object\",\"properties\":{\"bot_id\":{\"type\":\"string\"},\"icons\":{\"type\":\"string\"},\"latest_reply\":{\"type\":\"string\"},\"parent_user_id\":{\"type\":\"string\"},\"reply_count\":{\"type\":\"number\"},\"reply_users\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"reply_users_count\":{\"type\":\"number\"},\"subscribed\":{\"type\":\"boolean\"},\"subtype\":{\"type\":\"string\"},\"text\":{\"type\":\"string\"},\"thread_ts\":{\"type\":\"string\"},\"ts\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"username\":{\"type\":\"string\"}}},\"subscribed\":{\"type\":\"boolean\"},\"subtype\":{\"type\":\"string\"},\"team\":{\"type\":\"string\"},\"text\":{\"type\":\"string\"},\"thread_ts\":{\"type\":\"string\"},\"topic\":{\"type\":\"string\"},\"ts\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"upload\":{\"type\":\"boolean\"},\"user\":{\"type\":\"string\"},\"username\":{\"type\":\"string\"},\"x_files\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}}}},\"required\":[\"from\",\"content\"]},\"description\":\"List of messages from the channel history\"}},\"required\":[\"messages\"]},\n },\n \"fetchYoutubeCaptions\": {\n stepType: \"fetchYoutubeCaptions\",\n description: \"Retrieve the captions/transcript for a YouTube video.\",\n usageNotes: \"- Supports multiple languages via the language parameter.\\n- \\\"text\\\" export produces timestamped plain text; \\\"json\\\" export produces structured transcript data.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"YouTube video URL to fetch captions for\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Output format: \\\"text\\\" for timestamped plain text, \\\"json\\\" for structured transcript data\"},\"language\":{\"type\":\"string\",\"description\":\"Language code for the captions (e.g. \\\"en\\\")\"}},\"required\":[\"videoUrl\",\"exportType\",\"language\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"transcripts\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"Transcript text segment\"},\"start\":{\"type\":\"number\",\"description\":\"Start time of the segment in seconds\"}},\"required\":[\"text\",\"start\"]},\"description\":\"Parsed transcript segments with text and start timestamps\"}},\"required\":[\"transcripts\"]},\n },\n \"fetchYoutubeChannel\": {\n stepType: \"fetchYoutubeChannel\",\n description: \"Retrieve metadata and recent videos for a YouTube channel.\",\n usageNotes: \"- Accepts a YouTube channel URL (e.g. https://www.youtube.com/@ChannelName or /channel/ID).\\n- Returns channel info and video listings as a JSON object.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"channelUrl\":{\"type\":\"string\",\"description\":\"YouTube channel URL (e.g. https://www.youtube.com/@ChannelName or /channel/ID)\"}},\"required\":[\"channelUrl\"]},\n outputSchema: {\"type\":\"object\"},\n },\n \"fetchYoutubeComments\": {\n stepType: \"fetchYoutubeComments\",\n description: \"Retrieve comments for a YouTube video.\",\n usageNotes: \"- Paginates through comments (up to 5 pages).\\n- \\\"text\\\" export produces markdown-formatted text; \\\"json\\\" export produces structured comment data.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"YouTube video URL to fetch comments for\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Output format: \\\"text\\\" for markdown-formatted text, \\\"json\\\" for structured comment data\"},\"limitPages\":{\"type\":\"string\",\"description\":\"Maximum number of comment pages to fetch (1-5)\"}},\"required\":[\"videoUrl\",\"exportType\",\"limitPages\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"comments\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Unique comment identifier\"},\"link\":{\"type\":\"string\",\"description\":\"Direct URL to the comment\"},\"publishedDate\":{\"type\":\"string\",\"description\":\"Date the comment was published\"},\"text\":{\"type\":\"string\",\"description\":\"Text content of the comment\"},\"likes\":{\"type\":\"number\",\"description\":\"Number of likes on the comment\"},\"replies\":{\"type\":\"number\",\"description\":\"Number of replies to the comment\"},\"author\":{\"type\":\"string\",\"description\":\"Display name of the comment author\"},\"authorLink\":{\"type\":\"string\",\"description\":\"URL to the author's YouTube channel\"},\"authorImg\":{\"type\":\"string\",\"description\":\"URL of the author's profile image\"}},\"required\":[\"id\",\"link\",\"publishedDate\",\"text\",\"likes\",\"replies\",\"author\",\"authorLink\",\"authorImg\"]},\"description\":\"List of comments retrieved from the video\"}},\"required\":[\"comments\"]},\n },\n \"fetchYoutubeVideo\": {\n stepType: \"fetchYoutubeVideo\",\n description: \"Retrieve metadata for a YouTube video (title, description, stats, channel info).\",\n usageNotes: \"- Returns video metadata, channel info, and engagement stats.\\n- Video format data is excluded from the response.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"YouTube video URL to fetch metadata for\"}},\"required\":[\"videoUrl\"]},\n outputSchema: {\"type\":\"object\"},\n },\n \"generateAsset\": {\n stepType: \"generatePdf\",\n description: \"Generate an HTML asset and export it as a webpage, PDF, or image\",\n usageNotes: \"- Agents can generate HTML documents and export as webpage, PDFs, images, or videos. They do this by using the \\\"generatePdf\\\" block, which defines an HTML page with variables, and then the generation process renders the page to create the output and save its URL at the specified variable.\\n- The template for the HTML page is generated by a separate process, and it can only use variables that have already been defined in the workflow at the time of its execution. It has full access to handlebars to render the HTML template, including a handlebars helper to render a markdown variable string as HTML (which can be useful for creating templates that render long strings). The template can also create its own simple JavaScript to do things like format dates and strings.\\n- If PDF or composited image generation are part of the workflow, assistant adds the block and leaves the \\\"source\\\" empty. In a separate step, assistant generates a detailed request for the developer who will write the HTML.\\n- Can also auto-generate HTML from a prompt (like a generate text block to generate HTML). In these cases, create a prompt with variables in the dynamicPrompt variable describing, in detail, the document to generate\\n- Can either display output directly to user (foreground mode) or save the URL of the asset to a variable (background mode)\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\",\"description\":\"The HTML or Markdown source template for the asset\"},\"sourceType\":{\"enum\":[\"html\",\"markdown\",\"spa\",\"raw\",\"dynamic\",\"customInterface\"],\"type\":\"string\",\"description\":\"Source type: html, markdown (auto-formatted), spa (single page app), raw (pre-generated HTML in a variable), dynamic (AI-generated from prompt), or customInterface\"},\"outputFormat\":{\"enum\":[\"pdf\",\"png\",\"html\",\"mp4\",\"openGraph\"],\"type\":\"string\",\"description\":\"The output format for the generated asset\"},\"pageSize\":{\"enum\":[\"full\",\"letter\",\"A4\",\"custom\"],\"type\":\"string\",\"description\":\"Page size for PDF, PNG, or MP4 output\"},\"testData\":{\"type\":\"object\",\"description\":\"Test data used for previewing the template with sample variable values\"},\"options\":{\"type\":\"object\",\"properties\":{\"pageWidthPx\":{\"type\":\"number\",\"description\":\"Custom page width in pixels (for custom pageSize)\"},\"pageHeightPx\":{\"type\":\"number\",\"description\":\"Custom page height in pixels (for custom pageSize)\"},\"pageOrientation\":{\"enum\":[\"portrait\",\"landscape\"],\"type\":\"string\",\"description\":\"Page orientation for the rendered output\"},\"rehostMedia\":{\"type\":\"boolean\",\"description\":\"Whether to re-host third-party images on the MindStudio CDN\"},\"videoDurationSeconds\":{\"type\":\"number\",\"description\":\"Duration in seconds for MP4 video output\"}},\"description\":\"Additional rendering options\"},\"spaSource\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\",\"description\":\"Source code of the SPA (legacy, use files instead)\"},\"lastCompiledSource\":{\"type\":\"string\",\"description\":\"Last compiled source (cached)\"},\"files\":{\"type\":\"object\",\"description\":\"Multi-file SPA source\"},\"paths\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Available route paths in the SPA\"},\"root\":{\"type\":\"string\",\"description\":\"Root URL of the SPA bundle\"},\"zipUrl\":{\"type\":\"string\",\"description\":\"URL of the zipped SPA bundle\"}},\"required\":[\"paths\",\"root\",\"zipUrl\"],\"description\":\"Single page app source configuration (advanced)\"},\"rawSource\":{\"type\":\"string\",\"description\":\"Raw HTML source stored in a variable, using handlebars syntax (e.g. {{myHtmlVariable}})\"},\"dynamicPrompt\":{\"type\":\"string\",\"description\":\"Prompt to generate the HTML dynamically when sourceType is \\\"dynamic\\\"\"},\"dynamicSourceModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Model override for dynamic HTML generation. Leave undefined to use the default model\"},\"transitionControl\":{\"enum\":[\"default\",\"native\"],\"type\":\"string\",\"description\":\"Controls how the step transitions after displaying in foreground mode\"},\"shareControl\":{\"enum\":[\"default\",\"hidden\"],\"type\":\"string\",\"description\":\"Controls visibility of the share button on displayed assets\"},\"shareImageUrl\":{\"type\":\"string\",\"description\":\"URL of a custom Open Graph share image\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"source\",\"sourceType\",\"outputFormat\",\"pageSize\",\"testData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"CDN URL of the generated asset (PDF, PNG, HTML, or MP4 depending on outputFormat)\"}},\"required\":[\"url\"]},\n },\n \"generateChart\": {\n stepType: \"generateChart\",\n description: \"Create a chart image using QuickChart (Chart.js) and return the URL.\",\n usageNotes: \"- The data field must be a Chart.js-compatible JSON object serialized as a string.\\n- Supported chart types: bar, line, pie.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"chart\":{\"type\":\"object\",\"properties\":{\"chartType\":{\"enum\":[\"bar\",\"line\",\"pie\"],\"type\":\"string\",\"description\":\"The type of chart to generate\"},\"data\":{\"type\":\"string\",\"description\":\"Chart.js-compatible JSON data serialized as a string\"},\"options\":{\"type\":\"object\",\"properties\":{\"width\":{\"type\":\"string\",\"description\":\"Image width in pixels (e.g. \\\"500\\\")\"},\"height\":{\"type\":\"string\",\"description\":\"Image height in pixels (e.g. \\\"300\\\")\"}},\"required\":[\"width\",\"height\"],\"description\":\"Image rendering options\"}},\"required\":[\"chartType\",\"data\",\"options\"],\"description\":\"Chart configuration including type, data, and rendering options\"}},\"required\":[\"chart\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"chartUrl\":{\"type\":\"string\",\"description\":\"URL of the generated chart image\"}},\"required\":[\"chartUrl\"]},\n },\n \"generateImage\": {\n stepType: \"generateImage\",\n description: \"Generate an image from a text prompt using an AI model.\",\n usageNotes: \"- Prompts should be descriptive but concise (roughly 3–6 sentences).\\n- Images are automatically hosted on a CDN.\\n- In foreground mode, the image is displayed to the user. In background mode, the URL is saved to a variable.\\n- When generateVariants is true with numVariants > 1, multiple images are generated in parallel.\\n- In direct execution, foreground mode behaves as background, and userSelect variant behavior behaves as saveAll.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"Text prompt describing the image to generate\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"},\"imageModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Image generation model identifier\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default image model if not specified\"},\"generateVariants\":{\"type\":\"boolean\",\"description\":\"Whether to generate multiple image variants in parallel\"},\"numVariants\":{\"type\":\"number\",\"description\":\"Number of variants to generate (max 10)\"},\"addWatermark\":{\"type\":\"boolean\",\"description\":\"Whether to add a MindStudio watermark to the generated image\"}},\"required\":[\"prompt\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}}]}},\"required\":[\"imageUrl\"]},\n },\n \"generateLipsync\": {\n stepType: \"generateLipsync\",\n description: \"Generate a lip sync video from provided audio and image.\",\n usageNotes: \"- In foreground mode, the video is displayed to the user. In background mode, the URL is saved to a variable.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"},\"addWatermark\":{\"type\":\"boolean\",\"description\":\"Whether to add a MindStudio watermark to the generated video\"},\"lipsyncModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\"},\"config\":{\"type\":\"object\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default lipsync model if not specified\"}}},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"generateMusic\": {\n stepType: \"generateMusic\",\n description: \"Generate an audio file from provided instructions (text) using a music model.\",\n usageNotes: \"- The text field contains the instructions (prompt) for the music generation.\\n- In foreground mode, the audio is displayed to the user. In background mode, the URL is saved to a variable.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The instructions (prompt) for the music generation\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"},\"musicModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\"},\"config\":{\"type\":\"object\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default music model if not specified\"}},\"required\":[\"text\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"generatePdf\": {\n stepType: \"generatePdf\",\n description: \"Generate an HTML asset and export it as a webpage, PDF, or image\",\n usageNotes: \"- Agents can generate HTML documents and export as webpage, PDFs, images, or videos. They do this by using the \\\"generatePdf\\\" block, which defines an HTML page with variables, and then the generation process renders the page to create the output and save its URL at the specified variable.\\n- The template for the HTML page is generated by a separate process, and it can only use variables that have already been defined in the workflow at the time of its execution. It has full access to handlebars to render the HTML template, including a handlebars helper to render a markdown variable string as HTML (which can be useful for creating templates that render long strings). The template can also create its own simple JavaScript to do things like format dates and strings.\\n- If PDF or composited image generation are part of the workflow, assistant adds the block and leaves the \\\"source\\\" empty. In a separate step, assistant generates a detailed request for the developer who will write the HTML.\\n- Can also auto-generate HTML from a prompt (like a generate text block to generate HTML). In these cases, create a prompt with variables in the dynamicPrompt variable describing, in detail, the document to generate\\n- Can either display output directly to user (foreground mode) or save the URL of the asset to a variable (background mode)\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\",\"description\":\"The HTML or Markdown source template for the asset\"},\"sourceType\":{\"enum\":[\"html\",\"markdown\",\"spa\",\"raw\",\"dynamic\",\"customInterface\"],\"type\":\"string\",\"description\":\"Source type: html, markdown (auto-formatted), spa (single page app), raw (pre-generated HTML in a variable), dynamic (AI-generated from prompt), or customInterface\"},\"outputFormat\":{\"enum\":[\"pdf\",\"png\",\"html\",\"mp4\",\"openGraph\"],\"type\":\"string\",\"description\":\"The output format for the generated asset\"},\"pageSize\":{\"enum\":[\"full\",\"letter\",\"A4\",\"custom\"],\"type\":\"string\",\"description\":\"Page size for PDF, PNG, or MP4 output\"},\"testData\":{\"type\":\"object\",\"description\":\"Test data used for previewing the template with sample variable values\"},\"options\":{\"type\":\"object\",\"properties\":{\"pageWidthPx\":{\"type\":\"number\",\"description\":\"Custom page width in pixels (for custom pageSize)\"},\"pageHeightPx\":{\"type\":\"number\",\"description\":\"Custom page height in pixels (for custom pageSize)\"},\"pageOrientation\":{\"enum\":[\"portrait\",\"landscape\"],\"type\":\"string\",\"description\":\"Page orientation for the rendered output\"},\"rehostMedia\":{\"type\":\"boolean\",\"description\":\"Whether to re-host third-party images on the MindStudio CDN\"},\"videoDurationSeconds\":{\"type\":\"number\",\"description\":\"Duration in seconds for MP4 video output\"}},\"description\":\"Additional rendering options\"},\"spaSource\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\",\"description\":\"Source code of the SPA (legacy, use files instead)\"},\"lastCompiledSource\":{\"type\":\"string\",\"description\":\"Last compiled source (cached)\"},\"files\":{\"type\":\"object\",\"description\":\"Multi-file SPA source\"},\"paths\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Available route paths in the SPA\"},\"root\":{\"type\":\"string\",\"description\":\"Root URL of the SPA bundle\"},\"zipUrl\":{\"type\":\"string\",\"description\":\"URL of the zipped SPA bundle\"}},\"required\":[\"paths\",\"root\",\"zipUrl\"],\"description\":\"Single page app source configuration (advanced)\"},\"rawSource\":{\"type\":\"string\",\"description\":\"Raw HTML source stored in a variable, using handlebars syntax (e.g. {{myHtmlVariable}})\"},\"dynamicPrompt\":{\"type\":\"string\",\"description\":\"Prompt to generate the HTML dynamically when sourceType is \\\"dynamic\\\"\"},\"dynamicSourceModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Model override for dynamic HTML generation. Leave undefined to use the default model\"},\"transitionControl\":{\"enum\":[\"default\",\"native\"],\"type\":\"string\",\"description\":\"Controls how the step transitions after displaying in foreground mode\"},\"shareControl\":{\"enum\":[\"default\",\"hidden\"],\"type\":\"string\",\"description\":\"Controls visibility of the share button on displayed assets\"},\"shareImageUrl\":{\"type\":\"string\",\"description\":\"URL of a custom Open Graph share image\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"source\",\"sourceType\",\"outputFormat\",\"pageSize\",\"testData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"CDN URL of the generated asset (PDF, PNG, HTML, or MP4 depending on outputFormat)\"}},\"required\":[\"url\"]},\n },\n \"generateStaticVideoFromImage\": {\n stepType: \"generateStaticVideoFromImage\",\n description: \"Convert a static image to an MP4\",\n usageNotes: \"- Can use to create slides/intertitles/slates for video composition\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the source image to convert to video\"},\"duration\":{\"type\":\"string\",\"description\":\"Duration of the output video in seconds\"}},\"required\":[\"imageUrl\",\"duration\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the generated static video\"}},\"required\":[\"videoUrl\"]},\n },\n \"generateText\": {\n stepType: \"userMessage\",\n description: \"Send a message to an AI model and return the response, or echo a system message.\",\n usageNotes: \"- Source \\\"user\\\" sends the message to an LLM and returns the model's response.\\n- Source \\\"system\\\" echoes the message content directly (no AI call).\\n- Mode \\\"background\\\" saves the result to a variable. Mode \\\"foreground\\\" streams it to the user (not available in direct execution).\\n- Structured output (JSON/CSV) can be enforced via structuredOutputType and structuredOutputExample.\\n- When executed inside a v2 app method (managed sandbox or local dev tunnel),\\n LLM token output can be streamed to the frontend in real time via an SSE\\n side-channel. The frontend opts in by passing { stream: true } to the method\\n invocation via @mindstudio-ai/interface. Tokens are published to Redis\\n pub/sub as they arrive and forwarded as SSE events on the invoke response.\\n The method code itself is unchanged — streaming is transparent to the\\n developer. See V2ExecutionService.ts and the invoke handler in V2Apps for\\n the server-side plumbing.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"description\":\"The message to send (prompt for AI, or text for system echo)\"},\"source\":{\"enum\":[\"user\",\"system\"],\"type\":\"string\",\"description\":\"Message source: \\\"user\\\" sends to AI model, \\\"system\\\" echoes message content directly. Defaults to \\\"user\\\"\"},\"modelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Model configuration override. Optional; uses the workflow's default model if not specified\"},\"structuredOutputType\":{\"enum\":[\"text\",\"json\",\"csv\"],\"type\":\"string\",\"description\":\"Output format constraint for structured responses\"},\"structuredOutputExample\":{\"type\":\"string\",\"description\":\"Sample showing the desired output shape (for JSON/CSV formats). A TypeScript interface is also useful here for more complex types.\"},\"chatHistoryMode\":{\"enum\":[\"include\",\"exclude\"],\"type\":\"string\",\"description\":\"Whether to include or exclude prior chat history in the AI context\"}},\"required\":[\"message\"],\"description\":\"Configuration for the user message step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"type\":\"string\",\"description\":\"The AI model's response or echoed system message content\"}},\"required\":[\"content\"]},\n },\n \"generateVideo\": {\n stepType: \"generateVideo\",\n description: \"Generate a video from a text prompt using an AI model.\",\n usageNotes: \"- Prompts should be descriptive but concise (roughly 3–6 sentences).\\n- Videos are automatically hosted on a CDN.\\n- In foreground mode, the video is displayed to the user. In background mode, the URL is saved to a variable.\\n- When generateVariants is true with numVariants > 1, multiple videos are generated in parallel.\\n- In direct execution, foreground mode behaves as background, and userSelect variant behavior behaves as saveAll.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"Text prompt describing the video to generate\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"},\"videoModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Video generation model identifier\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default video model if not specified\"},\"generateVariants\":{\"type\":\"boolean\",\"description\":\"Whether to generate multiple video variants in parallel\"},\"numVariants\":{\"type\":\"number\",\"description\":\"Number of variants to generate (max 10)\"},\"addWatermark\":{\"type\":\"boolean\",\"description\":\"Whether to add a MindStudio watermark to the generated video\"}},\"required\":[\"prompt\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}}]}},\"required\":[\"videoUrl\"]},\n },\n \"getGmailAttachments\": {\n stepType: \"getGmailAttachments\",\n description: \"Download attachments from a Gmail email and re-host them on CDN.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Attachments are uploaded to CDN and returned as URLs.\\n- Attachments larger than 25MB are skipped.\\n- Use the message ID from Search Gmail Emails, List Recent Gmail Emails, or Get Gmail Email steps.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"messageId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"getGmailDraft\": {\n stepType: \"getGmailDraft\",\n description: \"Retrieve a specific draft from Gmail by draft ID.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns the draft content including subject, recipients, sender, and body.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"draftId\":{\"type\":\"string\",\"description\":\"Gmail draft ID to retrieve\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"draftId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"draftId\":{\"type\":\"string\",\"description\":\"Gmail draft ID\"},\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject\"},\"to\":{\"type\":\"string\",\"description\":\"Recipient email\"},\"from\":{\"type\":\"string\",\"description\":\"Sender email\"},\"body\":{\"type\":\"string\",\"description\":\"Draft body content\"}},\"required\":[\"draftId\",\"messageId\",\"subject\",\"to\",\"from\",\"body\"]},\n },\n \"getGmailEmail\": {\n stepType: \"getGmailEmail\",\n description: \"Retrieve a specific email from Gmail by message ID.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns the email subject, sender, recipient, date, body (plain text preferred, falls back to HTML), and labels.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID to retrieve\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"messageId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject\"},\"from\":{\"type\":\"string\",\"description\":\"Sender email\"},\"to\":{\"type\":\"string\",\"description\":\"Recipient email\"},\"date\":{\"type\":\"string\",\"description\":\"Email date\"},\"body\":{\"type\":\"string\",\"description\":\"Email body content\"},\"labels\":{\"type\":\"string\",\"description\":\"Comma-separated label IDs\"}},\"required\":[\"messageId\",\"subject\",\"from\",\"to\",\"date\",\"body\",\"labels\"]},\n },\n \"getGmailUnreadCount\": {\n stepType: \"getGmailUnreadCount\",\n description: \"Get the number of unread emails in the connected Gmail inbox.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns the unread message count for the inbox label.\\n- This is a lightweight call that does not fetch any email content.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}}},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"getGoogleCalendarEvent\": {\n stepType: \"getGoogleCalendarEvent\",\n description: \"Retrieve a specific event from a Google Calendar by event ID.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns the structured event.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"eventId\":{\"type\":\"string\",\"description\":\"Google Calendar event ID to retrieve\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\" if omitted)\"}},\"required\":[\"eventId\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"event\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Google Calendar event ID\"},\"status\":{\"type\":\"string\",\"description\":\"Event status (e.g. \\\"confirmed\\\", \\\"tentative\\\", \\\"cancelled\\\")\"},\"htmlLink\":{\"type\":\"string\",\"description\":\"URL to view the event in Google Calendar\"},\"created\":{\"type\":\"string\",\"description\":\"Timestamp when the event was created\"},\"updated\":{\"type\":\"string\",\"description\":\"Timestamp when the event was last updated\"},\"summary\":{\"type\":\"string\",\"description\":\"Event title\"},\"description\":{\"type\":\"string\",\"description\":\"Event description\"},\"location\":{\"type\":\"string\",\"description\":\"Event location\"},\"organizer\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"start\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"end\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"attendees\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"},\"responseStatus\":{\"type\":\"string\"}}}},{\"type\":\"null\"}]}},\"description\":\"The retrieved calendar event\"}},\"required\":[\"event\"]},\n },\n \"getGoogleDriveFile\": {\n stepType: \"getGoogleDriveFile\",\n description: \"Download a file from Google Drive and rehost it on the CDN. Returns a public CDN URL.\",\n usageNotes: \"- Requires a Google OAuth connection with Drive scope.\\n- Google-native files (Docs, Sheets, Slides) cannot be downloaded — use dedicated steps instead.\\n- Maximum file size: 200MB.\\n- The file is downloaded and re-uploaded to the CDN; the returned URL is publicly accessible.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"fileId\":{\"type\":\"string\",\"description\":\"Google Drive file ID\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"fileId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"CDN URL of the downloaded file\"},\"name\":{\"type\":\"string\",\"description\":\"Original file name\"},\"mimeType\":{\"type\":\"string\",\"description\":\"File MIME type\"},\"size\":{\"type\":\"number\",\"description\":\"File size in bytes\"}},\"required\":[\"url\",\"name\",\"mimeType\",\"size\"]},\n },\n \"getGoogleSheetInfo\": {\n stepType: \"getGoogleSheetInfo\",\n description: \"Get metadata about a Google Spreadsheet including sheet names, row counts, and column counts.\",\n usageNotes: \"- Requires a Google OAuth connection with Drive scope.\\n- Returns the spreadsheet title and a list of all sheets with their dimensions.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"description\":\"Google Spreadsheet ID or URL\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"documentId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Spreadsheet title\"},\"sheets\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"sheetId\":{\"type\":\"number\"},\"title\":{\"type\":\"string\"},\"rowCount\":{\"type\":\"number\"},\"columnCount\":{\"type\":\"number\"}},\"required\":[\"sheetId\",\"title\",\"rowCount\",\"columnCount\"]},\"description\":\"List of sheets with their properties\"}},\"required\":[\"title\",\"sheets\"]},\n },\n \"getMediaMetadata\": {\n stepType: \"getMediaMetadata\",\n description: \"Get info about a media file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"mediaUrl\":{\"type\":\"string\",\"description\":\"URL of the audio or video file to analyze\"}},\"required\":[\"mediaUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"metadata\":{\"type\":\"string\",\"description\":\"JSON string containing the media file metadata\"}},\"required\":[\"metadata\"]},\n },\n \"httpRequest\": {\n stepType: \"httpRequest\",\n description: \"Make an HTTP request to an external endpoint and return the response.\",\n usageNotes: \"- Supports GET, POST, PATCH, DELETE, and PUT methods.\\n- Body can be raw JSON/text, URL-encoded form data, or multipart form data.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"The request URL\"},\"method\":{\"type\":\"string\",\"description\":\"HTTP method (GET, POST, PATCH, DELETE, or PUT)\"},\"headers\":{\"type\":\"object\",\"description\":\"Custom request headers as key-value pairs\"},\"queryParams\":{\"type\":\"object\",\"description\":\"Query string parameters as key-value pairs\"},\"body\":{\"type\":\"string\",\"description\":\"Raw request body (used for JSON or custom content types)\"},\"bodyItems\":{\"type\":\"object\",\"description\":\"Key-value body items (used for form data or URL-encoded content types)\"},\"contentType\":{\"enum\":[\"none\",\"application/json\",\"application/x-www-form-urlencoded\",\"multipart/form-data\",\"custom\"],\"type\":\"string\",\"description\":\"The content type for the request body\"},\"customContentType\":{\"type\":\"string\",\"description\":\"Custom Content-Type header value (used when contentType is \\\"custom\\\")\"},\"testData\":{\"type\":\"object\",\"description\":\"Test data for debug/preview mode\"}},\"required\":[\"url\",\"method\",\"headers\",\"queryParams\",\"body\",\"bodyItems\",\"contentType\",\"customContentType\"],\"description\":\"HTTP request configuration\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"ok\":{\"type\":\"boolean\",\"description\":\"Whether the HTTP response status code is in the 2xx range\"},\"status\":{\"type\":\"number\",\"description\":\"HTTP response status code\"},\"statusText\":{\"type\":\"string\",\"description\":\"HTTP response status text\"},\"response\":{\"type\":\"string\",\"description\":\"Response body as a string\"}},\"required\":[\"ok\",\"status\",\"statusText\",\"response\"]},\n },\n \"hubspotCreateCompany\": {\n stepType: \"hubspotCreateCompany\",\n description: \"Create a new company or update an existing one in HubSpot. Matches by domain.\",\n usageNotes: \"- Requires a HubSpot OAuth connection (connectionId).\\n- If a company with the given domain already exists, it is updated. Otherwise, a new one is created.\\n- Property values are type-checked against enabledProperties before being sent to HubSpot.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"HubSpot OAuth connection ID\"},\"company\":{\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Company domain, used for matching existing companies\"},\"name\":{\"type\":\"string\",\"description\":\"Company name\"}},\"required\":[\"domain\",\"name\"],\"description\":\"Company data including domain, name, and additional properties\"},\"enabledProperties\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"label\":{\"type\":\"string\",\"description\":\"Display label for the HubSpot property\"},\"value\":{\"type\":\"string\",\"description\":\"HubSpot property internal name\"},\"type\":{\"enum\":[\"string\",\"number\",\"bool\"],\"type\":\"string\",\"description\":\"Data type of the property value\"}},\"required\":[\"label\",\"value\",\"type\"]},\"description\":\"HubSpot properties enabled for this step, used for type validation\"}},\"required\":[\"company\",\"enabledProperties\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"companyId\":{\"type\":\"string\",\"description\":\"HubSpot company ID of the created or updated company\"}},\"required\":[\"companyId\"]},\n },\n \"hubspotCreateContact\": {\n stepType: \"hubspotCreateContact\",\n description: \"Create a new contact or update an existing one in HubSpot. Matches by email address.\",\n usageNotes: \"- Requires a HubSpot OAuth connection (connectionId).\\n- If a contact with the given email already exists, it is updated. Otherwise, a new one is created.\\n- If companyDomain is provided, the contact is associated with that company (creating the company if needed).\\n- Property values are type-checked against enabledProperties before being sent to HubSpot.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"HubSpot OAuth connection ID\"},\"contact\":{\"type\":\"object\",\"properties\":{\"email\":{\"type\":\"string\",\"description\":\"Contact email address, used for matching existing contacts\"},\"firstname\":{\"type\":\"string\",\"description\":\"Contact first name\"},\"lastname\":{\"type\":\"string\",\"description\":\"Contact last name\"}},\"required\":[\"email\",\"firstname\",\"lastname\"],\"description\":\"Contact data including email, first name, last name, and additional properties\"},\"enabledProperties\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"label\":{\"type\":\"string\",\"description\":\"Display label for the HubSpot property\"},\"value\":{\"type\":\"string\",\"description\":\"HubSpot property internal name\"},\"type\":{\"enum\":[\"string\",\"number\",\"bool\"],\"type\":\"string\",\"description\":\"Data type of the property value\"}},\"required\":[\"label\",\"value\",\"type\"]},\"description\":\"HubSpot properties enabled for this step, used for type validation\"},\"companyDomain\":{\"type\":\"string\",\"description\":\"Company domain to associate the contact with. Creates the company if it does not exist\"}},\"required\":[\"contact\",\"enabledProperties\",\"companyDomain\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"contactId\":{\"type\":\"string\",\"description\":\"HubSpot contact ID of the created or updated contact\"}},\"required\":[\"contactId\"]},\n },\n \"hubspotGetCompany\": {\n stepType: \"hubspotGetCompany\",\n description: \"Look up a HubSpot company by domain name or company ID.\",\n usageNotes: \"- Requires a HubSpot OAuth connection (connectionId).\\n- Returns null if the company is not found.\\n- When searching by domain, performs a search query then fetches the full company record.\\n- Use additionalProperties to request specific HubSpot properties beyond the defaults.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"HubSpot OAuth connection ID\"},\"searchBy\":{\"enum\":[\"domain\",\"id\"],\"type\":\"string\",\"description\":\"How to look up the company: by domain name or HubSpot company ID\"},\"companyDomain\":{\"type\":\"string\",\"description\":\"Domain to search by (used when searchBy is 'domain')\"},\"companyId\":{\"type\":\"string\",\"description\":\"HubSpot company ID (used when searchBy is 'id')\"},\"additionalProperties\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Extra HubSpot property names to include in the response beyond the defaults\"}},\"required\":[\"searchBy\",\"companyDomain\",\"companyId\",\"additionalProperties\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"company\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"properties\":{\"type\":\"object\"},\"createdAt\":{\"type\":\"string\"},\"updatedAt\":{\"type\":\"string\"},\"archived\":{\"type\":\"boolean\"}},\"required\":[\"id\",\"properties\",\"createdAt\",\"updatedAt\",\"archived\"]},{\"type\":\"null\"}]}},\"required\":[\"company\"]},\n },\n \"hubspotGetContact\": {\n stepType: \"hubspotGetContact\",\n description: \"Look up a HubSpot contact by email address or contact ID.\",\n usageNotes: \"- Requires a HubSpot OAuth connection (connectionId).\\n- Returns null if the contact is not found.\\n- Use additionalProperties to request specific HubSpot properties beyond the defaults.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"HubSpot OAuth connection ID\"},\"searchBy\":{\"enum\":[\"email\",\"id\"],\"type\":\"string\",\"description\":\"How to look up the contact: by email address or HubSpot contact ID\"},\"contactEmail\":{\"type\":\"string\",\"description\":\"Email address to search by (used when searchBy is 'email')\"},\"contactId\":{\"type\":\"string\",\"description\":\"HubSpot contact ID (used when searchBy is 'id')\"},\"additionalProperties\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Extra HubSpot property names to include in the response beyond the defaults\"}},\"required\":[\"searchBy\",\"contactEmail\",\"contactId\",\"additionalProperties\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"contact\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"properties\":{\"type\":\"object\"},\"createdAt\":{\"type\":\"string\"},\"updatedAt\":{\"type\":\"string\"},\"archived\":{\"type\":\"boolean\"}},\"required\":[\"id\",\"properties\",\"createdAt\",\"updatedAt\",\"archived\"]},{\"type\":\"null\"}]}},\"required\":[\"contact\"]},\n },\n \"hunterApiCompanyEnrichment\": {\n stepType: \"hunterApiCompanyEnrichment\",\n description: \"Look up company information by domain using Hunter.io.\",\n usageNotes: \"- Returns company name, description, location, industry, size, technologies, and more.\\n- If the domain input is a full URL, the hostname is automatically extracted.\\n- Returns null if the company is not found.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Domain or URL to look up (e.g. \\\"example.com\\\")\"}},\"required\":[\"domain\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"domain\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"country\":{\"type\":\"string\"},\"state\":{\"type\":\"string\"},\"city\":{\"type\":\"string\"},\"industry\":{\"type\":\"string\"},\"employees_range\":{\"type\":\"string\"},\"logo_url\":{\"type\":\"string\"},\"technologies\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"name\",\"domain\",\"description\",\"country\",\"state\",\"city\",\"industry\",\"employees_range\",\"logo_url\",\"technologies\"]},{\"type\":\"null\"}]}},\"required\":[\"data\"]},\n },\n \"hunterApiDomainSearch\": {\n stepType: \"hunterApiDomainSearch\",\n description: \"Search for email addresses associated with a domain using Hunter.io.\",\n usageNotes: \"- If the domain input is a full URL, the hostname is automatically extracted.\\n- Returns a list of email addresses found for the domain along with organization info.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Domain or URL to search for email addresses (e.g. \\\"example.com\\\")\"}},\"required\":[\"domain\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"The searched domain\"},\"disposable\":{\"type\":\"boolean\",\"description\":\"Whether the domain uses disposable email addresses\"},\"webmail\":{\"type\":\"boolean\",\"description\":\"Whether the domain is a webmail provider\"},\"accept_all\":{\"type\":\"boolean\",\"description\":\"Whether the domain accepts all email addresses\"},\"pattern\":{\"type\":\"string\",\"description\":\"Common email pattern for the domain (e.g. \\\"{first}.{last}\\\")\"},\"organization\":{\"type\":\"string\",\"description\":\"Organization name associated with the domain\"},\"country\":{\"type\":\"string\",\"description\":\"Country of the organization\"},\"state\":{\"type\":\"string\",\"description\":\"State or region of the organization\"},\"emails\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"value\":{\"type\":\"string\",\"description\":\"Email address\"},\"type\":{\"type\":\"string\",\"description\":\"Email type (e.g. \\\"personal\\\", \\\"generic\\\")\"},\"confidence\":{\"type\":\"number\",\"description\":\"Confidence score (0-100)\"},\"first_name\":{\"type\":\"string\",\"description\":\"Contact first name\"},\"last_name\":{\"type\":\"string\",\"description\":\"Contact last name\"},\"position\":{\"type\":\"string\",\"description\":\"Job title or position\"},\"seniority\":{\"type\":\"string\",\"description\":\"Seniority level\"},\"department\":{\"type\":\"string\",\"description\":\"Department within the organization\"},\"linkedin\":{\"type\":\"string\",\"description\":\"LinkedIn profile URL\"},\"twitter\":{\"type\":\"string\",\"description\":\"Twitter handle\"},\"phone_number\":{\"type\":\"string\",\"description\":\"Phone number\"}},\"required\":[\"value\",\"type\",\"confidence\",\"first_name\",\"last_name\",\"position\",\"seniority\",\"department\",\"linkedin\",\"twitter\",\"phone_number\"]},\"description\":\"List of email addresses found for the domain\"},\"linked_domains\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Other domains linked to this organization\"}},\"required\":[\"domain\",\"disposable\",\"webmail\",\"accept_all\",\"pattern\",\"organization\",\"country\",\"state\",\"emails\",\"linked_domains\"],\"description\":\"Domain search results including emails and organization info\"}},\"required\":[\"data\"]},\n },\n \"hunterApiEmailFinder\": {\n stepType: \"hunterApiEmailFinder\",\n description: \"Find an email address for a specific person at a domain using Hunter.io.\",\n usageNotes: \"- Requires a first name, last name, and domain.\\n- If the domain input is a full URL, the hostname is automatically extracted.\\n- Returns the most likely email address with a confidence score.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Domain to search (e.g. \\\"example.com\\\"). Full URLs are also accepted\"},\"firstName\":{\"type\":\"string\",\"description\":\"Person's first name\"},\"lastName\":{\"type\":\"string\",\"description\":\"Person's last name\"}},\"required\":[\"domain\",\"firstName\",\"lastName\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"properties\":{\"first_name\":{\"type\":\"string\",\"description\":\"Person's first name\"},\"last_name\":{\"type\":\"string\",\"description\":\"Person's last name\"},\"email\":{\"type\":\"string\",\"description\":\"The found email address\"},\"score\":{\"type\":\"number\",\"description\":\"Confidence score (0-100)\"},\"domain\":{\"type\":\"string\",\"description\":\"Domain searched\"},\"accept_all\":{\"type\":\"boolean\",\"description\":\"Whether the domain accepts all email addresses\"},\"position\":{\"type\":\"string\",\"description\":\"Job title or position\"},\"twitter\":{\"type\":\"string\",\"description\":\"Twitter handle\"},\"linkedin_url\":{\"type\":\"string\",\"description\":\"LinkedIn profile URL\"},\"phone_number\":{\"type\":\"string\",\"description\":\"Phone number\"},\"company\":{\"type\":\"string\",\"description\":\"Company name\"},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Domain where the email was found\"},\"uri\":{\"type\":\"string\",\"description\":\"URI of the page where the email was found\"},\"extracted_on\":{\"type\":\"string\",\"description\":\"Date when the email was extracted\"}},\"required\":[\"domain\",\"uri\",\"extracted_on\"]},\"description\":\"Sources where the email was found\"}},\"required\":[\"first_name\",\"last_name\",\"email\",\"score\",\"domain\",\"accept_all\",\"position\",\"twitter\",\"linkedin_url\",\"phone_number\",\"company\",\"sources\"],\"description\":\"Email finder results including the found email and confidence score\"}},\"required\":[\"data\"]},\n },\n \"hunterApiEmailVerification\": {\n stepType: \"hunterApiEmailVerification\",\n description: \"Verify whether an email address is valid and deliverable using Hunter.io.\",\n usageNotes: \"- Checks email format, MX records, SMTP server, and mailbox deliverability.\\n- Returns a status (\\\"valid\\\", \\\"invalid\\\", \\\"accept_all\\\", \\\"webmail\\\", \\\"disposable\\\", \\\"unknown\\\") and a score.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"email\":{\"type\":\"string\",\"description\":\"Email address to verify\"}},\"required\":[\"email\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"description\":\"Verification status (e.g. \\\"valid\\\", \\\"invalid\\\", \\\"accept_all\\\", \\\"webmail\\\", \\\"disposable\\\", \\\"unknown\\\")\"},\"result\":{\"type\":\"string\",\"description\":\"Deliverability result\"},\"score\":{\"type\":\"number\",\"description\":\"Confidence score (0-100)\"},\"email\":{\"type\":\"string\",\"description\":\"The verified email address\"},\"regexp\":{\"type\":\"boolean\",\"description\":\"Whether the email matches a valid format\"},\"gibberish\":{\"type\":\"boolean\",\"description\":\"Whether the email appears to be gibberish\"},\"disposable\":{\"type\":\"boolean\",\"description\":\"Whether the email uses a disposable email service\"},\"webmail\":{\"type\":\"boolean\",\"description\":\"Whether the email is from a webmail provider\"},\"mx_records\":{\"type\":\"boolean\",\"description\":\"Whether MX records exist for the domain\"},\"smtp_server\":{\"type\":\"boolean\",\"description\":\"Whether the SMTP server is reachable\"},\"smtp_check\":{\"type\":\"boolean\",\"description\":\"Whether the SMTP mailbox check passed\"},\"accept_all\":{\"type\":\"boolean\",\"description\":\"Whether the domain accepts all email addresses\"},\"block\":{\"type\":\"boolean\",\"description\":\"Whether the email is blocked\"},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Domain where the email was found\"},\"uri\":{\"type\":\"string\",\"description\":\"URI of the page where the email was found\"},\"extracted_on\":{\"type\":\"string\",\"description\":\"Date when the email was extracted\"}},\"required\":[\"domain\",\"uri\",\"extracted_on\"]},\"description\":\"Sources where the email was found\"}},\"required\":[\"status\",\"result\",\"score\",\"email\",\"regexp\",\"gibberish\",\"disposable\",\"webmail\",\"mx_records\",\"smtp_server\",\"smtp_check\",\"accept_all\",\"block\",\"sources\"],\"description\":\"Email verification results including status, deliverability, and confidence score\"}},\"required\":[\"data\"]},\n },\n \"hunterApiPersonEnrichment\": {\n stepType: \"hunterApiPersonEnrichment\",\n description: \"Look up professional information about a person by their email address using Hunter.io.\",\n usageNotes: \"- Returns name, job title, social profiles, and company information.\\n- If the person is not found, returns an object with an error message instead of throwing.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"email\":{\"type\":\"string\",\"description\":\"Email address to look up\"}},\"required\":[\"email\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"first_name\":{\"type\":\"string\"},\"last_name\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"},\"position\":{\"type\":\"string\"},\"seniority\":{\"type\":\"string\"},\"department\":{\"type\":\"string\"},\"linkedin_url\":{\"type\":\"string\"},\"twitter\":{\"type\":\"string\"},\"phone_number\":{\"type\":\"string\"},\"company\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"domain\":{\"type\":\"string\"},\"industry\":{\"type\":\"string\"}},\"required\":[\"name\",\"domain\",\"industry\"]},{\"type\":\"null\"}]}},\"required\":[\"first_name\",\"last_name\",\"email\",\"position\",\"seniority\",\"department\",\"linkedin_url\",\"twitter\",\"phone_number\",\"company\"]},{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\"}},\"required\":[\"error\"]}]}},\"required\":[\"data\"]},\n },\n \"imageFaceSwap\": {\n stepType: \"imageFaceSwap\",\n description: \"Replace a face in an image with a face from another image using AI.\",\n usageNotes: \"- Requires both a target image and a face source image.\\n- Output is re-hosted on the CDN as a PNG.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the target image containing the face to replace\"},\"faceImageUrl\":{\"type\":\"string\",\"description\":\"URL of the image containing the replacement face\"},\"engine\":{\"type\":\"string\",\"description\":\"Face swap engine to use\"}},\"required\":[\"imageUrl\",\"faceImageUrl\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"CDN URL of the face-swapped image (PNG)\"}},\"required\":[\"imageUrl\"]},\n },\n \"imageRemoveWatermark\": {\n stepType: \"imageRemoveWatermark\",\n description: \"Remove watermarks from an image using AI.\",\n usageNotes: \"- Output is re-hosted on the CDN as a PNG.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the image to remove the watermark from\"},\"engine\":{\"type\":\"string\",\"description\":\"Watermark removal engine to use\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"imageUrl\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"CDN URL of the processed image with watermark removed (PNG)\"}},\"required\":[\"imageUrl\"]},\n },\n \"insertVideoClips\": {\n stepType: \"insertVideoClips\",\n description: \"Insert b-roll clips into a base video at a timecode, optionally with an xfade transition.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"baseVideoUrl\":{\"type\":\"string\",\"description\":\"URL of the base video to insert clips into\"},\"overlayVideos\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the overlay video clip\"},\"startTimeSec\":{\"type\":\"number\",\"description\":\"Timecode in seconds at which to insert this clip\"}},\"required\":[\"videoUrl\",\"startTimeSec\"]},\"description\":\"Array of overlay clips to insert at specified timecodes\"},\"transition\":{\"type\":\"string\",\"description\":\"Optional xfade transition effect name between clips\"},\"transitionDuration\":{\"type\":\"number\",\"description\":\"Duration of the transition in seconds\"},\"useOverlayAudio\":{\"type\":\"boolean\",\"description\":\"When true, uses audio from the overlay clips instead of the base video audio during inserts\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"baseVideoUrl\",\"overlayVideos\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video with clips inserted\"}},\"required\":[\"videoUrl\"]},\n },\n \"listDataSources\": {\n stepType: \"listDataSources\",\n description: \"List all data sources for the current app.\",\n usageNotes: \"- Returns metadata for every data source associated with the current app version.\\n- Each entry includes the data source ID, name, description, status, and document list.\",\n inputSchema: {\"type\":\"object\"},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"listGmailDrafts\": {\n stepType: \"listGmailDrafts\",\n description: \"List drafts in the connected Gmail account.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns up to 50 drafts (default 10).\\n- The variable receives text or JSON depending on exportType.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"limit\":{\"type\":\"string\",\"description\":\"Max drafts to return (default: 10, max: 50)\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"}},\"required\":[\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"drafts\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"draftId\":{\"type\":\"string\",\"description\":\"Gmail draft ID\"},\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject\"},\"to\":{\"type\":\"string\",\"description\":\"Recipient email\"},\"snippet\":{\"type\":\"string\",\"description\":\"Short preview text\"}},\"required\":[\"draftId\",\"messageId\",\"subject\",\"to\",\"snippet\"]},\"description\":\"List of draft summaries\"}},\"required\":[\"drafts\"]},\n },\n \"listGmailLabels\": {\n stepType: \"listGmailLabels\",\n description: \"List all labels in the connected Gmail account. Use these label IDs or names with the Update Gmail Labels step.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns both system labels (INBOX, SENT, TRASH, etc.) and user-created labels.\\n- Label type is \\\"system\\\" for built-in labels or \\\"user\\\" for custom labels.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}}},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"listGoogleCalendarEvents\": {\n stepType: \"listGoogleCalendarEvents\",\n description: \"List upcoming events from a Google Calendar, ordered by start time.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- Only returns future events (timeMin = now).\\n- The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns structured events.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"limit\":{\"type\":\"number\",\"description\":\"Maximum number of events to return (default: 10)\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\" if omitted)\"}},\"required\":[\"limit\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"events\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Google Calendar event ID\"},\"status\":{\"type\":\"string\",\"description\":\"Event status (e.g. \\\"confirmed\\\", \\\"tentative\\\", \\\"cancelled\\\")\"},\"htmlLink\":{\"type\":\"string\",\"description\":\"URL to view the event in Google Calendar\"},\"created\":{\"type\":\"string\",\"description\":\"Timestamp when the event was created\"},\"updated\":{\"type\":\"string\",\"description\":\"Timestamp when the event was last updated\"},\"summary\":{\"type\":\"string\",\"description\":\"Event title\"},\"description\":{\"type\":\"string\",\"description\":\"Event description\"},\"location\":{\"type\":\"string\",\"description\":\"Event location\"},\"organizer\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"start\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"end\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"attendees\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"},\"responseStatus\":{\"type\":\"string\"}}}},{\"type\":\"null\"}]}}},\"description\":\"List of upcoming calendar events ordered by start time\"}},\"required\":[\"events\"]},\n },\n \"listGoogleDriveFiles\": {\n stepType: \"listGoogleDriveFiles\",\n description: \"List files in a Google Drive folder.\",\n usageNotes: \"- Requires a Google OAuth connection with Drive scope.\\n- If folderId is omitted, lists files in the root folder.\\n- Returns file metadata including name, type, size, and links.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"folderId\":{\"type\":\"string\",\"description\":\"Google Drive folder ID (defaults to root)\"},\"limit\":{\"type\":\"number\",\"description\":\"Max files to return (default: 20)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"}},\"required\":[\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"files\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"mimeType\":{\"type\":\"string\"},\"size\":{\"type\":\"string\"},\"webViewLink\":{\"type\":\"string\"},\"createdTime\":{\"type\":\"string\"},\"modifiedTime\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"mimeType\",\"size\",\"webViewLink\",\"createdTime\",\"modifiedTime\"]},\"description\":\"List of files in the folder\"}},\"required\":[\"files\"]},\n },\n \"listRecentGmailEmails\": {\n stepType: \"listRecentGmailEmails\",\n description: \"List recent emails from the connected Gmail inbox.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns up to 100 emails (default 5), ordered by most recent first.\\n- Functionally equivalent to Search Gmail Emails with an \\\"in:inbox\\\" query.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"},\"limit\":{\"type\":\"string\",\"description\":\"Maximum number of emails to return (1-100, default: 5)\"}},\"required\":[\"exportType\",\"limit\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"logic\": {\n stepType: \"logic\",\n description: \"Route execution to different branches based on AI evaluation, comparison operators, or workflow jumps.\",\n usageNotes: \"- Supports two modes: \\\"ai\\\" (default) uses an AI model to pick the most accurate statement; \\\"comparison\\\" uses operator-based checks.\\n- In AI mode, the model picks the most accurate statement from the list. All possible cases must be specified.\\n- In comparison mode, the context is the left operand and each case's condition is the right operand. First matching case wins. Use operator \\\"default\\\" as a fallback.\\n- Requires at least two cases.\\n- Each case can transition to a step in the current workflow (destinationStepId) or jump to another workflow (destinationWorkflowId).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"mode\":{\"enum\":[\"ai\",\"comparison\"],\"type\":\"string\",\"description\":\"Evaluation mode: 'ai' for LLM-based, 'comparison' for operator-based. Default: 'ai'\"},\"context\":{\"type\":\"string\",\"description\":\"AI mode: prompt context. Comparison mode: left operand (resolved via variables).\"},\"cases\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Unique case identifier\"},\"condition\":{\"type\":\"string\",\"description\":\"AI mode: statement to evaluate. Comparison mode: right operand value.\"},\"operator\":{\"enum\":[\"eq\",\"neq\",\"gt\",\"lt\",\"gte\",\"lte\",\"exists\",\"not_exists\",\"contains\",\"not_contains\",\"default\"],\"type\":\"string\",\"description\":\"Comparison operator (comparison mode only)\"},\"destinationStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if this case wins (workflow mode only)\"},\"destinationWorkflowId\":{\"type\":\"string\",\"description\":\"Workflow to jump to if this case wins (uses that workflow's initial step)\"}},\"required\":[\"id\",\"condition\"]},{\"type\":\"string\"}]},\"description\":\"List of conditions to evaluate (objects for managed UIs, strings for code)\"},\"modelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Optional model settings override; uses the organization default if not specified (AI mode only)\"}},\"required\":[\"context\",\"cases\"],\"description\":\"Configuration for the router step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"selectedCase\":{\"type\":\"number\",\"description\":\"The index of the winning case\"}},\"required\":[\"selectedCase\"]},\n },\n \"makeDotComRunScenario\": {\n stepType: \"makeDotComRunScenario\",\n description: \"Trigger a Make.com (formerly Integromat) scenario via webhook and return the response.\",\n usageNotes: \"- The webhook URL must be configured in your Make.com scenario.\\n- Input key-value pairs are sent as JSON in the POST body.\\n- Response format depends on the Make.com scenario configuration.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"webhookUrl\":{\"type\":\"string\",\"description\":\"Make.com webhook URL for the scenario\"},\"input\":{\"type\":\"object\",\"description\":\"Key-value pairs to send as the JSON POST body\"}},\"required\":[\"webhookUrl\",\"input\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Response from the Make.com scenario (JSON or string depending on scenario configuration)\"}},\"required\":[\"data\"]},\n },\n \"mergeAudio\": {\n stepType: \"mergeAudio\",\n description: \"Merge one or more clips into a single audio file.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"mp3Urls\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"URLs of the MP3 audio clips to merge in order\"},\"fileMetadata\":{\"type\":\"object\",\"description\":\"FFmpeg MP3 metadata key-value pairs to embed in the output file\"},\"albumArtUrl\":{\"type\":\"string\",\"description\":\"URL of an image to embed as album art in the output file\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"mp3Urls\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the merged audio file\"}},\"required\":[\"audioUrl\"]},\n },\n \"mergeVideos\": {\n stepType: \"mergeVideos\",\n description: \"Merge one or more clips into a single video.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrls\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"URLs of the video clips to merge in order\"},\"transition\":{\"type\":\"string\",\"description\":\"Optional xfade transition effect name\"},\"transitionDuration\":{\"type\":\"number\",\"description\":\"Duration of the transition in seconds\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrls\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the merged video\"}},\"required\":[\"videoUrl\"]},\n },\n \"mixAudioIntoVideo\": {\n stepType: \"mixAudioIntoVideo\",\n description: \"Mix an audio track into a video\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video\"},\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the audio track to mix into the video\"},\"options\":{\"type\":\"object\",\"properties\":{\"keepVideoAudio\":{\"type\":\"boolean\",\"description\":\"When true, preserves the original video audio alongside the new track. Defaults to false.\"},\"audioGainDb\":{\"type\":\"number\",\"description\":\"Volume adjustment for the new audio track in decibels. Defaults to 0.\"},\"videoGainDb\":{\"type\":\"number\",\"description\":\"Volume adjustment for the existing video audio in decibels. Defaults to 0.\"},\"loopAudio\":{\"type\":\"boolean\",\"description\":\"When true, loops the audio track to match the video duration. Defaults to false.\"}},\"description\":\"Audio mixing options\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"audioUrl\",\"options\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video with the mixed audio track\"}},\"required\":[\"videoUrl\"]},\n },\n \"muteVideo\": {\n stepType: \"muteVideo\",\n description: \"Mute a video file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video to mute\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the muted video\"}},\"required\":[\"videoUrl\"]},\n },\n \"n8nRunNode\": {\n stepType: \"n8nRunNode\",\n description: \"Trigger an n8n workflow node via webhook and return the response.\",\n usageNotes: \"- The webhook URL must be configured in your n8n workflow.\\n- Supports GET and POST methods with optional Basic authentication.\\n- For GET requests, input values are sent as query parameters. For POST, they are sent as JSON body.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"method\":{\"type\":\"string\",\"description\":\"HTTP method to use (GET or POST)\"},\"authentication\":{\"enum\":[\"none\",\"basic\",\"string\"],\"type\":\"string\",\"description\":\"Authentication type for the webhook request\"},\"user\":{\"type\":\"string\",\"description\":\"Username for Basic authentication\"},\"password\":{\"type\":\"string\",\"description\":\"Password for Basic authentication\"},\"webhookUrl\":{\"type\":\"string\",\"description\":\"n8n webhook URL for the workflow node\"},\"input\":{\"type\":\"object\",\"description\":\"Key-value pairs sent as query params (GET) or JSON body (POST)\"}},\"required\":[\"method\",\"authentication\",\"user\",\"password\",\"webhookUrl\",\"input\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Response from the n8n node (JSON or string depending on node configuration)\"}},\"required\":[\"data\"]},\n },\n \"notionCreatePage\": {\n stepType: \"notionCreatePage\",\n description: \"Create a new page in Notion as a child of an existing page.\",\n usageNotes: \"- Requires a Notion OAuth connection (connectionId).\\n- Content is provided as markdown and converted to Notion blocks (headings, paragraphs, lists, code, quotes).\\n- The page is created as a child of the specified parent page (pageId).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"pageId\":{\"type\":\"string\",\"description\":\"Parent page ID to create the new page under\"},\"content\":{\"type\":\"string\",\"description\":\"Page content in markdown format\"},\"title\":{\"type\":\"string\",\"description\":\"Page title\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Notion OAuth connection ID\"}},\"required\":[\"pageId\",\"content\",\"title\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"pageId\":{\"type\":\"string\",\"description\":\"Notion page ID of the created page\"},\"pageUrl\":{\"type\":\"string\",\"description\":\"URL to view the page in Notion\"}},\"required\":[\"pageId\",\"pageUrl\"]},\n },\n \"notionUpdatePage\": {\n stepType: \"notionUpdatePage\",\n description: \"Update the content of an existing Notion page.\",\n usageNotes: \"- Requires a Notion OAuth connection (connectionId).\\n- Content is provided as markdown and converted to Notion blocks.\\n- \\\"append\\\" mode adds content to the end of the page. \\\"overwrite\\\" mode deletes all existing blocks first.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"pageId\":{\"type\":\"string\",\"description\":\"Notion page ID to update\"},\"content\":{\"type\":\"string\",\"description\":\"New content in markdown format\"},\"mode\":{\"enum\":[\"append\",\"overwrite\"],\"type\":\"string\",\"description\":\"How to apply the content: 'append' adds to end, 'overwrite' replaces all existing content\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Notion OAuth connection ID\"}},\"required\":[\"pageId\",\"content\",\"mode\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"pageId\":{\"type\":\"string\",\"description\":\"Notion page ID of the updated page\"},\"pageUrl\":{\"type\":\"string\",\"description\":\"URL to view the page in Notion\"}},\"required\":[\"pageId\",\"pageUrl\"]},\n },\n \"peopleSearch\": {\n stepType: \"peopleSearch\",\n description: \"Search for people matching specific criteria using Apollo.io. Supports natural language queries and advanced filters.\",\n usageNotes: \"- Can use a natural language \\\"smartQuery\\\" which is converted to Apollo search parameters by an AI model.\\n- Advanced params can override or supplement the smart query results.\\n- Optionally enriches returned people and/or their organizations for additional detail.\\n- Results are paginated. Use limit and page to control the result window.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"smartQuery\":{\"type\":\"string\",\"description\":\"Natural language search query (e.g. \\\"marketing directors at SaaS companies in NYC\\\")\"},\"enrichPeople\":{\"type\":\"boolean\",\"description\":\"Whether to enrich each result with full contact details\"},\"enrichOrganizations\":{\"type\":\"boolean\",\"description\":\"Whether to enrich each result with full company details\"},\"limit\":{\"type\":\"string\",\"description\":\"Maximum number of results to return\"},\"page\":{\"type\":\"string\",\"description\":\"Page number for pagination\"},\"params\":{\"type\":\"object\",\"properties\":{\"personTitles\":{\"type\":\"string\",\"description\":\"Job titles to search for (comma-separated)\"},\"includeSimilarTitles\":{\"type\":\"string\",\"description\":\"Whether to include similar/related job titles\"},\"qKeywords\":{\"type\":\"string\",\"description\":\"Keywords to search for in person profiles\"},\"personLocations\":{\"type\":\"string\",\"description\":\"Geographic locations of people (comma-separated)\"},\"personSeniorities\":{\"type\":\"string\",\"description\":\"Seniority levels to filter by (comma-separated)\"},\"organizationLocations\":{\"type\":\"string\",\"description\":\"Geographic locations of organizations (comma-separated)\"},\"qOrganizationDomainsList\":{\"type\":\"string\",\"description\":\"Organization domains to filter by (comma-separated)\"},\"contactEmailStatus\":{\"type\":\"string\",\"description\":\"Email verification status filter\"},\"organizationNumEmployeesRanges\":{\"type\":\"string\",\"description\":\"Employee count ranges as semicolon-separated pairs (e.g. \\\"1,10; 250,500\\\")\"},\"revenueRangeMin\":{\"type\":\"string\",\"description\":\"Minimum annual revenue filter\"},\"revenueRangeMax\":{\"type\":\"string\",\"description\":\"Maximum annual revenue filter\"},\"currentlyUsingAllOfTechnologyUids\":{\"type\":\"string\",\"description\":\"Technology UIDs the organization must use (all required)\"},\"currentlyUsingAnyOfTechnologyUids\":{\"type\":\"string\",\"description\":\"Technology UIDs the organization uses (any match)\"},\"currentlyNotUsingAnyOfTechnologyUids\":{\"type\":\"string\",\"description\":\"Technology UIDs the organization must not use\"}},\"required\":[\"personTitles\",\"includeSimilarTitles\",\"qKeywords\",\"personLocations\",\"personSeniorities\",\"organizationLocations\",\"qOrganizationDomainsList\",\"contactEmailStatus\",\"organizationNumEmployeesRanges\",\"revenueRangeMin\",\"revenueRangeMax\",\"currentlyUsingAllOfTechnologyUids\",\"currentlyUsingAnyOfTechnologyUids\",\"currentlyNotUsingAnyOfTechnologyUids\"],\"description\":\"Advanced search filter parameters\"}},\"required\":[\"smartQuery\",\"enrichPeople\",\"enrichOrganizations\",\"limit\",\"page\",\"params\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"results\":{\"description\":\"Apollo search results with matched people and optionally enriched data\"}},\"required\":[\"results\"]},\n },\n \"postToLinkedIn\": {\n stepType: \"postToLinkedIn\",\n description: \"Create a post on LinkedIn from the connected account.\",\n usageNotes: \"- Requires a LinkedIn OAuth connection (connectionId).\\n- Supports text posts, image posts, video posts, document posts, and article posts.\\n- Attach one media type per post: image, video, document, or article.\\n- Documents support PDF, PPT, PPTX, DOC, DOCX (max 100MB, 300 pages). Displays as a slideshow carousel.\\n- Articles create a link preview with optional custom title, description, and thumbnail.\\n- Visibility controls who can see the post.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"description\":\"The text content of the LinkedIn post\"},\"visibility\":{\"enum\":[\"PUBLIC\",\"CONNECTIONS\"],\"type\":\"string\",\"description\":\"Who can see the post: \\\"PUBLIC\\\" or \\\"CONNECTIONS\\\"\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of an image to attach to the post\"},\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of a video to attach to the post\"},\"documentUrl\":{\"type\":\"string\",\"description\":\"URL of a document (PDF, PPT, DOC) to attach to the post\"},\"articleUrl\":{\"type\":\"string\",\"description\":\"URL to share as an article link preview\"},\"titleText\":{\"type\":\"string\",\"description\":\"Title text for media or article attachments\"},\"descriptionText\":{\"type\":\"string\",\"description\":\"Description text for article attachments\"},\"connectionId\":{\"type\":\"string\",\"description\":\"LinkedIn OAuth connection ID\"}},\"required\":[\"message\",\"visibility\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"postToSlackChannel\": {\n stepType: \"postToSlackChannel\",\n description: \"Send a message to a Slack channel via a connected bot.\",\n usageNotes: \"- The user is responsible for connecting their Slack workspace and selecting the channel\\n- Supports both simple text messages and slack blocks messages\\n- Text messages can use limited markdown (slack-only fomatting—e.g., headers are just rendered as bold)\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"channelId\":{\"type\":\"string\",\"description\":\"Slack channel ID (leave empty to allow user to select a channel)\"},\"messageType\":{\"enum\":[\"string\",\"blocks\"],\"type\":\"string\",\"description\":\"Message format: \\\"string\\\" for plain text/markdown, \\\"blocks\\\" for Slack Block Kit JSON\"},\"message\":{\"type\":\"string\",\"description\":\"Message content (plain text/markdown for \\\"string\\\" type, or JSON for \\\"blocks\\\" type)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Slack OAuth connection ID (leave empty to allow user to select)\"}},\"required\":[\"channelId\",\"messageType\",\"message\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"postToX\": {\n stepType: \"postToX\",\n description: \"Create a post on X (Twitter) from the connected account.\",\n usageNotes: \"- Requires an X OAuth connection (connectionId).\\n- Maximum 280 characters of text.\\n- Optionally attach up to 4 media items (images, GIFs, or videos) via mediaUrls.\\n- Media URLs must be publicly accessible. The service fetches and uploads them to X.\\n- Supported formats: JPEG, PNG, GIF, WEBP, MP4. Images up to 5MB, videos up to 512MB.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The text content of the post (max 280 characters)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"X (Twitter) OAuth connection ID\"},\"mediaUrls\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Up to 4 URLs of images, GIFs, or videos to attach to the post\"}},\"required\":[\"text\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"postToZapier\": {\n stepType: \"postToZapier\",\n description: \"Send data to a Zapier Zap via webhook and return the response.\",\n usageNotes: \"- The webhook URL must be configured in the Zapier Zap settings\\n- Input keys and values are sent as the JSON body of the POST request\\n- The webhook response (JSON or plain text) is returned as the output\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"webhookUrl\":{\"type\":\"string\",\"description\":\"Zapier webhook URL to send data to\"},\"input\":{\"type\":\"object\",\"description\":\"Key-value pairs to send as the JSON POST body\"}},\"required\":[\"webhookUrl\",\"input\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Parsed webhook response from Zapier (JSON object, array, or string)\"}},\"required\":[\"data\"]},\n },\n \"queryAppDatabase\": {\n stepType: \"queryAppDatabase\",\n description: \"Execute a SQL query against the app managed database.\",\n usageNotes: \"- Executes raw SQL against a SQLite database managed by the app.\\n- For SELECT queries, returns rows as JSON.\\n- For INSERT/UPDATE/DELETE, returns the number of affected rows.\\n- Use {{variables}} directly in your SQL. By default they are automatically extracted\\n and passed as safe parameterized values (preventing SQL injection).\\n Example: INSERT INTO contacts (name, comment) VALUES ({{name}}, {{comment}})\\n- Full MindStudio handlebars syntax is supported, including helpers like {{json myVar}},\\n {{get myVar \\\"$.path\\\"}}, {{global.orgName}}, etc.\\n- Set parameterize to false for raw/dynamic SQL where variables are interpolated directly\\n into the query string. Use this when another step generates full or partial SQL, e.g.\\n a bulk INSERT with a precomputed VALUES list. The user is responsible for sanitization\\n when parameterize is false.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"databaseId\":{\"type\":\"string\",\"description\":\"Name or ID of the app data database to query\"},\"sql\":{\"type\":\"string\",\"description\":\"SQL query to execute. Use {{variables}} directly in the SQL — they are handled according to the `parameterize` setting.\\n\\nWhen parameterize is true (default): {{variables}} are extracted from the SQL, replaced with ? placeholders, resolved via the full MindStudio handlebars pipeline, and passed as safe parameterized values to SQLite. This prevents SQL injection. Example: INSERT INTO contacts (name, email) VALUES ({{name}}, {{email}})\\n\\nWhen parameterize is false: The entire SQL string is resolved via compileString (standard handlebars interpolation) and executed as-is. Use this for dynamic/generated SQL where another step builds the query. The user is responsible for safety. Example: {{generatedInsertQuery}}\\n\\nAsk the user for the database schema if they have not already provided it.\"},\"parameterize\":{\"type\":\"boolean\",\"description\":\"Whether to treat {{variables}} as parameterized query values (default: true).\\n\\n- true: {{vars}} are extracted, replaced with ?, and passed as bind params. Safe from SQL injection. Use for standard CRUD operations.\\n- false: {{vars}} are interpolated directly into the SQL string via handlebars. Use when another step generates full or partial SQL (e.g. bulk inserts with precomputed VALUES). The user is responsible for sanitization.\"}},\"required\":[\"databaseId\",\"sql\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{},\"description\":\"Result rows for SELECT queries (empty array for write queries)\"},\"changes\":{\"type\":\"number\",\"description\":\"Number of rows affected by INSERT, UPDATE, or DELETE queries (0 for SELECT)\"}},\"required\":[\"rows\",\"changes\"]},\n },\n \"queryDataSource\": {\n stepType: \"queryDataSource\",\n description: \"Search a vector data source (RAG) and return relevant document chunks.\",\n usageNotes: \"- Queries a vectorized data source and returns the most relevant chunks.\\n- Useful for retrieval-augmented generation (RAG) workflows.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"dataSourceId\":{\"type\":\"string\",\"description\":\"ID of the vector data source to query\"},\"query\":{\"type\":\"string\",\"description\":\"The search query to run against the data source\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of chunks to return (recommended 1-3)\"}},\"required\":[\"dataSourceId\",\"query\",\"maxResults\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"All matching chunks joined with newlines\"},\"chunks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Individual matching text chunks from the data source\"},\"query\":{\"type\":\"string\",\"description\":\"The resolved search query that was executed\"},\"citations\":{\"type\":\"array\",\"items\":{},\"description\":\"Source citations for the matched chunks\"},\"latencyMs\":{\"type\":\"number\",\"description\":\"Query execution time in milliseconds\"}},\"required\":[\"text\",\"chunks\",\"query\",\"citations\",\"latencyMs\"]},\n },\n \"queryExternalDatabase\": {\n stepType: \"queryExternalDatabase\",\n description: \"Execute a SQL query against an external database connected to the workspace.\",\n usageNotes: \"- Requires a database connection configured in the workspace.\\n- Supports PostgreSQL (including Supabase), MySQL, and MSSQL.\\n- Results can be returned as JSON or CSV.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Database connection ID configured in the workspace\"},\"query\":{\"type\":\"string\",\"description\":\"SQL query to execute (supports variable interpolation)\"},\"outputFormat\":{\"enum\":[\"json\",\"csv\"],\"type\":\"string\",\"description\":\"Output format for the result variable\"}},\"required\":[\"query\",\"outputFormat\"],\"description\":\"Configuration for the external database query step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Query result rows (array of objects for JSON, CSV string for CSV format)\"}},\"required\":[\"data\"]},\n },\n \"redactPII\": {\n stepType: \"redactPII\",\n description: \"Replace personally identifiable information in text with placeholders using Microsoft Presidio.\",\n usageNotes: \"- PII is replaced with entity type placeholders (e.g. \\\"Call me at <PHONE_NUMBER>\\\").\\n- If entities is empty, returns empty text immediately without processing.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"input\":{\"type\":\"string\",\"description\":\"Text to redact PII from\"},\"language\":{\"type\":\"string\",\"description\":\"Language code of the input text (e.g. \\\"en\\\")\"},\"entities\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"PII entity types to redact (e.g. [\\\"PHONE_NUMBER\\\", \\\"EMAIL_ADDRESS\\\"]). Empty array means nothing is redacted.\"}},\"required\":[\"input\",\"language\",\"entities\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The input text with detected PII replaced by entity type placeholders (e.g. \\\"<PHONE_NUMBER>\\\")\"}},\"required\":[\"text\"]},\n },\n \"removeBackgroundFromImage\": {\n stepType: \"removeBackgroundFromImage\",\n description: \"Remove the background from an image using AI, producing a transparent PNG.\",\n usageNotes: \"- Uses the Bria background removal model via fal.ai.\\n- Output is re-hosted on the CDN as a PNG with transparency.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the source image to remove the background from\"}},\"required\":[\"imageUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"CDN URL of the image with background removed (transparent PNG)\"}},\"required\":[\"imageUrl\"]},\n },\n \"replyToGmailEmail\": {\n stepType: \"replyToGmailEmail\",\n description: \"Reply to an existing email in Gmail. The reply is threaded under the original message.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail compose and readonly scopes.\\n- The reply is sent to the original sender and threaded under the original message.\\n- messageType controls the body format: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\".\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID to reply to\"},\"message\":{\"type\":\"string\",\"description\":\"Reply body content\"},\"messageType\":{\"enum\":[\"plain\",\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Body format: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\"\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"messageId\",\"message\",\"messageType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID of the sent reply\"}},\"required\":[\"messageId\"]},\n },\n \"resizeVideo\": {\n stepType: \"resizeVideo\",\n description: \"Resize a video file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video to resize\"},\"mode\":{\"enum\":[\"fit\",\"exact\"],\"type\":\"string\",\"description\":\"Resize mode: 'fit' scales within max dimensions, 'exact' forces exact dimensions\"},\"maxWidth\":{\"type\":\"number\",\"description\":\"Maximum width in pixels (used with 'fit' mode)\"},\"maxHeight\":{\"type\":\"number\",\"description\":\"Maximum height in pixels (used with 'fit' mode)\"},\"width\":{\"type\":\"number\",\"description\":\"Exact width in pixels (used with 'exact' mode)\"},\"height\":{\"type\":\"number\",\"description\":\"Exact height in pixels (used with 'exact' mode)\"},\"strategy\":{\"enum\":[\"pad\",\"crop\"],\"type\":\"string\",\"description\":\"Strategy for handling aspect ratio mismatch in 'exact' mode\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"mode\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the resized video\"}},\"required\":[\"videoUrl\"]},\n },\n \"runFromConnectorRegistry\": {\n stepType: \"runFromConnectorRegistry\",\n description: \"Run a raw API connector to a third-party service\",\n usageNotes: \"- Use the /developer/v2/helpers/connectors endpoint to list available services and actions.\\n- Use /developer/v2/helpers/connectors/{serviceId}/{actionId} to get the full input configuration for an action.\\n- Use /developer/v2/helpers/connections to list your available OAuth connections.\\n- The actionId format is \\\"serviceId/actionId\\\" (e.g., \\\"slack/send-message\\\").\\n- Pass a __connectionId to authenticate the request with a specific OAuth connection, otherwise the default will be used (if configured).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"actionId\":{\"type\":\"string\",\"description\":\"The connector action identifier in the format serviceId/actionId\"},\"displayName\":{\"type\":\"string\",\"description\":\"Human-readable name of the connector action\"},\"icon\":{\"type\":\"string\",\"description\":\"Icon URL for the connector\"},\"configurationValues\":{\"type\":\"object\",\"description\":\"Key-value configuration parameters for the connector action\"},\"__connectionId\":{\"type\":\"string\",\"description\":\"OAuth connection ID used to authenticate the connector request\"}},\"required\":[\"actionId\",\"displayName\",\"icon\",\"configurationValues\"],\"description\":\"Configuration for the connector registry step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"description\":\"Key-value map of output variables set by the connector\"}},\"required\":[\"data\"]},\n },\n \"runPackagedWorkflow\": {\n stepType: \"runPackagedWorkflow\",\n description: \"Run a packaged workflow (\\\"custom block\\\")\",\n usageNotes: \"- From the user's perspective, packaged workflows are just ordinary blocks. Behind the scenes, they operate like packages/libraries in a programming language, letting the user execute custom functionality.\\n- Some of these packaged workflows are available as part of MindStudio's \\\"Standard Library\\\" and available to every user.\\n- Available packaged workflows are documented here as individual blocks, but the runPackagedWorkflow block is how they need to be wrapped in order to be executed correctly.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"appId\":{\"type\":\"string\",\"description\":\"The app ID of the packaged workflow source\"},\"workflowId\":{\"type\":\"string\",\"description\":\"The source workflow ID to execute\"},\"inputVariables\":{\"type\":\"object\",\"description\":\"Variables to pass as input to the packaged workflow\"},\"outputVariables\":{\"type\":\"object\",\"description\":\"Variables to capture from the packaged workflow output\"},\"name\":{\"type\":\"string\",\"description\":\"Display name of the packaged workflow\"}},\"required\":[\"appId\",\"workflowId\",\"inputVariables\",\"outputVariables\",\"name\"],\"description\":\"Configuration for the packaged workflow step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the packaged workflow\"}},\"required\":[\"data\"]},\n },\n \"scrapeFacebookPage\": {\n stepType: \"scrapeFacebookPage\",\n description: \"Scrape a Facebook page\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"pageUrl\":{\"type\":\"string\",\"description\":\"Full URL to the Facebook page to scrape\"}},\"required\":[\"pageUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeFacebookPosts\": {\n stepType: \"scrapeFacebookPosts\",\n description: \"Get all the posts for a Facebook page\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"pageUrl\":{\"type\":\"string\",\"description\":\"Full URL to the Facebook page to scrape posts from\"}},\"required\":[\"pageUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeInstagramComments\": {\n stepType: \"scrapeInstagramComments\",\n description: \"Get all the comments for an Instagram post\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"postUrl\":{\"type\":\"string\",\"description\":\"Full URL to the Instagram post to scrape comments from\"},\"resultsLimit\":{\"type\":\"string\",\"description\":\"Maximum number of comments to return\"}},\"required\":[\"postUrl\",\"resultsLimit\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeInstagramMentions\": {\n stepType: \"scrapeInstagramMentions\",\n description: \"Scrape an Instagram profile's mentions\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"profileUrl\":{\"type\":\"string\",\"description\":\"Instagram profile URL or username to scrape mentions for\"},\"resultsLimit\":{\"type\":\"string\",\"description\":\"Maximum number of mentions to return\"}},\"required\":[\"profileUrl\",\"resultsLimit\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeInstagramPosts\": {\n stepType: \"scrapeInstagramPosts\",\n description: \"Get all the posts for an Instagram profile\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"profileUrl\":{\"type\":\"string\",\"description\":\"Instagram profile URL or username to scrape posts from\"},\"resultsLimit\":{\"type\":\"string\",\"description\":\"Maximum number of posts to return\"},\"onlyPostsNewerThan\":{\"type\":\"string\",\"description\":\"Only return posts newer than this date (ISO 8601 format)\"}},\"required\":[\"profileUrl\",\"resultsLimit\",\"onlyPostsNewerThan\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeInstagramProfile\": {\n stepType: \"scrapeInstagramProfile\",\n description: \"Scrape an Instagram profile\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"profileUrl\":{\"type\":\"string\",\"description\":\"Instagram profile URL or username to scrape\"}},\"required\":[\"profileUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeInstagramReels\": {\n stepType: \"scrapeInstagramReels\",\n description: \"Get all the reels for an Instagram profile\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"profileUrl\":{\"type\":\"string\",\"description\":\"Instagram profile URL or username to scrape reels from\"},\"resultsLimit\":{\"type\":\"string\",\"description\":\"Maximum number of reels to return\"}},\"required\":[\"profileUrl\",\"resultsLimit\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeLinkedInCompany\": {\n stepType: \"scrapeLinkedInCompany\",\n description: \"Scrape public company data from a LinkedIn company page.\",\n usageNotes: \"- Requires a LinkedIn company URL (e.g. https://www.linkedin.com/company/mindstudioai).\\n- Returns structured company data including description, employees, updates, and similar companies.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"LinkedIn company page URL (e.g. https://www.linkedin.com/company/mindstudioai)\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"company\":{\"description\":\"Scraped LinkedIn company data\"}},\"required\":[\"company\"]},\n },\n \"scrapeLinkedInProfile\": {\n stepType: \"scrapeLinkedInProfile\",\n description: \"Scrape public profile data from a LinkedIn profile page.\",\n usageNotes: \"- Requires a LinkedIn profile URL (e.g. https://www.linkedin.com/in/username).\\n- Returns structured profile data including experience, education, articles, and activities.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"LinkedIn profile URL (e.g. https://www.linkedin.com/in/username)\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"profile\":{\"description\":\"Scraped LinkedIn profile data\"}},\"required\":[\"profile\"]},\n },\n \"scrapeMetaThreadsProfile\": {\n stepType: \"scrapeMetaThreadsProfile\",\n description: \"Scrape a Meta Threads profile\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"profileUrl\":{\"type\":\"string\",\"description\":\"Meta Threads profile URL or username to scrape\"}},\"required\":[\"profileUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeUrl\": {\n stepType: \"scrapeUrl\",\n description: \"Extract text, HTML, or structured content from one or more web pages.\",\n usageNotes: \"- Accepts a single URL or multiple URLs (as a JSON array, comma-separated, or newline-separated).\\n- Output format controls the result shape: \\\"text\\\" returns markdown, \\\"html\\\" returns raw HTML, \\\"json\\\" returns structured scraper data.\\n- Can optionally capture a screenshot of each page.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"URL(s) to scrape. Accepts a single URL, JSON array, or comma/newline-separated list\"},\"service\":{\"enum\":[\"default\",\"firecrawl\"],\"type\":\"string\",\"description\":\"Scraping service to use\"},\"autoEnhance\":{\"type\":\"boolean\",\"description\":\"Whether to enable enhanced scraping for social media URLs (e.g. Twitter, LinkedIn)\"},\"pageOptions\":{\"type\":\"object\",\"properties\":{\"onlyMainContent\":{\"type\":\"boolean\",\"description\":\"Whether to extract only the main content of the page, excluding navigation, footers, etc.\"},\"screenshot\":{\"type\":\"boolean\",\"description\":\"Whether to capture a screenshot of the page\"},\"waitFor\":{\"type\":\"number\",\"description\":\"Milliseconds to wait before scraping (0 for immediate)\"},\"replaceAllPathsWithAbsolutePaths\":{\"type\":\"boolean\",\"description\":\"Whether to convert relative URLs to absolute URLs in the result\"},\"headers\":{\"type\":\"object\",\"description\":\"Custom HTTP request headers as key-value pairs\"},\"removeTags\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"HTML tags to remove from the scraped result\"},\"mobile\":{\"type\":\"boolean\",\"description\":\"Whether to scrape using a mobile user-agent\"}},\"required\":[\"onlyMainContent\",\"screenshot\",\"waitFor\",\"replaceAllPathsWithAbsolutePaths\",\"headers\",\"removeTags\",\"mobile\"],\"description\":\"Page-level scraping options (content filtering, screenshots, headers, etc.)\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"Markdown/plain-text content of the scraped page\"},\"html\":{\"type\":\"string\",\"description\":\"Raw HTML content of the scraped page\"},\"json\":{\"type\":\"object\",\"description\":\"Structured data extracted from the page\"},\"screenshotUrl\":{\"type\":\"string\",\"description\":\"Screenshot URL of the page (if requested)\"},\"metadata\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Page title\"},\"description\":{\"type\":\"string\",\"description\":\"Page meta description\"},\"url\":{\"type\":\"string\",\"description\":\"Canonical URL\"},\"image\":{\"type\":\"string\",\"description\":\"Open Graph image URL\"}},\"required\":[\"title\",\"description\",\"url\",\"image\"],\"description\":\"Page metadata (Open Graph / meta tags)\"}},\"required\":[\"text\",\"html\"]},{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"Markdown/plain-text content of the scraped page\"},\"html\":{\"type\":\"string\",\"description\":\"Raw HTML content of the scraped page\"},\"json\":{\"type\":\"object\",\"description\":\"Structured data extracted from the page\"},\"screenshotUrl\":{\"type\":\"string\",\"description\":\"Screenshot URL of the page (if requested)\"},\"metadata\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Page title\"},\"description\":{\"type\":\"string\",\"description\":\"Page meta description\"},\"url\":{\"type\":\"string\",\"description\":\"Canonical URL\"},\"image\":{\"type\":\"string\",\"description\":\"Open Graph image URL\"}},\"required\":[\"title\",\"description\",\"url\",\"image\"],\"description\":\"Page metadata (Open Graph / meta tags)\"}},\"required\":[\"text\",\"html\"]}}]},\"screenshot\":{\"type\":\"string\",\"description\":\"Screenshot URL, only present when screenshot was requested via pageOptions\"}},\"required\":[\"content\"]},\n },\n \"scrapeXPost\": {\n stepType: \"scrapeXPost\",\n description: \"Scrape data from a single X (Twitter) post by URL.\",\n usageNotes: \"- Returns structured post data (text, html, optional json/screenshot/metadata).\\n- Optionally saves the text content to a variable.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"Full URL to the X post (e.g. https://x.com/elonmusk/status/1655608985058267139)\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"post\":{\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"Markdown/plain-text content of the scraped page\"},\"html\":{\"type\":\"string\",\"description\":\"Raw HTML content of the scraped page\"},\"json\":{\"type\":\"object\",\"description\":\"Structured data extracted from the page\"},\"screenshotUrl\":{\"type\":\"string\",\"description\":\"Screenshot URL of the page (if requested)\"},\"metadata\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Page title\"},\"description\":{\"type\":\"string\",\"description\":\"Page meta description\"},\"url\":{\"type\":\"string\",\"description\":\"Canonical URL\"},\"image\":{\"type\":\"string\",\"description\":\"Open Graph image URL\"}},\"required\":[\"title\",\"description\",\"url\",\"image\"],\"description\":\"Page metadata (Open Graph / meta tags)\"}},\"required\":[\"text\",\"html\"],\"description\":\"Scraped post data including text, HTML, and optional structured JSON\"}},\"required\":[\"post\"]},\n },\n \"scrapeXProfile\": {\n stepType: \"scrapeXProfile\",\n description: \"Scrape public profile data from an X (Twitter) account by URL.\",\n usageNotes: \"- Returns structured profile data.\\n- Optionally saves the result to a variable.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"Full URL or username for the X profile (e.g. https://x.com/elonmusk)\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"profile\":{\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"Markdown/plain-text content of the scraped page\"},\"html\":{\"type\":\"string\",\"description\":\"Raw HTML content of the scraped page\"},\"json\":{\"type\":\"object\",\"description\":\"Structured data extracted from the page\"},\"screenshotUrl\":{\"type\":\"string\",\"description\":\"Screenshot URL of the page (if requested)\"},\"metadata\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Page title\"},\"description\":{\"type\":\"string\",\"description\":\"Page meta description\"},\"url\":{\"type\":\"string\",\"description\":\"Canonical URL\"},\"image\":{\"type\":\"string\",\"description\":\"Open Graph image URL\"}},\"required\":[\"title\",\"description\",\"url\",\"image\"],\"description\":\"Page metadata (Open Graph / meta tags)\"}},\"required\":[\"text\",\"html\"],\"description\":\"Scraped profile data including text, HTML, and optional structured JSON\"}},\"required\":[\"profile\"]},\n },\n \"screenshotUrl\": {\n stepType: \"screenshotUrl\",\n description: \"Capture a screenshot of a web page as a PNG image.\",\n usageNotes: \"- Takes a viewport or full-page screenshot of the given URL.\\n- Returns a CDN-hosted PNG image URL.\\n- Viewport mode captures only the visible area; fullPage captures the entire scrollable page.\\n- You can customize viewport width/height, add a delay, or wait for a CSS selector before capturing.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"URL to screenshot\"},\"mode\":{\"enum\":[\"viewport\",\"fullPage\"],\"type\":\"string\",\"description\":\"Screenshot mode: viewport captures visible area, fullPage captures entire page\"},\"width\":{\"type\":\"number\",\"description\":\"Viewport width in pixels (default: 1280)\"},\"height\":{\"type\":\"number\",\"description\":\"Viewport height in pixels (default: 800, ignored for fullPage mode)\"},\"delay\":{\"type\":\"number\",\"description\":\"Milliseconds to wait before capturing (default: 0)\"},\"waitFor\":{\"type\":\"string\",\"description\":\"CSS selector to wait for before capturing\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"screenshotUrl\":{\"type\":\"string\"}},\"required\":[\"screenshotUrl\"]},\n },\n \"searchGmailEmails\": {\n stepType: \"searchGmailEmails\",\n description: \"Search for emails in the connected Gmail account using a Gmail search query. To list recent inbox emails, pass an empty query string.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Uses Gmail search syntax (e.g. \\\"from:user@example.com\\\", \\\"subject:invoice\\\", \\\"is:unread\\\").\\n- To list recent inbox emails, use an empty query string or \\\"in:inbox\\\".\\n- Returns up to 100 emails (default 5). The variable receives text or JSON depending on exportType.\\n- The direct execution output always returns structured email objects.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Gmail search query (e.g. \\\"from:user@example.com\\\", \\\"subject:invoice\\\", \\\"is:unread\\\")\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"},\"limit\":{\"type\":\"string\",\"description\":\"Maximum number of emails to return (1-10, default: 5)\"}},\"required\":[\"query\",\"exportType\",\"limit\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"emails\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Gmail message ID\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject line\"},\"from\":{\"type\":\"string\",\"description\":\"Sender email address\"},\"to\":{\"type\":\"string\",\"description\":\"Recipient email address\"},\"date\":{\"type\":\"string\",\"description\":\"Email date\"},\"plainBody\":{\"type\":\"string\",\"description\":\"Plain text body content\"},\"htmlBody\":{\"type\":\"string\",\"description\":\"HTML body content (if available)\"},\"labels\":{\"type\":\"string\",\"description\":\"Comma-separated label IDs applied to the email\"}},\"required\":[\"id\",\"subject\",\"from\",\"to\",\"date\",\"plainBody\",\"htmlBody\",\"labels\"]},\"description\":\"List of matching email messages\"}},\"required\":[\"emails\"]},\n },\n \"searchGoogle\": {\n stepType: \"searchGoogle\",\n description: \"Search the web using Google and return structured results.\",\n usageNotes: \"- Defaults to us/english, but can optionally specify country and/or language.\\n- Defaults to any time, but can optionally specify last hour, last day, week, month, or year.\\n- Defaults to top 30 results, but can specify 1 to 100 results to return.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"The search query to send to Google\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Format for the variable value: \\\"text\\\" or \\\"json\\\"\"},\"countryCode\":{\"type\":\"string\",\"description\":\"Google gl country code (defaults to US)\"},\"languageCode\":{\"type\":\"string\",\"description\":\"Google hl language code (defaults to \\\"en\\\")\"},\"dateRange\":{\"enum\":[\"hour\",\"day\",\"week\",\"month\",\"year\",\"any\"],\"type\":\"string\",\"description\":\"Time range filter: \\\"hour\\\", \\\"day\\\", \\\"week\\\", \\\"month\\\", \\\"year\\\", or \\\"any\\\"\"},\"numResults\":{\"type\":\"number\",\"description\":\"Number of results to return (1-100, default: 30)\"}},\"required\":[\"query\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Title of the search result\"},\"description\":{\"type\":\"string\",\"description\":\"Snippet/description of the search result\"},\"url\":{\"type\":\"string\",\"description\":\"URL of the search result page\"}},\"required\":[\"title\",\"description\",\"url\"]},\"description\":\"List of search result entries\"}},\"required\":[\"results\"]},\n },\n \"searchGoogleCalendarEvents\": {\n stepType: \"searchGoogleCalendarEvents\",\n description: \"Search for events in a Google Calendar by keyword, date range, or both.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- Supports keyword search via \\\"query\\\" and date filtering via \\\"timeMin\\\"/\\\"timeMax\\\" (ISO 8601 format).\\n- Unlike \\\"List Events\\\" which only shows future events, this allows searching past events too.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Text search term\"},\"timeMin\":{\"type\":\"string\",\"description\":\"Start of time range (ISO 8601)\"},\"timeMax\":{\"type\":\"string\",\"description\":\"End of time range (ISO 8601)\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\")\"},\"limit\":{\"type\":\"number\",\"description\":\"Maximum number of events to return (default: 10)\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"events\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Google Calendar event ID\"},\"status\":{\"type\":\"string\",\"description\":\"Event status (e.g. \\\"confirmed\\\", \\\"tentative\\\", \\\"cancelled\\\")\"},\"htmlLink\":{\"type\":\"string\",\"description\":\"URL to view the event in Google Calendar\"},\"created\":{\"type\":\"string\",\"description\":\"Timestamp when the event was created\"},\"updated\":{\"type\":\"string\",\"description\":\"Timestamp when the event was last updated\"},\"summary\":{\"type\":\"string\",\"description\":\"Event title\"},\"description\":{\"type\":\"string\",\"description\":\"Event description\"},\"location\":{\"type\":\"string\",\"description\":\"Event location\"},\"organizer\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"start\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"end\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"attendees\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"},\"responseStatus\":{\"type\":\"string\"}}}},{\"type\":\"null\"}]}}},\"description\":\"List of matching calendar events\"}},\"required\":[\"events\"]},\n },\n \"searchGoogleDrive\": {\n stepType: \"searchGoogleDrive\",\n description: \"Search for files in Google Drive by keyword.\",\n usageNotes: \"- Requires a Google OAuth connection with Drive scope.\\n- Searches file content and names using Google Drive's fullText search.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Search keyword\"},\"limit\":{\"type\":\"number\",\"description\":\"Max files to return (default: 20)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"}},\"required\":[\"query\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"files\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"mimeType\":{\"type\":\"string\"},\"size\":{\"type\":\"string\"},\"webViewLink\":{\"type\":\"string\"},\"createdTime\":{\"type\":\"string\"},\"modifiedTime\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"mimeType\",\"size\",\"webViewLink\",\"createdTime\",\"modifiedTime\"]},\"description\":\"List of matching files\"}},\"required\":[\"files\"]},\n },\n \"searchGoogleImages\": {\n stepType: \"searchGoogleImages\",\n description: \"Search Google Images and return image results with URLs and metadata.\",\n usageNotes: \"- Defaults to us/english, but can optionally specify country and/or language.\\n- Defaults to any time, but can optionally specify last hour, last day, week, month, or year.\\n- Defaults to top 30 results, but can specify 1 to 100 results to return.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"The image search query\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Format for the variable value: \\\"text\\\" or \\\"json\\\"\"},\"countryCode\":{\"type\":\"string\",\"description\":\"Google gl country code (defaults to US)\"},\"languageCode\":{\"type\":\"string\",\"description\":\"Google hl language code (defaults to \\\"en\\\")\"},\"dateRange\":{\"enum\":[\"hour\",\"day\",\"week\",\"month\",\"year\",\"any\"],\"type\":\"string\",\"description\":\"Time range filter: \\\"hour\\\", \\\"day\\\", \\\"week\\\", \\\"month\\\", \\\"year\\\", or \\\"any\\\"\"},\"numResults\":{\"type\":\"number\",\"description\":\"Number of results to return (1-100, default: 30)\"}},\"required\":[\"query\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"images\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Title/alt text of the image\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"Direct URL of the full-size image\"},\"imageWidth\":{\"type\":\"number\",\"description\":\"Width of the full-size image in pixels\"},\"imageHeight\":{\"type\":\"number\",\"description\":\"Height of the full-size image in pixels\"},\"thumbnailUrl\":{\"type\":\"string\",\"description\":\"URL of the thumbnail image\"},\"thumbnailWidth\":{\"type\":\"number\",\"description\":\"Width of the thumbnail in pixels\"},\"thumbnailHeight\":{\"type\":\"number\",\"description\":\"Height of the thumbnail in pixels\"},\"source\":{\"type\":\"string\",\"description\":\"Source website name\"},\"domain\":{\"type\":\"string\",\"description\":\"Domain of the source website\"},\"link\":{\"type\":\"string\",\"description\":\"URL of the page containing the image\"},\"googleUrl\":{\"type\":\"string\",\"description\":\"Google Images URL for this result\"},\"position\":{\"type\":\"number\",\"description\":\"Position/rank of this result in the search results\"}},\"required\":[\"title\",\"imageUrl\",\"imageWidth\",\"imageHeight\",\"thumbnailUrl\",\"thumbnailWidth\",\"thumbnailHeight\",\"source\",\"domain\",\"link\",\"googleUrl\",\"position\"]},\"description\":\"List of image search results with URLs and metadata\"}},\"required\":[\"images\"]},\n },\n \"searchGoogleNews\": {\n stepType: \"searchGoogleNews\",\n description: \"Search Google News for recent news articles matching a query.\",\n usageNotes: \"- Defaults to top 30 results, but can specify 1 to 100 results to return.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The news search query\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Format for the variable value: \\\"text\\\" or \\\"json\\\"\"},\"numResults\":{\"type\":\"number\",\"description\":\"Number of results to return (1-100, default: 30)\"}},\"required\":[\"text\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"articles\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Headline of the news article\"},\"link\":{\"type\":\"string\",\"description\":\"URL to the full article\"},\"date\":{\"type\":\"string\",\"description\":\"Publication date of the article\"},\"source\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"description\":\"Name of the news source\"}},\"required\":[\"name\"],\"description\":\"Source publication\"},\"snippet\":{\"type\":\"string\",\"description\":\"Brief excerpt or summary of the article\"}},\"required\":[\"title\",\"link\",\"date\",\"source\"]},\"description\":\"List of matching news articles\"}},\"required\":[\"articles\"]},\n },\n \"searchGoogleTrends\": {\n stepType: \"searchGoogleTrends\",\n description: \"Fetch Google Trends data for a search term.\",\n usageNotes: \"- date accepts shorthand (\\\"now 1-H\\\", \\\"today 1-m\\\", \\\"today 5-y\\\", etc.) or custom \\\"yyyy-mm-dd yyyy-mm-dd\\\" ranges.\\n- data_type controls the shape of returned data: TIMESERIES, GEO_MAP, GEO_MAP_0, RELATED_TOPICS, or RELATED_QUERIES.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The search term to look up on Google Trends\"},\"hl\":{\"type\":\"string\",\"description\":\"Language code (e.g. \\\"en\\\")\"},\"geo\":{\"type\":\"string\",\"description\":\"Geographic region: empty string for worldwide, or a two-letter country code\"},\"data_type\":{\"enum\":[\"TIMESERIES\",\"GEO_MAP\",\"GEO_MAP_0\",\"RELATED_TOPICS\",\"RELATED_QUERIES\"],\"type\":\"string\",\"description\":\"Type of trend data to return\"},\"cat\":{\"type\":\"string\",\"description\":\"Category filter (\\\"0\\\" for all categories)\"},\"date\":{\"type\":\"string\",\"description\":\"Date range for trend data. Available options: - \\\"now 1-H\\\" - Past hour - \\\"now 4-H\\\" - Past 4 hours - \\\"now 1-d\\\" - Past day - \\\"now 7-d\\\" - Past 7 days - \\\"today 1-m\\\" - Past 30 days - \\\"today 3-m\\\" - Past 90 days - \\\"today 12-m\\\" - Past 12 months - \\\"today 5-y\\\" - Past 5 years - \\\"all - 2004\\\" - present - You can also pass custom values: \\\"yyyy-mm-dd yyyy-mm-dd\\\"\"},\"ts\":{\"type\":\"string\",\"description\":\"Timezone offset in minutes (-1439 to 1439, default: 420 for PDT)\"}},\"required\":[\"text\",\"hl\",\"geo\",\"data_type\",\"cat\",\"date\",\"ts\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"trends\":{\"type\":\"object\",\"description\":\"Google Trends data for the searched term\"}},\"required\":[\"trends\"]},\n },\n \"searchPerplexity\": {\n stepType: \"searchPerplexity\",\n description: \"Search the web using the Perplexity API and return structured results.\",\n usageNotes: \"- Defaults to US results. Use countryCode (ISO code) to filter by country.\\n- Returns 10 results by default, configurable from 1 to 20.\\n- The variable receives text or JSON depending on exportType. The direct execution output always returns structured results.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Search query to send to Perplexity\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Output format for the variable: plain text or structured JSON\"},\"countryCode\":{\"type\":\"string\",\"description\":\"ISO country code to filter results by region (e.g. \\\"us\\\", \\\"gb\\\")\"},\"numResults\":{\"type\":\"number\",\"description\":\"Number of results to return (1-20, default: 10)\"}},\"required\":[\"query\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Page title of the search result\"},\"description\":{\"type\":\"string\",\"description\":\"Snippet or description of the search result\"},\"url\":{\"type\":\"string\",\"description\":\"URL of the search result page\"}},\"required\":[\"title\",\"description\",\"url\"]},\"description\":\"List of structured search results\"}},\"required\":[\"results\"]},\n },\n \"searchXPosts\": {\n stepType: \"searchXPosts\",\n description: \"Search recent X (Twitter) posts matching a query.\",\n usageNotes: \"- Searches only the past 7 days of posts.\\n- Query supports X API v2 search operators (up to 512 characters).\\n\\nAvailable search operators in query:\\n\\n| Operator | Description |\\n| -----------------| -------------------------------------------------|\\n| from: | Posts from a specific user (e.g., from:elonmusk) |\\n| to: | Posts sent to a specific user (e.g., to:NASA) |\\n| @ | Mentions a user (e.g., @openai) |\\n| # | Hashtag search (e.g., #AI) |\\n| is:retweet | Filters retweets |\\n| is:reply | Filters replies |\\n| has:media | Posts containing media (images, videos, or GIFs) |\\n| has:links | Posts containing URLs |\\n| lang: | Filters by language (e.g., lang:en) |\\n| - | Excludes specific terms (e.g., -spam) |\\n| () | Groups terms or operators (e.g., (AI OR ML)) |\\n| AND, OR, NOT | Boolean logic for combining or excluding terms |\\n\\nConjunction-Required Operators (must be combined with a standalone operator):\\n\\n| Operator | Description |\\n| ------------ | -----------------------------------------------|\\n| has:media | Posts containing media (images, videos, or GIFs) |\\n| has:links | Posts containing URLs |\\n| is:retweet | Filters retweets |\\n| is:reply | Filters replies |\\n\\nFor example, has:media alone is invalid, but #AI has:media is valid.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Search query (max 512 chars, supports X API v2 search operators)\"},\"scope\":{\"enum\":[\"recent\",\"all\"],\"type\":\"string\",\"description\":\"Search scope: \\\"recent\\\" for past 7 days or \\\"all\\\" for full archive\"},\"options\":{\"type\":\"object\",\"properties\":{\"startTime\":{\"type\":\"string\",\"description\":\"ISO 8601 date; only return posts after this time\"},\"endTime\":{\"type\":\"string\",\"description\":\"ISO 8601 date; only return posts before this time\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Number of results to return (default: 50, max: 100)\"}},\"description\":\"Additional search options\"}},\"required\":[\"query\",\"scope\",\"options\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"posts\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Unique post identifier\"},\"authorId\":{\"type\":\"string\",\"description\":\"Author's X user ID\"},\"dateCreated\":{\"type\":\"string\",\"description\":\"ISO 8601 timestamp when the post was created\"},\"text\":{\"type\":\"string\",\"description\":\"Text content of the post\"},\"stats\":{\"type\":\"object\",\"properties\":{\"retweets\":{\"type\":\"number\",\"description\":\"Number of retweets/reposts\"},\"replies\":{\"type\":\"number\",\"description\":\"Number of replies\"},\"likes\":{\"type\":\"number\",\"description\":\"Number of likes\"}},\"required\":[\"retweets\",\"replies\",\"likes\"],\"description\":\"Engagement statistics for the post\"}},\"required\":[\"id\",\"authorId\",\"dateCreated\",\"text\",\"stats\"]},\"description\":\"List of matching X posts\"}},\"required\":[\"posts\"]},\n },\n \"searchYoutube\": {\n stepType: \"searchYoutube\",\n description: \"Search for YouTube videos by keyword.\",\n usageNotes: \"- Supports pagination (up to 5 pages) and country/language filters.\\n- Use the filter/filterType fields for YouTube search parameter (sp) filters.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Search query for YouTube videos\"},\"limitPages\":{\"type\":\"string\",\"description\":\"Maximum number of pages to fetch (1-5)\"},\"filter\":{\"type\":\"string\",\"description\":\"YouTube search parameter (sp) filter value\"},\"filterType\":{\"type\":\"string\",\"description\":\"Filter type identifier\"},\"countryCode\":{\"type\":\"string\",\"description\":\"Google gl country code for regional results (default: \\\"US\\\")\"},\"languageCode\":{\"type\":\"string\",\"description\":\"Google hl language code for result language (default: \\\"en\\\")\"}},\"required\":[\"query\",\"limitPages\",\"filter\",\"filterType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"results\":{\"type\":\"object\",\"description\":\"YouTube search results including video_results, channel_results, etc.\"}},\"required\":[\"results\"]},\n },\n \"searchYoutubeTrends\": {\n stepType: \"searchYoutubeTrends\",\n description: \"Retrieve trending videos on YouTube by category and region.\",\n usageNotes: \"- Categories: \\\"now\\\" (trending now), \\\"music\\\", \\\"gaming\\\", \\\"films\\\".\\n- Supports country and language filtering.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"bp\":{\"enum\":[\"now\",\"music\",\"gaming\",\"films\"],\"type\":\"string\",\"description\":\"Trending category: \\\"now\\\" (trending now), \\\"music\\\", \\\"gaming\\\", or \\\"films\\\"\"},\"hl\":{\"type\":\"string\",\"description\":\"Language code (e.g. \\\"en\\\")\"},\"gl\":{\"type\":\"string\",\"description\":\"Country code (e.g. \\\"US\\\")\"}},\"required\":[\"bp\",\"hl\",\"gl\"]},\n outputSchema: {\"type\":\"object\"},\n },\n \"sendEmail\": {\n stepType: \"sendEmail\",\n description: \"Send an email to one or more configured recipient addresses.\",\n usageNotes: \"- Recipient email addresses are resolved from OAuth connections configured by the app creator. The user running the workflow does not specify the recipient directly.\\n- If the body is a URL to a hosted HTML file on the CDN, the HTML is fetched and used as the email body.\\n- When generateHtml is enabled, the body text is converted to a styled HTML email using an AI model.\\n- connectionId can be a comma-separated list to send to multiple recipients.\\n- The special connectionId \\\"trigger_email\\\" uses the email address that triggered the workflow.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"subject\":{\"type\":\"string\",\"description\":\"Email subject line\"},\"body\":{\"type\":\"string\",\"description\":\"Email body content (plain text, markdown, HTML, or a CDN URL to an HTML file)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"OAuth connection ID(s) for the recipient(s), comma-separated for multiple\"},\"generateHtml\":{\"type\":\"boolean\",\"description\":\"When true, auto-convert the body text into a styled HTML email using AI\"},\"generateHtmlInstructions\":{\"type\":\"string\",\"description\":\"Natural language instructions for the HTML generation style\"},\"generateHtmlModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Model settings override for HTML generation\"},\"attachments\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"URLs of files to attach to the email\"}},\"required\":[\"subject\",\"body\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"recipients\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Email addresses the message was sent to\"}},\"required\":[\"recipients\"]},\n },\n \"sendGmailDraft\": {\n stepType: \"sendGmailDraft\",\n description: \"Send an existing draft from the connected Gmail account.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail compose scope.\\n- The draft is sent and removed from the Drafts folder.\\n- Use the draft ID returned by the Create Gmail Draft or List Gmail Drafts steps.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"draftId\":{\"type\":\"string\",\"description\":\"Gmail draft ID to send\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"draftId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"sendGmailMessage\": {\n stepType: \"sendGmailMessage\",\n description: \"Send an email from the connected Gmail account.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail compose scope.\\n- messageType controls the body format: \\\"plain\\\" for plain text, \\\"html\\\" for raw HTML, \\\"markdown\\\" for auto-converted markdown.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"to\":{\"type\":\"string\",\"description\":\"Recipient email address(es), comma-separated for multiple\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject line\"},\"message\":{\"type\":\"string\",\"description\":\"Email body content\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"messageType\":{\"enum\":[\"plain\",\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Body format: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\"\"}},\"required\":[\"to\",\"subject\",\"message\",\"messageType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID of the sent email\"}},\"required\":[\"messageId\"]},\n },\n \"sendSMS\": {\n stepType: \"sendSMS\",\n description: \"Send an SMS or MMS message to a phone number configured via OAuth connection.\",\n usageNotes: \"- User is responsible for configuring the connection to the number (MindStudio requires double opt-in to prevent spam)\\n- If mediaUrls are provided, the message is sent as MMS instead of SMS\\n- MMS supports up to 10 media URLs (images, video, audio, PDF) with a 5MB limit per file\\n- MMS is only supported on US and Canadian carriers; international numbers will receive SMS only (media silently dropped)\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"body\":{\"type\":\"string\",\"description\":\"SMS message body text\"},\"connectionId\":{\"type\":\"string\",\"description\":\"OAuth connection ID for the recipient phone number\"},\"mediaUrls\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Optional array of media URLs to send as MMS (up to 10, 5MB each)\"}},\"required\":[\"body\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"setGmailReadStatus\": {\n stepType: \"setGmailReadStatus\",\n description: \"Mark one or more Gmail emails as read or unread.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail modify scope.\\n- Accepts one or more message IDs as a comma-separated string or array.\\n- Set markAsRead to true to mark as read, false to mark as unread.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"messageIds\":{\"type\":\"string\",\"description\":\"Gmail message ID(s), comma-separated\"},\"markAsRead\":{\"type\":\"boolean\",\"description\":\"true = mark as read, false = mark as unread\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"messageIds\",\"markAsRead\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"setRunTitle\": {\n stepType: \"setRunTitle\",\n description: \"Set the title of the agent run for the user's history\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"The title to assign to the agent run (supports variable interpolation)\"}},\"required\":[\"title\"],\"description\":\"Configuration for the set run title step\"},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"setVariable\": {\n stepType: \"setVariable\",\n description: \"Explicitly set a variable to a given value.\",\n usageNotes: \"- Useful for bootstrapping global variables or setting constants.\\n- The variable name and value both support variable interpolation.\\n- The type field is a UI hint only (controls input widget in the editor).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"value\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}}]}},\"required\":[\"value\"],\"description\":\"Configuration for the set variable step\"},\n outputSchema: {\"type\":\"object\"},\n },\n \"telegramEditMessage\": {\n stepType: \"telegramEditMessage\",\n description: \"Edit a previously sent Telegram message. Use with the message ID returned by Send Telegram Message.\",\n usageNotes: \"- Only text messages sent by the bot can be edited.\\n- The messageId is returned by the Send Telegram Message step.\\n- Common pattern: send a \\\"Processing...\\\" message, do work, then edit it with the result.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID containing the message\"},\"messageId\":{\"type\":\"string\",\"description\":\"ID of the message to edit\"},\"text\":{\"type\":\"string\",\"description\":\"New message text (MarkdownV2 formatting supported)\"}},\"required\":[\"botToken\",\"chatId\",\"messageId\",\"text\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"telegramReplyToMessage\": {\n stepType: \"telegramReplyToMessage\",\n description: \"Send a reply to a specific Telegram message. The reply will be visually threaded in the chat.\",\n usageNotes: \"- Use the rawMessage.message_id from the incoming trigger variables to reply to the user's message.\\n- Especially useful in group chats where replies provide context.\\n- Returns the sent message ID, which can be used with Edit Telegram Message.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the reply to\"},\"replyToMessageId\":{\"type\":\"string\",\"description\":\"ID of the message to reply to\"},\"text\":{\"type\":\"string\",\"description\":\"Reply text (MarkdownV2 formatting supported)\"}},\"required\":[\"botToken\",\"chatId\",\"replyToMessageId\",\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"number\",\"description\":\"ID of the sent reply message\"}},\"required\":[\"messageId\"]},\n },\n \"telegramSendAudio\": {\n stepType: \"telegramSendAudio\",\n description: \"Send an audio file to a Telegram chat as music or a voice note via a bot.\",\n usageNotes: \"- \\\"audio\\\" mode sends as a standard audio file. \\\"voice\\\" mode sends as a voice message (re-uploads the file for large file support).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the audio to\"},\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the audio file to send\"},\"mode\":{\"enum\":[\"audio\",\"voice\"],\"type\":\"string\",\"description\":\"Send as a standard audio track (\\\"audio\\\") or as a voice note (\\\"voice\\\")\"},\"caption\":{\"type\":\"string\",\"description\":\"Optional caption text for the audio\"}},\"required\":[\"botToken\",\"chatId\",\"audioUrl\",\"mode\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"telegramSendFile\": {\n stepType: \"telegramSendFile\",\n description: \"Send a document/file to a Telegram chat via a bot.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the file to\"},\"fileUrl\":{\"type\":\"string\",\"description\":\"URL of the document/file to send\"},\"caption\":{\"type\":\"string\",\"description\":\"Optional caption text for the file\"}},\"required\":[\"botToken\",\"chatId\",\"fileUrl\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"telegramSendImage\": {\n stepType: \"telegramSendImage\",\n description: \"Send an image to a Telegram chat via a bot.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the image to\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the image to send\"},\"caption\":{\"type\":\"string\",\"description\":\"Optional caption text for the image\"}},\"required\":[\"botToken\",\"chatId\",\"imageUrl\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"telegramSendMessage\": {\n stepType: \"telegramSendMessage\",\n description: \"Send a text message to a Telegram chat via a bot.\",\n usageNotes: \"- Messages are sent using MarkdownV2 formatting. Special characters are auto-escaped.\\n- botToken format is \\\"botId:token\\\" — both parts are required.\\n- Returns the sent message ID, which can be used with Edit Telegram Message to update the message later.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the message to\"},\"text\":{\"type\":\"string\",\"description\":\"Message text to send (MarkdownV2 formatting supported)\"}},\"required\":[\"botToken\",\"chatId\",\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"number\",\"description\":\"ID of the sent Telegram message\"}},\"required\":[\"messageId\"]},\n },\n \"telegramSendVideo\": {\n stepType: \"telegramSendVideo\",\n description: \"Send a video to a Telegram chat via a bot.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the video to\"},\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video to send\"},\"caption\":{\"type\":\"string\",\"description\":\"Optional caption text for the video\"}},\"required\":[\"botToken\",\"chatId\",\"videoUrl\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"telegramSetTyping\": {\n stepType: \"telegramSetTyping\",\n description: \"Show the \\\"typing...\\\" indicator in a Telegram chat via a bot.\",\n usageNotes: \"- The typing indicator automatically expires after a few seconds. Use this right before sending a message for a natural feel.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to show the typing indicator in\"}},\"required\":[\"botToken\",\"chatId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"textToSpeech\": {\n stepType: \"textToSpeech\",\n description: \"Generate an audio file from provided text using a speech model.\",\n usageNotes: \"- The text field contains the exact words to be spoken (not instructions).\\n- In foreground mode, the audio is displayed to the user. In background mode, the URL is saved to a variable.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The text to convert to speech\"},\"intermediateAsset\":{\"type\":\"boolean\"},\"speechModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Speech synthesis model identifier\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default speech model if not specified\"}},\"required\":[\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the generated audio file\"}},\"required\":[\"audioUrl\"]},\n },\n \"transcribeAudio\": {\n stepType: \"transcribeAudio\",\n description: \"Convert an audio file to text using a transcription model.\",\n usageNotes: \"- The prompt field provides optional context to improve transcription accuracy (e.g. language, speaker names, domain).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the audio file to transcribe\"},\"prompt\":{\"type\":\"string\",\"description\":\"Optional context to improve transcription accuracy (e.g. language, speaker names, domain terms)\"},\"transcriptionModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Audio transcription model identifier\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default transcription model if not specified\"}},\"required\":[\"audioUrl\",\"prompt\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The transcribed text from the audio file\"}},\"required\":[\"text\"]},\n },\n \"trimMedia\": {\n stepType: \"trimMedia\",\n description: \"Trim an audio or video clip\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"inputUrl\":{\"type\":\"string\",\"description\":\"URL of the source audio or video file to trim\"},\"start\":{\"type\":[\"number\",\"string\"]},\"duration\":{\"type\":[\"string\",\"number\"]},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"inputUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"mediaUrl\":{\"type\":\"string\",\"description\":\"URL of the trimmed media file\"}},\"required\":[\"mediaUrl\"]},\n },\n \"updateGmailLabels\": {\n stepType: \"updateGmailLabels\",\n description: \"Add or remove labels on Gmail messages, identified by message IDs or a search query.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail modify scope.\\n- Provide either a query (Gmail search syntax) or explicit messageIds to target messages.\\n- Label IDs can be label names or Gmail label IDs — names are resolved automatically.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Gmail search query to find messages (alternative to messageIds)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"messageIds\":{\"type\":\"string\",\"description\":\"Comma-separated message IDs to target (alternative to query)\"},\"addLabelIds\":{\"type\":\"string\",\"description\":\"Comma-separated label names or IDs to add\"},\"removeLabelIds\":{\"type\":\"string\",\"description\":\"Comma-separated label names or IDs to remove\"}},\"required\":[\"query\",\"messageIds\",\"addLabelIds\",\"removeLabelIds\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"updatedMessageIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Gmail message IDs that were updated\"}},\"required\":[\"updatedMessageIds\"]},\n },\n \"updateGoogleCalendarEvent\": {\n stepType: \"updateGoogleCalendarEvent\",\n description: \"Update an existing event on a Google Calendar. Only specified fields are changed.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- Fetches the existing event first, then applies only the provided updates. Omitted fields are left unchanged.\\n- Attendees are specified as one email address per line, and replace the entire attendee list.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"eventId\":{\"type\":\"string\",\"description\":\"Google Calendar event ID to update\"},\"summary\":{\"type\":\"string\",\"description\":\"Updated event title\"},\"description\":{\"type\":\"string\",\"description\":\"Updated event description\"},\"location\":{\"type\":\"string\",\"description\":\"Updated event location\"},\"startDateTime\":{\"type\":\"string\",\"description\":\"Updated start time in ISO 8601 format\"},\"endDateTime\":{\"type\":\"string\",\"description\":\"Updated end time in ISO 8601 format\"},\"attendees\":{\"type\":\"string\",\"description\":\"Updated attendee email addresses (one per line, replaces all existing attendees)\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\" if omitted)\"}},\"required\":[\"eventId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"eventId\":{\"type\":\"string\",\"description\":\"Google Calendar event ID\"},\"htmlLink\":{\"type\":\"string\",\"description\":\"URL to view the updated event in Google Calendar\"}},\"required\":[\"eventId\",\"htmlLink\"]},\n },\n \"updateGoogleDoc\": {\n stepType: \"updateGoogleDoc\",\n description: \"Update the contents of an existing Google Document.\",\n usageNotes: \"- operationType controls how content is applied: \\\"addToTop\\\" prepends, \\\"addToBottom\\\" appends, \\\"overwrite\\\" replaces all content.\\n- textType determines how the text field is interpreted: \\\"plain\\\" for plain text, \\\"html\\\" for HTML markup, \\\"markdown\\\" for Markdown.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"description\":\"Google Document ID to update\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"text\":{\"type\":\"string\",\"description\":\"New content to write to the document\"},\"textType\":{\"enum\":[\"plain\",\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Format of the text field: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\"\"},\"operationType\":{\"enum\":[\"addToTop\",\"addToBottom\",\"overwrite\"],\"type\":\"string\",\"description\":\"How to apply the content: \\\"addToTop\\\", \\\"addToBottom\\\", or \\\"overwrite\\\"\"}},\"required\":[\"documentId\",\"text\",\"textType\",\"operationType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"documentUrl\":{\"type\":\"string\",\"description\":\"URL of the updated Google Document\"}},\"required\":[\"documentUrl\"]},\n },\n \"updateGoogleSheet\": {\n stepType: \"updateGoogleSheet\",\n description: \"Update a Google Spreadsheet with new data.\",\n usageNotes: \"- operationType controls how data is written: \\\"addToBottom\\\" appends rows, \\\"overwrite\\\" replaces all data, \\\"range\\\" writes to a specific cell range.\\n- Data should be provided as CSV in the text field.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"CSV data to write to the spreadsheet\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"spreadsheetId\":{\"type\":\"string\",\"description\":\"Google Spreadsheet ID to update\"},\"range\":{\"type\":\"string\",\"description\":\"Target cell range in A1 notation (used with \\\"range\\\" operationType)\"},\"operationType\":{\"enum\":[\"addToBottom\",\"overwrite\",\"range\"],\"type\":\"string\",\"description\":\"How to apply the data: \\\"addToBottom\\\", \\\"overwrite\\\", or \\\"range\\\"\"}},\"required\":[\"text\",\"spreadsheetId\",\"range\",\"operationType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"spreadsheetUrl\":{\"type\":\"string\",\"description\":\"URL of the updated Google Spreadsheet\"}},\"required\":[\"spreadsheetUrl\"]},\n },\n \"uploadDataSourceDocument\": {\n stepType: \"uploadDataSourceDocument\",\n description: \"Upload a file into an existing data source from a URL or raw text content.\",\n usageNotes: \"- If \\\"file\\\" is a single URL, the file is downloaded from that URL and uploaded.\\n- If \\\"file\\\" is any other string, a .txt document is created from that content and uploaded.\\n- The block waits (polls) for processing to complete before transitioning, up to 5 minutes.\\n- Once processing finishes, vectors are loaded into Milvus so the data source is immediately queryable.\\n- Supported file types (when using a URL) are the same as the data source upload UI (PDF, DOCX, TXT, etc.).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"dataSourceId\":{\"type\":\"string\",\"description\":\"ID of the target data source (supports variable interpolation)\"},\"file\":{\"type\":\"string\",\"description\":\"A URL to download, or raw text content to create a .txt document from (supports variable interpolation)\"},\"fileName\":{\"type\":\"string\",\"description\":\"Display name for the document (supports variable interpolation)\"}},\"required\":[\"dataSourceId\",\"file\",\"fileName\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"upscaleImage\": {\n stepType: \"upscaleImage\",\n description: \"Increase the resolution of an image using AI upscaling.\",\n usageNotes: \"- Output is re-hosted on the CDN as a PNG.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the image to upscale\"},\"targetResolution\":{\"enum\":[\"2k\",\"4k\",\"8k\"],\"type\":\"string\",\"description\":\"Target output resolution\"},\"engine\":{\"enum\":[\"standard\",\"pro\"],\"type\":\"string\",\"description\":\"Upscaling engine quality tier\"}},\"required\":[\"imageUrl\",\"targetResolution\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"CDN URL of the upscaled image (PNG)\"}},\"required\":[\"imageUrl\"]},\n },\n \"upscaleVideo\": {\n stepType: \"upscaleVideo\",\n description: \"Upscale a video file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video to upscale\"},\"targetResolution\":{\"enum\":[\"720p\",\"1080p\",\"2K\",\"4K\"],\"type\":\"string\",\"description\":\"Target output resolution for the upscaled video\"},\"engine\":{\"enum\":[\"standard\",\"pro\",\"ultimate\",\"flashvsr\",\"seedance\",\"seedvr2\",\"runwayml/upscale-v1\"],\"type\":\"string\",\"description\":\"Upscaling engine to use. Higher tiers produce better quality at higher cost.\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"targetResolution\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the upscaled video\"}},\"required\":[\"videoUrl\"]},\n },\n \"userMessage\": {\n stepType: \"userMessage\",\n description: \"Send a message to an AI model and return the response, or echo a system message.\",\n usageNotes: \"- Source \\\"user\\\" sends the message to an LLM and returns the model's response.\\n- Source \\\"system\\\" echoes the message content directly (no AI call).\\n- Mode \\\"background\\\" saves the result to a variable. Mode \\\"foreground\\\" streams it to the user (not available in direct execution).\\n- Structured output (JSON/CSV) can be enforced via structuredOutputType and structuredOutputExample.\\n- When executed inside a v2 app method (managed sandbox or local dev tunnel),\\n LLM token output can be streamed to the frontend in real time via an SSE\\n side-channel. The frontend opts in by passing { stream: true } to the method\\n invocation via @mindstudio-ai/interface. Tokens are published to Redis\\n pub/sub as they arrive and forwarded as SSE events on the invoke response.\\n The method code itself is unchanged — streaming is transparent to the\\n developer. See V2ExecutionService.ts and the invoke handler in V2Apps for\\n the server-side plumbing.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"description\":\"The message to send (prompt for AI, or text for system echo)\"},\"source\":{\"enum\":[\"user\",\"system\"],\"type\":\"string\",\"description\":\"Message source: \\\"user\\\" sends to AI model, \\\"system\\\" echoes message content directly. Defaults to \\\"user\\\"\"},\"modelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Model configuration override. Optional; uses the workflow's default model if not specified\"},\"structuredOutputType\":{\"enum\":[\"text\",\"json\",\"csv\"],\"type\":\"string\",\"description\":\"Output format constraint for structured responses\"},\"structuredOutputExample\":{\"type\":\"string\",\"description\":\"Sample showing the desired output shape (for JSON/CSV formats). A TypeScript interface is also useful here for more complex types.\"},\"chatHistoryMode\":{\"enum\":[\"include\",\"exclude\"],\"type\":\"string\",\"description\":\"Whether to include or exclude prior chat history in the AI context\"}},\"required\":[\"message\"],\"description\":\"Configuration for the user message step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"type\":\"string\",\"description\":\"The AI model's response or echoed system message content\"}},\"required\":[\"content\"]},\n },\n \"videoFaceSwap\": {\n stepType: \"videoFaceSwap\",\n description: \"Swap faces in a video file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video containing faces to swap\"},\"faceImageUrl\":{\"type\":\"string\",\"description\":\"URL of the image containing the replacement face\"},\"targetIndex\":{\"type\":\"number\",\"description\":\"Zero-based index of the face to replace in the video\"},\"engine\":{\"type\":\"string\",\"description\":\"Face swap engine to use\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"faceImageUrl\",\"targetIndex\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the face-swapped video\"}},\"required\":[\"videoUrl\"]},\n },\n \"videoRemoveBackground\": {\n stepType: \"videoRemoveBackground\",\n description: \"Remove or replace background from a video\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video\"},\"newBackground\":{\"enum\":[\"transparent\",\"image\"],\"type\":\"string\",\"description\":\"Whether to make the background transparent or replace it with an image\"},\"newBackgroundImageUrl\":{\"type\":\"string\",\"description\":\"URL of a replacement background image. Required when newBackground is 'image'.\"},\"engine\":{\"type\":\"string\",\"description\":\"Background removal engine to use\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"newBackground\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video with background removed or replaced\"}},\"required\":[\"videoUrl\"]},\n },\n \"videoRemoveWatermark\": {\n stepType: \"videoRemoveWatermark\",\n description: \"Remove a watermark from a video\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video containing a watermark\"},\"engine\":{\"type\":\"string\",\"description\":\"Watermark removal engine to use\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video with watermark removed\"}},\"required\":[\"videoUrl\"]},\n },\n \"watermarkImage\": {\n stepType: \"watermarkImage\",\n description: \"Overlay a watermark image onto another image.\",\n usageNotes: \"- The watermark is placed at the specified corner with configurable padding and width.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the base image\"},\"watermarkImageUrl\":{\"type\":\"string\",\"description\":\"URL of the watermark image to overlay\"},\"corner\":{\"enum\":[\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"],\"type\":\"string\",\"description\":\"Corner position for the watermark placement\"},\"paddingPx\":{\"type\":\"number\",\"description\":\"Padding from the corner in pixels\"},\"widthPx\":{\"type\":\"number\",\"description\":\"Width of the watermark overlay in pixels\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"imageUrl\",\"watermarkImageUrl\",\"corner\",\"paddingPx\",\"widthPx\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"CDN URL of the watermarked image\"}},\"required\":[\"imageUrl\"]},\n },\n \"watermarkVideo\": {\n stepType: \"watermarkVideo\",\n description: \"Add an image watermark to a video\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the watermark image to overlay\"},\"corner\":{\"enum\":[\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"],\"type\":\"string\",\"description\":\"Corner position for the watermark placement\"},\"paddingPx\":{\"type\":\"number\",\"description\":\"Padding from the corner in pixels\"},\"widthPx\":{\"type\":\"number\",\"description\":\"Width of the watermark overlay in pixels\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"imageUrl\",\"corner\",\"paddingPx\",\"widthPx\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the watermarked video\"}},\"required\":[\"videoUrl\"]},\n },\n};\n","import { MindStudioAgent as _MindStudioAgent } from './client.js';\nimport type { StepMethods } from './generated/steps.js';\nimport type { AgentOptions } from './types.js';\nimport type { AuthContext as _AuthContext } from './auth/index.js';\nimport type { Db as _Db } from './db/index.js';\n\n/** MindStudioAgent with all generated step methods. */\nexport type MindStudioAgent = _MindStudioAgent & StepMethods;\n\n/** {@inheritDoc MindStudioAgent} */\nexport const MindStudioAgent = _MindStudioAgent as unknown as {\n new (options?: AgentOptions): MindStudioAgent;\n};\n\nexport { MindStudioError } from './errors.js';\nexport { AuthContext, Roles } from './auth/index.js';\nexport type { Db, DefineTableOptions, Table, Query, Predicate, Accessor, PushInput, UpdateInput, SystemFields } from './db/index.js';\nexport type {\n AgentOptions,\n StepExecutionOptions,\n StepExecutionResult,\n StepExecutionMeta,\n User,\n ResolvedUser,\n AgentInfo,\n ListAgentsResult,\n UserInfoResult,\n RunAgentOptions,\n RunAgentResult,\n MindStudioModel,\n MindStudioModelSummary,\n ModelType,\n ConnectorService,\n ConnectorActionDetail,\n Connection,\n StepCostEstimateEntry,\n UploadFileResult,\n AppRoleAssignment,\n AppAuthContext,\n AppDatabaseColumnSchema,\n AppDatabaseTable,\n AppDatabase,\n AppContextResult,\n BatchStepInput,\n BatchStepResult,\n ExecuteStepBatchOptions,\n ExecuteStepBatchResult,\n} from './types.js';\n\n// Re-export all generated types\nexport * from './generated/types.js';\nexport type { StepMethods } from './generated/steps.js';\nexport {\n monacoSnippets,\n blockTypeAliases,\n type MonacoSnippet,\n type MonacoSnippetField,\n type MonacoSnippetFieldType,\n} from './generated/snippets.js';\nexport {\n stepMetadata,\n type StepMetadata,\n} from './generated/metadata.js';\n\n// ---------------------------------------------------------------------------\n// Lazy default singleton\n// ---------------------------------------------------------------------------\n\n/**\n * Lazy default instance — created on first property access.\n * Uses env/config auth, so no constructor args needed.\n *\n * ```ts\n * import { mindstudio } from '@mindstudio-ai/agent';\n * const { imageUrl } = await mindstudio.generateImage({ prompt: 'a sunset' });\n * ```\n */\nlet _default: MindStudioAgent;\nexport const mindstudio: MindStudioAgent = new Proxy(\n {} as MindStudioAgent,\n {\n get(_, prop, receiver) {\n _default ??= new MindStudioAgent();\n const value = Reflect.get(_default, prop, _default);\n return typeof value === 'function' ? value.bind(_default) : value;\n },\n },\n);\n\nexport default mindstudio;\n\n// ---------------------------------------------------------------------------\n// Top-level auth and db — bound to the lazy singleton\n// ---------------------------------------------------------------------------\n//\n// These provide the ergonomic import style matching the sketch's\n// `import { db, auth, Roles } from '@mindstudio/app'`:\n//\n// ```ts\n// import { db, auth, Roles } from '@mindstudio-ai/agent';\n//\n// const Orders = db.defineTable<Order>('orders');\n// auth.requireRole(Roles.admin);\n// ```\n//\n// Under the hood they proxy to `mindstudio.db` and `mindstudio.auth`.\n// The mindstudio singleton is lazily created on first access, so these\n// are safe to reference at module scope.\n\n/**\n * Top-level `auth` namespace bound to the default singleton.\n *\n * Provides the current user's identity and roles. Requires context\n * hydration before use — call `await mindstudio.ensureContext()` or\n * perform any `db` operation first.\n *\n * @example\n * ```ts\n * import { auth, Roles } from '@mindstudio-ai/agent';\n *\n * auth.requireRole(Roles.admin);\n * const admins = auth.getUsersByRole(Roles.admin);\n * ```\n */\nexport const auth: _AuthContext = new Proxy(\n {} as _AuthContext,\n {\n get(_, prop) {\n const target = mindstudio.auth;\n const value = Reflect.get(target, prop, target);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n },\n);\n\n/**\n * Top-level `db` namespace bound to the default singleton.\n *\n * Use `db.defineTable<T>(name)` to create typed collections. Table\n * definitions are lazy — no HTTP until you await a query. Context is\n * auto-hydrated on first query execution.\n *\n * @example\n * ```ts\n * import { db } from '@mindstudio-ai/agent';\n *\n * const Orders = db.defineTable<Order>('orders');\n * const active = await Orders.filter(o => o.status === 'active').take(10);\n * ```\n */\nexport const db: _Db = new Proxy(\n {} as _Db,\n {\n get(_, prop) {\n const target = mindstudio.db;\n const value = Reflect.get(target, prop, target);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n },\n);\n\n/**\n * Top-level `stream` function bound to the default singleton.\n *\n * Send a stream chunk to the caller via SSE. When the method was called\n * with `stream: true`, chunks arrive in real-time. When there is no active\n * stream, calls are silently ignored.\n *\n * @example\n * ```ts\n * import { stream } from '@mindstudio-ai/agent';\n *\n * await stream('Processing...');\n * await stream({ progress: 50 });\n * ```\n */\nexport const stream = (data: string | Record<string, unknown>) =>\n mindstudio.stream(data);\n\n/**\n * Resolve a user ID to display info (name, email, profile picture).\n * Bound to the default singleton.\n *\n * @example\n * ```ts\n * import { resolveUser } from '@mindstudio-ai/agent';\n *\n * const user = await resolveUser(order.requestedBy);\n * if (user) console.log(user.name, user.email);\n * ```\n */\nexport const resolveUser = (userId: string) => mindstudio.resolveUser(userId);\n"],"mappings":"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","names":["inner","db","sleep","MindStudioAgent"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/rate-limit.ts","../src/config.ts","../src/auth/index.ts","../src/db/sql.ts","../src/db/predicate.ts","../src/db/query.ts","../src/db/mutation.ts","../src/db/table.ts","../src/db/index.ts","../src/generated/steps.ts","../src/client.ts","../src/generated/snippets.ts","../src/generated/metadata.ts","../src/index.ts"],"sourcesContent":["/**\n * Error thrown when a MindStudio API request fails.\n *\n * Contains the HTTP status code, an error code from the API,\n * and any additional details returned in the response body.\n */\nexport class MindStudioError extends Error {\n override readonly name = 'MindStudioError';\n\n constructor(\n message: string,\n /** Machine-readable error code from the API (e.g. \"invalid_step_config\"). */\n public readonly code: string,\n /** HTTP status code of the failed request. */\n public readonly status: number,\n /** Raw error body from the API, if available. */\n public readonly details?: unknown,\n ) {\n super(message);\n }\n}\n","import { MindStudioError } from './errors.js';\nimport type { RateLimiter } from './rate-limit.js';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n token: string;\n rateLimiter: RateLimiter;\n maxRetries: number;\n}\n\nexport async function request<T>(\n config: HttpClientConfig,\n method: 'GET' | 'POST',\n path: string,\n body?: unknown,\n): Promise<{ data: T; headers: Headers }> {\n const url = `${config.baseUrl}/developer/v2${path}`;\n\n await config.rateLimiter.acquire();\n\n try {\n return await requestWithRetry<T>(config, method, url, body, 0);\n } finally {\n config.rateLimiter.release();\n }\n}\n\nasync function requestWithRetry<T>(\n config: HttpClientConfig,\n method: string,\n url: string,\n body: unknown,\n attempt: number,\n): Promise<{ data: T; headers: Headers }> {\n const res = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${config.token}`,\n 'Content-Type': 'application/json',\n 'User-Agent': '@mindstudio-ai/agent',\n },\n body: body != null ? JSON.stringify(body) : undefined,\n });\n\n // Update rate limiter with latest server-reported limits\n config.rateLimiter.updateFromHeaders(res.headers);\n\n if (res.status === 429 && attempt < config.maxRetries) {\n const retryAfter = res.headers.get('retry-after');\n const waitMs = retryAfter ? parseFloat(retryAfter) * 1000 : 1000;\n await sleep(waitMs);\n return requestWithRetry<T>(config, method, url, body, attempt + 1);\n }\n\n if (!res.ok) {\n const errorBody = await res.json().catch(() => ({}));\n throw new MindStudioError(\n (errorBody as Record<string, string>).message ||\n `${res.status} ${res.statusText}`,\n (errorBody as Record<string, string>).code || 'api_error',\n res.status,\n errorBody,\n );\n }\n\n const data = (await res.json()) as T;\n return { data, headers: res.headers };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { MindStudioError } from './errors.js';\n\nexport type AuthType = 'internal' | 'apiKey';\n\nconst DEFAULTS: Record<AuthType, { concurrency: number; callCap: number }> = {\n internal: { concurrency: 10, callCap: 500 },\n apiKey: { concurrency: 20, callCap: Infinity },\n};\n\nexport class RateLimiter {\n private inflight = 0;\n private concurrencyLimit: number;\n private callCount = 0;\n private callCap: number;\n private queue: Array<() => void> = [];\n\n constructor(readonly authType: AuthType) {\n this.concurrencyLimit = DEFAULTS[authType].concurrency;\n this.callCap = DEFAULTS[authType].callCap;\n }\n\n /** Acquire a slot. Resolves when a concurrent slot is available. */\n async acquire(): Promise<void> {\n if (this.callCount >= this.callCap) {\n throw new MindStudioError(\n `Call cap reached (${this.callCap} calls). ` +\n 'Internal tokens are limited to 500 calls per execution.',\n 'call_cap_exceeded',\n 429,\n );\n }\n\n if (this.inflight < this.concurrencyLimit) {\n this.inflight++;\n this.callCount++;\n return;\n }\n\n return new Promise<void>((resolve) => {\n this.queue.push(() => {\n this.inflight++;\n this.callCount++;\n resolve();\n });\n });\n }\n\n /** Release a slot and let the next queued request proceed. */\n release(): void {\n this.inflight--;\n const next = this.queue.shift();\n if (next) next();\n }\n\n /** Update limits from response headers. */\n updateFromHeaders(headers: Headers): void {\n const concurrency = headers.get('x-ratelimit-concurrency-limit');\n if (concurrency) {\n this.concurrencyLimit = parseInt(concurrency, 10);\n }\n const limit = headers.get('x-ratelimit-limit');\n if (limit && this.authType === 'internal') {\n this.callCap = parseInt(limit, 10);\n }\n }\n\n /** Read current rate limit state from response headers. */\n static parseHeaders(headers: Headers): {\n remaining: number | undefined;\n concurrencyRemaining: number | undefined;\n } {\n const remaining = headers.get('x-ratelimit-remaining');\n const concurrencyRemaining = headers.get(\n 'x-ratelimit-concurrency-remaining',\n );\n return {\n remaining: remaining != null ? parseInt(remaining, 10) : undefined,\n concurrencyRemaining:\n concurrencyRemaining != null\n ? parseInt(concurrencyRemaining, 10)\n : undefined,\n };\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface MindStudioConfig {\n apiKey?: string;\n baseUrl?: string;\n /** @internal Last update check metadata. */\n _updateCheck?: {\n latestVersion: string;\n checkedAt: number;\n };\n}\n\nfunction configPaths() {\n const dir = join(homedir(), '.mindstudio');\n return { dir, file: join(dir, 'config.json') };\n}\n\nexport function getConfigPath(): string {\n return configPaths().file;\n}\n\nexport function loadConfig(): MindStudioConfig {\n try {\n const raw = readFileSync(configPaths().file, 'utf-8');\n return JSON.parse(raw) as MindStudioConfig;\n } catch {\n return {};\n }\n}\n\nexport function saveConfig(config: MindStudioConfig): void {\n const { dir, file } = configPaths();\n mkdirSync(dir, { recursive: true });\n writeFileSync(file, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\nexport function clearConfig(): void {\n saveConfig({});\n}\n","/**\n * Auth namespace — role-based access control for MindStudio apps.\n *\n * Provides synchronous access to the current user's identity and roles\n * within an app. Hydrated once from app context (either sandbox globals\n * or the `GET /helpers/app-context` endpoint), then all access is sync.\n *\n * ## How it works\n *\n * 1. The platform stores role assignments per app: `{ userId, roleName }[]`\n * 2. On context hydration, the full role map is loaded into memory\n * 3. `auth.hasRole()` / `auth.requireRole()` are simple array lookups\n * 4. `auth.getUsersByRole()` scans the preloaded assignments\n *\n * ## Usage\n *\n * ```ts\n * import { auth, Roles } from '@mindstudio-ai/agent';\n *\n * // Check permissions\n * if (auth.hasRole(Roles.admin, Roles.approver)) {\n * // user has at least one of these roles\n * }\n *\n * // Gate a route — throws 403 if user lacks the role\n * auth.requireRole(Roles.admin);\n *\n * // Look up who has a role\n * const admins = auth.getUsersByRole(Roles.admin);\n * ```\n *\n * ## Roles proxy\n *\n * `Roles` is a convenience proxy: `Roles.admin` === `\"admin\"`. It provides\n * discoverability and typo prevention. In the future, the compilation\n * pipeline will generate a typed `Roles` object from `app.json`, giving\n * compile-time safety. For now, any string property access works.\n */\n\nimport { MindStudioError } from '../errors.js';\nimport type { AppAuthContext, AppRoleAssignment } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// AuthContext — the runtime auth object\n// ---------------------------------------------------------------------------\n\n/**\n * Auth context for the current execution. Created from the app's role\n * assignments and the current user's identity.\n *\n * All methods are synchronous — the full role map is preloaded at\n * context hydration time.\n */\nexport class AuthContext {\n /** The current user's ID. */\n readonly userId: string;\n\n /** The current user's roles in this app. */\n readonly roles: readonly string[];\n\n /** All role assignments for this app (all users, all roles). */\n private readonly _roleAssignments: readonly AppRoleAssignment[];\n\n constructor(ctx: AppAuthContext) {\n this.userId = ctx.userId;\n this._roleAssignments = ctx.roleAssignments;\n\n // Extract the current user's roles from the full assignment list\n this.roles = ctx.roleAssignments\n .filter((a) => a.userId === ctx.userId)\n .map((a) => a.roleName);\n }\n\n /**\n * Check if the current user has **any** of the given roles.\n * Returns true if at least one matches.\n *\n * @example\n * ```ts\n * if (auth.hasRole(Roles.admin, Roles.approver)) {\n * // user is an admin OR an approver\n * }\n * ```\n */\n hasRole(...roles: string[]): boolean {\n return roles.some((r) => this.roles.includes(r));\n }\n\n /**\n * Require the current user to have at least one of the given roles.\n * Throws a `MindStudioError` with code `'forbidden'` and status 403\n * if the user lacks all of the specified roles.\n *\n * Use this at the top of route handlers to gate access.\n *\n * @example\n * ```ts\n * auth.requireRole(Roles.admin);\n * // code below only runs if user is an admin\n * ```\n */\n requireRole(...roles: string[]): void {\n if (!this.hasRole(...roles)) {\n throw new MindStudioError(\n `User does not have required role: ${roles.join(', ')}`,\n 'forbidden',\n 403,\n );\n }\n }\n\n /**\n * Get all user IDs that have the given role in this app.\n * Synchronous — scans the preloaded role assignments.\n *\n * @example\n * ```ts\n * const reviewers = auth.getUsersByRole(Roles.reviewer);\n * // ['user-id-1', 'user-id-2', ...]\n * ```\n */\n getUsersByRole(role: string): string[] {\n return this._roleAssignments\n .filter((a) => a.roleName === role)\n .map((a) => a.userId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Roles proxy — string passthrough for role names\n// ---------------------------------------------------------------------------\n\n/**\n * Convenience proxy for referencing role names. Any property access\n * returns the property name as a string: `Roles.admin === \"admin\"`.\n *\n * This provides:\n * - Discoverability via autocomplete (in typed environments)\n * - Typo prevention (vs raw string literals)\n * - Forward compatibility with the future typed Roles generation\n *\n * In the future, the compilation pipeline will generate a typed `Roles`\n * object from `app.json` roles, replacing this proxy with compile-time\n * checked constants.\n *\n * @example\n * ```ts\n * Roles.admin // \"admin\"\n * Roles.approver // \"approver\"\n * Roles.anything // \"anything\" (no runtime error, any string works)\n * ```\n */\nexport const Roles: Record<string, string> = new Proxy(\n {} as Record<string, string>,\n {\n get(_, prop: string | symbol): string | undefined {\n // Only handle string property access (not Symbols like Symbol.toPrimitive)\n if (typeof prop === 'string') return prop;\n return undefined;\n },\n },\n);\n","/**\n * SQL builders for the `db` namespace.\n *\n * Pure functions that generate SQL strings with `?` placeholder bind params\n * for SQLite. These are used by Table and Query to translate collection\n * operations into queries executed via `POST /_internal/v2/db/query`.\n *\n * ## Parameterized queries\n *\n * All builders return `{ sql, params }` tuples. Values are passed as\n * positional bind params (`?` placeholders) rather than inlined into the\n * SQL string. This is safer and works naturally with the batch endpoint\n * which accepts `{ sql, params }` per query.\n *\n * ## RETURNING support\n *\n * INSERT and UPDATE builders append `RETURNING *` so the platform returns\n * the created/updated row in a single round trip — no separate SELECT needed.\n *\n * ## User type columns\n *\n * Columns with schema type `'user'` store values with a `@@user@@` prefix\n * in SQLite (e.g. `@@user@@550e8400-...`). The `serializeParam()` and\n * `deserializeRow()` functions handle this transparently — application\n * code always works with clean UUID strings.\n */\n\nimport type { AppDatabaseColumnSchema } from '../types.js';\nimport type { SqlQuery } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Value serialization — converts JS values to bind param values\n// ---------------------------------------------------------------------------\n\n/**\n * Serialize a JavaScript value for use as a bind param.\n *\n * - `null` / `undefined` → `null`\n * - `boolean` → `1` or `0` (SQLite convention)\n * - `number` / `string` → passed through\n * - `object` / `array` → JSON-encoded string\n */\nexport function serializeParam(val: unknown): unknown {\n if (val === null || val === undefined) return null;\n if (typeof val === 'boolean') return val ? 1 : 0;\n if (typeof val === 'number' || typeof val === 'string') return val;\n return JSON.stringify(val);\n}\n\n/**\n * Serialize a value for a specific column, handling the @@user@@ prefix\n * for user-type columns.\n */\nexport function serializeColumnParam(\n val: unknown,\n columnName: string,\n columns: AppDatabaseColumnSchema[],\n): unknown {\n const col = columns.find((c) => c.name === columnName);\n\n // User-type columns: add @@user@@ prefix to non-null string values\n if (col?.type === 'user' && typeof val === 'string') {\n return `@@user@@${val}`;\n }\n\n return serializeParam(val);\n}\n\n// ---------------------------------------------------------------------------\n// Inline value escaping — used by the predicate compiler for WHERE clauses\n// ---------------------------------------------------------------------------\n\n/**\n * Escape a JavaScript value for safe inline use in a SQL WHERE clause.\n * Used by the predicate compiler which builds WHERE strings with inlined\n * values (since predicates are parsed from function source code, not from\n * structured data).\n *\n * For structured data (INSERT/UPDATE/SELECT params), use `serializeParam()`\n * with `?` bind params instead.\n */\nexport function escapeValue(val: unknown): string {\n if (val === null || val === undefined) return 'NULL';\n if (typeof val === 'boolean') return val ? '1' : '0';\n if (typeof val === 'number') return String(val);\n if (typeof val === 'string') return `'${val.replace(/'/g, \"''\")}'`;\n const json = JSON.stringify(val);\n return `'${json.replace(/'/g, \"''\")}'`;\n}\n\n// ---------------------------------------------------------------------------\n// Row deserialization — strips @@user@@ prefixes, parses JSON columns\n// ---------------------------------------------------------------------------\n\nconst USER_PREFIX = '@@user@@';\n\n/**\n * Deserialize a row from the database, handling:\n * - Stripping `@@user@@` prefix from user-type columns\n * - Parsing JSON strings for json-type columns\n */\nexport function deserializeRow(\n row: Record<string, unknown>,\n columns: AppDatabaseColumnSchema[],\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(row)) {\n const col = columns.find((c) => c.name === key);\n\n if (col?.type === 'user' && typeof value === 'string' && value.startsWith(USER_PREFIX)) {\n result[key] = value.slice(USER_PREFIX.length);\n } else if (col?.type === 'json' && typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// SELECT builders\n// ---------------------------------------------------------------------------\n\nexport interface SelectOptions {\n /** WHERE clause (with ? placeholders). */\n where?: string;\n /** Params for the WHERE clause. */\n whereParams?: unknown[];\n orderBy?: string;\n desc?: boolean;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Build a SELECT query with bind params.\n */\nexport function buildSelect(table: string, options: SelectOptions = {}): SqlQuery {\n let sql = `SELECT * FROM ${table}`;\n const params: unknown[] = [];\n\n if (options.where) {\n sql += ` WHERE ${options.where}`;\n if (options.whereParams) params.push(...options.whereParams);\n }\n if (options.orderBy) sql += ` ORDER BY ${options.orderBy}${options.desc ? ' DESC' : ' ASC'}`;\n if (options.limit != null) sql += ` LIMIT ${options.limit}`;\n if (options.offset != null) sql += ` OFFSET ${options.offset}`;\n\n return { sql, params: params.length > 0 ? params : undefined };\n}\n\n/**\n * Build a SELECT COUNT(*) query.\n */\nexport function buildCount(table: string, where?: string, whereParams?: unknown[]): SqlQuery {\n let sql = `SELECT COUNT(*) as count FROM ${table}`;\n if (where) sql += ` WHERE ${where}`;\n return { sql, params: whereParams?.length ? whereParams : undefined };\n}\n\n/**\n * Build a SELECT EXISTS query. Used for `.some()` and `.every()`.\n */\nexport function buildExists(table: string, where?: string, whereParams?: unknown[], negate?: boolean): SqlQuery {\n const inner = where ? `SELECT 1 FROM ${table} WHERE ${where}` : `SELECT 1 FROM ${table}`;\n const fn = negate ? 'NOT EXISTS' : 'EXISTS';\n return { sql: `SELECT ${fn}(${inner}) as result`, params: whereParams?.length ? whereParams : undefined };\n}\n\n// ---------------------------------------------------------------------------\n// Write builders — all use RETURNING * for single-roundtrip results\n// ---------------------------------------------------------------------------\n\n/**\n * Build an INSERT statement with RETURNING *.\n * System columns are excluded automatically.\n * Values are passed as bind params.\n */\nexport function buildInsert(\n table: string,\n data: Record<string, unknown>,\n columns: AppDatabaseColumnSchema[],\n): SqlQuery {\n const filtered = stripSystemColumns(data);\n const keys = Object.keys(filtered);\n const placeholders = keys.map(() => '?').join(', ');\n const params = keys.map((k) => serializeColumnParam(filtered[k], k, columns));\n return {\n sql: `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders}) RETURNING *`,\n params,\n };\n}\n\n/**\n * Build an UPDATE statement with RETURNING *.\n * System columns are excluded. Values are bind params.\n */\nexport function buildUpdate(\n table: string,\n id: string,\n data: Record<string, unknown>,\n columns: AppDatabaseColumnSchema[],\n): SqlQuery {\n const filtered = stripSystemColumns(data);\n const keys = Object.keys(filtered);\n const assignments = keys.map((k) => `${k} = ?`).join(', ');\n const params = [\n ...keys.map((k) => serializeColumnParam(filtered[k], k, columns)),\n id, // for WHERE id = ?\n ];\n return {\n sql: `UPDATE ${table} SET ${assignments} WHERE id = ? RETURNING *`,\n params,\n };\n}\n\n/**\n * Build an INSERT ... ON CONFLICT ... DO UPDATE statement with RETURNING *.\n * System columns are excluded. Values are bind params.\n *\n * If all data keys are conflict columns (nothing to update), uses DO NOTHING.\n * Uses SQLite's `excluded.` prefix to reference the attempted INSERT values.\n */\nexport function buildUpsert(\n table: string,\n data: Record<string, unknown>,\n conflictColumns: string[],\n columns: AppDatabaseColumnSchema[],\n): SqlQuery {\n const filtered = stripSystemColumns(data);\n const keys = Object.keys(filtered);\n const placeholders = keys.map(() => '?').join(', ');\n const params = keys.map((k) =>\n serializeColumnParam(filtered[k], k, columns),\n );\n\n // ON CONFLICT — update all non-conflict columns\n const updateKeys = keys.filter((k) => !conflictColumns.includes(k));\n const conflict = conflictColumns.join(', ');\n\n const sql =\n updateKeys.length > 0\n ? `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${conflict}) DO UPDATE SET ${updateKeys.map((k) => `${k} = excluded.${k}`).join(', ')} RETURNING *`\n : `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${conflict}) DO NOTHING RETURNING *`;\n\n return { sql, params };\n}\n\n/**\n * Build a DELETE statement.\n */\nexport function buildDelete(table: string, where?: string, whereParams?: unknown[]): SqlQuery {\n let sql = `DELETE FROM ${table}`;\n if (where) sql += ` WHERE ${where}`;\n return { sql, params: whereParams?.length ? whereParams : undefined };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst SYSTEM_COLUMNS = new Set([\n 'id',\n 'created_at', 'createdAt',\n 'updated_at', 'updatedAt',\n 'last_updated_by', 'lastUpdatedBy',\n]);\n\nfunction stripSystemColumns(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (!SYSTEM_COLUMNS.has(key)) {\n result[key] = value;\n }\n }\n return result;\n}\n","/**\n * Predicate compiler — converts JS arrow functions to SQL WHERE clauses.\n *\n * This is the core complexity of the `db` namespace. When users write:\n *\n * ```ts\n * orders.filter(o => o.status === 'active' && o.amount > 5000)\n * ```\n *\n * ...the compiler parses the function's source code and produces:\n *\n * ```sql\n * WHERE status = 'active' AND amount > 5000\n * ```\n *\n * ## How it works\n *\n * 1. **Extract source**: Call `fn.toString()` to get the arrow function source\n * 2. **Identify parameter**: Parse the arrow function parameter name (`o` in `o => ...`)\n * 3. **Tokenize**: Break the body into tokens (identifiers, strings, numbers, operators)\n * 4. **Parse**: Recursive descent parser builds a small AST\n * 5. **Compile**: Walk the AST and emit SQL fragments\n *\n * ## Supported patterns (v1)\n *\n * - Field comparisons: `o.field === 'value'`, `!==`, `<`, `>`, `<=`, `>=`\n * - Null checks: `o.field === null`, `o.field != null`, `o.field === undefined`\n * - Logical operators: `&&` (AND), `||` (OR), `!expr` (NOT)\n * - Boolean fields: `o.active` (truthy), `!o.deleted` (falsy)\n * - Array.includes for IN: `['a','b'].includes(o.field)` → `field IN ('a','b')`\n * - Field.includes for LIKE: `o.field.includes('text')` → `field LIKE '%text%'`\n * - Closure variables: values captured from the enclosing scope\n *\n * ## Fallback strategy\n *\n * If the compiler encounters ANY pattern it doesn't recognize, it returns\n * `null` instead of a SQL string. The caller (Query/Table) then fetches\n * all rows and runs the original JS function as a filter. This means\n * filter() always works — there are no runtime errors from unsupported\n * expressions. The SQL path is a transparent performance optimization.\n *\n * A warning is logged on fallback so developers know they're on the slow path.\n *\n * ## Closure variable resolution\n *\n * When the predicate references a variable that isn't the parameter name\n * (e.g. `o => o.userId === currentUserId`), we need to resolve `currentUserId`\n * to its actual value. We do this by calling the original function with a\n * Proxy that records property accesses, then comparing against known patterns.\n * If resolution fails, we fall back to JS.\n */\n\nimport { escapeValue } from './sql.js';\nimport type { CompiledPredicate, Predicate } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Attempt to compile a predicate function to a SQL WHERE clause.\n *\n * @param fn - The predicate function (e.g. `o => o.status === 'active'`)\n * @returns A CompiledPredicate: either `{ type: 'sql', where }` or `{ type: 'js', fn }`\n *\n * @example\n * ```ts\n * const result = compilePredicate(o => o.status === 'active');\n * // { type: 'sql', where: \"status = 'active'\" }\n *\n * const result = compilePredicate(o => o.name.startsWith('A'));\n * // { type: 'js', fn: [original function] }\n * ```\n */\nexport function compilePredicate<T>(fn: Predicate<T>): CompiledPredicate<T> {\n try {\n const source = fn.toString();\n const paramName = extractParamName(source);\n if (!paramName) return { type: 'js', fn };\n\n const body = extractBody(source);\n if (!body) return { type: 'js', fn };\n\n const tokens = tokenize(body);\n if (tokens.length === 0) return { type: 'js', fn };\n\n // Parse into an AST and compile to SQL\n const parser = new Parser(tokens, paramName, fn);\n const ast = parser.parseExpression();\n if (!ast) return { type: 'js', fn };\n\n // Make sure we consumed all tokens (no trailing garbage)\n if (parser.pos < tokens.length) return { type: 'js', fn };\n\n const where = compileNode(ast);\n if (!where) return { type: 'js', fn };\n\n return { type: 'sql', where };\n } catch {\n // Any unexpected error → fall back to JS safely\n return { type: 'js', fn };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Source extraction — get the parameter name and body from fn.toString()\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the parameter name from an arrow function source.\n *\n * Handles:\n * - `x => ...`\n * - `(x) => ...`\n * - `(x: Type) => ...` (TypeScript — toString() may include types)\n *\n * Returns null if the pattern doesn't match (e.g. regular function,\n * destructured params, multiple params).\n */\nfunction extractParamName(source: string): string | null {\n // Match: `paramName =>` or `(paramName) =>` or `(paramName: type) =>`\n const match = source.match(\n /^\\s*(?:\\(?\\s*([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*(?::[^)]*?)?\\)?\\s*=>)/,\n );\n return match?.[1] ?? null;\n}\n\n/**\n * Extract the expression body from an arrow function source.\n *\n * Handles:\n * - `x => expr` (concise body)\n * - `x => { return expr; }` (block body with single return)\n * - `(x) => expr`\n *\n * Returns null for block bodies with multiple statements.\n */\nfunction extractBody(source: string): string | null {\n // Find the `=>` and take everything after it\n const arrowIdx = source.indexOf('=>');\n if (arrowIdx === -1) return null;\n\n let body = source.slice(arrowIdx + 2).trim();\n\n // Block body: `{ return expr; }` → extract the expression\n if (body.startsWith('{')) {\n const match = body.match(/^\\{\\s*return\\s+([\\s\\S]+?)\\s*;?\\s*\\}$/);\n if (!match) return null; // Multiple statements or no return\n body = match[1];\n }\n\n return body.trim() || null;\n}\n\n// ---------------------------------------------------------------------------\n// Tokenizer — breaks the expression body into typed tokens\n// ---------------------------------------------------------------------------\n\n/** Token types produced by the tokenizer. */\ntype TokenType =\n | 'identifier' // variable names, keywords (true, false, null, undefined)\n | 'number' // numeric literals\n | 'string' // string literals (single or double quoted)\n | 'operator' // ===, !==, ==, !=, <, >, <=, >=, &&, ||, !\n | 'dot' // .\n | 'lparen' // (\n | 'rparen' // )\n | 'lbracket' // [\n | 'rbracket' // ]\n | 'comma'; // ,\n\ninterface Token {\n type: TokenType;\n value: string;\n}\n\n/**\n * Tokenize an expression string into a flat array of typed tokens.\n *\n * This is intentionally simple — it handles the subset of JavaScript\n * that appears in common filter predicates. Unknown characters cause\n * the tokenizer to return an empty array (triggering JS fallback).\n */\nfunction tokenize(expr: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < expr.length) {\n const ch = expr[i];\n\n // Skip whitespace\n if (/\\s/.test(ch)) {\n i++;\n continue;\n }\n\n // String literals (single or double quoted)\n if (ch === \"'\" || ch === '\"') {\n const quote = ch;\n let str = '';\n i++; // skip opening quote\n while (i < expr.length && expr[i] !== quote) {\n if (expr[i] === '\\\\') {\n // Handle escape sequences\n i++;\n if (i < expr.length) str += expr[i];\n } else {\n str += expr[i];\n }\n i++;\n }\n if (i >= expr.length) return []; // Unterminated string\n i++; // skip closing quote\n tokens.push({ type: 'string', value: str });\n continue;\n }\n\n // Template literals — we can't reliably parse these, fall back\n if (ch === '`') return [];\n\n // Numbers (integers and decimals)\n if (/[0-9]/.test(ch) || (ch === '-' && i + 1 < expr.length && /[0-9]/.test(expr[i + 1]))) {\n let num = ch;\n i++;\n while (i < expr.length && /[0-9.]/.test(expr[i])) {\n num += expr[i];\n i++;\n }\n tokens.push({ type: 'number', value: num });\n continue;\n }\n\n // Multi-character operators (must check before single-character)\n if (expr.slice(i, i + 3) === '===' || expr.slice(i, i + 3) === '!==') {\n tokens.push({ type: 'operator', value: expr.slice(i, i + 3) });\n i += 3;\n continue;\n }\n if (expr.slice(i, i + 2) === '==' || expr.slice(i, i + 2) === '!=' ||\n expr.slice(i, i + 2) === '<=' || expr.slice(i, i + 2) === '>=' ||\n expr.slice(i, i + 2) === '&&' || expr.slice(i, i + 2) === '||') {\n tokens.push({ type: 'operator', value: expr.slice(i, i + 2) });\n i += 2;\n continue;\n }\n\n // Single-character operators and punctuation\n if (ch === '!' || ch === '<' || ch === '>') {\n tokens.push({ type: 'operator', value: ch });\n i++;\n continue;\n }\n if (ch === '.') { tokens.push({ type: 'dot', value: '.' }); i++; continue; }\n if (ch === '(') { tokens.push({ type: 'lparen', value: '(' }); i++; continue; }\n if (ch === ')') { tokens.push({ type: 'rparen', value: ')' }); i++; continue; }\n if (ch === '[') { tokens.push({ type: 'lbracket', value: '[' }); i++; continue; }\n if (ch === ']') { tokens.push({ type: 'rbracket', value: ']' }); i++; continue; }\n if (ch === ',') { tokens.push({ type: 'comma', value: ',' }); i++; continue; }\n\n // Identifiers (variable names, keywords)\n if (/[a-zA-Z_$]/.test(ch)) {\n let ident = ch;\n i++;\n while (i < expr.length && /[a-zA-Z0-9_$]/.test(expr[i])) {\n ident += expr[i];\n i++;\n }\n tokens.push({ type: 'identifier', value: ident });\n continue;\n }\n\n // Unknown character — bail out to JS fallback\n return [];\n }\n\n return tokens;\n}\n\n// ---------------------------------------------------------------------------\n// AST node types — the small tree the parser builds\n// ---------------------------------------------------------------------------\n\n/** A comparison like `field === 'value'` or `field > 5`. */\ninterface ComparisonNode {\n kind: 'comparison';\n field: string; // SQL column name (may include json_extract for nested)\n operator: string; // SQL operator: =, !=, <, >, <=, >=, IS, IS NOT\n value: unknown; // The literal value to compare against\n}\n\n/** A logical AND or OR combining two expressions. */\ninterface LogicalNode {\n kind: 'logical';\n operator: 'AND' | 'OR';\n left: AstNode;\n right: AstNode;\n}\n\n/** A NOT wrapping an expression. */\ninterface NotNode {\n kind: 'not';\n operand: AstNode;\n}\n\n/** A field IS NULL or IS NOT NULL check. */\ninterface NullCheckNode {\n kind: 'nullCheck';\n field: string;\n isNull: boolean; // true = IS NULL, false = IS NOT NULL\n}\n\n/** A field IN ('a', 'b', 'c') expression (from ['a','b'].includes(o.field)). */\ninterface InNode {\n kind: 'in';\n field: string;\n values: unknown[];\n}\n\n/** A field LIKE '%text%' expression (from o.field.includes('text')). */\ninterface LikeNode {\n kind: 'like';\n field: string;\n pattern: string; // The LIKE pattern with % wildcards\n}\n\n/** A boolean field check: `o.active` (truthy) compiles to `active = 1`. */\ninterface BooleanFieldNode {\n kind: 'booleanField';\n field: string;\n negated: boolean; // true for `!o.active`\n}\n\ntype AstNode =\n | ComparisonNode\n | LogicalNode\n | NotNode\n | NullCheckNode\n | InNode\n | LikeNode\n | BooleanFieldNode;\n\n// ---------------------------------------------------------------------------\n// Parser — recursive descent over the token stream\n// ---------------------------------------------------------------------------\n\n/**\n * Recursive descent parser that builds an AST from the token stream.\n *\n * Grammar (simplified):\n *\n * expression → or_expr\n * or_expr → and_expr ( '||' and_expr )*\n * and_expr → not_expr ( '&&' not_expr )*\n * not_expr → '!' not_expr | primary\n * primary → comparison | null_check | includes | boolean_field | '(' expression ')'\n *\n * The parser is deliberately conservative — it returns null for anything\n * it doesn't confidently understand, which triggers the JS fallback.\n */\nclass Parser {\n pos = 0;\n\n constructor(\n private tokens: Token[],\n private paramName: string,\n private originalFn: Function,\n ) {}\n\n /** Peek at the current token without consuming it. */\n private peek(): Token | undefined {\n return this.tokens[this.pos];\n }\n\n /** Consume the current token and advance. */\n private advance(): Token {\n return this.tokens[this.pos++];\n }\n\n /** Check if the current token matches an expected type and value. */\n private match(type: TokenType, value?: string): boolean {\n const t = this.peek();\n if (!t) return false;\n if (t.type !== type) return false;\n if (value !== undefined && t.value !== value) return false;\n return true;\n }\n\n /** Consume a token if it matches, otherwise return false. */\n private eat(type: TokenType, value?: string): boolean {\n if (this.match(type, value)) {\n this.advance();\n return true;\n }\n return false;\n }\n\n // --- Grammar rules ---\n\n /** Entry point: parse a full expression. */\n parseExpression(): AstNode | null {\n return this.parseOr();\n }\n\n /** or_expr → and_expr ( '||' and_expr )* */\n private parseOr(): AstNode | null {\n let left = this.parseAnd();\n if (!left) return null;\n\n while (this.match('operator', '||')) {\n this.advance();\n const right = this.parseAnd();\n if (!right) return null;\n left = { kind: 'logical', operator: 'OR', left, right };\n }\n\n return left;\n }\n\n /** and_expr → not_expr ( '&&' not_expr )* */\n private parseAnd(): AstNode | null {\n let left = this.parseNot();\n if (!left) return null;\n\n while (this.match('operator', '&&')) {\n this.advance();\n const right = this.parseNot();\n if (!right) return null;\n left = { kind: 'logical', operator: 'AND', left, right };\n }\n\n return left;\n }\n\n /** not_expr → '!' not_expr | primary */\n private parseNot(): AstNode | null {\n if (this.match('operator', '!')) {\n this.advance();\n\n // Check for `!(expr)` — parenthesized negation\n if (this.match('lparen')) {\n this.advance();\n const inner = this.parseExpression();\n if (!inner) return null;\n if (!this.eat('rparen')) return null;\n return { kind: 'not', operand: inner };\n }\n\n // Check for `!o.field` — negated boolean field\n const inner = this.parsePrimary();\n if (!inner) return null;\n\n // If it's a boolean field, just flip the negation\n if (inner.kind === 'booleanField') {\n return { ...inner, negated: !inner.negated };\n }\n\n return { kind: 'not', operand: inner };\n }\n\n return this.parsePrimary();\n }\n\n /**\n * primary → field_comparison | null_check | includes_expr | paren_expr | boolean_field\n *\n * This is the workhorse — handles the different patterns that can appear\n * as atomic expressions within a larger &&/|| combination.\n */\n private parsePrimary(): AstNode | null {\n // Parenthesized expression: `(expr)`\n if (this.match('lparen')) {\n this.advance();\n const inner = this.parseExpression();\n if (!inner) return null;\n if (!this.eat('rparen')) return null;\n return inner;\n }\n\n // Array literal: `['a', 'b'].includes(o.field)` → IN expression\n if (this.match('lbracket')) {\n return this.parseArrayIncludes();\n }\n\n // Starts with the parameter name: field access pattern\n if (this.match('identifier', this.paramName)) {\n return this.parseFieldExpression();\n }\n\n // Starts with a different identifier — could be a closure variable\n // or a keyword (true, false, null, undefined)\n if (this.match('identifier')) {\n return this.parseNonParamExpression();\n }\n\n // Literal value on the left side of a comparison (unusual but valid)\n // e.g. `null !== o.field` — too complex for v1, fall back\n return null;\n }\n\n /**\n * Parse an expression that starts with the parameter name (e.g. `o.field`).\n *\n * Could be:\n * - `o.field === value` (comparison)\n * - `o.field != null` (null check)\n * - `o.field.includes('text')` (LIKE)\n * - `o.field` alone (boolean field check)\n */\n private parseFieldExpression(): AstNode | null {\n this.advance(); // consume param name\n\n // Read the field path: o.field or o.nested.field\n const field = this.parseFieldPath();\n if (!field) return null;\n\n // Check what follows the field access\n const next = this.peek();\n\n // Field.includes('text') → LIKE\n if (next?.type === 'dot' && this.lookAheadForIncludes()) {\n return this.parseFieldIncludes(field);\n }\n\n // Comparison operator: ===, !==, ==, !=, <, >, <=, >=\n if (next?.type === 'operator' && isComparisonOp(next.value)) {\n return this.parseComparison(field);\n }\n\n // No operator follows — this is a boolean field check: `o.active`\n return { kind: 'booleanField', field, negated: false };\n }\n\n /**\n * Parse a dot-separated field path after the parameter name.\n * `o.status` → `\"status\"`, `o.address.city` → `\"json_extract(address, '$.city')\"`.\n */\n private parseFieldPath(): string | null {\n if (!this.eat('dot')) return null;\n\n if (!this.match('identifier')) return null;\n const parts: string[] = [this.advance().value];\n\n // Check for nested access: o.a.b.c\n while (this.match('dot') && this.tokens[this.pos + 1]?.type === 'identifier') {\n this.advance(); // consume dot\n parts.push(this.advance().value);\n }\n\n if (parts.length === 1) {\n return parts[0];\n }\n\n // Nested access: use json_extract for SQLite JSON columns\n // o.address.city → json_extract(address, '$.city')\n const root = parts[0];\n const jsonPath = '$.' + parts.slice(1).join('.');\n return `json_extract(${root}, '${jsonPath}')`;\n }\n\n /**\n * Parse a comparison: `field OP value`.\n * The field has already been parsed; we need the operator and right-hand value.\n */\n private parseComparison(field: string): AstNode | null {\n const opToken = this.advance(); // consume operator\n const jsOp = opToken.value;\n\n // Parse the right-hand side value\n const value = this.parseValue();\n if (value === PARSE_FAILED) return null;\n\n // Null comparisons get special SQL syntax (IS NULL / IS NOT NULL)\n if (value === null || value === undefined) {\n if (jsOp === '===' || jsOp === '==') {\n return { kind: 'nullCheck', field, isNull: true };\n }\n if (jsOp === '!==' || jsOp === '!=') {\n return { kind: 'nullCheck', field, isNull: false };\n }\n return null; // < null, > null, etc. — nonsensical, fall back\n }\n\n // Map JS operators to SQL operators\n const sqlOp = JS_TO_SQL_OP[jsOp];\n if (!sqlOp) return null;\n\n return { kind: 'comparison', field, operator: sqlOp, value };\n }\n\n /**\n * Parse `o.field.includes('text')` → LIKE expression.\n * The field name has already been parsed.\n */\n private parseFieldIncludes(field: string): AstNode | null {\n this.advance(); // consume dot\n this.advance(); // consume 'includes'\n if (!this.eat('lparen')) return null;\n\n const value = this.parseValue();\n if (value === PARSE_FAILED || typeof value !== 'string') return null;\n\n if (!this.eat('rparen')) return null;\n\n // Escape % and _ in the search string (they're LIKE wildcards)\n const escaped = value.replace(/%/g, '\\\\%').replace(/_/g, '\\\\_');\n return { kind: 'like', field, pattern: `%${escaped}%` };\n }\n\n /**\n * Parse `['a', 'b', 'c'].includes(o.field)` → IN expression.\n * The opening bracket has been peeked but not consumed.\n */\n private parseArrayIncludes(): AstNode | null {\n this.advance(); // consume [\n\n // Parse array literal values\n const values: unknown[] = [];\n while (!this.match('rbracket')) {\n if (values.length > 0) {\n if (!this.eat('comma')) return null;\n }\n const val = this.parseValue();\n if (val === PARSE_FAILED) return null;\n values.push(val);\n }\n this.advance(); // consume ]\n\n // Expect .includes(o.field)\n if (!this.eat('dot')) return null;\n if (!this.match('identifier', 'includes')) return null;\n this.advance(); // consume 'includes'\n if (!this.eat('lparen')) return null;\n\n // The argument should be a field access: o.field\n if (!this.match('identifier', this.paramName)) return null;\n this.advance(); // consume param name\n const field = this.parseFieldPath();\n if (!field) return null;\n\n if (!this.eat('rparen')) return null;\n\n return { kind: 'in', field, values };\n }\n\n /**\n * Parse an expression that starts with an identifier that is NOT the\n * parameter name. This could be:\n * - A keyword literal: `true`, `false`, `null`, `undefined`\n * - A closure variable used in a comparison (handled by backtracking)\n */\n private parseNonParamExpression(): AstNode | null {\n const ident = this.peek()!.value;\n\n // Keyword literals on their own aren't useful as filter expressions\n // They'd only appear as `true` or `false` which is a constant predicate —\n // not worth optimizing. Fall back to JS.\n if (ident === 'true' || ident === 'false') return null;\n\n // This could be a closure variable in a reversed comparison:\n // `someVar === o.field` — we don't support LHS-variable comparisons in v1\n // Fall back to JS.\n return null;\n }\n\n /**\n * Parse a literal value or closure variable reference.\n *\n * Returns the parsed value, or PARSE_FAILED if parsing fails.\n * Returns `null` or `undefined` for those keyword literals.\n */\n private parseValue(): unknown {\n const t = this.peek();\n if (!t) return PARSE_FAILED;\n\n // String literal\n if (t.type === 'string') {\n this.advance();\n return t.value;\n }\n\n // Number literal\n if (t.type === 'number') {\n this.advance();\n return Number(t.value);\n }\n\n // Keyword literals\n if (t.type === 'identifier') {\n if (t.value === 'true') { this.advance(); return true; }\n if (t.value === 'false') { this.advance(); return false; }\n if (t.value === 'null') { this.advance(); return null; }\n if (t.value === 'undefined') { this.advance(); return undefined; }\n\n // Closure variable — try to resolve its value by calling the\n // original function with a Proxy. We build a proxy that records\n // which fields are accessed, then inspect the comparison.\n return this.resolveClosureVariable();\n }\n\n // Negative number: -42\n if (t.type === 'operator' && t.value === '-') {\n this.advance();\n const next = this.peek();\n if (next?.type === 'number') {\n this.advance();\n return -Number(next.value);\n }\n return PARSE_FAILED;\n }\n\n return PARSE_FAILED;\n }\n\n /**\n * Attempt to resolve a closure variable's value.\n *\n * This handles the common pattern:\n * ```ts\n * const userId = auth.userId;\n * orders.filter(o => o.requestedBy === userId)\n * ```\n *\n * Closure variable resolution is fundamentally limited in JavaScript —\n * we can't access another function's closure scope from outside without\n * `eval`. The `===` operator can't be overridden via Proxy or\n * Symbol.toPrimitive, so we can't intercept comparisons.\n *\n * For now, this falls back to JS execution. The predicate still works\n * correctly — it just scans all rows instead of generating SQL.\n * This is the most common reason for JS fallback in practice, since\n * almost every real-world filter references a variable like `userId`.\n *\n * A future improvement could accept an explicit `vars` argument:\n * ```ts\n * orders.filter(o => o.requestedBy === $userId, { $userId: auth.userId })\n * ```\n */\n private resolveClosureVariable(): unknown {\n // Consume the identifier (and any dotted access like closureVar.prop)\n this.advance();\n while (this.match('dot') && this.tokens[this.pos + 1]?.type === 'identifier') {\n this.advance();\n this.advance();\n }\n\n return PARSE_FAILED;\n }\n\n /**\n * Look ahead to check if the next tokens form `.includes(`.\n * Used to disambiguate `o.field.includes(...)` from `o.field.nested`.\n */\n private lookAheadForIncludes(): boolean {\n // We need: dot + 'includes' + lparen\n return (\n this.tokens[this.pos]?.type === 'dot' &&\n this.tokens[this.pos + 1]?.type === 'identifier' &&\n this.tokens[this.pos + 1]?.value === 'includes' &&\n this.tokens[this.pos + 2]?.type === 'lparen'\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// AST → SQL compilation\n// ---------------------------------------------------------------------------\n\n/**\n * Compile an AST node to a SQL WHERE clause fragment.\n * Returns null if any node can't be compiled.\n */\nfunction compileNode(node: AstNode): string | null {\n switch (node.kind) {\n case 'comparison':\n return `${node.field} ${node.operator} ${escapeValue(node.value)}`;\n\n case 'nullCheck':\n return `${node.field} ${node.isNull ? 'IS NULL' : 'IS NOT NULL'}`;\n\n case 'in': {\n if (node.values.length === 0) return '0'; // empty IN → always false\n const vals = node.values.map(escapeValue).join(', ');\n return `${node.field} IN (${vals})`;\n }\n\n case 'like':\n return `${node.field} LIKE ${escapeValue(node.pattern)}`;\n\n case 'booleanField':\n // `o.active` → `active = 1`, `!o.active` → `active = 0`\n return node.negated ? `${node.field} = 0` : `${node.field} = 1`;\n\n case 'logical': {\n const left = compileNode(node.left);\n const right = compileNode(node.right);\n if (!left || !right) return null;\n return `(${left} ${node.operator} ${right})`;\n }\n\n case 'not': {\n const inner = compileNode(node.operand);\n if (!inner) return null;\n return `NOT (${inner})`;\n }\n\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Constants and helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Mapping from JavaScript comparison operators to SQL equivalents.\n * Strict and loose equality both map to `=` (SQL has no strict equality).\n */\nconst JS_TO_SQL_OP: Record<string, string> = {\n '===': '=',\n '==': '=',\n '!==': '!=',\n '!=': '!=',\n '<': '<',\n '>': '>',\n '<=': '<=',\n '>=': '>=',\n};\n\n/** Sentinel value indicating a parse failure (distinct from `undefined`). */\nconst PARSE_FAILED = Symbol('PARSE_FAILED');\n\n/** Check if a token value is a comparison operator. */\nfunction isComparisonOp(value: string): boolean {\n return value in JS_TO_SQL_OP;\n}\n","/**\n * Query chain builder — lazy, immutable query construction for database reads.\n *\n * A Query<T> represents a pending database query. It accumulates operations\n * (filter, sort, limit, skip) without executing anything. Execution happens\n * only when the query is awaited (via PromiseLike) or a terminal method\n * is called (first, last, count, some, every, min, max, groupBy).\n *\n * ## Immutability\n *\n * Every chain method returns a NEW Query instance. This means chains can\n * safely fork:\n *\n * ```ts\n * const base = Orders.filter(o => o.status === 'active');\n * const recent = base.sortBy(o => o.createdAt).reverse().take(10);\n * const count = await base.count(); // doesn't affect `recent`\n * ```\n *\n * ## Execution strategy (SQL fast path vs JS fallback)\n *\n * When a Query is executed, it attempts to compile all predicates to SQL:\n *\n * - **Fast path**: All predicates compile → single SQL query with WHERE,\n * ORDER BY, LIMIT, OFFSET. Efficient, minimal data transfer.\n *\n * - **Fallback path**: Any predicate fails to compile → fetch ALL rows\n * from the table (SELECT *), then apply the entire chain as native JS\n * array operations (Array.filter, Array.sort, Array.slice, etc.).\n * A warning is logged so developers can optimize if needed.\n *\n * Both paths produce identical results. The SQL path is a transparent\n * performance optimization.\n */\n\nimport { compilePredicate } from './predicate.js';\nimport {\n buildSelect,\n buildCount,\n buildExists,\n deserializeRow,\n} from './sql.js';\nimport type {\n Predicate,\n Accessor,\n TableConfig,\n CompiledPredicate,\n SqlQuery,\n SqlResult,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// Query class\n// ---------------------------------------------------------------------------\n\nexport class Query<T> implements PromiseLike<T[]> {\n private readonly _predicates: Predicate<T>[];\n private readonly _sortAccessor: Accessor<T> | undefined;\n private readonly _reversed: boolean;\n private readonly _limit: number | undefined;\n private readonly _offset: number | undefined;\n private readonly _config: TableConfig;\n\n constructor(\n config: TableConfig,\n options?: {\n predicates?: Predicate<T>[];\n sortAccessor?: Accessor<T>;\n reversed?: boolean;\n limit?: number;\n offset?: number;\n },\n ) {\n this._config = config;\n this._predicates = options?.predicates ?? [];\n this._sortAccessor = options?.sortAccessor;\n this._reversed = options?.reversed ?? false;\n this._limit = options?.limit;\n this._offset = options?.offset;\n }\n\n private _clone(overrides: {\n predicates?: Predicate<T>[];\n sortAccessor?: Accessor<T>;\n reversed?: boolean;\n limit?: number;\n offset?: number;\n }): Query<T> {\n return new Query<T>(this._config, {\n predicates: overrides.predicates ?? this._predicates,\n sortAccessor: overrides.sortAccessor ?? this._sortAccessor,\n reversed: overrides.reversed ?? this._reversed,\n limit: overrides.limit ?? this._limit,\n offset: overrides.offset ?? this._offset,\n });\n }\n\n // -------------------------------------------------------------------------\n // Chain methods\n // -------------------------------------------------------------------------\n\n filter(predicate: Predicate<T>): Query<T> {\n return this._clone({ predicates: [...this._predicates, predicate] });\n }\n\n sortBy(accessor: Accessor<T>): Query<T> {\n return this._clone({ sortAccessor: accessor });\n }\n\n reverse(): Query<T> {\n return this._clone({ reversed: !this._reversed });\n }\n\n take(n: number): Query<T> {\n return this._clone({ limit: n });\n }\n\n skip(n: number): Query<T> {\n return this._clone({ offset: n });\n }\n\n // -------------------------------------------------------------------------\n // Terminal methods\n // -------------------------------------------------------------------------\n\n async first(): Promise<T | null> {\n const rows = await this._clone({ limit: 1 })._execute();\n return rows[0] ?? null;\n }\n\n async last(): Promise<T | null> {\n const rows = await this._clone({ limit: 1, reversed: !this._reversed })._execute();\n return rows[0] ?? null;\n }\n\n async count(): Promise<number> {\n const compiled = this._compilePredicates();\n\n if (compiled.allSql) {\n const query = buildCount(\n this._config.tableName,\n compiled.sqlWhere || undefined,\n );\n const results = await this._config.executeBatch([query]);\n const row = results[0]?.rows[0] as { count: number } | undefined;\n return row?.count ?? 0;\n }\n\n const rows = await this._fetchAndFilterInJs(compiled);\n return rows.length;\n }\n\n async some(): Promise<boolean> {\n const compiled = this._compilePredicates();\n\n if (compiled.allSql) {\n const query = buildExists(\n this._config.tableName,\n compiled.sqlWhere || undefined,\n );\n const results = await this._config.executeBatch([query]);\n const row = results[0]?.rows[0] as { result: number } | undefined;\n return row?.result === 1;\n }\n\n const rows = await this._fetchAndFilterInJs(compiled);\n return rows.length > 0;\n }\n\n async every(): Promise<boolean> {\n const compiled = this._compilePredicates();\n\n if (compiled.allSql && compiled.sqlWhere) {\n const query = buildExists(\n this._config.tableName,\n `NOT (${compiled.sqlWhere})`,\n undefined,\n true,\n );\n const results = await this._config.executeBatch([query]);\n const row = results[0]?.rows[0] as { result: number } | undefined;\n return row?.result === 1;\n }\n\n if (this._predicates.length === 0) return true;\n\n const allRows = await this._fetchAllRows();\n return allRows.every((row) =>\n this._predicates.every((pred) => pred(row as T)),\n );\n }\n\n async min(accessor: Accessor<T, number>): Promise<T | null> {\n return this.sortBy(accessor as Accessor<T>).first();\n }\n\n async max(accessor: Accessor<T, number>): Promise<T | null> {\n return this.sortBy(accessor as Accessor<T>).reverse().first();\n }\n\n async groupBy<K extends string | number>(\n accessor: Accessor<T, K>,\n ): Promise<Map<K, T[]>> {\n const rows = await this._execute();\n const map = new Map<K, T[]>();\n for (const row of rows) {\n const key = accessor(row);\n const group = map.get(key);\n if (group) {\n group.push(row);\n } else {\n map.set(key, [row]);\n }\n }\n return map;\n }\n\n // -------------------------------------------------------------------------\n // Batch compilation — used by db.batch() to extract SQL without executing\n // -------------------------------------------------------------------------\n\n /**\n * @internal Compile this query into a SqlQuery for batch execution.\n *\n * Returns the compiled SQL query (if all predicates compile to SQL),\n * or null (if JS fallback is needed). In the fallback case, a bare\n * `SELECT *` is returned as `fallbackQuery` so the batch can fetch\n * all rows and this query can filter them in JS post-fetch.\n */\n _compile(): CompiledQuery<T> {\n const compiled = this._compilePredicates();\n const sortField = this._sortAccessor\n ? extractFieldName(this._sortAccessor)\n : undefined;\n\n if (compiled.allSql) {\n const query = buildSelect(this._config.tableName, {\n where: compiled.sqlWhere || undefined,\n orderBy: sortField ?? undefined,\n desc: this._reversed,\n limit: this._limit,\n offset: this._offset,\n });\n return { type: 'query', query, fallbackQuery: null, config: this._config };\n }\n\n // JS fallback — need all rows\n const fallbackQuery = buildSelect(this._config.tableName);\n return {\n type: 'query',\n query: null,\n fallbackQuery,\n config: this._config,\n predicates: this._predicates,\n sortAccessor: this._sortAccessor,\n reversed: this._reversed,\n limit: this._limit,\n offset: this._offset,\n };\n }\n\n /**\n * @internal Process raw SQL results into typed rows. Used by db.batch()\n * after executing the compiled query.\n *\n * For SQL-compiled queries: just deserialize the rows.\n * For JS-fallback queries: filter, sort, and slice in JS.\n */\n static _processResults<T>(\n result: SqlResult,\n compiled: CompiledQuery<T>,\n ): T[] {\n const rows = result.rows.map(\n (row) =>\n deserializeRow(\n row as Record<string, unknown>,\n compiled.config.columns,\n ) as T,\n );\n\n // SQL path — rows are already filtered/sorted/limited\n if (compiled.query) return rows;\n\n // JS fallback — apply predicates, sort, slice\n let filtered: T[] = compiled.predicates\n ? rows.filter((row) => compiled.predicates!.every((pred) => pred(row)))\n : rows;\n\n if (compiled.sortAccessor) {\n const accessor = compiled.sortAccessor;\n const reversed = compiled.reversed ?? false;\n filtered.sort((a, b) => {\n const aVal = accessor(a) as number | string;\n const bVal = accessor(b) as number | string;\n if (aVal < bVal) return reversed ? 1 : -1;\n if (aVal > bVal) return reversed ? -1 : 1;\n return 0;\n });\n }\n\n if (compiled.offset != null || compiled.limit != null) {\n const start = compiled.offset ?? 0;\n const end = compiled.limit != null ? start + compiled.limit : undefined;\n filtered = filtered.slice(start, end);\n }\n\n return filtered;\n }\n\n // -------------------------------------------------------------------------\n // PromiseLike\n // -------------------------------------------------------------------------\n\n then<TResult1 = T[], TResult2 = never>(\n onfulfilled?: ((value: T[]) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this._execute().then(onfulfilled, onrejected);\n }\n\n catch<TResult2 = never>(\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<T[] | TResult2> {\n return this._execute().catch(onrejected);\n }\n\n // -------------------------------------------------------------------------\n // Execution internals\n // -------------------------------------------------------------------------\n\n private async _execute(): Promise<T[]> {\n const compiled = this._compilePredicates();\n\n if (compiled.allSql) {\n const sortField = this._sortAccessor\n ? extractFieldName(this._sortAccessor)\n : undefined;\n\n const query = buildSelect(this._config.tableName, {\n where: compiled.sqlWhere || undefined,\n orderBy: sortField ?? undefined,\n desc: this._reversed,\n limit: this._limit,\n offset: this._offset,\n });\n\n const results = await this._config.executeBatch([query]);\n return results[0].rows.map(\n (row) =>\n deserializeRow(\n row as Record<string, unknown>,\n this._config.columns,\n ) as T,\n );\n }\n\n // Fallback: fetch all rows, process in JS\n let rows = await this._fetchAndFilterInJs(compiled);\n\n if (this._sortAccessor) {\n const accessor = this._sortAccessor;\n rows.sort((a, b) => {\n const aVal = accessor(a as T) as number | string;\n const bVal = accessor(b as T) as number | string;\n if (aVal < bVal) return this._reversed ? 1 : -1;\n if (aVal > bVal) return this._reversed ? -1 : 1;\n return 0;\n });\n }\n\n if (this._offset != null || this._limit != null) {\n const start = this._offset ?? 0;\n const end = this._limit != null ? start + this._limit : undefined;\n rows = rows.slice(start, end);\n }\n\n return rows as T[];\n }\n\n private _compilePredicates(): {\n allSql: boolean;\n sqlWhere: string;\n compiled: CompiledPredicate<T>[];\n } {\n if (this._predicates.length === 0) {\n return { allSql: true, sqlWhere: '', compiled: [] };\n }\n\n const compiled = this._predicates.map((pred) => compilePredicate(pred));\n const allSql = compiled.every((c) => c.type === 'sql');\n\n let sqlWhere = '';\n if (allSql) {\n sqlWhere = compiled\n .map((c) => (c as { type: 'sql'; where: string }).where)\n .join(' AND ');\n }\n\n return { allSql, sqlWhere, compiled };\n }\n\n private async _fetchAndFilterInJs(\n compiled: { compiled: CompiledPredicate<T>[] },\n ): Promise<Record<string, unknown>[]> {\n const allRows = await this._fetchAllRows();\n\n if (compiled.compiled.some((c) => c.type === 'js')) {\n console.warn(\n `[mindstudio] Filter on ${this._config.tableName} could not be compiled to SQL — scanning ${allRows.length} rows in JS`,\n );\n }\n\n return allRows.filter((row) =>\n this._predicates.every((pred) => pred(row as T)),\n );\n }\n\n private async _fetchAllRows(): Promise<Record<string, unknown>[]> {\n const query = buildSelect(this._config.tableName);\n const results = await this._config.executeBatch([query]);\n return results[0].rows.map((row) =>\n deserializeRow(row as Record<string, unknown>, this._config.columns),\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Result of Query._compile(). Contains either a compiled SQL query\n * (fast path) or a fallback SELECT * with JS processing metadata.\n */\nexport interface CompiledQuery<T> {\n type: 'query';\n /** Compiled SQL query, or null if JS fallback needed. */\n query: SqlQuery | null;\n /** SELECT * fallback query, or null if SQL compiled. */\n fallbackQuery: SqlQuery | null;\n /** Table config for deserialization. */\n config: TableConfig;\n /** JS predicates (only for fallback). */\n predicates?: Predicate<T>[];\n /** Sort accessor (only for fallback). */\n sortAccessor?: Accessor<T>;\n /** Sort direction (only for fallback). */\n reversed?: boolean;\n /** Limit (only for fallback). */\n limit?: number;\n /** Offset (only for fallback). */\n offset?: number;\n}\n\nexport function extractFieldName<T>(accessor: Accessor<T>): string | null {\n const source = accessor.toString();\n const match = source.match(\n /^\\s*\\(?([a-zA-Z_$][a-zA-Z0-9_$]*)\\)?\\s*=>\\s*\\1\\.([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*$/,\n );\n return match?.[2] ?? null;\n}\n","/**\n * Mutation<T> — a lazy write operation backed by SQLite.\n *\n * Created by Table write methods (push, update, remove, removeAll, clear).\n * Like Query, implements PromiseLike so `await` triggers execution. Unlike\n * Query, there's no chaining — a Mutation is a fixed set of SQL statements\n * with a result processor.\n *\n * ## Batch support\n *\n * `db.batch()` calls `_compile()` to extract the SQL without executing,\n * then bundles it with other operations into a single round trip. After\n * execution, `_processResults()` deserializes the raw SQL results.\n *\n * ## Non-batchable mutations\n *\n * Some mutations (e.g. `removeAll` with a JS-fallback predicate) require\n * multi-step execution that can't be expressed as a fixed SQL batch.\n * These are created via `Mutation.fromExecutor()` and work fine when\n * awaited standalone, but throw if passed to `db.batch()`.\n */\n\nimport type { TableConfig, SqlQuery, SqlResult } from './types.js';\n\n// ---------------------------------------------------------------------------\n// CompiledMutation — returned by _compile() for db.batch()\n// ---------------------------------------------------------------------------\n\nexport interface CompiledMutation<TResult> {\n type: 'mutation';\n queries: SqlQuery[];\n config: TableConfig;\n processResult: (results: SqlResult[]) => TResult;\n}\n\n// ---------------------------------------------------------------------------\n// Mutation class\n// ---------------------------------------------------------------------------\n\nexport class Mutation<TResult> implements PromiseLike<TResult> {\n /** @internal */\n private readonly _config: TableConfig;\n /** @internal */\n private readonly _queries: SqlQuery[];\n /** @internal */\n private readonly _processResult: (results: SqlResult[]) => TResult;\n /** @internal Non-batchable executor for complex mutations (e.g. removeAll JS fallback). */\n private readonly _executor:\n | (() => Promise<TResult>)\n | undefined;\n\n constructor(\n config: TableConfig,\n queries: SqlQuery[],\n processResult: (results: SqlResult[]) => TResult,\n ) {\n this._config = config;\n this._queries = queries;\n this._processResult = processResult;\n this._executor = undefined;\n }\n\n /**\n * Create a non-batchable mutation that wraps an async executor.\n * Used for operations that require multi-step execution (e.g. removeAll\n * with a JS-fallback predicate: fetch all rows → filter → delete).\n *\n * Works fine when awaited standalone. Throws if passed to db.batch().\n *\n * @internal\n */\n static fromExecutor<T>(\n config: TableConfig,\n executor: () => Promise<T>,\n ): Mutation<T> {\n const m = new Mutation<T>(config, [], () => undefined as T);\n // Override the private field — TypeScript doesn't allow reassigning\n // readonly in a static method, so we use Object.defineProperty.\n Object.defineProperty(m, '_executor', { value: executor });\n return m;\n }\n\n // -------------------------------------------------------------------------\n // PromiseLike — executes on await\n // -------------------------------------------------------------------------\n\n then<T1 = TResult, T2 = never>(\n onfulfilled?:\n | ((value: TResult) => T1 | PromiseLike<T1>)\n | null,\n onrejected?:\n | ((reason: unknown) => T2 | PromiseLike<T2>)\n | null,\n ): Promise<T1 | T2> {\n return this._execute().then(onfulfilled, onrejected);\n }\n\n catch<T2 = never>(\n onrejected?:\n | ((reason: unknown) => T2 | PromiseLike<T2>)\n | null,\n ): Promise<TResult | T2> {\n return this._execute().catch(onrejected);\n }\n\n // -------------------------------------------------------------------------\n // Batch compilation — used by db.batch()\n // -------------------------------------------------------------------------\n\n /**\n * @internal Compile this mutation into SQL for batch execution.\n * Returns the queries and a result processor.\n *\n * Throws if this is a non-batchable mutation (created via fromExecutor).\n */\n _compile(): CompiledMutation<TResult> {\n if (this._executor) {\n throw new Error(\n 'This operation cannot be batched (e.g. removeAll with a predicate that cannot compile to SQL). Await it separately.',\n );\n }\n\n return {\n type: 'mutation',\n queries: this._queries,\n config: this._config,\n processResult: this._processResult,\n };\n }\n\n /**\n * @internal Process raw SQL results into the typed result.\n * Used by db.batch() after executing the compiled queries.\n */\n static _processResults<T>(\n results: SqlResult[],\n compiled: CompiledMutation<T>,\n ): T {\n return compiled.processResult(results);\n }\n\n // -------------------------------------------------------------------------\n // Execution\n // -------------------------------------------------------------------------\n\n private async _execute(): Promise<TResult> {\n if (this._executor) {\n return this._executor();\n }\n\n const results = await this._config.executeBatch(this._queries);\n return this._processResult(results);\n }\n}\n","/**\n * Table<T> — a typed persistent collection backed by SQLite.\n *\n * Created via `db.defineTable<T>(name)`. Every method either returns a\n * chainable Query<T> (for lazy reads), a Mutation<T> (for lazy writes),\n * or a Promise (for terminal reads).\n *\n * ## Write operations use RETURNING\n *\n * INSERT and UPDATE use `RETURNING *` to get the created/updated row\n * back in a single round trip — no separate SELECT needed. This is\n * executed via the batch endpoint which runs all queries on a single\n * SQLite connection.\n */\n\nimport { Query, extractFieldName } from './query.js';\nimport { Mutation } from './mutation.js';\nimport { compilePredicate } from './predicate.js';\nimport { MindStudioError } from '../errors.js';\nimport {\n buildSelect,\n buildCount,\n buildExists,\n buildInsert,\n buildUpdate,\n buildUpsert,\n buildDelete,\n deserializeRow,\n escapeValue,\n} from './sql.js';\nimport type { Predicate, Accessor, PushInput, UpdateInput, SystemFields, TableConfig } from './types.js';\n\nexport class Table<T> {\n /** @internal */\n private readonly _config: TableConfig;\n\n constructor(config: TableConfig) {\n this._config = config;\n }\n\n // -------------------------------------------------------------------------\n // Reads — direct\n // -------------------------------------------------------------------------\n\n async get(id: string): Promise<T | null> {\n const query = buildSelect(this._config.tableName, {\n where: `id = ?`,\n whereParams: [id],\n limit: 1,\n });\n const results = await this._config.executeBatch([query]);\n if (results[0].rows.length === 0) return null;\n return deserializeRow(\n results[0].rows[0] as Record<string, unknown>,\n this._config.columns,\n ) as T;\n }\n\n async findOne(predicate: Predicate<T>): Promise<T | null> {\n return this.filter(predicate).first();\n }\n\n async count(predicate?: Predicate<T>): Promise<number> {\n if (predicate) return this.filter(predicate).count();\n\n const query = buildCount(this._config.tableName);\n const results = await this._config.executeBatch([query]);\n const row = results[0]?.rows[0] as { count: number } | undefined;\n return row?.count ?? 0;\n }\n\n async some(predicate: Predicate<T>): Promise<boolean> {\n return this.filter(predicate).some();\n }\n\n async every(predicate: Predicate<T>): Promise<boolean> {\n return this.filter(predicate).every();\n }\n\n async isEmpty(): Promise<boolean> {\n const query = buildExists(this._config.tableName, undefined, undefined, true);\n const results = await this._config.executeBatch([query]);\n const row = results[0]?.rows[0] as { result: number } | undefined;\n return row?.result === 1;\n }\n\n async min(accessor: Accessor<T, number>): Promise<T | null> {\n return this.sortBy(accessor as Accessor<T>).first();\n }\n\n async max(accessor: Accessor<T, number>): Promise<T | null> {\n return this.sortBy(accessor as Accessor<T>).reverse().first();\n }\n\n async groupBy<K extends string | number>(\n accessor: Accessor<T, K>,\n ): Promise<Map<K, T[]>> {\n return new Query<T>(this._config).groupBy(accessor);\n }\n\n // -------------------------------------------------------------------------\n // Reads — chainable\n // -------------------------------------------------------------------------\n\n filter(predicate: Predicate<T>): Query<T> {\n return new Query<T>(this._config).filter(predicate);\n }\n\n sortBy(accessor: Accessor<T>): Query<T> {\n return new Query<T>(this._config).sortBy(accessor);\n }\n\n // -------------------------------------------------------------------------\n // Writes — lazy Mutations, batchable via db.batch()\n //\n // All write methods return Mutation<T> which implements PromiseLike.\n // When awaited standalone, they execute immediately (same behavior as\n // before). When passed to db.batch(), their SQL is bundled into a\n // single round trip.\n // -------------------------------------------------------------------------\n\n /**\n * Insert one or more rows. Returns the created row(s) with system fields\n * populated (id, createdAt, updatedAt, lastUpdatedBy).\n *\n * Uses `INSERT ... RETURNING *` so the created row comes back in a\n * single round trip — no separate SELECT needed.\n */\n push(data: PushInput<T>): Mutation<T>;\n push(data: PushInput<T>[]): Mutation<T[]>;\n push(data: PushInput<T> | PushInput<T>[]): Mutation<T | T[]> {\n const isArray = Array.isArray(data);\n const items = (isArray ? data : [data]).map((item) =>\n this._config.defaults\n ? ({ ...this._config.defaults, ...item } as PushInput<T>)\n : item,\n );\n\n const queries = items.map((item) =>\n buildInsert(\n this._config.tableName,\n item as Record<string, unknown>,\n this._config.columns,\n ),\n );\n\n return new Mutation<T | T[]>(this._config, queries, (results) => {\n const rows = results.map((r) => {\n if (r.rows.length > 0) {\n return deserializeRow(\n r.rows[0] as Record<string, unknown>,\n this._config.columns,\n ) as T;\n }\n return undefined as unknown as T;\n });\n return isArray ? rows : rows[0];\n });\n }\n\n /**\n * Update a row by ID. Only the provided fields are changed.\n * Returns the updated row via `UPDATE ... RETURNING *`.\n */\n update(id: string, data: UpdateInput<T>): Mutation<T> {\n const query = buildUpdate(\n this._config.tableName,\n id,\n data as Record<string, unknown>,\n this._config.columns,\n );\n\n return new Mutation<T>(this._config, [query], (results) =>\n deserializeRow(\n results[0].rows[0] as Record<string, unknown>,\n this._config.columns,\n ) as T,\n );\n }\n\n remove(id: string): Mutation<void> {\n const query = buildDelete(this._config.tableName, `id = ?`, [id]);\n return new Mutation<void>(this._config, [query], () => undefined as void);\n }\n\n /**\n * Remove all rows matching a predicate. Returns the count removed.\n */\n removeAll(predicate: Predicate<T>): Mutation<number> {\n const compiled = compilePredicate(predicate);\n\n if (compiled.type === 'sql') {\n const query = buildDelete(this._config.tableName, compiled.where);\n return new Mutation<number>(this._config, [query], (results) => results[0].changes);\n }\n\n // Fallback: multi-step execution — not batchable\n return Mutation.fromExecutor<number>(this._config, async () => {\n console.warn(\n `[mindstudio] removeAll predicate on ${this._config.tableName} could not be compiled to SQL — fetching all rows first`,\n );\n\n const allQuery = buildSelect(this._config.tableName);\n const allResults = await this._config.executeBatch([allQuery]);\n const allRows = allResults[0].rows.map(\n (r) =>\n deserializeRow(\n r as Record<string, unknown>,\n this._config.columns,\n ) as Record<string, unknown>,\n );\n\n const matching = allRows.filter((row) => predicate(row as T));\n if (matching.length === 0) return 0;\n\n const deleteQueries = matching\n .filter((row) => row.id)\n .map((row) => buildDelete(this._config.tableName, `id = ?`, [row.id as string]));\n\n if (deleteQueries.length > 0) {\n await this._config.executeBatch(deleteQueries);\n }\n\n return matching.length;\n });\n }\n\n clear(): Mutation<void> {\n const query = buildDelete(this._config.tableName);\n return new Mutation<void>(this._config, [query], () => undefined as void);\n }\n\n /**\n * Insert a row, or update it if a row with the same unique key already\n * exists. The conflict key must match a `unique` constraint declared in\n * defineTable options. Returns the created or updated row.\n *\n * Uses SQLite's `INSERT ... ON CONFLICT ... DO UPDATE SET ... RETURNING *`.\n *\n * @param conflictKey - Column name(s) that form the unique constraint.\n * Pass a single string for single-column unique, or an array for compound.\n * @param data - Row data to insert (or update on conflict). Defaults apply.\n */\n upsert(\n conflictKey:\n | (keyof Omit<T, SystemFields> & string)\n | (keyof Omit<T, SystemFields> & string)[],\n data: PushInput<T>,\n ): Mutation<T> {\n const conflictColumns = (\n Array.isArray(conflictKey) ? conflictKey : [conflictKey]\n ) as string[];\n\n this._validateUniqueConstraint(conflictColumns);\n\n const withDefaults = this._config.defaults\n ? ({ ...this._config.defaults, ...data } as Record<string, unknown>)\n : (data as Record<string, unknown>);\n\n const query = buildUpsert(\n this._config.tableName,\n withDefaults,\n conflictColumns,\n this._config.columns,\n );\n\n return new Mutation<T>(this._config, [query], (results) =>\n deserializeRow(\n results[0].rows[0] as Record<string, unknown>,\n this._config.columns,\n ) as T,\n );\n }\n\n // -------------------------------------------------------------------------\n // Internal helpers\n // -------------------------------------------------------------------------\n\n /** @internal Validate that the given columns match a declared unique constraint. */\n private _validateUniqueConstraint(columns: string[]): void {\n if (!this._config.unique?.length) {\n throw new MindStudioError(\n `Cannot upsert on ${this._config.tableName}: no unique constraints declared. ` +\n `Add unique: [[${columns.map((c) => `'${c}'`).join(', ')}]] to defineTable options.`,\n 'no_unique_constraint',\n 400,\n );\n }\n const sorted = [...columns].sort().join(',');\n const match = this._config.unique.some(\n (u) => [...u].sort().join(',') === sorted,\n );\n if (!match) {\n throw new MindStudioError(\n `Cannot upsert on (${columns.join(', ')}): no matching unique constraint declared on ${this._config.tableName}.`,\n 'no_unique_constraint',\n 400,\n );\n }\n }\n}\n","/**\n * The `db` namespace — factory and time helpers for MindStudio managed databases.\n *\n * This module provides `createDb()`, which builds the `Db` object that users\n * interact with. The Db object has:\n *\n * - `defineTable<T>(name)` — creates a typed Table<T> for a given table name\n * - Time helpers: `now()`, `days()`, `hours()`, `minutes()`, `ago()`, `fromNow()`\n *\n * ## How defineTable works\n *\n * `defineTable` is a factory that binds a table name to the correct database\n * and execution context. It:\n *\n * 1. Looks up the table name in the app context database metadata\n * 2. Resolves the databaseId (implicit if only one database exists)\n * 3. Gets the column schema (for user-type handling and JSON parsing)\n * 4. Returns a Table<T> instance bound to the executeQuery function\n *\n * Tables are typically defined at module scope and imported into route handlers:\n *\n * ```ts\n * // tables/orders.ts\n * import { db } from '@mindstudio-ai/agent';\n * export const Orders = db.defineTable<Order>('orders');\n *\n * // routes/getOrders.ts\n * import { Orders } from '../tables/orders';\n * const active = await Orders.filter(o => o.status === 'active').take(10);\n * ```\n *\n * Since `defineTable()` is lazy (no queries execute until you await something\n * on the Table), it's safe to call at module scope. The actual database\n * context resolution happens on first query execution.\n *\n * ## Time helpers\n *\n * All timestamps in MindStudio databases are unix timestamps (milliseconds\n * since epoch). The time helpers make it easy to work with relative times\n * without writing `Date.now() - 48 * 60 * 60 * 1000` everywhere:\n *\n * ```ts\n * const cutoff = db.ago(db.days(2)); // 2 days ago (unix ms)\n * const deadline = db.fromNow(db.hours(48)); // 48 hours from now\n * const window = db.days(7) + db.hours(12); // composable durations\n * ```\n */\n\nimport { MindStudioError } from '../errors.js';\nimport type { AppDatabase, AppDatabaseColumnSchema } from '../types.js';\nimport { Table } from './table.js';\nimport { Query } from './query.js';\nimport { Mutation } from './mutation.js';\nimport type { TableConfig, SqlQuery, SqlResult, SystemColumns, SystemFields } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Options for defineTable\n// ---------------------------------------------------------------------------\n\n/**\n * Options for `db.defineTable()`.\n */\nexport interface DefineTableOptions<T = unknown> {\n /**\n * Database name or ID to target. Required when the app has multiple\n * databases and the table name alone is ambiguous.\n *\n * Accepts either the database's display name or its ID. The SDK\n * matches against both.\n *\n * If omitted, the SDK resolves the database automatically:\n * - Single database → used implicitly\n * - Multiple databases → searched by table name\n */\n database?: string;\n\n /**\n * Unique constraints for the table. Each entry is an array of column\n * names that together must be unique. The SDK communicates these to\n * the platform which creates the corresponding SQLite UNIQUE indexes.\n *\n * Required for `upsert()` — the conflict key must match a declared\n * unique constraint.\n *\n * @example\n * ```ts\n * // Single column unique\n * db.defineTable<User>('users', { unique: [['email']] });\n *\n * // Compound unique\n * db.defineTable<Membership>('memberships', { unique: [['userId', 'orgId']] });\n *\n * // Multiple constraints\n * db.defineTable<User>('users', { unique: [['email'], ['slug']] });\n * ```\n */\n unique?: (keyof T & string)[][];\n\n /**\n * Default values for columns, applied client-side in `push()` and\n * `upsert()`. Explicit values in the input override defaults.\n *\n * @example\n * ```ts\n * db.defineTable<Order>('orders', {\n * defaults: { status: 'pending', retryCount: 0 },\n * });\n * ```\n */\n defaults?: Partial<Omit<T, SystemFields>>;\n}\n\n// Re-export Table, Query, Mutation, and types for consumers\nexport { Table } from './table.js';\nexport { Query } from './query.js';\nexport { Mutation } from './mutation.js';\nexport type {\n Predicate,\n Accessor,\n PushInput,\n UpdateInput,\n Row,\n SystemColumns,\n SystemFields,\n TableConfig,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// Db interface — the shape of the `db` namespace object\n// ---------------------------------------------------------------------------\n\n/**\n * The `db` namespace object. Contains `defineTable()` for creating typed\n * collections and time helpers for working with unix timestamps.\n */\nexport interface Db {\n /**\n * Define a typed table. Returns a Table<T> bound to the app's managed\n * database. The table name must match a table in the app's database schema.\n *\n * Tables are lazy — nothing executes until you call a method on the Table\n * and await the result. This makes it safe to call `defineTable()` at\n * module scope.\n *\n * Database resolution:\n * - If the app has a single database (common case), it's used automatically.\n * - If the app has multiple databases, pass `{ database }` with the\n * database name or ID to target the right one. If omitted, the SDK\n * searches all databases by table name.\n *\n * @example\n * ```ts\n * // Single database (common) — no need to specify\n * const Orders = db.defineTable<Order>('orders');\n *\n * // Multiple databases — specify which one\n * const Orders = db.defineTable<Order>('orders', { database: 'main' });\n * ```\n */\n defineTable<T>(name: string, options?: DefineTableOptions<T>): Table<T & SystemColumns>;\n\n // --- Time helpers ---\n // All return numbers (unix timestamps in milliseconds or durations in ms).\n\n /** Returns the current time as a unix timestamp (ms). Equivalent to `Date.now()`. */\n now(): number;\n\n /** Returns milliseconds for n days. Composable with `+`. */\n days(n: number): number;\n\n /** Returns milliseconds for n hours. Composable with `+`. */\n hours(n: number): number;\n\n /** Returns milliseconds for n minutes. Composable with `+`. */\n minutes(n: number): number;\n\n /** Returns a unix timestamp for (now - duration). Use with days/hours/minutes. */\n ago(ms: number): number;\n\n /** Returns a unix timestamp for (now + duration). Use with days/hours/minutes. */\n fromNow(ms: number): number;\n\n // --- Batch execution ---\n\n /**\n * Execute multiple reads and writes in a single round trip. All\n * operations run on the same database connection, eliminating\n * per-operation HTTP overhead. Writes execute in argument order.\n *\n * Accepts Query objects (reads) and Mutation objects (writes from\n * push, update, remove, removeAll, clear). Compiles them to SQL,\n * sends all in one batch request, and returns typed results.\n *\n * @example\n * ```ts\n * // Mixed reads and writes in one round trip\n * const [, newCard, cards] = await db.batch(\n * Cards.update(card1.id, { position: 1 }),\n * Cards.push({ title: 'New', columnId, position: 0 }),\n * Cards.filter(c => c.columnId === columnId),\n * );\n * ```\n */\n batch<A>(q1: PromiseLike<A>): Promise<[A]>;\n batch<A, B>(q1: PromiseLike<A>, q2: PromiseLike<B>): Promise<[A, B]>;\n batch<A, B, C>(q1: PromiseLike<A>, q2: PromiseLike<B>, q3: PromiseLike<C>): Promise<[A, B, C]>;\n batch<A, B, C, D>(q1: PromiseLike<A>, q2: PromiseLike<B>, q3: PromiseLike<C>, q4: PromiseLike<D>): Promise<[A, B, C, D]>;\n batch<A, B, C, D, E>(q1: PromiseLike<A>, q2: PromiseLike<B>, q3: PromiseLike<C>, q4: PromiseLike<D>, q5: PromiseLike<E>): Promise<[A, B, C, D, E]>;\n batch(...queries: PromiseLike<unknown>[]): Promise<unknown[]>;\n}\n\n// ---------------------------------------------------------------------------\n// Factory — creates a Db instance from app context\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Db namespace object from app context database metadata.\n *\n * @param databases - Database metadata from `getAppContext()` or sandbox globals\n * @param executeBatch - Bound function that executes SQL batches via POST /_internal/v2/db/query\n * @returns The Db object with defineTable() and time helpers\n *\n * @internal Called by MindStudioAgent during context hydration. Not part of\n * the public API — users access `db` via the agent instance or top-level export.\n */\nexport function createDb(\n databases: AppDatabase[],\n executeBatch: (databaseId: string, queries: SqlQuery[]) => Promise<SqlResult[]>,\n): Db {\n return {\n defineTable<T>(name: string, options?: DefineTableOptions<T>): Table<T & SystemColumns> {\n // Resolve which database contains this table\n const resolved = resolveTable(databases, name, options?.database);\n\n const config: TableConfig = {\n databaseId: resolved.databaseId,\n tableName: name,\n columns: resolved.columns,\n unique: options?.unique as string[][] | undefined,\n defaults: options?.defaults as Record<string, unknown> | undefined,\n executeBatch: (queries: SqlQuery[]) =>\n executeBatch(resolved.databaseId, queries),\n };\n\n return new Table<T & SystemColumns>(config);\n },\n\n // --- Time helpers ---\n // Pure JS, no platform dependency. All timestamps are unix ms.\n\n now: () => Date.now(),\n days: (n: number) => n * 86_400_000,\n hours: (n: number) => n * 3_600_000,\n minutes: (n: number) => n * 60_000,\n ago: (ms: number) => Date.now() - ms,\n fromNow: (ms: number) => Date.now() + ms,\n\n // --- Batch execution ---\n\n batch: ((...operations: PromiseLike<unknown>[]) => {\n return (async () => {\n // Compile each operation into SQL\n type CompiledOp =\n | ReturnType<InstanceType<typeof Query<unknown>>['_compile']>\n | ReturnType<InstanceType<typeof Mutation<unknown>>['_compile']>;\n\n const compiled: CompiledOp[] = operations.map((op) => {\n if (op instanceof Query) {\n return (op as InstanceType<typeof Query<unknown>>)._compile();\n }\n if (op instanceof Mutation) {\n return (op as InstanceType<typeof Mutation<unknown>>)._compile();\n }\n throw new MindStudioError(\n 'db.batch() only accepts Query and Mutation objects (from .filter(), .update(), .push(), etc.)',\n 'invalid_batch_operation',\n 400,\n );\n });\n\n // Build a flat list of SQL queries, tracking which slice belongs\n // to which operation. Queries (reads) produce 1 SQL statement.\n // Mutations (writes) may produce N (e.g. push([a, b, c]) = 3 INSERTs).\n const groups = new Map<\n string,\n { opIndex: number; sqlQueries: SqlQuery[] }[]\n >();\n\n for (let i = 0; i < compiled.length; i++) {\n const c = compiled[i];\n const dbId = c.config.databaseId;\n\n if (!groups.has(dbId)) groups.set(dbId, []);\n\n if (c.type === 'query') {\n const sqlQuery = c.query ?? c.fallbackQuery!;\n groups.get(dbId)!.push({ opIndex: i, sqlQueries: [sqlQuery] });\n } else {\n groups.get(dbId)!.push({ opIndex: i, sqlQueries: c.queries });\n }\n }\n\n // Execute one batch per database, then map result slices back\n const opResults = new Map<number, SqlResult[]>();\n\n await Promise.all(\n Array.from(groups.entries()).map(async ([dbId, entries]) => {\n // Flatten all SQL for this database into one batch\n const flatQueries: SqlQuery[] = [];\n const slices: { opIndex: number; start: number; count: number }[] = [];\n\n for (const entry of entries) {\n slices.push({\n opIndex: entry.opIndex,\n start: flatQueries.length,\n count: entry.sqlQueries.length,\n });\n flatQueries.push(...entry.sqlQueries);\n }\n\n const results = await executeBatch(dbId, flatQueries);\n\n for (const { opIndex, start, count } of slices) {\n opResults.set(opIndex, results.slice(start, start + count));\n }\n }),\n );\n\n // Process results: deserialize + apply JS fallback where needed\n return compiled.map((c, i) => {\n const results = opResults.get(i)!;\n\n if (c.type === 'query') {\n // Log warning for JS fallback queries\n if (!c.query && c.predicates?.length) {\n console.warn(\n `[mindstudio] db.batch(): filter on ${c.config.tableName} could not be compiled to SQL — processing in JS`,\n );\n }\n return Query._processResults(results[0], c);\n } else {\n return Mutation._processResults(results, c);\n }\n });\n })();\n }) as Db['batch'],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Table resolution — finds the database + schema for a table name\n// ---------------------------------------------------------------------------\n\ninterface ResolvedTable {\n databaseId: string;\n columns: AppDatabaseColumnSchema[];\n}\n\n/**\n * Look up a table name in the app context database metadata.\n *\n * Resolution strategy:\n * 1. If `databaseHint` is provided, find that database (by name or ID)\n * and look for the table within it.\n * 2. If only one database exists, look for the table in that database.\n * 3. If multiple databases exist, search all of them by table name.\n * 4. Throws if the table or database is not found.\n *\n * @param databases - Database metadata from app context\n * @param tableName - The table name to find\n * @param databaseHint - Optional database name or ID to narrow the search\n * @returns The database ID and column schema for the table\n */\nfunction resolveTable(\n databases: AppDatabase[],\n tableName: string,\n databaseHint?: string,\n): ResolvedTable {\n if (databases.length === 0) {\n throw new MindStudioError(\n `No databases found in app context. Make sure the app has at least one database configured.`,\n 'no_databases',\n 400,\n );\n }\n\n // If a database hint is provided, narrow to that specific database\n if (databaseHint) {\n const targetDb = databases.find(\n (db) => db.id === databaseHint || db.name === databaseHint,\n );\n if (!targetDb) {\n const available = databases.map((db) => db.name || db.id).join(', ');\n throw new MindStudioError(\n `Database \"${databaseHint}\" not found. Available databases: ${available}`,\n 'database_not_found',\n 400,\n );\n }\n\n const table = targetDb.tables.find((t) => t.name === tableName);\n if (!table) {\n const available = targetDb.tables.map((t) => t.name).join(', ');\n throw new MindStudioError(\n `Table \"${tableName}\" not found in database \"${databaseHint}\". Available tables: ${available || '(none)'}`,\n 'table_not_found',\n 400,\n );\n }\n\n return { databaseId: targetDb.id, columns: table.schema };\n }\n\n // No hint — search all databases for a matching table name\n for (const db of databases) {\n const table = db.tables.find((t) => t.name === tableName);\n if (table) {\n return {\n databaseId: db.id,\n columns: table.schema,\n };\n }\n }\n\n // Table not found — build a helpful error message\n const availableTables = databases\n .flatMap((db) => db.tables.map((t) => t.name))\n .join(', ');\n\n throw new MindStudioError(\n `Table \"${tableName}\" not found in app databases. Available tables: ${availableTables || '(none)'}`,\n 'table_not_found',\n 400,\n );\n}\n","// AUTO-GENERATED — DO NOT EDIT\n// Run `npm run codegen` to regenerate from the OpenAPI spec.\n// Generated: 2026-03-24T14:58:04.580Z\n\n\nimport type {\n ActiveCampaignAddNoteStepInput,\n ActiveCampaignCreateContactStepInput,\n AddSubtitlesToVideoStepInput,\n AirtableCreateUpdateRecordStepInput,\n AirtableDeleteRecordStepInput,\n AirtableGetRecordStepInput,\n AirtableGetTableRecordsStepInput,\n AnalyzeImageStepInput,\n AnalyzeVideoStepInput,\n CaptureThumbnailStepInput,\n CheckAppRoleStepInput,\n CodaCreateUpdatePageStepInput,\n CodaCreateUpdateRowStepInput,\n CodaFindRowStepInput,\n CodaGetPageStepInput,\n CodaGetTableRowsStepInput,\n ConvertPdfToImagesStepInput,\n CreateDataSourceStepInput,\n CreateGmailDraftStepInput,\n CreateGoogleCalendarEventStepInput,\n CreateGoogleDocStepInput,\n CreateGoogleSheetStepInput,\n DeleteDataSourceStepInput,\n DeleteDataSourceDocumentStepInput,\n DeleteGmailEmailStepInput,\n DeleteGoogleCalendarEventStepInput,\n DeleteGoogleSheetRowsStepInput,\n DetectChangesStepInput,\n DetectPIIStepInput,\n DiscordEditMessageStepInput,\n DiscordSendFollowUpStepInput,\n DiscordSendMessageStepInput,\n DownloadVideoStepInput,\n EnhanceImageGenerationPromptStepInput,\n EnhanceVideoGenerationPromptStepInput,\n EnrichPersonStepInput,\n ExtractAudioFromVideoStepInput,\n ExtractTextStepInput,\n FetchDataSourceDocumentStepInput,\n FetchGoogleDocStepInput,\n FetchGoogleSheetStepInput,\n FetchSlackChannelHistoryStepInput,\n FetchYoutubeCaptionsStepInput,\n FetchYoutubeChannelStepInput,\n FetchYoutubeCommentsStepInput,\n FetchYoutubeVideoStepInput,\n GenerateChartStepInput,\n GenerateImageStepInput,\n GenerateLipsyncStepInput,\n GenerateMusicStepInput,\n GeneratePdfStepInput,\n GenerateStaticVideoFromImageStepInput,\n GenerateVideoStepInput,\n GetGmailAttachmentsStepInput,\n GetGmailDraftStepInput,\n GetGmailEmailStepInput,\n GetGmailUnreadCountStepInput,\n GetGoogleCalendarEventStepInput,\n GetGoogleDriveFileStepInput,\n GetGoogleSheetInfoStepInput,\n GetMediaMetadataStepInput,\n HttpRequestStepInput,\n HubspotCreateCompanyStepInput,\n HubspotCreateContactStepInput,\n HubspotGetCompanyStepInput,\n HubspotGetContactStepInput,\n HunterApiCompanyEnrichmentStepInput,\n HunterApiDomainSearchStepInput,\n HunterApiEmailFinderStepInput,\n HunterApiEmailVerificationStepInput,\n HunterApiPersonEnrichmentStepInput,\n ImageFaceSwapStepInput,\n ImageRemoveWatermarkStepInput,\n InsertVideoClipsStepInput,\n ListDataSourcesStepInput,\n ListGmailDraftsStepInput,\n ListGmailLabelsStepInput,\n ListGoogleCalendarEventsStepInput,\n ListGoogleDriveFilesStepInput,\n ListRecentGmailEmailsStepInput,\n LogicStepInput,\n MakeDotComRunScenarioStepInput,\n MergeAudioStepInput,\n MergeVideosStepInput,\n MixAudioIntoVideoStepInput,\n MuteVideoStepInput,\n N8nRunNodeStepInput,\n NotionCreatePageStepInput,\n NotionUpdatePageStepInput,\n PeopleSearchStepInput,\n PostToLinkedInStepInput,\n PostToSlackChannelStepInput,\n PostToXStepInput,\n PostToZapierStepInput,\n QueryAppDatabaseStepInput,\n QueryDataSourceStepInput,\n QueryExternalDatabaseStepInput,\n RedactPIIStepInput,\n RemoveBackgroundFromImageStepInput,\n ReplyToGmailEmailStepInput,\n ResizeVideoStepInput,\n RunFromConnectorRegistryStepInput,\n RunPackagedWorkflowStepInput,\n ScrapeFacebookPageStepInput,\n ScrapeFacebookPostsStepInput,\n ScrapeInstagramCommentsStepInput,\n ScrapeInstagramMentionsStepInput,\n ScrapeInstagramPostsStepInput,\n ScrapeInstagramProfileStepInput,\n ScrapeInstagramReelsStepInput,\n ScrapeLinkedInCompanyStepInput,\n ScrapeLinkedInProfileStepInput,\n ScrapeMetaThreadsProfileStepInput,\n ScrapeUrlStepInput,\n ScrapeXPostStepInput,\n ScrapeXProfileStepInput,\n ScreenshotUrlStepInput,\n SearchGmailEmailsStepInput,\n SearchGoogleStepInput,\n SearchGoogleCalendarEventsStepInput,\n SearchGoogleDriveStepInput,\n SearchGoogleImagesStepInput,\n SearchGoogleNewsStepInput,\n SearchGoogleTrendsStepInput,\n SearchPerplexityStepInput,\n SearchXPostsStepInput,\n SearchYoutubeStepInput,\n SearchYoutubeTrendsStepInput,\n SendEmailStepInput,\n SendGmailDraftStepInput,\n SendGmailMessageStepInput,\n SendSMSStepInput,\n SetGmailReadStatusStepInput,\n SetRunTitleStepInput,\n SetVariableStepInput,\n TelegramEditMessageStepInput,\n TelegramReplyToMessageStepInput,\n TelegramSendAudioStepInput,\n TelegramSendFileStepInput,\n TelegramSendImageStepInput,\n TelegramSendMessageStepInput,\n TelegramSendVideoStepInput,\n TelegramSetTypingStepInput,\n TextToSpeechStepInput,\n TranscribeAudioStepInput,\n TrimMediaStepInput,\n UpdateGmailLabelsStepInput,\n UpdateGoogleCalendarEventStepInput,\n UpdateGoogleDocStepInput,\n UpdateGoogleSheetStepInput,\n UploadDataSourceDocumentStepInput,\n UpscaleImageStepInput,\n UpscaleVideoStepInput,\n UserMessageStepInput,\n VideoFaceSwapStepInput,\n VideoRemoveBackgroundStepInput,\n VideoRemoveWatermarkStepInput,\n WatermarkImageStepInput,\n WatermarkVideoStepInput,\n ActiveCampaignAddNoteStepOutput,\n ActiveCampaignCreateContactStepOutput,\n AddSubtitlesToVideoStepOutput,\n AirtableCreateUpdateRecordStepOutput,\n AirtableDeleteRecordStepOutput,\n AirtableGetRecordStepOutput,\n AirtableGetTableRecordsStepOutput,\n AnalyzeImageStepOutput,\n AnalyzeVideoStepOutput,\n CaptureThumbnailStepOutput,\n CheckAppRoleStepOutput,\n CodaCreateUpdatePageStepOutput,\n CodaCreateUpdateRowStepOutput,\n CodaFindRowStepOutput,\n CodaGetPageStepOutput,\n CodaGetTableRowsStepOutput,\n ConvertPdfToImagesStepOutput,\n CreateDataSourceStepOutput,\n CreateGmailDraftStepOutput,\n CreateGoogleCalendarEventStepOutput,\n CreateGoogleDocStepOutput,\n CreateGoogleSheetStepOutput,\n DeleteDataSourceStepOutput,\n DeleteDataSourceDocumentStepOutput,\n DeleteGmailEmailStepOutput,\n DeleteGoogleCalendarEventStepOutput,\n DeleteGoogleSheetRowsStepOutput,\n DetectChangesStepOutput,\n DetectPIIStepOutput,\n DiscordEditMessageStepOutput,\n DiscordSendFollowUpStepOutput,\n DiscordSendMessageStepOutput,\n DownloadVideoStepOutput,\n EnhanceImageGenerationPromptStepOutput,\n EnhanceVideoGenerationPromptStepOutput,\n EnrichPersonStepOutput,\n ExtractAudioFromVideoStepOutput,\n ExtractTextStepOutput,\n FetchDataSourceDocumentStepOutput,\n FetchGoogleDocStepOutput,\n FetchGoogleSheetStepOutput,\n FetchSlackChannelHistoryStepOutput,\n FetchYoutubeCaptionsStepOutput,\n FetchYoutubeChannelStepOutput,\n FetchYoutubeCommentsStepOutput,\n FetchYoutubeVideoStepOutput,\n GenerateChartStepOutput,\n GenerateImageStepOutput,\n GenerateLipsyncStepOutput,\n GenerateMusicStepOutput,\n GeneratePdfStepOutput,\n GenerateStaticVideoFromImageStepOutput,\n GenerateVideoStepOutput,\n GetGmailAttachmentsStepOutput,\n GetGmailDraftStepOutput,\n GetGmailEmailStepOutput,\n GetGmailUnreadCountStepOutput,\n GetGoogleCalendarEventStepOutput,\n GetGoogleDriveFileStepOutput,\n GetGoogleSheetInfoStepOutput,\n GetMediaMetadataStepOutput,\n HttpRequestStepOutput,\n HubspotCreateCompanyStepOutput,\n HubspotCreateContactStepOutput,\n HubspotGetCompanyStepOutput,\n HubspotGetContactStepOutput,\n HunterApiCompanyEnrichmentStepOutput,\n HunterApiDomainSearchStepOutput,\n HunterApiEmailFinderStepOutput,\n HunterApiEmailVerificationStepOutput,\n HunterApiPersonEnrichmentStepOutput,\n ImageFaceSwapStepOutput,\n ImageRemoveWatermarkStepOutput,\n InsertVideoClipsStepOutput,\n ListDataSourcesStepOutput,\n ListGmailDraftsStepOutput,\n ListGmailLabelsStepOutput,\n ListGoogleCalendarEventsStepOutput,\n ListGoogleDriveFilesStepOutput,\n ListRecentGmailEmailsStepOutput,\n LogicStepOutput,\n MakeDotComRunScenarioStepOutput,\n MergeAudioStepOutput,\n MergeVideosStepOutput,\n MixAudioIntoVideoStepOutput,\n MuteVideoStepOutput,\n N8nRunNodeStepOutput,\n NotionCreatePageStepOutput,\n NotionUpdatePageStepOutput,\n PeopleSearchStepOutput,\n PostToLinkedInStepOutput,\n PostToSlackChannelStepOutput,\n PostToXStepOutput,\n PostToZapierStepOutput,\n QueryAppDatabaseStepOutput,\n QueryDataSourceStepOutput,\n QueryExternalDatabaseStepOutput,\n RedactPIIStepOutput,\n RemoveBackgroundFromImageStepOutput,\n ReplyToGmailEmailStepOutput,\n ResizeVideoStepOutput,\n RunFromConnectorRegistryStepOutput,\n RunPackagedWorkflowStepOutput,\n ScrapeFacebookPageStepOutput,\n ScrapeFacebookPostsStepOutput,\n ScrapeInstagramCommentsStepOutput,\n ScrapeInstagramMentionsStepOutput,\n ScrapeInstagramPostsStepOutput,\n ScrapeInstagramProfileStepOutput,\n ScrapeInstagramReelsStepOutput,\n ScrapeLinkedInCompanyStepOutput,\n ScrapeLinkedInProfileStepOutput,\n ScrapeMetaThreadsProfileStepOutput,\n ScrapeUrlStepOutput,\n ScrapeXPostStepOutput,\n ScrapeXProfileStepOutput,\n ScreenshotUrlStepOutput,\n SearchGmailEmailsStepOutput,\n SearchGoogleStepOutput,\n SearchGoogleCalendarEventsStepOutput,\n SearchGoogleDriveStepOutput,\n SearchGoogleImagesStepOutput,\n SearchGoogleNewsStepOutput,\n SearchGoogleTrendsStepOutput,\n SearchPerplexityStepOutput,\n SearchXPostsStepOutput,\n SearchYoutubeStepOutput,\n SearchYoutubeTrendsStepOutput,\n SendEmailStepOutput,\n SendGmailDraftStepOutput,\n SendGmailMessageStepOutput,\n SendSMSStepOutput,\n SetGmailReadStatusStepOutput,\n SetRunTitleStepOutput,\n SetVariableStepOutput,\n TelegramEditMessageStepOutput,\n TelegramReplyToMessageStepOutput,\n TelegramSendAudioStepOutput,\n TelegramSendFileStepOutput,\n TelegramSendImageStepOutput,\n TelegramSendMessageStepOutput,\n TelegramSendVideoStepOutput,\n TelegramSetTypingStepOutput,\n TextToSpeechStepOutput,\n TranscribeAudioStepOutput,\n TrimMediaStepOutput,\n UpdateGmailLabelsStepOutput,\n UpdateGoogleCalendarEventStepOutput,\n UpdateGoogleDocStepOutput,\n UpdateGoogleSheetStepOutput,\n UploadDataSourceDocumentStepOutput,\n UpscaleImageStepOutput,\n UpscaleVideoStepOutput,\n UserMessageStepOutput,\n VideoFaceSwapStepOutput,\n VideoRemoveBackgroundStepOutput,\n VideoRemoveWatermarkStepOutput,\n WatermarkImageStepOutput,\n WatermarkVideoStepOutput,\n} from \"./types.js\";\n\nimport type { StepExecutionOptions, StepExecutionResult } from \"../types.js\";\n\nexport interface StepMethods {\n /**\n * Add a note to an existing contact in ActiveCampaign.\n *\n * @remarks\n * - Requires an ActiveCampaign OAuth connection (connectionId).\n * - The contact must already exist — use the contact ID from a previous create or search step.\n *\n * @example\n * ```typescript\n * const result = await agent.activeCampaignAddNote({\n * contactId: ``,\n * note: ``,\n * });\n * ```\n */\n activeCampaignAddNote(step: ActiveCampaignAddNoteStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ActiveCampaignAddNoteStepOutput>>;\n\n /**\n * Create or sync a contact in ActiveCampaign.\n *\n * @remarks\n * - Requires an ActiveCampaign OAuth connection (connectionId).\n * - If a contact with the email already exists, it may be updated depending on ActiveCampaign settings.\n * - Custom fields are passed as a key-value map where keys are field IDs.\n *\n * @example\n * ```typescript\n * const result = await agent.activeCampaignCreateContact({\n * email: ``,\n * firstName: ``,\n * lastName: ``,\n * phone: ``,\n * accountId: ``,\n * customFields: {},\n * });\n * ```\n */\n activeCampaignCreateContact(step: ActiveCampaignCreateContactStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ActiveCampaignCreateContactStepOutput>>;\n\n /**\n * Automatically add subtitles to a video\n *\n * @remarks\n * - Can control style of text and animation\n *\n * @example\n * ```typescript\n * const result = await agent.addSubtitlesToVideo({\n * videoUrl: ``,\n * language: ``,\n * fontName: ``,\n * fontSize: 0,\n * fontWeight: \"normal\",\n * fontColor: \"white\",\n * highlightColor: \"white\",\n * strokeWidth: 0,\n * strokeColor: \"black\",\n * backgroundColor: \"black\",\n * backgroundOpacity: 0,\n * position: \"top\",\n * yOffset: 0,\n * wordsPerSubtitle: 0,\n * enableAnimation: false,\n * });\n * ```\n */\n addSubtitlesToVideo(step: AddSubtitlesToVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AddSubtitlesToVideoStepOutput>>;\n\n /**\n * Create a new record or update an existing record in an Airtable table.\n *\n * @remarks\n * - If recordId is provided, updates that record. Otherwise, creates a new one.\n * - When updating with updateMode \"onlySpecified\", unspecified fields are left as-is. With \"all\", unspecified fields are cleared.\n * - Array fields (e.g. multipleAttachments) accept arrays of values.\n *\n * @example\n * ```typescript\n * const result = await agent.airtableCreateUpdateRecord({\n * baseId: ``,\n * tableId: ``,\n * fields: ``,\n * recordData: {},\n * });\n * ```\n */\n airtableCreateUpdateRecord(step: AirtableCreateUpdateRecordStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AirtableCreateUpdateRecordStepOutput>>;\n\n /**\n * Delete a record from an Airtable table by its record ID.\n *\n * @remarks\n * - Requires an active Airtable OAuth connection (connectionId).\n * - Silently succeeds if the record does not exist.\n *\n * @example\n * ```typescript\n * const result = await agent.airtableDeleteRecord({\n * baseId: ``,\n * tableId: ``,\n * recordId: ``,\n * });\n * ```\n */\n airtableDeleteRecord(step: AirtableDeleteRecordStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AirtableDeleteRecordStepOutput>>;\n\n /**\n * Fetch a single record from an Airtable table by its record ID.\n *\n * @remarks\n * - Requires an active Airtable OAuth connection (connectionId).\n * - If the record is not found, returns a string message instead of a record object.\n *\n * @example\n * ```typescript\n * const result = await agent.airtableGetRecord({\n * baseId: ``,\n * tableId: ``,\n * recordId: ``,\n * });\n * ```\n */\n airtableGetRecord(step: AirtableGetRecordStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AirtableGetRecordStepOutput>>;\n\n /**\n * Fetch multiple records from an Airtable table with optional pagination.\n *\n * @remarks\n * - Requires an active Airtable OAuth connection (connectionId).\n * - Default limit is 100 records. Maximum is 1000.\n * - When outputFormat is 'csv', the variable receives CSV text. The direct execution output always returns parsed records.\n *\n * @example\n * ```typescript\n * const result = await agent.airtableGetTableRecords({\n * baseId: ``,\n * tableId: ``,\n * });\n * ```\n */\n airtableGetTableRecords(step: AirtableGetTableRecordsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AirtableGetTableRecordsStepOutput>>;\n\n /**\n * Analyze an image using a vision model based on a text prompt.\n *\n * @remarks\n * - Uses the configured vision model to generate a text analysis of the image.\n * - The prompt should describe what to look for or extract from the image.\n *\n * @example\n * ```typescript\n * const result = await agent.analyzeImage({\n * prompt: ``,\n * imageUrl: ``,\n * });\n * ```\n */\n analyzeImage(step: AnalyzeImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AnalyzeImageStepOutput>>;\n\n /**\n * Analyze a video using a video analysis model based on a text prompt.\n *\n * @remarks\n * - Uses the configured video analysis model to generate a text analysis of the video.\n * - The prompt should describe what to look for or extract from the video.\n *\n * @example\n * ```typescript\n * const result = await agent.analyzeVideo({\n * prompt: ``,\n * videoUrl: ``,\n * });\n * ```\n */\n analyzeVideo(step: AnalyzeVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<AnalyzeVideoStepOutput>>;\n\n /**\n * Capture a thumbnail from a video at a specified timestamp\n *\n * @example\n * ```typescript\n * const result = await agent.captureThumbnail({\n * videoUrl: ``,\n * at: ``,\n * });\n * ```\n */\n captureThumbnail(step: CaptureThumbnailStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CaptureThumbnailStepOutput>>;\n\n /**\n * Check whether the current user has a specific app role and branch accordingly.\n *\n * @remarks\n * - Checks if the current user has been assigned a specific role in this app.\n * - If the user has the role, transitions to the \"has role\" path.\n * - If the user does not have the role, transitions to the \"no role\" path, or errors if no path is configured.\n * - Role names are defined by the app creator and assigned to users via the app roles system.\n * - The roleName field supports {{variables}} for dynamic role checks.\n *\n * @example\n * ```typescript\n * const result = await agent.checkAppRole({\n * roleName: ``,\n * });\n * ```\n */\n checkAppRole(step: CheckAppRoleStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CheckAppRoleStepOutput>>;\n\n /**\n * Create a new page or update an existing page in a Coda document.\n *\n * @remarks\n * - Requires a Coda OAuth connection (connectionId).\n * - If pageData.pageId is provided, updates that page. Otherwise, creates a new one.\n * - Page content is provided as markdown and converted to Coda's canvas format.\n * - When updating, insertionMode controls how content is applied (default: 'append').\n *\n * @example\n * ```typescript\n * const result = await agent.codaCreateUpdatePage({\n * pageData: {},\n * });\n * ```\n */\n codaCreateUpdatePage(step: CodaCreateUpdatePageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CodaCreateUpdatePageStepOutput>>;\n\n /**\n * Create a new row or update an existing row in a Coda table.\n *\n * @remarks\n * - Requires a Coda OAuth connection (connectionId).\n * - If rowId is provided, updates that row. Otherwise, creates a new one.\n * - Row data keys are column IDs. Empty values are excluded.\n *\n * @example\n * ```typescript\n * const result = await agent.codaCreateUpdateRow({\n * docId: ``,\n * tableId: ``,\n * rowData: {},\n * });\n * ```\n */\n codaCreateUpdateRow(step: CodaCreateUpdateRowStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CodaCreateUpdateRowStepOutput>>;\n\n /**\n * Search for a row in a Coda table by matching column values.\n *\n * @remarks\n * - Requires a Coda OAuth connection (connectionId).\n * - Returns the first row matching all specified column values, or null if no match.\n * - Search criteria in rowData are ANDed together.\n *\n * @example\n * ```typescript\n * const result = await agent.codaFindRow({\n * docId: ``,\n * tableId: ``,\n * rowData: {},\n * });\n * ```\n */\n codaFindRow(step: CodaFindRowStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CodaFindRowStepOutput>>;\n\n /**\n * Export and read the contents of a page from a Coda document.\n *\n * @remarks\n * - Requires a Coda OAuth connection (connectionId).\n * - Page export is asynchronous on Coda's side — there may be a brief delay while it processes.\n * - If a page was just created in a prior step, there is an automatic 20-second retry if the first export attempt fails.\n *\n * @example\n * ```typescript\n * const result = await agent.codaGetPage({\n * docId: ``,\n * pageId: ``,\n * });\n * ```\n */\n codaGetPage(step: CodaGetPageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CodaGetPageStepOutput>>;\n\n /**\n * Fetch rows from a Coda table with optional pagination.\n *\n * @remarks\n * - Requires a Coda OAuth connection (connectionId).\n * - Default limit is 10000 rows. Rows are fetched in pages of 500.\n * - When outputFormat is 'csv', the variable receives CSV text. The direct execution output always returns parsed rows.\n *\n * @example\n * ```typescript\n * const result = await agent.codaGetTableRows({\n * docId: ``,\n * tableId: ``,\n * });\n * ```\n */\n codaGetTableRows(step: CodaGetTableRowsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CodaGetTableRowsStepOutput>>;\n\n /**\n * Convert each page of a PDF document into a PNG image.\n *\n * @remarks\n * - Each page is converted to a separate PNG and re-hosted on the CDN.\n * - Returns an array of image URLs, one per page.\n *\n * @example\n * ```typescript\n * const result = await agent.convertPdfToImages({\n * pdfUrl: ``,\n * });\n * ```\n */\n convertPdfToImages(step: ConvertPdfToImagesStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ConvertPdfToImagesStepOutput>>;\n\n /**\n * Create a new empty vector data source for the current app.\n *\n * @remarks\n * - Creates a new data source (vector database) associated with the current app version.\n * - The data source is created empty — use the \"Upload Data Source Document\" block to add documents.\n * - Returns the new data source ID which can be used in subsequent blocks.\n *\n * @example\n * ```typescript\n * const result = await agent.createDataSource({\n * name: ``,\n * });\n * ```\n */\n createDataSource(step: CreateDataSourceStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CreateDataSourceStepOutput>>;\n\n /**\n * Create a draft email in the connected Gmail account.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail compose scope.\n * - The draft appears in the user's Gmail Drafts folder but is not sent.\n * - messageType controls the body format: \"plain\" for plain text, \"html\" for raw HTML, \"markdown\" for auto-converted markdown.\n *\n * @example\n * ```typescript\n * const result = await agent.createGmailDraft({\n * to: ``,\n * subject: ``,\n * message: ``,\n * messageType: \"plain\",\n * });\n * ```\n */\n createGmailDraft(step: CreateGmailDraftStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CreateGmailDraftStepOutput>>;\n\n /**\n * Create a new event on a Google Calendar.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - Date/time values must be ISO 8601 format (e.g. \"2025-07-02T10:00:00-07:00\").\n * - Attendees are specified as one email address per line in a single string.\n * - Set addMeetLink to true to automatically attach a Google Meet video call.\n *\n * @example\n * ```typescript\n * const result = await agent.createGoogleCalendarEvent({\n * summary: ``,\n * startDateTime: ``,\n * endDateTime: ``,\n * });\n * ```\n */\n createGoogleCalendarEvent(step: CreateGoogleCalendarEventStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CreateGoogleCalendarEventStepOutput>>;\n\n /**\n * Create a new Google Document and optionally populate it with content.\n *\n * @remarks\n * - textType determines how the text field is interpreted: \"plain\" for plain text, \"html\" for HTML markup, \"markdown\" for Markdown.\n *\n * @example\n * ```typescript\n * const result = await agent.createGoogleDoc({\n * title: ``,\n * text: ``,\n * textType: \"plain\",\n * });\n * ```\n */\n createGoogleDoc(step: CreateGoogleDocStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CreateGoogleDocStepOutput>>;\n\n /**\n * Create a new Google Spreadsheet and populate it with CSV data.\n *\n * @example\n * ```typescript\n * const result = await agent.createGoogleSheet({\n * title: ``,\n * text: ``,\n * });\n * ```\n */\n createGoogleSheet(step: CreateGoogleSheetStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<CreateGoogleSheetStepOutput>>;\n\n /**\n * Delete a vector data source from the current app.\n *\n * @remarks\n * - Soft-deletes a data source (vector database) by marking it as deleted.\n * - The Milvus partition is cleaned up asynchronously by a background cron job.\n * - The data source must belong to the current app version.\n *\n * @example\n * ```typescript\n * const result = await agent.deleteDataSource({\n * dataSourceId: ``,\n * });\n * ```\n */\n deleteDataSource(step: DeleteDataSourceStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DeleteDataSourceStepOutput>>;\n\n /**\n * Delete a single document from a data source.\n *\n * @remarks\n * - Soft-deletes a document by marking it as deleted.\n * - Requires both the data source ID and document ID.\n * - After deletion, reloads vectors into Milvus so the data source reflects the change immediately.\n *\n * @example\n * ```typescript\n * const result = await agent.deleteDataSourceDocument({\n * dataSourceId: ``,\n * documentId: ``,\n * });\n * ```\n */\n deleteDataSourceDocument(step: DeleteDataSourceDocumentStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DeleteDataSourceDocumentStepOutput>>;\n\n /**\n * Move an email to trash in the connected Gmail account (recoverable delete).\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail modify scope.\n * - Uses trash (recoverable) rather than permanent delete.\n *\n * @example\n * ```typescript\n * const result = await agent.deleteGmailEmail({\n * messageId: ``,\n * });\n * ```\n */\n deleteGmailEmail(step: DeleteGmailEmailStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DeleteGmailEmailStepOutput>>;\n\n /**\n * Retrieve a specific event from a Google Calendar by event ID.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns the structured event.\n *\n * @example\n * ```typescript\n * const result = await agent.deleteGoogleCalendarEvent({\n * eventId: ``,\n * });\n * ```\n */\n deleteGoogleCalendarEvent(step: DeleteGoogleCalendarEventStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DeleteGoogleCalendarEventStepOutput>>;\n\n /**\n * Delete a range of rows from a Google Spreadsheet.\n *\n * @remarks\n * - Requires a Google OAuth connection with Drive scope.\n * - startRow and endRow are 1-based row numbers (inclusive).\n * - If sheetName is omitted, operates on the first sheet.\n *\n * @example\n * ```typescript\n * const result = await agent.deleteGoogleSheetRows({\n * documentId: ``,\n * startRow: ``,\n * endRow: ``,\n * });\n * ```\n */\n deleteGoogleSheetRows(step: DeleteGoogleSheetRowsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DeleteGoogleSheetRowsStepOutput>>;\n\n /**\n * Detect changes between runs by comparing current input against previously stored state. Routes execution based on whether a change occurred.\n *\n * @remarks\n * - Persists state across runs using a global variable keyed to the step ID.\n * - Two modes: \"comparison\" (default) uses strict string inequality; \"ai\" uses an LLM to determine if a meaningful change occurred.\n * - First run always treats the value as \"changed\" since there is no previous state.\n * - Each mode supports transitions to different steps/workflows for the \"changed\" and \"unchanged\" paths.\n * - AI mode bills normally for the LLM call.\n *\n * @example\n * ```typescript\n * const result = await agent.detectChanges({\n * mode: \"ai\",\n * input: ``,\n * });\n * ```\n */\n detectChanges(step: DetectChangesStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DetectChangesStepOutput>>;\n\n /**\n * Scan text for personally identifiable information using Microsoft Presidio.\n *\n * @remarks\n * - In workflow mode, transitions to detectedStepId if PII is found, notDetectedStepId otherwise.\n * - In direct execution, returns the detection results without transitioning.\n * - If entities is empty, returns immediately with no detections.\n *\n * @example\n * ```typescript\n * const result = await agent.detectPII({\n * input: ``,\n * language: ``,\n * entities: [],\n * });\n * ```\n */\n detectPII(step: DetectPIIStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DetectPIIStepOutput>>;\n\n /**\n * Edit a previously sent Discord channel message. Use with the message ID returned by Send Discord Message.\n *\n * @remarks\n * - Only messages sent by the bot can be edited.\n * - The messageId is returned by the Send Discord Message step.\n * - Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\n * - When editing with an attachment, the new attachment replaces any previous attachments on the message.\n * - URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\n *\n * @example\n * ```typescript\n * const result = await agent.discordEditMessage({\n * botToken: ``,\n * channelId: ``,\n * messageId: ``,\n * text: ``,\n * });\n * ```\n */\n discordEditMessage(step: DiscordEditMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DiscordEditMessageStepOutput>>;\n\n /**\n * Send a follow-up message to a Discord slash command interaction.\n *\n * @remarks\n * - Requires the applicationId and interactionToken from the Discord trigger variables.\n * - Follow-up messages appear as new messages in the channel after the initial response.\n * - Returns the sent message ID.\n * - Interaction tokens expire after 15 minutes.\n * - Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\n * - URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\n *\n * @example\n * ```typescript\n * const result = await agent.discordSendFollowUp({\n * applicationId: ``,\n * interactionToken: ``,\n * text: ``,\n * });\n * ```\n */\n discordSendFollowUp(step: DiscordSendFollowUpStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DiscordSendFollowUpStepOutput>>;\n\n /**\n * Send a message to Discord — either edit the loading message or send a new channel message.\n *\n * @remarks\n * - mode \"edit\" replaces the loading message (interaction response) with the final result. Uses applicationId and interactionToken from trigger variables. No bot permissions required.\n * - mode \"send\" sends a new message to a channel. Uses botToken and channelId from trigger variables. Returns a messageId that can be used with Edit Discord Message.\n * - Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\n * - URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\n * - Interaction tokens expire after 15 minutes.\n *\n * @example\n * ```typescript\n * const result = await agent.discordSendMessage({\n * mode: \"edit\",\n * text: ``,\n * });\n * ```\n */\n discordSendMessage(step: DiscordSendMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DiscordSendMessageStepOutput>>;\n\n /**\n * Download a video file\n *\n * @remarks\n * - Works with YouTube, TikTok, etc., by using ytdlp behind the scenes\n * - Can save as mp4 or mp3\n *\n * @example\n * ```typescript\n * const result = await agent.downloadVideo({\n * videoUrl: ``,\n * format: \"mp4\",\n * });\n * ```\n */\n downloadVideo(step: DownloadVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<DownloadVideoStepOutput>>;\n\n /**\n * Generate or enhance an image generation prompt using a language model. Optionally generates a negative prompt.\n *\n * @remarks\n * - Rewrites the user's prompt with added detail about style, lighting, colors, and composition.\n * - Also useful for initial generation, it doesn't always need to be enhancing an existing prompt\n * - When includeNegativePrompt is true, a second model call generates a negative prompt.\n *\n * @example\n * ```typescript\n * const result = await agent.enhanceImageGenerationPrompt({\n * initialPrompt: ``,\n * includeNegativePrompt: false,\n * systemPrompt: ``,\n * });\n * ```\n */\n enhanceImageGenerationPrompt(step: EnhanceImageGenerationPromptStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<EnhanceImageGenerationPromptStepOutput>>;\n\n /**\n * Generate or enhance a video generation prompt using a language model. Optionally generates a negative prompt.\n *\n * @remarks\n * - Rewrites the user's prompt with added detail about style, camera movement, lighting, and composition.\n * - Also useful for initial generation, it doesn't always need to be enhancing an existing prompt\n * - When includeNegativePrompt is true, a second model call generates a negative prompt.\n *\n * @example\n * ```typescript\n * const result = await agent.enhanceVideoGenerationPrompt({\n * initialPrompt: ``,\n * includeNegativePrompt: false,\n * systemPrompt: ``,\n * });\n * ```\n */\n enhanceVideoGenerationPrompt(step: EnhanceVideoGenerationPromptStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<EnhanceVideoGenerationPromptStepOutput>>;\n\n /**\n * Look up professional information about a person using Apollo.io. Search by ID, name, LinkedIn URL, email, or domain.\n *\n * @remarks\n * - At least one search parameter must be provided.\n * - Returns enriched data from Apollo including contact details, employment info, and social profiles.\n *\n * @example\n * ```typescript\n * const result = await agent.enrichPerson({\n * params: {},\n * });\n * ```\n */\n enrichPerson(step: EnrichPersonStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<EnrichPersonStepOutput>>;\n\n /**\n * Extract audio MP3 from a video file\n *\n * @example\n * ```typescript\n * const result = await agent.extractAudioFromVideo({\n * videoUrl: ``,\n * });\n * ```\n */\n extractAudioFromVideo(step: ExtractAudioFromVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ExtractAudioFromVideoStepOutput>>;\n\n /**\n * Download a file from a URL and extract its text content. Supports PDFs, plain text files, and other document formats.\n *\n * @remarks\n * - Best suited for PDFs and raw text/document files. For web pages, use the scrapeUrl step instead.\n * - Accepts a single URL, a comma-separated list of URLs, or a JSON array of URLs.\n * - Files are rehosted on the MindStudio CDN before extraction.\n * - Maximum file size is 50MB per URL.\n *\n * @example\n * ```typescript\n * const result = await agent.extractText({\n * url: ``,\n * });\n * ```\n */\n extractText(step: ExtractTextStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ExtractTextStepOutput>>;\n\n /**\n * Fetch the full extracted text contents of a document in a data source.\n *\n * @remarks\n * - Loads a document by ID and returns its full extracted text content.\n * - The document must have been successfully processed (status \"done\").\n * - Also returns document metadata (name, summary, word count).\n *\n * @example\n * ```typescript\n * const result = await agent.fetchDataSourceDocument({\n * dataSourceId: ``,\n * documentId: ``,\n * });\n * ```\n */\n fetchDataSourceDocument(step: FetchDataSourceDocumentStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchDataSourceDocumentStepOutput>>;\n\n /**\n * Fetch the contents of an existing Google Document.\n *\n * @remarks\n * - exportType controls the output format: \"html\" for HTML markup, \"markdown\" for Markdown, \"json\" for structured JSON, \"plain\" for plain text.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchGoogleDoc({\n * documentId: ``,\n * exportType: \"html\",\n * });\n * ```\n */\n fetchGoogleDoc(step: FetchGoogleDocStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchGoogleDocStepOutput>>;\n\n /**\n * Fetch contents of a Google Spreadsheet range.\n *\n * @remarks\n * - range uses A1 notation (e.g. \"Sheet1!A1:C10\"). Omit to fetch the entire first sheet.\n * - exportType controls the output format: \"csv\" for comma-separated values, \"json\" for structured JSON.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchGoogleSheet({\n * spreadsheetId: ``,\n * range: ``,\n * exportType: \"csv\",\n * });\n * ```\n */\n fetchGoogleSheet(step: FetchGoogleSheetStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchGoogleSheetStepOutput>>;\n\n /**\n * Fetch recent message history from a Slack channel.\n *\n * @remarks\n * - The user is responsible for connecting their Slack workspace and selecting the channel\n *\n * @example\n * ```typescript\n * const result = await agent.fetchSlackChannelHistory({\n * channelId: ``,\n * });\n * ```\n */\n fetchSlackChannelHistory(step: FetchSlackChannelHistoryStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchSlackChannelHistoryStepOutput>>;\n\n /**\n * Retrieve the captions/transcript for a YouTube video.\n *\n * @remarks\n * - Supports multiple languages via the language parameter.\n * - \"text\" export produces timestamped plain text; \"json\" export produces structured transcript data.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchYoutubeCaptions({\n * videoUrl: ``,\n * exportType: \"text\",\n * language: ``,\n * });\n * ```\n */\n fetchYoutubeCaptions(step: FetchYoutubeCaptionsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchYoutubeCaptionsStepOutput>>;\n\n /**\n * Retrieve metadata and recent videos for a YouTube channel.\n *\n * @remarks\n * - Accepts a YouTube channel URL (e.g. https://www.youtube.com/@ChannelName or /channel/ID).\n * - Returns channel info and video listings as a JSON object.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchYoutubeChannel({\n * channelUrl: ``,\n * });\n * ```\n */\n fetchYoutubeChannel(step: FetchYoutubeChannelStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchYoutubeChannelStepOutput>>;\n\n /**\n * Retrieve comments for a YouTube video.\n *\n * @remarks\n * - Paginates through comments (up to 5 pages).\n * - \"text\" export produces markdown-formatted text; \"json\" export produces structured comment data.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchYoutubeComments({\n * videoUrl: ``,\n * exportType: \"text\",\n * limitPages: ``,\n * });\n * ```\n */\n fetchYoutubeComments(step: FetchYoutubeCommentsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchYoutubeCommentsStepOutput>>;\n\n /**\n * Retrieve metadata for a YouTube video (title, description, stats, channel info).\n *\n * @remarks\n * - Returns video metadata, channel info, and engagement stats.\n * - Video format data is excluded from the response.\n *\n * @example\n * ```typescript\n * const result = await agent.fetchYoutubeVideo({\n * videoUrl: ``,\n * });\n * ```\n */\n fetchYoutubeVideo(step: FetchYoutubeVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<FetchYoutubeVideoStepOutput>>;\n\n /**\n * Create a chart image using QuickChart (Chart.js) and return the URL.\n *\n * @remarks\n * - The data field must be a Chart.js-compatible JSON object serialized as a string.\n * - Supported chart types: bar, line, pie.\n *\n * @example\n * ```typescript\n * const result = await agent.generateChart({\n * chart: {},\n * });\n * ```\n */\n generateChart(step: GenerateChartStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateChartStepOutput>>;\n\n /**\n * Generate an image from a text prompt using an AI model.\n *\n * @remarks\n * - Prompts should be descriptive but concise (roughly 3–6 sentences).\n * - Images are automatically hosted on a CDN.\n * - In foreground mode, the image is displayed to the user. In background mode, the URL is saved to a variable.\n * - When generateVariants is true with numVariants > 1, multiple images are generated in parallel.\n * - In direct execution, foreground mode behaves as background, and userSelect variant behavior behaves as saveAll.\n *\n * @example\n * ```typescript\n * const result = await agent.generateImage({\n * prompt: ``,\n * });\n * ```\n */\n generateImage(step: GenerateImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateImageStepOutput>>;\n\n /**\n * Generate a lip sync video from provided audio and image.\n *\n * @remarks\n * - In foreground mode, the video is displayed to the user. In background mode, the URL is saved to a variable.\n *\n * @example\n * ```typescript\n * const result = await agent.generateLipsync({});\n * ```\n */\n generateLipsync(step: GenerateLipsyncStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateLipsyncStepOutput>>;\n\n /**\n * Generate an audio file from provided instructions (text) using a music model.\n *\n * @remarks\n * - The text field contains the instructions (prompt) for the music generation.\n * - In foreground mode, the audio is displayed to the user. In background mode, the URL is saved to a variable.\n *\n * @example\n * ```typescript\n * const result = await agent.generateMusic({\n * text: ``,\n * });\n * ```\n */\n generateMusic(step: GenerateMusicStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateMusicStepOutput>>;\n\n /**\n * Generate an HTML asset and export it as a webpage, PDF, or image\n *\n * @remarks\n * - Agents can generate HTML documents and export as webpage, PDFs, images, or videos. They do this by using the \"generatePdf\" block, which defines an HTML page with variables, and then the generation process renders the page to create the output and save its URL at the specified variable.\n * - The template for the HTML page is generated by a separate process, and it can only use variables that have already been defined in the workflow at the time of its execution. It has full access to handlebars to render the HTML template, including a handlebars helper to render a markdown variable string as HTML (which can be useful for creating templates that render long strings). The template can also create its own simple JavaScript to do things like format dates and strings.\n * - If PDF or composited image generation are part of the workflow, assistant adds the block and leaves the \"source\" empty. In a separate step, assistant generates a detailed request for the developer who will write the HTML.\n * - Can also auto-generate HTML from a prompt (like a generate text block to generate HTML). In these cases, create a prompt with variables in the dynamicPrompt variable describing, in detail, the document to generate\n * - Can either display output directly to user (foreground mode) or save the URL of the asset to a variable (background mode)\n *\n * @example\n * ```typescript\n * const result = await agent.generateAsset({\n * source: ``,\n * sourceType: \"html\",\n * outputFormat: \"pdf\",\n * pageSize: \"full\",\n * testData: {},\n * });\n * ```\n */\n generateAsset(step: GeneratePdfStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GeneratePdfStepOutput>>;\n\n /**\n * Convert a static image to an MP4\n *\n * @remarks\n * - Can use to create slides/intertitles/slates for video composition\n *\n * @example\n * ```typescript\n * const result = await agent.generateStaticVideoFromImage({\n * imageUrl: ``,\n * duration: ``,\n * });\n * ```\n */\n generateStaticVideoFromImage(step: GenerateStaticVideoFromImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateStaticVideoFromImageStepOutput>>;\n\n /**\n * Generate a video from a text prompt using an AI model.\n *\n * @remarks\n * - Prompts should be descriptive but concise (roughly 3–6 sentences).\n * - Videos are automatically hosted on a CDN.\n * - In foreground mode, the video is displayed to the user. In background mode, the URL is saved to a variable.\n * - When generateVariants is true with numVariants > 1, multiple videos are generated in parallel.\n * - In direct execution, foreground mode behaves as background, and userSelect variant behavior behaves as saveAll.\n *\n * @example\n * ```typescript\n * const result = await agent.generateVideo({\n * prompt: ``,\n * });\n * ```\n */\n generateVideo(step: GenerateVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GenerateVideoStepOutput>>;\n\n /**\n * Download attachments from a Gmail email and re-host them on CDN.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Attachments are uploaded to CDN and returned as URLs.\n * - Attachments larger than 25MB are skipped.\n * - Use the message ID from Search Gmail Emails, List Recent Gmail Emails, or Get Gmail Email steps.\n *\n * @example\n * ```typescript\n * const result = await agent.getGmailAttachments({\n * messageId: ``,\n * });\n * ```\n */\n getGmailAttachments(step: GetGmailAttachmentsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGmailAttachmentsStepOutput>>;\n\n /**\n * Retrieve a specific draft from Gmail by draft ID.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns the draft content including subject, recipients, sender, and body.\n *\n * @example\n * ```typescript\n * const result = await agent.getGmailDraft({\n * draftId: ``,\n * });\n * ```\n */\n getGmailDraft(step: GetGmailDraftStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGmailDraftStepOutput>>;\n\n /**\n * Retrieve a specific email from Gmail by message ID.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns the email subject, sender, recipient, date, body (plain text preferred, falls back to HTML), and labels.\n *\n * @example\n * ```typescript\n * const result = await agent.getGmailEmail({\n * messageId: ``,\n * });\n * ```\n */\n getGmailEmail(step: GetGmailEmailStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGmailEmailStepOutput>>;\n\n /**\n * Get the number of unread emails in the connected Gmail inbox.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns the unread message count for the inbox label.\n * - This is a lightweight call that does not fetch any email content.\n *\n * @example\n * ```typescript\n * const result = await agent.getGmailUnreadCount({});\n * ```\n */\n getGmailUnreadCount(step: GetGmailUnreadCountStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGmailUnreadCountStepOutput>>;\n\n /**\n * Retrieve a specific event from a Google Calendar by event ID.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns the structured event.\n *\n * @example\n * ```typescript\n * const result = await agent.getGoogleCalendarEvent({\n * eventId: ``,\n * exportType: \"json\",\n * });\n * ```\n */\n getGoogleCalendarEvent(step: GetGoogleCalendarEventStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGoogleCalendarEventStepOutput>>;\n\n /**\n * Download a file from Google Drive and rehost it on the CDN. Returns a public CDN URL.\n *\n * @remarks\n * - Requires a Google OAuth connection with Drive scope.\n * - Google-native files (Docs, Sheets, Slides) cannot be downloaded — use dedicated steps instead.\n * - Maximum file size: 200MB.\n * - The file is downloaded and re-uploaded to the CDN; the returned URL is publicly accessible.\n *\n * @example\n * ```typescript\n * const result = await agent.getGoogleDriveFile({\n * fileId: ``,\n * });\n * ```\n */\n getGoogleDriveFile(step: GetGoogleDriveFileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGoogleDriveFileStepOutput>>;\n\n /**\n * Get metadata about a Google Spreadsheet including sheet names, row counts, and column counts.\n *\n * @remarks\n * - Requires a Google OAuth connection with Drive scope.\n * - Returns the spreadsheet title and a list of all sheets with their dimensions.\n *\n * @example\n * ```typescript\n * const result = await agent.getGoogleSheetInfo({\n * documentId: ``,\n * });\n * ```\n */\n getGoogleSheetInfo(step: GetGoogleSheetInfoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetGoogleSheetInfoStepOutput>>;\n\n /**\n * Get info about a media file\n *\n * @example\n * ```typescript\n * const result = await agent.getMediaMetadata({\n * mediaUrl: ``,\n * });\n * ```\n */\n getMediaMetadata(step: GetMediaMetadataStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<GetMediaMetadataStepOutput>>;\n\n /**\n * Make an HTTP request to an external endpoint and return the response.\n *\n * @remarks\n * - Supports GET, POST, PATCH, DELETE, and PUT methods.\n * - Body can be raw JSON/text, URL-encoded form data, or multipart form data.\n *\n * @example\n * ```typescript\n * const result = await agent.httpRequest({\n * url: ``,\n * method: ``,\n * headers: {},\n * queryParams: {},\n * body: ``,\n * bodyItems: {},\n * contentType: \"none\",\n * customContentType: ``,\n * });\n * ```\n */\n httpRequest(step: HttpRequestStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HttpRequestStepOutput>>;\n\n /**\n * Create a new company or update an existing one in HubSpot. Matches by domain.\n *\n * @remarks\n * - Requires a HubSpot OAuth connection (connectionId).\n * - If a company with the given domain already exists, it is updated. Otherwise, a new one is created.\n * - Property values are type-checked against enabledProperties before being sent to HubSpot.\n *\n * @example\n * ```typescript\n * const result = await agent.hubspotCreateCompany({\n * company: {},\n * enabledProperties: [],\n * });\n * ```\n */\n hubspotCreateCompany(step: HubspotCreateCompanyStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HubspotCreateCompanyStepOutput>>;\n\n /**\n * Create a new contact or update an existing one in HubSpot. Matches by email address.\n *\n * @remarks\n * - Requires a HubSpot OAuth connection (connectionId).\n * - If a contact with the given email already exists, it is updated. Otherwise, a new one is created.\n * - If companyDomain is provided, the contact is associated with that company (creating the company if needed).\n * - Property values are type-checked against enabledProperties before being sent to HubSpot.\n *\n * @example\n * ```typescript\n * const result = await agent.hubspotCreateContact({\n * contact: {},\n * enabledProperties: [],\n * companyDomain: ``,\n * });\n * ```\n */\n hubspotCreateContact(step: HubspotCreateContactStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HubspotCreateContactStepOutput>>;\n\n /**\n * Look up a HubSpot company by domain name or company ID.\n *\n * @remarks\n * - Requires a HubSpot OAuth connection (connectionId).\n * - Returns null if the company is not found.\n * - When searching by domain, performs a search query then fetches the full company record.\n * - Use additionalProperties to request specific HubSpot properties beyond the defaults.\n *\n * @example\n * ```typescript\n * const result = await agent.hubspotGetCompany({\n * searchBy: \"domain\",\n * companyDomain: ``,\n * companyId: ``,\n * additionalProperties: [],\n * });\n * ```\n */\n hubspotGetCompany(step: HubspotGetCompanyStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HubspotGetCompanyStepOutput>>;\n\n /**\n * Look up a HubSpot contact by email address or contact ID.\n *\n * @remarks\n * - Requires a HubSpot OAuth connection (connectionId).\n * - Returns null if the contact is not found.\n * - Use additionalProperties to request specific HubSpot properties beyond the defaults.\n *\n * @example\n * ```typescript\n * const result = await agent.hubspotGetContact({\n * searchBy: \"email\",\n * contactEmail: ``,\n * contactId: ``,\n * additionalProperties: [],\n * });\n * ```\n */\n hubspotGetContact(step: HubspotGetContactStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HubspotGetContactStepOutput>>;\n\n /**\n * Look up company information by domain using Hunter.io.\n *\n * @remarks\n * - Returns company name, description, location, industry, size, technologies, and more.\n * - If the domain input is a full URL, the hostname is automatically extracted.\n * - Returns null if the company is not found.\n *\n * @example\n * ```typescript\n * const result = await agent.hunterApiCompanyEnrichment({\n * domain: ``,\n * });\n * ```\n */\n hunterApiCompanyEnrichment(step: HunterApiCompanyEnrichmentStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HunterApiCompanyEnrichmentStepOutput>>;\n\n /**\n * Search for email addresses associated with a domain using Hunter.io.\n *\n * @remarks\n * - If the domain input is a full URL, the hostname is automatically extracted.\n * - Returns a list of email addresses found for the domain along with organization info.\n *\n * @example\n * ```typescript\n * const result = await agent.hunterApiDomainSearch({\n * domain: ``,\n * });\n * ```\n */\n hunterApiDomainSearch(step: HunterApiDomainSearchStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HunterApiDomainSearchStepOutput>>;\n\n /**\n * Find an email address for a specific person at a domain using Hunter.io.\n *\n * @remarks\n * - Requires a first name, last name, and domain.\n * - If the domain input is a full URL, the hostname is automatically extracted.\n * - Returns the most likely email address with a confidence score.\n *\n * @example\n * ```typescript\n * const result = await agent.hunterApiEmailFinder({\n * domain: ``,\n * firstName: ``,\n * lastName: ``,\n * });\n * ```\n */\n hunterApiEmailFinder(step: HunterApiEmailFinderStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HunterApiEmailFinderStepOutput>>;\n\n /**\n * Verify whether an email address is valid and deliverable using Hunter.io.\n *\n * @remarks\n * - Checks email format, MX records, SMTP server, and mailbox deliverability.\n * - Returns a status (\"valid\", \"invalid\", \"accept_all\", \"webmail\", \"disposable\", \"unknown\") and a score.\n *\n * @example\n * ```typescript\n * const result = await agent.hunterApiEmailVerification({\n * email: ``,\n * });\n * ```\n */\n hunterApiEmailVerification(step: HunterApiEmailVerificationStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HunterApiEmailVerificationStepOutput>>;\n\n /**\n * Look up professional information about a person by their email address using Hunter.io.\n *\n * @remarks\n * - Returns name, job title, social profiles, and company information.\n * - If the person is not found, returns an object with an error message instead of throwing.\n *\n * @example\n * ```typescript\n * const result = await agent.hunterApiPersonEnrichment({\n * email: ``,\n * });\n * ```\n */\n hunterApiPersonEnrichment(step: HunterApiPersonEnrichmentStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<HunterApiPersonEnrichmentStepOutput>>;\n\n /**\n * Replace a face in an image with a face from another image using AI.\n *\n * @remarks\n * - Requires both a target image and a face source image.\n * - Output is re-hosted on the CDN as a PNG.\n *\n * @example\n * ```typescript\n * const result = await agent.imageFaceSwap({\n * imageUrl: ``,\n * faceImageUrl: ``,\n * engine: ``,\n * });\n * ```\n */\n imageFaceSwap(step: ImageFaceSwapStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ImageFaceSwapStepOutput>>;\n\n /**\n * Remove watermarks from an image using AI.\n *\n * @remarks\n * - Output is re-hosted on the CDN as a PNG.\n *\n * @example\n * ```typescript\n * const result = await agent.imageRemoveWatermark({\n * imageUrl: ``,\n * engine: ``,\n * });\n * ```\n */\n imageRemoveWatermark(step: ImageRemoveWatermarkStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ImageRemoveWatermarkStepOutput>>;\n\n /**\n * Insert b-roll clips into a base video at a timecode, optionally with an xfade transition.\n *\n * @example\n * ```typescript\n * const result = await agent.insertVideoClips({\n * baseVideoUrl: ``,\n * overlayVideos: [],\n * });\n * ```\n */\n insertVideoClips(step: InsertVideoClipsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<InsertVideoClipsStepOutput>>;\n\n /**\n * List all data sources for the current app.\n *\n * @remarks\n * - Returns metadata for every data source associated with the current app version.\n * - Each entry includes the data source ID, name, description, status, and document list.\n *\n * @example\n * ```typescript\n * const result = await agent.listDataSources({});\n * ```\n */\n listDataSources(step: ListDataSourcesStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListDataSourcesStepOutput>>;\n\n /**\n * List drafts in the connected Gmail account.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns up to 50 drafts (default 10).\n * - The variable receives text or JSON depending on exportType.\n *\n * @example\n * ```typescript\n * const result = await agent.listGmailDrafts({\n * exportType: \"json\",\n * });\n * ```\n */\n listGmailDrafts(step: ListGmailDraftsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListGmailDraftsStepOutput>>;\n\n /**\n * List all labels in the connected Gmail account. Use these label IDs or names with the Update Gmail Labels step.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns both system labels (INBOX, SENT, TRASH, etc.) and user-created labels.\n * - Label type is \"system\" for built-in labels or \"user\" for custom labels.\n *\n * @example\n * ```typescript\n * const result = await agent.listGmailLabels({});\n * ```\n */\n listGmailLabels(step: ListGmailLabelsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListGmailLabelsStepOutput>>;\n\n /**\n * List upcoming events from a Google Calendar, ordered by start time.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - Only returns future events (timeMin = now).\n * - The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns structured events.\n *\n * @example\n * ```typescript\n * const result = await agent.listGoogleCalendarEvents({\n * limit: 0,\n * exportType: \"json\",\n * });\n * ```\n */\n listGoogleCalendarEvents(step: ListGoogleCalendarEventsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListGoogleCalendarEventsStepOutput>>;\n\n /**\n * List files in a Google Drive folder.\n *\n * @remarks\n * - Requires a Google OAuth connection with Drive scope.\n * - If folderId is omitted, lists files in the root folder.\n * - Returns file metadata including name, type, size, and links.\n *\n * @example\n * ```typescript\n * const result = await agent.listGoogleDriveFiles({\n * exportType: \"json\",\n * });\n * ```\n */\n listGoogleDriveFiles(step: ListGoogleDriveFilesStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListGoogleDriveFilesStepOutput>>;\n\n /**\n * List recent emails from the connected Gmail inbox.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Returns up to 100 emails (default 5), ordered by most recent first.\n * - Functionally equivalent to Search Gmail Emails with an \"in:inbox\" query.\n *\n * @example\n * ```typescript\n * const result = await agent.listRecentGmailEmails({\n * exportType: \"json\",\n * limit: ``,\n * });\n * ```\n */\n listRecentGmailEmails(step: ListRecentGmailEmailsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ListRecentGmailEmailsStepOutput>>;\n\n /**\n * Route execution to different branches based on AI evaluation, comparison operators, or workflow jumps.\n *\n * @remarks\n * - Supports two modes: \"ai\" (default) uses an AI model to pick the most accurate statement; \"comparison\" uses operator-based checks.\n * - In AI mode, the model picks the most accurate statement from the list. All possible cases must be specified.\n * - In comparison mode, the context is the left operand and each case's condition is the right operand. First matching case wins. Use operator \"default\" as a fallback.\n * - Requires at least two cases.\n * - Each case can transition to a step in the current workflow (destinationStepId) or jump to another workflow (destinationWorkflowId).\n *\n * @example\n * ```typescript\n * const result = await agent.logic({\n * context: ``,\n * cases: [],\n * });\n * ```\n */\n logic(step: LogicStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<LogicStepOutput>>;\n\n /**\n * Trigger a Make.com (formerly Integromat) scenario via webhook and return the response.\n *\n * @remarks\n * - The webhook URL must be configured in your Make.com scenario.\n * - Input key-value pairs are sent as JSON in the POST body.\n * - Response format depends on the Make.com scenario configuration.\n *\n * @example\n * ```typescript\n * const result = await agent.makeDotComRunScenario({\n * webhookUrl: ``,\n * input: {},\n * });\n * ```\n */\n makeDotComRunScenario(step: MakeDotComRunScenarioStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<MakeDotComRunScenarioStepOutput>>;\n\n /**\n * Merge one or more clips into a single audio file.\n *\n * @example\n * ```typescript\n * const result = await agent.mergeAudio({\n * mp3Urls: [],\n * });\n * ```\n */\n mergeAudio(step: MergeAudioStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<MergeAudioStepOutput>>;\n\n /**\n * Merge one or more clips into a single video.\n *\n * @example\n * ```typescript\n * const result = await agent.mergeVideos({\n * videoUrls: [],\n * });\n * ```\n */\n mergeVideos(step: MergeVideosStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<MergeVideosStepOutput>>;\n\n /**\n * Mix an audio track into a video\n *\n * @example\n * ```typescript\n * const result = await agent.mixAudioIntoVideo({\n * videoUrl: ``,\n * audioUrl: ``,\n * options: {},\n * });\n * ```\n */\n mixAudioIntoVideo(step: MixAudioIntoVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<MixAudioIntoVideoStepOutput>>;\n\n /**\n * Mute a video file\n *\n * @example\n * ```typescript\n * const result = await agent.muteVideo({\n * videoUrl: ``,\n * });\n * ```\n */\n muteVideo(step: MuteVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<MuteVideoStepOutput>>;\n\n /**\n * Trigger an n8n workflow node via webhook and return the response.\n *\n * @remarks\n * - The webhook URL must be configured in your n8n workflow.\n * - Supports GET and POST methods with optional Basic authentication.\n * - For GET requests, input values are sent as query parameters. For POST, they are sent as JSON body.\n *\n * @example\n * ```typescript\n * const result = await agent.n8nRunNode({\n * method: ``,\n * authentication: \"none\",\n * user: ``,\n * password: ``,\n * webhookUrl: ``,\n * input: {},\n * });\n * ```\n */\n n8nRunNode(step: N8nRunNodeStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<N8nRunNodeStepOutput>>;\n\n /**\n * Create a new page in Notion as a child of an existing page.\n *\n * @remarks\n * - Requires a Notion OAuth connection (connectionId).\n * - Content is provided as markdown and converted to Notion blocks (headings, paragraphs, lists, code, quotes).\n * - The page is created as a child of the specified parent page (pageId).\n *\n * @example\n * ```typescript\n * const result = await agent.notionCreatePage({\n * pageId: ``,\n * content: ``,\n * title: ``,\n * });\n * ```\n */\n notionCreatePage(step: NotionCreatePageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<NotionCreatePageStepOutput>>;\n\n /**\n * Update the content of an existing Notion page.\n *\n * @remarks\n * - Requires a Notion OAuth connection (connectionId).\n * - Content is provided as markdown and converted to Notion blocks.\n * - \"append\" mode adds content to the end of the page. \"overwrite\" mode deletes all existing blocks first.\n *\n * @example\n * ```typescript\n * const result = await agent.notionUpdatePage({\n * pageId: ``,\n * content: ``,\n * mode: \"append\",\n * });\n * ```\n */\n notionUpdatePage(step: NotionUpdatePageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<NotionUpdatePageStepOutput>>;\n\n /**\n * Search for people matching specific criteria using Apollo.io. Supports natural language queries and advanced filters.\n *\n * @remarks\n * - Can use a natural language \"smartQuery\" which is converted to Apollo search parameters by an AI model.\n * - Advanced params can override or supplement the smart query results.\n * - Optionally enriches returned people and/or their organizations for additional detail.\n * - Results are paginated. Use limit and page to control the result window.\n *\n * @example\n * ```typescript\n * const result = await agent.peopleSearch({\n * smartQuery: ``,\n * enrichPeople: false,\n * enrichOrganizations: false,\n * limit: ``,\n * page: ``,\n * params: {},\n * });\n * ```\n */\n peopleSearch(step: PeopleSearchStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<PeopleSearchStepOutput>>;\n\n /**\n * Create a post on LinkedIn from the connected account.\n *\n * @remarks\n * - Requires a LinkedIn OAuth connection (connectionId).\n * - Supports text posts, image posts, video posts, document posts, and article posts.\n * - Attach one media type per post: image, video, document, or article.\n * - Documents support PDF, PPT, PPTX, DOC, DOCX (max 100MB, 300 pages). Displays as a slideshow carousel.\n * - Articles create a link preview with optional custom title, description, and thumbnail.\n * - Visibility controls who can see the post.\n *\n * @example\n * ```typescript\n * const result = await agent.postToLinkedIn({\n * message: ``,\n * visibility: \"PUBLIC\",\n * });\n * ```\n */\n postToLinkedIn(step: PostToLinkedInStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<PostToLinkedInStepOutput>>;\n\n /**\n * Send a message to a Slack channel via a connected bot.\n *\n * @remarks\n * - The user is responsible for connecting their Slack workspace and selecting the channel\n * - Supports both simple text messages and slack blocks messages\n * - Text messages can use limited markdown (slack-only fomatting—e.g., headers are just rendered as bold)\n *\n * @example\n * ```typescript\n * const result = await agent.postToSlackChannel({\n * channelId: ``,\n * messageType: \"string\",\n * message: ``,\n * });\n * ```\n */\n postToSlackChannel(step: PostToSlackChannelStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<PostToSlackChannelStepOutput>>;\n\n /**\n * Create a post on X (Twitter) from the connected account.\n *\n * @remarks\n * - Requires an X OAuth connection (connectionId).\n * - Maximum 280 characters of text.\n * - Optionally attach up to 4 media items (images, GIFs, or videos) via mediaUrls.\n * - Media URLs must be publicly accessible. The service fetches and uploads them to X.\n * - Supported formats: JPEG, PNG, GIF, WEBP, MP4. Images up to 5MB, videos up to 512MB.\n *\n * @example\n * ```typescript\n * const result = await agent.postToX({\n * text: ``,\n * });\n * ```\n */\n postToX(step: PostToXStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<PostToXStepOutput>>;\n\n /**\n * Send data to a Zapier Zap via webhook and return the response.\n *\n * @remarks\n * - The webhook URL must be configured in the Zapier Zap settings\n * - Input keys and values are sent as the JSON body of the POST request\n * - The webhook response (JSON or plain text) is returned as the output\n *\n * @example\n * ```typescript\n * const result = await agent.postToZapier({\n * webhookUrl: ``,\n * input: {},\n * });\n * ```\n */\n postToZapier(step: PostToZapierStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<PostToZapierStepOutput>>;\n\n /**\n * Execute a SQL query against the app managed database.\n *\n * @remarks\n * - Executes raw SQL against a SQLite database managed by the app.\n * - For SELECT queries, returns rows as JSON.\n * - For INSERT/UPDATE/DELETE, returns the number of affected rows.\n * - Use {{variables}} directly in your SQL. By default they are automatically extracted\n * and passed as safe parameterized values (preventing SQL injection).\n * Example: INSERT INTO contacts (name, comment) VALUES ({{name}}, {{comment}})\n * - Full MindStudio handlebars syntax is supported, including helpers like {{json myVar}},\n * {{get myVar \"$.path\"}}, {{global.orgName}}, etc.\n * - Set parameterize to false for raw/dynamic SQL where variables are interpolated directly\n * into the query string. Use this when another step generates full or partial SQL, e.g.\n * a bulk INSERT with a precomputed VALUES list. The user is responsible for sanitization\n * when parameterize is false.\n *\n * @example\n * ```typescript\n * const result = await agent.queryAppDatabase({\n * databaseId: ``,\n * sql: ``,\n * });\n * ```\n */\n queryAppDatabase(step: QueryAppDatabaseStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<QueryAppDatabaseStepOutput>>;\n\n /**\n * Search a vector data source (RAG) and return relevant document chunks.\n *\n * @remarks\n * - Queries a vectorized data source and returns the most relevant chunks.\n * - Useful for retrieval-augmented generation (RAG) workflows.\n *\n * @example\n * ```typescript\n * const result = await agent.queryDataSource({\n * dataSourceId: ``,\n * query: ``,\n * maxResults: 0,\n * });\n * ```\n */\n queryDataSource(step: QueryDataSourceStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<QueryDataSourceStepOutput>>;\n\n /**\n * Execute a SQL query against an external database connected to the workspace.\n *\n * @remarks\n * - Requires a database connection configured in the workspace.\n * - Supports PostgreSQL (including Supabase), MySQL, and MSSQL.\n * - Results can be returned as JSON or CSV.\n *\n * @example\n * ```typescript\n * const result = await agent.queryExternalDatabase({\n * query: ``,\n * outputFormat: \"json\",\n * });\n * ```\n */\n queryExternalDatabase(step: QueryExternalDatabaseStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<QueryExternalDatabaseStepOutput>>;\n\n /**\n * Replace personally identifiable information in text with placeholders using Microsoft Presidio.\n *\n * @remarks\n * - PII is replaced with entity type placeholders (e.g. \"Call me at <PHONE_NUMBER>\").\n * - If entities is empty, returns empty text immediately without processing.\n *\n * @example\n * ```typescript\n * const result = await agent.redactPII({\n * input: ``,\n * language: ``,\n * entities: [],\n * });\n * ```\n */\n redactPII(step: RedactPIIStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<RedactPIIStepOutput>>;\n\n /**\n * Remove the background from an image using AI, producing a transparent PNG.\n *\n * @remarks\n * - Uses the Bria background removal model via fal.ai.\n * - Output is re-hosted on the CDN as a PNG with transparency.\n *\n * @example\n * ```typescript\n * const result = await agent.removeBackgroundFromImage({\n * imageUrl: ``,\n * });\n * ```\n */\n removeBackgroundFromImage(step: RemoveBackgroundFromImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<RemoveBackgroundFromImageStepOutput>>;\n\n /**\n * Reply to an existing email in Gmail. The reply is threaded under the original message.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail compose and readonly scopes.\n * - The reply is sent to the original sender and threaded under the original message.\n * - messageType controls the body format: \"plain\", \"html\", or \"markdown\".\n *\n * @example\n * ```typescript\n * const result = await agent.replyToGmailEmail({\n * messageId: ``,\n * message: ``,\n * messageType: \"plain\",\n * });\n * ```\n */\n replyToGmailEmail(step: ReplyToGmailEmailStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ReplyToGmailEmailStepOutput>>;\n\n /**\n * Resize a video file\n *\n * @example\n * ```typescript\n * const result = await agent.resizeVideo({\n * videoUrl: ``,\n * mode: \"fit\",\n * });\n * ```\n */\n resizeVideo(step: ResizeVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ResizeVideoStepOutput>>;\n\n /**\n * Run a raw API connector to a third-party service\n *\n * @remarks\n * - Use the /developer/v2/helpers/connectors endpoint to list available services and actions.\n * - Use /developer/v2/helpers/connectors/{serviceId}/{actionId} to get the full input configuration for an action.\n * - Use /developer/v2/helpers/connections to list your available OAuth connections.\n * - The actionId format is \"serviceId/actionId\" (e.g., \"slack/send-message\").\n * - Pass a __connectionId to authenticate the request with a specific OAuth connection, otherwise the default will be used (if configured).\n *\n * @example\n * ```typescript\n * const result = await agent.runFromConnectorRegistry({\n * actionId: ``,\n * displayName: ``,\n * icon: ``,\n * configurationValues: {},\n * });\n * ```\n */\n runFromConnectorRegistry(step: RunFromConnectorRegistryStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<RunFromConnectorRegistryStepOutput>>;\n\n /**\n * Run a packaged workflow (\"custom block\")\n *\n * @remarks\n * - From the user's perspective, packaged workflows are just ordinary blocks. Behind the scenes, they operate like packages/libraries in a programming language, letting the user execute custom functionality.\n * - Some of these packaged workflows are available as part of MindStudio's \"Standard Library\" and available to every user.\n * - Available packaged workflows are documented here as individual blocks, but the runPackagedWorkflow block is how they need to be wrapped in order to be executed correctly.\n *\n * @example\n * ```typescript\n * const result = await agent.runPackagedWorkflow({\n * appId: ``,\n * workflowId: ``,\n * inputVariables: {},\n * outputVariables: {},\n * name: ``,\n * });\n * ```\n */\n runPackagedWorkflow(step: RunPackagedWorkflowStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<RunPackagedWorkflowStepOutput>>;\n\n /**\n * Scrape a Facebook page\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeFacebookPage({\n * pageUrl: ``,\n * });\n * ```\n */\n scrapeFacebookPage(step: ScrapeFacebookPageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeFacebookPageStepOutput>>;\n\n /**\n * Get all the posts for a Facebook page\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeFacebookPosts({\n * pageUrl: ``,\n * });\n * ```\n */\n scrapeFacebookPosts(step: ScrapeFacebookPostsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeFacebookPostsStepOutput>>;\n\n /**\n * Get all the comments for an Instagram post\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeInstagramComments({\n * postUrl: ``,\n * resultsLimit: ``,\n * });\n * ```\n */\n scrapeInstagramComments(step: ScrapeInstagramCommentsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeInstagramCommentsStepOutput>>;\n\n /**\n * Scrape an Instagram profile's mentions\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeInstagramMentions({\n * profileUrl: ``,\n * resultsLimit: ``,\n * });\n * ```\n */\n scrapeInstagramMentions(step: ScrapeInstagramMentionsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeInstagramMentionsStepOutput>>;\n\n /**\n * Get all the posts for an Instagram profile\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeInstagramPosts({\n * profileUrl: ``,\n * resultsLimit: ``,\n * onlyPostsNewerThan: ``,\n * });\n * ```\n */\n scrapeInstagramPosts(step: ScrapeInstagramPostsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeInstagramPostsStepOutput>>;\n\n /**\n * Scrape an Instagram profile\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeInstagramProfile({\n * profileUrl: ``,\n * });\n * ```\n */\n scrapeInstagramProfile(step: ScrapeInstagramProfileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeInstagramProfileStepOutput>>;\n\n /**\n * Get all the reels for an Instagram profile\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeInstagramReels({\n * profileUrl: ``,\n * resultsLimit: ``,\n * });\n * ```\n */\n scrapeInstagramReels(step: ScrapeInstagramReelsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeInstagramReelsStepOutput>>;\n\n /**\n * Scrape public company data from a LinkedIn company page.\n *\n * @remarks\n * - Requires a LinkedIn company URL (e.g. https://www.linkedin.com/company/mindstudioai).\n * - Returns structured company data including description, employees, updates, and similar companies.\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeLinkedInCompany({\n * url: ``,\n * });\n * ```\n */\n scrapeLinkedInCompany(step: ScrapeLinkedInCompanyStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeLinkedInCompanyStepOutput>>;\n\n /**\n * Scrape public profile data from a LinkedIn profile page.\n *\n * @remarks\n * - Requires a LinkedIn profile URL (e.g. https://www.linkedin.com/in/username).\n * - Returns structured profile data including experience, education, articles, and activities.\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeLinkedInProfile({\n * url: ``,\n * });\n * ```\n */\n scrapeLinkedInProfile(step: ScrapeLinkedInProfileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeLinkedInProfileStepOutput>>;\n\n /**\n * Scrape a Meta Threads profile\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeMetaThreadsProfile({\n * profileUrl: ``,\n * });\n * ```\n */\n scrapeMetaThreadsProfile(step: ScrapeMetaThreadsProfileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeMetaThreadsProfileStepOutput>>;\n\n /**\n * Extract text, HTML, or structured content from one or more web pages.\n *\n * @remarks\n * - Accepts a single URL or multiple URLs (as a JSON array, comma-separated, or newline-separated).\n * - Output format controls the result shape: \"text\" returns markdown, \"html\" returns raw HTML, \"json\" returns structured scraper data.\n * - Can optionally capture a screenshot of each page.\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeUrl({\n * url: ``,\n * });\n * ```\n */\n scrapeUrl(step: ScrapeUrlStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeUrlStepOutput>>;\n\n /**\n * Scrape data from a single X (Twitter) post by URL.\n *\n * @remarks\n * - Returns structured post data (text, html, optional json/screenshot/metadata).\n * - Optionally saves the text content to a variable.\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeXPost({\n * url: ``,\n * });\n * ```\n */\n scrapeXPost(step: ScrapeXPostStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeXPostStepOutput>>;\n\n /**\n * Scrape public profile data from an X (Twitter) account by URL.\n *\n * @remarks\n * - Returns structured profile data.\n * - Optionally saves the result to a variable.\n *\n * @example\n * ```typescript\n * const result = await agent.scrapeXProfile({\n * url: ``,\n * });\n * ```\n */\n scrapeXProfile(step: ScrapeXProfileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScrapeXProfileStepOutput>>;\n\n /**\n * Capture a screenshot of a web page as a PNG image.\n *\n * @remarks\n * - Takes a viewport or full-page screenshot of the given URL.\n * - Returns a CDN-hosted PNG image URL.\n * - Viewport mode captures only the visible area; fullPage captures the entire scrollable page.\n * - You can customize viewport width/height, add a delay, or wait for a CSS selector before capturing.\n *\n * @example\n * ```typescript\n * const result = await agent.screenshotUrl({\n * url: ``,\n * });\n * ```\n */\n screenshotUrl(step: ScreenshotUrlStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<ScreenshotUrlStepOutput>>;\n\n /**\n * Search for emails in the connected Gmail account using a Gmail search query. To list recent inbox emails, pass an empty query string.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail readonly scope.\n * - Uses Gmail search syntax (e.g. \"from:user@example.com\", \"subject:invoice\", \"is:unread\").\n * - To list recent inbox emails, use an empty query string or \"in:inbox\".\n * - Returns up to 100 emails (default 5). The variable receives text or JSON depending on exportType.\n * - The direct execution output always returns structured email objects.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGmailEmails({\n * query: ``,\n * exportType: \"json\",\n * limit: ``,\n * });\n * ```\n */\n searchGmailEmails(step: SearchGmailEmailsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGmailEmailsStepOutput>>;\n\n /**\n * Search the web using Google and return structured results.\n *\n * @remarks\n * - Defaults to us/english, but can optionally specify country and/or language.\n * - Defaults to any time, but can optionally specify last hour, last day, week, month, or year.\n * - Defaults to top 30 results, but can specify 1 to 100 results to return.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogle({\n * query: ``,\n * exportType: \"text\",\n * });\n * ```\n */\n searchGoogle(step: SearchGoogleStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleStepOutput>>;\n\n /**\n * Search for events in a Google Calendar by keyword, date range, or both.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - Supports keyword search via \"query\" and date filtering via \"timeMin\"/\"timeMax\" (ISO 8601 format).\n * - Unlike \"List Events\" which only shows future events, this allows searching past events too.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogleCalendarEvents({\n * exportType: \"json\",\n * });\n * ```\n */\n searchGoogleCalendarEvents(step: SearchGoogleCalendarEventsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleCalendarEventsStepOutput>>;\n\n /**\n * Search for files in Google Drive by keyword.\n *\n * @remarks\n * - Requires a Google OAuth connection with Drive scope.\n * - Searches file content and names using Google Drive's fullText search.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogleDrive({\n * query: ``,\n * exportType: \"json\",\n * });\n * ```\n */\n searchGoogleDrive(step: SearchGoogleDriveStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleDriveStepOutput>>;\n\n /**\n * Search Google Images and return image results with URLs and metadata.\n *\n * @remarks\n * - Defaults to us/english, but can optionally specify country and/or language.\n * - Defaults to any time, but can optionally specify last hour, last day, week, month, or year.\n * - Defaults to top 30 results, but can specify 1 to 100 results to return.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogleImages({\n * query: ``,\n * exportType: \"text\",\n * });\n * ```\n */\n searchGoogleImages(step: SearchGoogleImagesStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleImagesStepOutput>>;\n\n /**\n * Search Google News for recent news articles matching a query.\n *\n * @remarks\n * - Defaults to top 30 results, but can specify 1 to 100 results to return.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogleNews({\n * text: ``,\n * exportType: \"text\",\n * });\n * ```\n */\n searchGoogleNews(step: SearchGoogleNewsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleNewsStepOutput>>;\n\n /**\n * Fetch Google Trends data for a search term.\n *\n * @remarks\n * - date accepts shorthand (\"now 1-H\", \"today 1-m\", \"today 5-y\", etc.) or custom \"yyyy-mm-dd yyyy-mm-dd\" ranges.\n * - data_type controls the shape of returned data: TIMESERIES, GEO_MAP, GEO_MAP_0, RELATED_TOPICS, or RELATED_QUERIES.\n *\n * @example\n * ```typescript\n * const result = await agent.searchGoogleTrends({\n * text: ``,\n * hl: ``,\n * geo: ``,\n * data_type: \"TIMESERIES\",\n * cat: ``,\n * date: ``,\n * ts: ``,\n * });\n * ```\n */\n searchGoogleTrends(step: SearchGoogleTrendsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchGoogleTrendsStepOutput>>;\n\n /**\n * Search the web using the Perplexity API and return structured results.\n *\n * @remarks\n * - Defaults to US results. Use countryCode (ISO code) to filter by country.\n * - Returns 10 results by default, configurable from 1 to 20.\n * - The variable receives text or JSON depending on exportType. The direct execution output always returns structured results.\n *\n * @example\n * ```typescript\n * const result = await agent.searchPerplexity({\n * query: ``,\n * exportType: \"text\",\n * });\n * ```\n */\n searchPerplexity(step: SearchPerplexityStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchPerplexityStepOutput>>;\n\n /**\n * Search recent X (Twitter) posts matching a query.\n *\n * @remarks\n * - Searches only the past 7 days of posts.\n * - Query supports X API v2 search operators (up to 512 characters).\n * Available search operators in query:\n * | Operator | Description |\n * | -----------------| -------------------------------------------------|\n * | from: | Posts from a specific user (e.g., from:elonmusk) |\n * | to: | Posts sent to a specific user (e.g., to:NASA) |\n * | @ | Mentions a user (e.g., @openai) |\n * | # | Hashtag search (e.g., #AI) |\n * | is:retweet | Filters retweets |\n * | is:reply | Filters replies |\n * | has:media | Posts containing media (images, videos, or GIFs) |\n * | has:links | Posts containing URLs |\n * | lang: | Filters by language (e.g., lang:en) |\n * | - | Excludes specific terms (e.g., -spam) |\n * | () | Groups terms or operators (e.g., (AI OR ML)) |\n * | AND, OR, NOT | Boolean logic for combining or excluding terms |\n * Conjunction-Required Operators (must be combined with a standalone operator):\n * | Operator | Description |\n * | ------------ | -----------------------------------------------|\n * | has:media | Posts containing media (images, videos, or GIFs) |\n * | has:links | Posts containing URLs |\n * | is:retweet | Filters retweets |\n * | is:reply | Filters replies |\n * For example, has:media alone is invalid, but #AI has:media is valid.\n *\n * @example\n * ```typescript\n * const result = await agent.searchXPosts({\n * query: ``,\n * scope: \"recent\",\n * options: {},\n * });\n * ```\n */\n searchXPosts(step: SearchXPostsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchXPostsStepOutput>>;\n\n /**\n * Search for YouTube videos by keyword.\n *\n * @remarks\n * - Supports pagination (up to 5 pages) and country/language filters.\n * - Use the filter/filterType fields for YouTube search parameter (sp) filters.\n *\n * @example\n * ```typescript\n * const result = await agent.searchYoutube({\n * query: ``,\n * limitPages: ``,\n * filter: ``,\n * filterType: ``,\n * });\n * ```\n */\n searchYoutube(step: SearchYoutubeStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchYoutubeStepOutput>>;\n\n /**\n * Retrieve trending videos on YouTube by category and region.\n *\n * @remarks\n * - Categories: \"now\" (trending now), \"music\", \"gaming\", \"films\".\n * - Supports country and language filtering.\n *\n * @example\n * ```typescript\n * const result = await agent.searchYoutubeTrends({\n * bp: \"now\",\n * hl: ``,\n * gl: ``,\n * });\n * ```\n */\n searchYoutubeTrends(step: SearchYoutubeTrendsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SearchYoutubeTrendsStepOutput>>;\n\n /**\n * Send an email to one or more configured recipient addresses.\n *\n * @remarks\n * - Recipient email addresses are resolved from OAuth connections configured by the app creator. The user running the workflow does not specify the recipient directly.\n * - If the body is a URL to a hosted HTML file on the CDN, the HTML is fetched and used as the email body.\n * - When generateHtml is enabled, the body text is converted to a styled HTML email using an AI model.\n * - connectionId can be a comma-separated list to send to multiple recipients.\n * - The special connectionId \"trigger_email\" uses the email address that triggered the workflow.\n *\n * @example\n * ```typescript\n * const result = await agent.sendEmail({\n * subject: ``,\n * body: ``,\n * });\n * ```\n */\n sendEmail(step: SendEmailStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SendEmailStepOutput>>;\n\n /**\n * Send an existing draft from the connected Gmail account.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail compose scope.\n * - The draft is sent and removed from the Drafts folder.\n * - Use the draft ID returned by the Create Gmail Draft or List Gmail Drafts steps.\n *\n * @example\n * ```typescript\n * const result = await agent.sendGmailDraft({\n * draftId: ``,\n * });\n * ```\n */\n sendGmailDraft(step: SendGmailDraftStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SendGmailDraftStepOutput>>;\n\n /**\n * Send an email from the connected Gmail account.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail compose scope.\n * - messageType controls the body format: \"plain\" for plain text, \"html\" for raw HTML, \"markdown\" for auto-converted markdown.\n *\n * @example\n * ```typescript\n * const result = await agent.sendGmailMessage({\n * to: ``,\n * subject: ``,\n * message: ``,\n * messageType: \"plain\",\n * });\n * ```\n */\n sendGmailMessage(step: SendGmailMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SendGmailMessageStepOutput>>;\n\n /**\n * Send an SMS or MMS message to a phone number configured via OAuth connection.\n *\n * @remarks\n * - User is responsible for configuring the connection to the number (MindStudio requires double opt-in to prevent spam)\n * - If mediaUrls are provided, the message is sent as MMS instead of SMS\n * - MMS supports up to 10 media URLs (images, video, audio, PDF) with a 5MB limit per file\n * - MMS is only supported on US and Canadian carriers; international numbers will receive SMS only (media silently dropped)\n *\n * @example\n * ```typescript\n * const result = await agent.sendSMS({\n * body: ``,\n * });\n * ```\n */\n sendSMS(step: SendSMSStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SendSMSStepOutput>>;\n\n /**\n * Mark one or more Gmail emails as read or unread.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail modify scope.\n * - Accepts one or more message IDs as a comma-separated string or array.\n * - Set markAsRead to true to mark as read, false to mark as unread.\n *\n * @example\n * ```typescript\n * const result = await agent.setGmailReadStatus({\n * messageIds: ``,\n * markAsRead: false,\n * });\n * ```\n */\n setGmailReadStatus(step: SetGmailReadStatusStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SetGmailReadStatusStepOutput>>;\n\n /**\n * Set the title of the agent run for the user's history\n *\n * @example\n * ```typescript\n * const result = await agent.setRunTitle({\n * title: ``,\n * });\n * ```\n */\n setRunTitle(step: SetRunTitleStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SetRunTitleStepOutput>>;\n\n /**\n * Explicitly set a variable to a given value.\n *\n * @remarks\n * - Useful for bootstrapping global variables or setting constants.\n * - The variable name and value both support variable interpolation.\n * - The type field is a UI hint only (controls input widget in the editor).\n *\n * @example\n * ```typescript\n * const result = await agent.setVariable({\n * value: ``,\n * });\n * ```\n */\n setVariable(step: SetVariableStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<SetVariableStepOutput>>;\n\n /**\n * Edit a previously sent Telegram message. Use with the message ID returned by Send Telegram Message.\n *\n * @remarks\n * - Only text messages sent by the bot can be edited.\n * - The messageId is returned by the Send Telegram Message step.\n * - Common pattern: send a \"Processing...\" message, do work, then edit it with the result.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramEditMessage({\n * botToken: ``,\n * chatId: ``,\n * messageId: ``,\n * text: ``,\n * });\n * ```\n */\n telegramEditMessage(step: TelegramEditMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramEditMessageStepOutput>>;\n\n /**\n * Send a reply to a specific Telegram message. The reply will be visually threaded in the chat.\n *\n * @remarks\n * - Use the rawMessage.message_id from the incoming trigger variables to reply to the user's message.\n * - Especially useful in group chats where replies provide context.\n * - Returns the sent message ID, which can be used with Edit Telegram Message.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramReplyToMessage({\n * botToken: ``,\n * chatId: ``,\n * replyToMessageId: ``,\n * text: ``,\n * });\n * ```\n */\n telegramReplyToMessage(step: TelegramReplyToMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramReplyToMessageStepOutput>>;\n\n /**\n * Send an audio file to a Telegram chat as music or a voice note via a bot.\n *\n * @remarks\n * - \"audio\" mode sends as a standard audio file. \"voice\" mode sends as a voice message (re-uploads the file for large file support).\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSendAudio({\n * botToken: ``,\n * chatId: ``,\n * audioUrl: ``,\n * mode: \"audio\",\n * });\n * ```\n */\n telegramSendAudio(step: TelegramSendAudioStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSendAudioStepOutput>>;\n\n /**\n * Send a document/file to a Telegram chat via a bot.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSendFile({\n * botToken: ``,\n * chatId: ``,\n * fileUrl: ``,\n * });\n * ```\n */\n telegramSendFile(step: TelegramSendFileStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSendFileStepOutput>>;\n\n /**\n * Send an image to a Telegram chat via a bot.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSendImage({\n * botToken: ``,\n * chatId: ``,\n * imageUrl: ``,\n * });\n * ```\n */\n telegramSendImage(step: TelegramSendImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSendImageStepOutput>>;\n\n /**\n * Send a text message to a Telegram chat via a bot.\n *\n * @remarks\n * - Messages are sent using MarkdownV2 formatting. Special characters are auto-escaped.\n * - botToken format is \"botId:token\" — both parts are required.\n * - Returns the sent message ID, which can be used with Edit Telegram Message to update the message later.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSendMessage({\n * botToken: ``,\n * chatId: ``,\n * text: ``,\n * });\n * ```\n */\n telegramSendMessage(step: TelegramSendMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSendMessageStepOutput>>;\n\n /**\n * Send a video to a Telegram chat via a bot.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSendVideo({\n * botToken: ``,\n * chatId: ``,\n * videoUrl: ``,\n * });\n * ```\n */\n telegramSendVideo(step: TelegramSendVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSendVideoStepOutput>>;\n\n /**\n * Show the \"typing...\" indicator in a Telegram chat via a bot.\n *\n * @remarks\n * - The typing indicator automatically expires after a few seconds. Use this right before sending a message for a natural feel.\n *\n * @example\n * ```typescript\n * const result = await agent.telegramSetTyping({\n * botToken: ``,\n * chatId: ``,\n * });\n * ```\n */\n telegramSetTyping(step: TelegramSetTypingStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TelegramSetTypingStepOutput>>;\n\n /**\n * Generate an audio file from provided text using a speech model.\n *\n * @remarks\n * - The text field contains the exact words to be spoken (not instructions).\n * - In foreground mode, the audio is displayed to the user. In background mode, the URL is saved to a variable.\n *\n * @example\n * ```typescript\n * const result = await agent.textToSpeech({\n * text: ``,\n * });\n * ```\n */\n textToSpeech(step: TextToSpeechStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TextToSpeechStepOutput>>;\n\n /**\n * Convert an audio file to text using a transcription model.\n *\n * @remarks\n * - The prompt field provides optional context to improve transcription accuracy (e.g. language, speaker names, domain).\n *\n * @example\n * ```typescript\n * const result = await agent.transcribeAudio({\n * audioUrl: ``,\n * prompt: ``,\n * });\n * ```\n */\n transcribeAudio(step: TranscribeAudioStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TranscribeAudioStepOutput>>;\n\n /**\n * Trim an audio or video clip\n *\n * @example\n * ```typescript\n * const result = await agent.trimMedia({\n * inputUrl: ``,\n * });\n * ```\n */\n trimMedia(step: TrimMediaStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<TrimMediaStepOutput>>;\n\n /**\n * Add or remove labels on Gmail messages, identified by message IDs or a search query.\n *\n * @remarks\n * - Requires a Google OAuth connection with Gmail modify scope.\n * - Provide either a query (Gmail search syntax) or explicit messageIds to target messages.\n * - Label IDs can be label names or Gmail label IDs — names are resolved automatically.\n *\n * @example\n * ```typescript\n * const result = await agent.updateGmailLabels({\n * query: ``,\n * messageIds: ``,\n * addLabelIds: ``,\n * removeLabelIds: ``,\n * });\n * ```\n */\n updateGmailLabels(step: UpdateGmailLabelsStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpdateGmailLabelsStepOutput>>;\n\n /**\n * Update an existing event on a Google Calendar. Only specified fields are changed.\n *\n * @remarks\n * - Requires a Google OAuth connection with Calendar events scope.\n * - Fetches the existing event first, then applies only the provided updates. Omitted fields are left unchanged.\n * - Attendees are specified as one email address per line, and replace the entire attendee list.\n *\n * @example\n * ```typescript\n * const result = await agent.updateGoogleCalendarEvent({\n * eventId: ``,\n * });\n * ```\n */\n updateGoogleCalendarEvent(step: UpdateGoogleCalendarEventStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpdateGoogleCalendarEventStepOutput>>;\n\n /**\n * Update the contents of an existing Google Document.\n *\n * @remarks\n * - operationType controls how content is applied: \"addToTop\" prepends, \"addToBottom\" appends, \"overwrite\" replaces all content.\n * - textType determines how the text field is interpreted: \"plain\" for plain text, \"html\" for HTML markup, \"markdown\" for Markdown.\n *\n * @example\n * ```typescript\n * const result = await agent.updateGoogleDoc({\n * documentId: ``,\n * text: ``,\n * textType: \"plain\",\n * operationType: \"addToTop\",\n * });\n * ```\n */\n updateGoogleDoc(step: UpdateGoogleDocStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpdateGoogleDocStepOutput>>;\n\n /**\n * Update a Google Spreadsheet with new data.\n *\n * @remarks\n * - operationType controls how data is written: \"addToBottom\" appends rows, \"overwrite\" replaces all data, \"range\" writes to a specific cell range.\n * - Data should be provided as CSV in the text field.\n *\n * @example\n * ```typescript\n * const result = await agent.updateGoogleSheet({\n * text: ``,\n * spreadsheetId: ``,\n * range: ``,\n * operationType: \"addToBottom\",\n * });\n * ```\n */\n updateGoogleSheet(step: UpdateGoogleSheetStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpdateGoogleSheetStepOutput>>;\n\n /**\n * Upload a file into an existing data source from a URL or raw text content.\n *\n * @remarks\n * - If \"file\" is a single URL, the file is downloaded from that URL and uploaded.\n * - If \"file\" is any other string, a .txt document is created from that content and uploaded.\n * - The block waits (polls) for processing to complete before transitioning, up to 5 minutes.\n * - Once processing finishes, vectors are loaded into Milvus so the data source is immediately queryable.\n * - Supported file types (when using a URL) are the same as the data source upload UI (PDF, DOCX, TXT, etc.).\n *\n * @example\n * ```typescript\n * const result = await agent.uploadDataSourceDocument({\n * dataSourceId: ``,\n * file: ``,\n * fileName: ``,\n * });\n * ```\n */\n uploadDataSourceDocument(step: UploadDataSourceDocumentStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UploadDataSourceDocumentStepOutput>>;\n\n /**\n * Increase the resolution of an image using AI upscaling.\n *\n * @remarks\n * - Output is re-hosted on the CDN as a PNG.\n *\n * @example\n * ```typescript\n * const result = await agent.upscaleImage({\n * imageUrl: ``,\n * targetResolution: \"2k\",\n * engine: \"standard\",\n * });\n * ```\n */\n upscaleImage(step: UpscaleImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpscaleImageStepOutput>>;\n\n /**\n * Upscale a video file\n *\n * @example\n * ```typescript\n * const result = await agent.upscaleVideo({\n * videoUrl: ``,\n * targetResolution: \"720p\",\n * engine: \"standard\",\n * });\n * ```\n */\n upscaleVideo(step: UpscaleVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UpscaleVideoStepOutput>>;\n\n /**\n * Send a message to an AI model and return the response, or echo a system message.\n *\n * @remarks\n * - Source \"user\" sends the message to an LLM and returns the model's response.\n * - Source \"system\" echoes the message content directly (no AI call).\n * - Mode \"background\" saves the result to a variable. Mode \"foreground\" streams it to the user (not available in direct execution).\n * - Structured output (JSON/CSV) can be enforced via structuredOutputType and structuredOutputExample.\n * - When executed inside a v2 app method (managed sandbox or local dev tunnel),\n * LLM token output can be streamed to the frontend in real time via an SSE\n * side-channel. The frontend opts in by passing { stream: true } to the method\n * invocation via @mindstudio-ai/interface. Tokens are published to Redis\n * pub/sub as they arrive and forwarded as SSE events on the invoke response.\n * The method code itself is unchanged — streaming is transparent to the\n * developer. See V2ExecutionService.ts and the invoke handler in V2Apps for\n * the server-side plumbing.\n *\n * @example\n * ```typescript\n * const result = await agent.generateText({\n * message: ``,\n * });\n * ```\n */\n generateText(step: UserMessageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<UserMessageStepOutput>>;\n\n /**\n * Swap faces in a video file\n *\n * @example\n * ```typescript\n * const result = await agent.videoFaceSwap({\n * videoUrl: ``,\n * faceImageUrl: ``,\n * targetIndex: 0,\n * engine: ``,\n * });\n * ```\n */\n videoFaceSwap(step: VideoFaceSwapStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<VideoFaceSwapStepOutput>>;\n\n /**\n * Remove or replace background from a video\n *\n * @example\n * ```typescript\n * const result = await agent.videoRemoveBackground({\n * videoUrl: ``,\n * newBackground: \"transparent\",\n * engine: ``,\n * });\n * ```\n */\n videoRemoveBackground(step: VideoRemoveBackgroundStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<VideoRemoveBackgroundStepOutput>>;\n\n /**\n * Remove a watermark from a video\n *\n * @example\n * ```typescript\n * const result = await agent.videoRemoveWatermark({\n * videoUrl: ``,\n * engine: ``,\n * });\n * ```\n */\n videoRemoveWatermark(step: VideoRemoveWatermarkStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<VideoRemoveWatermarkStepOutput>>;\n\n /**\n * Overlay a watermark image onto another image.\n *\n * @remarks\n * - The watermark is placed at the specified corner with configurable padding and width.\n *\n * @example\n * ```typescript\n * const result = await agent.watermarkImage({\n * imageUrl: ``,\n * watermarkImageUrl: ``,\n * corner: \"top-left\",\n * paddingPx: 0,\n * widthPx: 0,\n * });\n * ```\n */\n watermarkImage(step: WatermarkImageStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<WatermarkImageStepOutput>>;\n\n /**\n * Add an image watermark to a video\n *\n * @example\n * ```typescript\n * const result = await agent.watermarkVideo({\n * videoUrl: ``,\n * imageUrl: ``,\n * corner: \"top-left\",\n * paddingPx: 0,\n * widthPx: 0,\n * });\n * ```\n */\n watermarkVideo(step: WatermarkVideoStepInput, options?: StepExecutionOptions): Promise<StepExecutionResult<WatermarkVideoStepOutput>>;\n\n}\n\n/** @internal Attaches typed step methods to the MindStudioAgent prototype. */\nexport function applyStepMethods(AgentClass: new (...args: any[]) => any): void {\n const proto = AgentClass.prototype;\n\n proto.activeCampaignAddNote = function (step: ActiveCampaignAddNoteStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"activeCampaignAddNote\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.activeCampaignCreateContact = function (step: ActiveCampaignCreateContactStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"activeCampaignCreateContact\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.addSubtitlesToVideo = function (step: AddSubtitlesToVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"addSubtitlesToVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.airtableCreateUpdateRecord = function (step: AirtableCreateUpdateRecordStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"airtableCreateUpdateRecord\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.airtableDeleteRecord = function (step: AirtableDeleteRecordStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"airtableDeleteRecord\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.airtableGetRecord = function (step: AirtableGetRecordStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"airtableGetRecord\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.airtableGetTableRecords = function (step: AirtableGetTableRecordsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"airtableGetTableRecords\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.analyzeImage = function (step: AnalyzeImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"analyzeImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.analyzeVideo = function (step: AnalyzeVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"analyzeVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.captureThumbnail = function (step: CaptureThumbnailStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"captureThumbnail\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.checkAppRole = function (step: CheckAppRoleStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"checkAppRole\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.codaCreateUpdatePage = function (step: CodaCreateUpdatePageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"codaCreateUpdatePage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.codaCreateUpdateRow = function (step: CodaCreateUpdateRowStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"codaCreateUpdateRow\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.codaFindRow = function (step: CodaFindRowStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"codaFindRow\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.codaGetPage = function (step: CodaGetPageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"codaGetPage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.codaGetTableRows = function (step: CodaGetTableRowsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"codaGetTableRows\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.convertPdfToImages = function (step: ConvertPdfToImagesStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"convertPdfToImages\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.createDataSource = function (step: CreateDataSourceStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"createDataSource\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.createGmailDraft = function (step: CreateGmailDraftStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"createGmailDraft\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.createGoogleCalendarEvent = function (step: CreateGoogleCalendarEventStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"createGoogleCalendarEvent\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.createGoogleDoc = function (step: CreateGoogleDocStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"createGoogleDoc\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.createGoogleSheet = function (step: CreateGoogleSheetStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"createGoogleSheet\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.deleteDataSource = function (step: DeleteDataSourceStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"deleteDataSource\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.deleteDataSourceDocument = function (step: DeleteDataSourceDocumentStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"deleteDataSourceDocument\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.deleteGmailEmail = function (step: DeleteGmailEmailStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"deleteGmailEmail\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.deleteGoogleCalendarEvent = function (step: DeleteGoogleCalendarEventStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"deleteGoogleCalendarEvent\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.deleteGoogleSheetRows = function (step: DeleteGoogleSheetRowsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"deleteGoogleSheetRows\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.detectChanges = function (step: DetectChangesStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"detectChanges\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.detectPII = function (step: DetectPIIStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"detectPII\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.discordEditMessage = function (step: DiscordEditMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"discordEditMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.discordSendFollowUp = function (step: DiscordSendFollowUpStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"discordSendFollowUp\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.discordSendMessage = function (step: DiscordSendMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"discordSendMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.downloadVideo = function (step: DownloadVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"downloadVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.enhanceImageGenerationPrompt = function (step: EnhanceImageGenerationPromptStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"enhanceImageGenerationPrompt\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.enhanceVideoGenerationPrompt = function (step: EnhanceVideoGenerationPromptStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"enhanceVideoGenerationPrompt\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.enrichPerson = function (step: EnrichPersonStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"enrichPerson\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.extractAudioFromVideo = function (step: ExtractAudioFromVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"extractAudioFromVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.extractText = function (step: ExtractTextStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"extractText\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchDataSourceDocument = function (step: FetchDataSourceDocumentStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchDataSourceDocument\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchGoogleDoc = function (step: FetchGoogleDocStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchGoogleDoc\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchGoogleSheet = function (step: FetchGoogleSheetStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchGoogleSheet\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchSlackChannelHistory = function (step: FetchSlackChannelHistoryStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchSlackChannelHistory\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchYoutubeCaptions = function (step: FetchYoutubeCaptionsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchYoutubeCaptions\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchYoutubeChannel = function (step: FetchYoutubeChannelStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchYoutubeChannel\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchYoutubeComments = function (step: FetchYoutubeCommentsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchYoutubeComments\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.fetchYoutubeVideo = function (step: FetchYoutubeVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"fetchYoutubeVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateChart = function (step: GenerateChartStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateChart\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateImage = function (step: GenerateImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateLipsync = function (step: GenerateLipsyncStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateLipsync\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateMusic = function (step: GenerateMusicStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateMusic\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateAsset = function (step: GeneratePdfStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generatePdf\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateStaticVideoFromImage = function (step: GenerateStaticVideoFromImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateStaticVideoFromImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateVideo = function (step: GenerateVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"generateVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGmailAttachments = function (step: GetGmailAttachmentsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGmailAttachments\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGmailDraft = function (step: GetGmailDraftStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGmailDraft\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGmailEmail = function (step: GetGmailEmailStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGmailEmail\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGmailUnreadCount = function (step: GetGmailUnreadCountStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGmailUnreadCount\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGoogleCalendarEvent = function (step: GetGoogleCalendarEventStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGoogleCalendarEvent\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGoogleDriveFile = function (step: GetGoogleDriveFileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGoogleDriveFile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getGoogleSheetInfo = function (step: GetGoogleSheetInfoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getGoogleSheetInfo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.getMediaMetadata = function (step: GetMediaMetadataStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"getMediaMetadata\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.httpRequest = function (step: HttpRequestStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"httpRequest\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hubspotCreateCompany = function (step: HubspotCreateCompanyStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hubspotCreateCompany\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hubspotCreateContact = function (step: HubspotCreateContactStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hubspotCreateContact\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hubspotGetCompany = function (step: HubspotGetCompanyStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hubspotGetCompany\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hubspotGetContact = function (step: HubspotGetContactStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hubspotGetContact\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hunterApiCompanyEnrichment = function (step: HunterApiCompanyEnrichmentStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hunterApiCompanyEnrichment\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hunterApiDomainSearch = function (step: HunterApiDomainSearchStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hunterApiDomainSearch\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hunterApiEmailFinder = function (step: HunterApiEmailFinderStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hunterApiEmailFinder\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hunterApiEmailVerification = function (step: HunterApiEmailVerificationStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hunterApiEmailVerification\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.hunterApiPersonEnrichment = function (step: HunterApiPersonEnrichmentStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"hunterApiPersonEnrichment\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.imageFaceSwap = function (step: ImageFaceSwapStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"imageFaceSwap\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.imageRemoveWatermark = function (step: ImageRemoveWatermarkStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"imageRemoveWatermark\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.insertVideoClips = function (step: InsertVideoClipsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"insertVideoClips\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listDataSources = function (step: ListDataSourcesStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listDataSources\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listGmailDrafts = function (step: ListGmailDraftsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listGmailDrafts\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listGmailLabels = function (step: ListGmailLabelsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listGmailLabels\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listGoogleCalendarEvents = function (step: ListGoogleCalendarEventsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listGoogleCalendarEvents\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listGoogleDriveFiles = function (step: ListGoogleDriveFilesStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listGoogleDriveFiles\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.listRecentGmailEmails = function (step: ListRecentGmailEmailsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"listRecentGmailEmails\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.logic = function (step: LogicStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"logic\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.makeDotComRunScenario = function (step: MakeDotComRunScenarioStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"makeDotComRunScenario\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.mergeAudio = function (step: MergeAudioStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"mergeAudio\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.mergeVideos = function (step: MergeVideosStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"mergeVideos\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.mixAudioIntoVideo = function (step: MixAudioIntoVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"mixAudioIntoVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.muteVideo = function (step: MuteVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"muteVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.n8nRunNode = function (step: N8nRunNodeStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"n8nRunNode\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.notionCreatePage = function (step: NotionCreatePageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"notionCreatePage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.notionUpdatePage = function (step: NotionUpdatePageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"notionUpdatePage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.peopleSearch = function (step: PeopleSearchStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"peopleSearch\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.postToLinkedIn = function (step: PostToLinkedInStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"postToLinkedIn\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.postToSlackChannel = function (step: PostToSlackChannelStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"postToSlackChannel\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.postToX = function (step: PostToXStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"postToX\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.postToZapier = function (step: PostToZapierStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"postToZapier\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.queryAppDatabase = function (step: QueryAppDatabaseStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"queryAppDatabase\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.queryDataSource = function (step: QueryDataSourceStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"queryDataSource\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.queryExternalDatabase = function (step: QueryExternalDatabaseStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"queryExternalDatabase\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.redactPII = function (step: RedactPIIStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"redactPII\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.removeBackgroundFromImage = function (step: RemoveBackgroundFromImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"removeBackgroundFromImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.replyToGmailEmail = function (step: ReplyToGmailEmailStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"replyToGmailEmail\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.resizeVideo = function (step: ResizeVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"resizeVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.runFromConnectorRegistry = function (step: RunFromConnectorRegistryStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"runFromConnectorRegistry\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.runPackagedWorkflow = function (step: RunPackagedWorkflowStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"runPackagedWorkflow\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeFacebookPage = function (step: ScrapeFacebookPageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeFacebookPage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeFacebookPosts = function (step: ScrapeFacebookPostsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeFacebookPosts\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeInstagramComments = function (step: ScrapeInstagramCommentsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeInstagramComments\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeInstagramMentions = function (step: ScrapeInstagramMentionsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeInstagramMentions\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeInstagramPosts = function (step: ScrapeInstagramPostsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeInstagramPosts\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeInstagramProfile = function (step: ScrapeInstagramProfileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeInstagramProfile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeInstagramReels = function (step: ScrapeInstagramReelsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeInstagramReels\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeLinkedInCompany = function (step: ScrapeLinkedInCompanyStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeLinkedInCompany\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeLinkedInProfile = function (step: ScrapeLinkedInProfileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeLinkedInProfile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeMetaThreadsProfile = function (step: ScrapeMetaThreadsProfileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeMetaThreadsProfile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeUrl = function (step: ScrapeUrlStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeUrl\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeXPost = function (step: ScrapeXPostStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeXPost\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.scrapeXProfile = function (step: ScrapeXProfileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"scrapeXProfile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.screenshotUrl = function (step: ScreenshotUrlStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"screenshotUrl\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGmailEmails = function (step: SearchGmailEmailsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGmailEmails\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogle = function (step: SearchGoogleStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogle\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogleCalendarEvents = function (step: SearchGoogleCalendarEventsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogleCalendarEvents\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogleDrive = function (step: SearchGoogleDriveStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogleDrive\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogleImages = function (step: SearchGoogleImagesStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogleImages\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogleNews = function (step: SearchGoogleNewsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogleNews\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchGoogleTrends = function (step: SearchGoogleTrendsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchGoogleTrends\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchPerplexity = function (step: SearchPerplexityStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchPerplexity\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchXPosts = function (step: SearchXPostsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchXPosts\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchYoutube = function (step: SearchYoutubeStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchYoutube\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.searchYoutubeTrends = function (step: SearchYoutubeTrendsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"searchYoutubeTrends\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.sendEmail = function (step: SendEmailStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"sendEmail\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.sendGmailDraft = function (step: SendGmailDraftStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"sendGmailDraft\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.sendGmailMessage = function (step: SendGmailMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"sendGmailMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.sendSMS = function (step: SendSMSStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"sendSMS\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.setGmailReadStatus = function (step: SetGmailReadStatusStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"setGmailReadStatus\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.setRunTitle = function (step: SetRunTitleStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"setRunTitle\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.setVariable = function (step: SetVariableStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"setVariable\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramEditMessage = function (step: TelegramEditMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramEditMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramReplyToMessage = function (step: TelegramReplyToMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramReplyToMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSendAudio = function (step: TelegramSendAudioStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSendAudio\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSendFile = function (step: TelegramSendFileStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSendFile\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSendImage = function (step: TelegramSendImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSendImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSendMessage = function (step: TelegramSendMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSendMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSendVideo = function (step: TelegramSendVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSendVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.telegramSetTyping = function (step: TelegramSetTypingStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"telegramSetTyping\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.textToSpeech = function (step: TextToSpeechStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"textToSpeech\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.transcribeAudio = function (step: TranscribeAudioStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"transcribeAudio\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.trimMedia = function (step: TrimMediaStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"trimMedia\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.updateGmailLabels = function (step: UpdateGmailLabelsStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"updateGmailLabels\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.updateGoogleCalendarEvent = function (step: UpdateGoogleCalendarEventStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"updateGoogleCalendarEvent\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.updateGoogleDoc = function (step: UpdateGoogleDocStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"updateGoogleDoc\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.updateGoogleSheet = function (step: UpdateGoogleSheetStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"updateGoogleSheet\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.uploadDataSourceDocument = function (step: UploadDataSourceDocumentStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"uploadDataSourceDocument\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.upscaleImage = function (step: UpscaleImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"upscaleImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.upscaleVideo = function (step: UpscaleVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"upscaleVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.generateText = function (step: UserMessageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"userMessage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.videoFaceSwap = function (step: VideoFaceSwapStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"videoFaceSwap\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.videoRemoveBackground = function (step: VideoRemoveBackgroundStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"videoRemoveBackground\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.videoRemoveWatermark = function (step: VideoRemoveWatermarkStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"videoRemoveWatermark\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.watermarkImage = function (step: WatermarkImageStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"watermarkImage\", step as unknown as Record<string, unknown>, options);\n };\n\n proto.watermarkVideo = function (step: WatermarkVideoStepInput, options?: StepExecutionOptions) {\n return this.executeStep(\"watermarkVideo\", step as unknown as Record<string, unknown>, options);\n };\n\n}\n","import { request, type HttpClientConfig } from './http.js';\nimport { MindStudioError } from './errors.js';\nimport { RateLimiter, type AuthType } from './rate-limit.js';\nimport { loadConfig, type MindStudioConfig } from './config.js';\nimport { AuthContext } from './auth/index.js';\nimport { createDb, Table, type Db, type DefineTableOptions } from './db/index.js';\nimport type {\n AgentOptions,\n StepExecutionOptions,\n StepExecutionResult,\n StepLogEvent,\n ListAgentsResult,\n UserInfoResult,\n RunAgentOptions,\n RunAgentResult,\n MindStudioModel,\n MindStudioModelSummary,\n ModelType,\n ConnectorService,\n ConnectorActionDetail,\n Connection,\n StepCostEstimateEntry,\n UploadFileResult,\n ResolvedUser,\n AppContextResult,\n BatchStepInput,\n BatchStepResult,\n ExecuteStepBatchOptions,\n ExecuteStepBatchResult,\n} from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://v1.mindstudio-api.com';\nconst DEFAULT_MAX_RETRIES = 3;\n\n/**\n * Client for the MindStudio direct step execution API.\n *\n * Create an instance and call typed step methods directly:\n *\n * ```ts\n * const agent = new MindStudioAgent({ apiKey: \"your-key\" });\n * const { imageUrl } = await agent.generateImage({ prompt: \"a sunset\", mode: \"background\" });\n * console.log(imageUrl);\n * ```\n *\n * Authentication is resolved in order:\n * 1. `CALLBACK_TOKEN` environment variable (auto-set inside MindStudio — always takes priority)\n * 2. `apiKey` passed to the constructor\n * 3. `MINDSTUDIO_API_KEY` environment variable\n * 4. `~/.mindstudio/config.json` (set via `mindstudio login`)\n *\n * Base URL is resolved in order:\n * 1. `baseUrl` passed to the constructor\n * 2. `MINDSTUDIO_BASE_URL` environment variable\n * 3. `REMOTE_HOSTNAME` environment variable (auto-set inside MindStudio custom functions)\n * 4. `~/.mindstudio/config.json`\n * 5. `https://v1.mindstudio-api.com` (production default)\n *\n * Rate limiting is handled automatically:\n * - Concurrent requests are queued to stay within server limits\n * - 429 responses are retried automatically using the `Retry-After` header\n * - Internal (hook) tokens are capped at 500 calls per execution\n */\nexport class MindStudioAgent {\n /** @internal */\n readonly _httpConfig: HttpClientConfig;\n /** @internal */\n private _reuseThreadId: boolean;\n /** @internal */\n private _threadId: string | undefined;\n\n /** @internal Stream ID for SSE token streaming. Set by sandbox via STREAM_ID env var. */\n private _streamId: string | undefined;\n\n // ---- App context (db + auth) ----\n\n /**\n * @internal App ID for context resolution. Resolved from:\n * constructor appId → MINDSTUDIO_APP_ID env → sandbox globals →\n * auto-detected from first executeStep response header.\n */\n private _appId: string | undefined;\n\n /**\n * @internal Cached app context (auth + databases). Populated by\n * ensureContext() and cached for the lifetime of the instance.\n */\n private _context: AppContextResult | undefined;\n\n /**\n * @internal Deduplication promise for ensureContext(). Ensures only one\n * context fetch is in-flight at a time, even if multiple db/auth\n * operations trigger it concurrently.\n */\n private _contextPromise: Promise<void> | undefined;\n\n /** @internal Cached AuthContext instance, created during context hydration. */\n private _auth: AuthContext | undefined;\n\n /** @internal Cached Db namespace instance, created during context hydration. */\n private _db: Db | undefined;\n\n /** @internal Auth type — 'internal' for CALLBACK_TOKEN (managed mode), 'apiKey' otherwise. */\n private _authType: AuthType;\n\n constructor(options: AgentOptions = {}) {\n const config = loadConfig();\n const { token, authType } = resolveToken(options.apiKey, config);\n const baseUrl =\n options.baseUrl ??\n process.env.MINDSTUDIO_BASE_URL ??\n process.env.REMOTE_HOSTNAME ??\n config.baseUrl ??\n DEFAULT_BASE_URL;\n\n this._reuseThreadId =\n options.reuseThreadId ??\n /^(true|1)$/i.test(process.env.MINDSTUDIO_REUSE_THREAD_ID ?? '');\n\n this._appId =\n options.appId ?? process.env.MINDSTUDIO_APP_ID ?? undefined;\n\n this._authType = authType;\n\n this._httpConfig = {\n baseUrl,\n token,\n rateLimiter: new RateLimiter(authType),\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n };\n\n // Sandbox fast path: if running inside MindStudio (CALLBACK_TOKEN auth),\n // try to hydrate context synchronously from globals. The platform\n // pre-populates `ai.auth` and `ai.databases` before the script runs.\n if (authType === 'internal') {\n this._trySandboxHydration();\n }\n\n this._streamId = process.env.STREAM_ID ?? undefined;\n }\n\n /**\n * Execute any step by its type name. This is the low-level method that all\n * typed step methods delegate to. Use it as an escape hatch for step types\n * not yet covered by the generated methods.\n *\n * ```ts\n * const result = await agent.executeStep(\"generateImage\", { prompt: \"hello\", mode: \"background\" });\n * ```\n */\n async executeStep<TOutput = unknown>(\n stepType: string,\n step: Record<string, unknown>,\n options?: StepExecutionOptions,\n ): Promise<StepExecutionResult<TOutput>> {\n // Streaming path — when onLog is set, use SSE to get real-time debug logs\n if (options?.onLog) {\n return this._executeStepStreaming<TOutput>(\n stepType,\n step,\n options as StepExecutionOptions & { onLog: (event: StepLogEvent) => void },\n );\n }\n\n const threadId =\n options?.threadId ?? (this._reuseThreadId ? this._threadId : undefined);\n\n const { data, headers } = await request<{\n output?: TOutput;\n outputUrl?: string;\n }>(this._httpConfig, 'POST', `/steps/${stepType}/execute`, {\n step,\n ...(options?.appId != null && { appId: options.appId }),\n ...(threadId != null && { threadId }),\n ...(this._streamId != null && { streamId: this._streamId }),\n });\n\n let output: TOutput;\n if (data.output != null) {\n output = data.output;\n } else if (data.outputUrl) {\n const res = await fetch(data.outputUrl);\n if (!res.ok) {\n throw new MindStudioError(\n `Failed to fetch output from S3: ${res.status} ${res.statusText}`,\n 'output_fetch_error',\n res.status,\n );\n }\n const envelope = (await res.json()) as { value: TOutput };\n output = envelope.value;\n } else {\n output = undefined as TOutput;\n }\n\n const returnedThreadId = headers.get('x-mindstudio-thread-id') ?? '';\n if (this._reuseThreadId && returnedThreadId) {\n this._threadId = returnedThreadId;\n }\n\n // Auto-capture appId from response headers for zero-config db/auth.\n // If no explicit appId was set, store the one from the first API response\n // so that subsequent ensureContext() calls can use it.\n const returnedAppId = headers.get('x-mindstudio-app-id');\n if (!this._appId && returnedAppId) {\n this._appId = returnedAppId;\n }\n\n const remaining = headers.get('x-ratelimit-remaining');\n const billingCost = headers.get('x-mindstudio-billing-cost');\n const billingEvents = headers.get('x-mindstudio-billing-events');\n\n return {\n ...(output as object),\n $appId: headers.get('x-mindstudio-app-id') ?? '',\n $threadId: returnedThreadId,\n $rateLimitRemaining:\n remaining != null ? parseInt(remaining, 10) : undefined,\n $billingCost:\n billingCost != null ? parseFloat(billingCost) : undefined,\n $billingEvents:\n billingEvents != null\n ? (JSON.parse(billingEvents) as Array<Record<string, unknown>>)\n : undefined,\n } as StepExecutionResult<TOutput>;\n }\n\n /**\n * @internal Streaming step execution — sends `Accept: text/event-stream`\n * and parses SSE events for real-time debug logs.\n */\n private async _executeStepStreaming<TOutput = unknown>(\n stepType: string,\n step: Record<string, unknown>,\n options: StepExecutionOptions & { onLog: (event: StepLogEvent) => void },\n ): Promise<StepExecutionResult<TOutput>> {\n const threadId =\n options.threadId ?? (this._reuseThreadId ? this._threadId : undefined);\n\n const url = `${this._httpConfig.baseUrl}/developer/v2/steps/${stepType}/execute`;\n const body = {\n step,\n ...(options.appId != null && { appId: options.appId }),\n ...(threadId != null && { threadId }),\n ...(this._streamId != null && { streamId: this._streamId }),\n };\n\n await this._httpConfig.rateLimiter.acquire();\n\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this._httpConfig.token}`,\n 'Content-Type': 'application/json',\n 'User-Agent': '@mindstudio-ai/agent',\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n });\n } catch (err) {\n this._httpConfig.rateLimiter.release();\n throw err;\n }\n\n this._httpConfig.rateLimiter.updateFromHeaders(res.headers);\n\n if (!res.ok) {\n this._httpConfig.rateLimiter.release();\n const errorBody = await res.json().catch(() => ({}));\n throw new MindStudioError(\n (errorBody as Record<string, string>).message ||\n `${res.status} ${res.statusText}`,\n (errorBody as Record<string, string>).code || 'api_error',\n res.status,\n errorBody,\n );\n }\n\n // Capture headers from the initial response (same as non-streaming path)\n const headers = res.headers;\n\n try {\n // Parse SSE stream\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let doneEvent: {\n output?: TOutput;\n outputUrl?: string;\n billingCost?: number;\n billingEvents?: Array<Record<string, unknown>>;\n } | null = null;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n try {\n const event = JSON.parse(line.slice(6)) as Record<string, unknown>;\n\n if (event.type === 'log') {\n options.onLog({\n value: event.value as string,\n tag: event.tag as string,\n ts: event.ts as number,\n });\n } else if (event.type === 'done') {\n doneEvent = {\n output: event.output as TOutput | undefined,\n outputUrl: event.outputUrl as string | undefined,\n billingCost: event.billingCost as number | undefined,\n billingEvents: event.billingEvents as\n | Array<Record<string, unknown>>\n | undefined,\n };\n } else if (event.type === 'error') {\n throw new MindStudioError(\n (event.error as string) || 'Step execution failed',\n 'step_error',\n 500,\n );\n }\n } catch (err) {\n if (err instanceof MindStudioError) throw err;\n // Skip malformed SSE lines\n }\n }\n }\n\n // Flush remaining buffer\n if (buffer.startsWith('data: ')) {\n try {\n const event = JSON.parse(buffer.slice(6)) as Record<string, unknown>;\n if (event.type === 'done') {\n doneEvent = {\n output: event.output as TOutput | undefined,\n outputUrl: event.outputUrl as string | undefined,\n billingCost: event.billingCost as number | undefined,\n billingEvents: event.billingEvents as\n | Array<Record<string, unknown>>\n | undefined,\n };\n } else if (event.type === 'error') {\n throw new MindStudioError(\n (event.error as string) || 'Step execution failed',\n 'step_error',\n 500,\n );\n } else if (event.type === 'log') {\n options.onLog({\n value: event.value as string,\n tag: event.tag as string,\n ts: event.ts as number,\n });\n }\n } catch (err) {\n if (err instanceof MindStudioError) throw err;\n }\n }\n\n if (!doneEvent) {\n throw new MindStudioError(\n 'Stream ended without a done event',\n 'stream_error',\n 500,\n );\n }\n\n // Resolve output — same logic as non-streaming path\n let output: TOutput;\n if (doneEvent.output != null) {\n output = doneEvent.output;\n } else if (doneEvent.outputUrl) {\n const s3Res = await fetch(doneEvent.outputUrl);\n if (!s3Res.ok) {\n throw new MindStudioError(\n `Failed to fetch output from S3: ${s3Res.status} ${s3Res.statusText}`,\n 'output_fetch_error',\n s3Res.status,\n );\n }\n const envelope = (await s3Res.json()) as { value: TOutput };\n output = envelope.value;\n } else {\n output = undefined as TOutput;\n }\n\n // Process headers — same as non-streaming path\n const returnedThreadId =\n headers.get('x-mindstudio-thread-id') ?? '';\n if (this._reuseThreadId && returnedThreadId) {\n this._threadId = returnedThreadId;\n }\n\n const returnedAppId = headers.get('x-mindstudio-app-id');\n if (!this._appId && returnedAppId) {\n this._appId = returnedAppId;\n }\n\n const remaining = headers.get('x-ratelimit-remaining');\n\n return {\n ...(output as object),\n $appId: headers.get('x-mindstudio-app-id') ?? '',\n $threadId: returnedThreadId,\n $rateLimitRemaining:\n remaining != null ? parseInt(remaining, 10) : undefined,\n $billingCost: doneEvent.billingCost,\n $billingEvents: doneEvent.billingEvents,\n } as StepExecutionResult<TOutput>;\n } finally {\n this._httpConfig.rateLimiter.release();\n }\n }\n\n /**\n * Execute multiple steps in parallel in a single request.\n *\n * All steps run in parallel on the server. Results are returned in the same\n * order as the input. Individual step failures do not affect other steps —\n * partial success is possible.\n *\n * ```ts\n * const { results } = await agent.executeStepBatch([\n * { stepType: 'generateImage', step: { prompt: 'a sunset' } },\n * { stepType: 'textToSpeech', step: { text: 'Hello world' } },\n * ]);\n * ```\n */\n async executeStepBatch(\n steps: BatchStepInput[],\n options?: ExecuteStepBatchOptions,\n ): Promise<ExecuteStepBatchResult> {\n const threadId =\n options?.threadId ?? (this._reuseThreadId ? this._threadId : undefined);\n\n const { data } = await request<{\n results: Array<{\n stepType: string;\n output?: Record<string, unknown>;\n outputUrl?: string;\n billingCost?: number;\n error?: string;\n }>;\n totalBillingCost?: number;\n appId?: string;\n threadId?: string;\n }>(this._httpConfig, 'POST', '/steps/execute-batch', {\n steps,\n ...(options?.appId != null && { appId: options.appId }),\n ...(threadId != null && { threadId }),\n });\n\n // Resolve S3 outputs in parallel\n const results: BatchStepResult[] = await Promise.all(\n data.results.map(async (r) => {\n if (r.output != null) {\n return {\n stepType: r.stepType,\n output: r.output,\n billingCost: r.billingCost,\n error: r.error,\n };\n }\n if (r.outputUrl) {\n const res = await fetch(r.outputUrl);\n if (!res.ok) {\n return {\n stepType: r.stepType,\n error: `Failed to fetch output from S3: ${res.status} ${res.statusText}`,\n };\n }\n const envelope = (await res.json()) as {\n value: Record<string, unknown>;\n };\n return {\n stepType: r.stepType,\n output: envelope.value,\n billingCost: r.billingCost,\n };\n }\n return {\n stepType: r.stepType,\n billingCost: r.billingCost,\n error: r.error,\n };\n }),\n );\n\n if (this._reuseThreadId && data.threadId) {\n this._threadId = data.threadId;\n }\n\n return {\n results,\n totalBillingCost: data.totalBillingCost,\n appId: data.appId,\n threadId: data.threadId,\n };\n }\n\n /**\n * Get the authenticated user's identity and organization info.\n *\n * ```ts\n * const info = await agent.getUserInfo();\n * console.log(info.displayName, info.organizationName);\n * ```\n */\n async getUserInfo(): Promise<UserInfoResult> {\n const { data } = await request<UserInfoResult>(\n this._httpConfig,\n 'GET',\n '/account/userinfo',\n );\n return data;\n }\n\n /**\n * List all pre-built agents in the organization.\n *\n * ```ts\n * const { apps } = await agent.listAgents();\n * for (const app of apps) console.log(app.name, app.id);\n * ```\n */\n async listAgents(): Promise<ListAgentsResult> {\n const { data } = await request<ListAgentsResult>(\n this._httpConfig,\n 'GET',\n '/agents/load',\n );\n return data;\n }\n\n /**\n * Run a pre-built agent and wait for the result.\n *\n * Uses async polling internally — the request returns immediately with a\n * callback token, then polls until the run completes or fails.\n *\n * ```ts\n * const result = await agent.runAgent({\n * appId: 'your-agent-id',\n * variables: { query: 'hello' },\n * });\n * console.log(result.result);\n * ```\n */\n async runAgent(options: RunAgentOptions): Promise<RunAgentResult> {\n const pollInterval = options.pollIntervalMs ?? 1000;\n\n const { data } = await request<{\n success: boolean;\n threadId: string;\n callbackToken: string;\n }>(this._httpConfig, 'POST', '/agents/run', {\n appId: options.appId,\n async: true,\n ...(options.variables != null && { variables: options.variables }),\n ...(options.workflow != null && { workflow: options.workflow }),\n ...(options.version != null && { version: options.version }),\n ...(options.includeBillingCost != null && {\n includeBillingCost: options.includeBillingCost,\n }),\n ...(options.metadata != null && { metadata: options.metadata }),\n });\n\n const token = data.callbackToken;\n const pollUrl = `${this._httpConfig.baseUrl}/developer/v2/agents/run/poll/${token}`;\n\n // Poll until complete or error\n while (true) {\n await sleep(pollInterval);\n\n const res = await fetch(pollUrl, {\n headers: { 'User-Agent': '@mindstudio-ai/agent' },\n });\n\n if (res.status === 404) {\n throw new MindStudioError(\n 'Poll token not found or expired.',\n 'poll_token_expired',\n 404,\n );\n }\n\n if (!res.ok) {\n const errorBody = await res.json().catch(() => ({}));\n throw new MindStudioError(\n (errorBody as Record<string, string>).message ??\n (errorBody as Record<string, string>).error ??\n `Poll request failed: ${res.status} ${res.statusText}`,\n (errorBody as Record<string, string>).code ?? 'poll_error',\n res.status,\n errorBody,\n );\n }\n\n const poll = (await res.json()) as {\n status: 'pending' | 'complete' | 'error';\n result?: RunAgentResult;\n error?: string;\n };\n\n if (poll.status === 'pending') continue;\n\n if (poll.status === 'error') {\n throw new MindStudioError(\n poll.error ?? 'Agent run failed.',\n 'agent_run_error',\n 500,\n );\n }\n\n return poll.result!;\n }\n }\n\n /** @internal Used by generated action methods. */\n _request<T>(method: 'GET' | 'POST', path: string, body?: unknown) {\n return request<T>(this._httpConfig, method, path, body);\n }\n\n // -------------------------------------------------------------------------\n // Helper methods — models\n // -------------------------------------------------------------------------\n\n /** List all available AI models. */\n async listModels(): Promise<{ models: MindStudioModel[] }> {\n const { data } = await request<{ models: MindStudioModel[] }>(\n this._httpConfig,\n 'GET',\n '/helpers/models',\n );\n return data;\n }\n\n /** List AI models filtered by type. */\n async listModelsByType(\n modelType: ModelType,\n ): Promise<{ models: MindStudioModel[] }> {\n const { data } = await request<{ models: MindStudioModel[] }>(\n this._httpConfig,\n 'GET',\n `/helpers/models/${modelType}`,\n );\n return data;\n }\n\n /** List all available AI models (summary). Returns only id, name, type, and tags. */\n async listModelsSummary(): Promise<{ models: MindStudioModelSummary[] }> {\n const { data } = await request<{ models: MindStudioModelSummary[] }>(\n this._httpConfig,\n 'GET',\n '/helpers/models-summary',\n );\n return data;\n }\n\n /** List AI models (summary) filtered by type. */\n async listModelsSummaryByType(\n modelType: ModelType,\n ): Promise<{ models: MindStudioModelSummary[] }> {\n const { data } = await request<{ models: MindStudioModelSummary[] }>(\n this._httpConfig,\n 'GET',\n `/helpers/models-summary/${modelType}`,\n );\n return data;\n }\n\n // -------------------------------------------------------------------------\n // Helper methods — OAuth connectors & connections\n // -------------------------------------------------------------------------\n\n /**\n * List available OAuth connector services (Slack, Google, HubSpot, etc.).\n *\n * These are third-party integrations from the MindStudio Connector Registry.\n * For most tasks, use actions directly instead.\n */\n async listConnectors(): Promise<{ services: ConnectorService[] }> {\n const { data } = await request<{ services: ConnectorService[] }>(\n this._httpConfig,\n 'GET',\n '/helpers/connectors',\n );\n return data;\n }\n\n /** Get details for a single OAuth connector service. */\n async getConnector(\n serviceId: string,\n ): Promise<{ service: ConnectorService }> {\n const { data } = await request<{ service: ConnectorService }>(\n this._httpConfig,\n 'GET',\n `/helpers/connectors/${serviceId}`,\n );\n return data;\n }\n\n /** Get the full configuration for an OAuth connector action, including input fields. */\n async getConnectorAction(\n serviceId: string,\n actionId: string,\n ): Promise<{ action: ConnectorActionDetail }> {\n const { data } = await request<{ action: ConnectorActionDetail }>(\n this._httpConfig,\n 'GET',\n `/helpers/connectors/${serviceId}/${actionId}`,\n );\n return data;\n }\n\n /** List OAuth connections for the organization. These are authenticated third-party service links. */\n async listConnections(): Promise<{ connections: Connection[] }> {\n const { data } = await request<{ connections: Connection[] }>(\n this._httpConfig,\n 'GET',\n '/helpers/connections',\n );\n return data;\n }\n\n // -------------------------------------------------------------------------\n // Helper methods — cost estimation\n // -------------------------------------------------------------------------\n\n /** Estimate the cost of executing an action before running it. */\n async estimateStepCost(\n stepType: string,\n step?: Record<string, unknown>,\n options?: { appId?: string; workflowId?: string },\n ): Promise<{ costType?: string; estimates?: StepCostEstimateEntry[] }> {\n const { data } = await request<{\n costType?: string;\n estimates?: StepCostEstimateEntry[];\n }>(this._httpConfig, 'POST', '/helpers/step-cost-estimate', {\n step: { type: stepType, ...step },\n ...options,\n });\n return data;\n }\n\n // -------------------------------------------------------------------------\n // Streaming\n // -------------------------------------------------------------------------\n\n /**\n * Send a stream chunk to the caller via SSE.\n *\n * When invoked from a method that was called with `stream: true`, chunks\n * are delivered in real-time as Server-Sent Events. When there is no active\n * stream (no `STREAM_ID`), calls are silently ignored — so it's safe to\n * call unconditionally.\n *\n * Accepts strings (sent as `type: 'token'`) or structured data (sent as\n * `type: 'data'`). The caller receives each chunk as an SSE event.\n *\n * @example\n * ```ts\n * // Stream text tokens\n * await agent.stream('Processing item 1...');\n *\n * // Stream structured data\n * await agent.stream({ progress: 50, currentItem: 'abc' });\n * ```\n */\n stream = async (data: string | Record<string, unknown>): Promise<void> => {\n if (!this._streamId) return;\n\n const url = `${this._httpConfig.baseUrl}/_internal/v2/stream-chunk`;\n\n const body =\n typeof data === 'string'\n ? { streamId: this._streamId, type: 'token', text: data }\n : { streamId: this._streamId, type: 'data', data };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this._httpConfig.token,\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n // Best-effort — don't throw on stream failures, just warn\n const text = await res.text().catch(() => '');\n console.warn(`[mindstudio] stream chunk failed: ${res.status} ${text}`);\n }\n };\n\n // -------------------------------------------------------------------------\n // db + auth namespaces\n // -------------------------------------------------------------------------\n\n /**\n * The `auth` namespace — synchronous role-based access control.\n *\n * Provides the current user's identity and roles. All methods are\n * synchronous since the role map is preloaded during context hydration.\n *\n * **Important**: Context must be hydrated before accessing `auth`.\n * - Inside the MindStudio sandbox: automatic (populated from globals)\n * - Outside the sandbox: call `await agent.ensureContext()` first,\n * or access `auth` after any `db` operation (which auto-hydrates)\n *\n * @throws {MindStudioError} if context has not been hydrated yet\n *\n * @example\n * ```ts\n * await agent.ensureContext();\n * agent.auth.requireRole(Roles.admin);\n * const admins = agent.auth.getUsersByRole(Roles.admin);\n * ```\n */\n get auth(): AuthContext {\n if (!this._auth) {\n // Try sandbox hydration lazily — global.ai may have been set after\n // the constructor ran (e.g. ESM imports hoist before inline code)\n this._trySandboxHydration();\n }\n if (!this._auth) {\n throw new MindStudioError(\n 'Auth context not yet loaded. Call `await agent.ensureContext()` ' +\n 'or perform any db operation first (which auto-hydrates context). ' +\n 'Inside the MindStudio sandbox, context is loaded automatically.',\n 'context_not_loaded',\n 400,\n );\n }\n return this._auth;\n }\n\n /**\n * The `db` namespace — chainable collection API over managed databases.\n *\n * Use `db.defineTable<T>(name)` to get a typed Table<T>, then call\n * collection methods (filter, sortBy, push, update, etc.) on it.\n *\n * Context is auto-hydrated on first query execution — you can safely\n * call `defineTable()` at module scope without triggering any HTTP.\n *\n * @example\n * ```ts\n * const Orders = agent.db.defineTable<Order>('orders');\n * const active = await Orders.filter(o => o.status === 'active').take(10);\n * ```\n */\n get db(): Db {\n if (!this._db) {\n // Try sandbox hydration lazily — global.ai may have been set after\n // the constructor ran (e.g. ESM imports hoist before inline code)\n this._trySandboxHydration();\n }\n if (this._db) return this._db;\n\n // Return a lazy Db proxy that auto-hydrates context on first use.\n // defineTable() itself is synchronous (it just stores the table name),\n // but the Table methods are all async and will trigger ensureContext().\n return this._createLazyDb();\n }\n\n /**\n * Hydrate the app context (auth + database metadata). This must be\n * called before using `auth` synchronously. For `db`, hydration happens\n * automatically on first query.\n *\n * Context is fetched once and cached for the instance's lifetime.\n * Calling `ensureContext()` multiple times is safe (no-op after first).\n *\n * Context sources (checked in order):\n * 1. Sandbox globals (`globalThis.ai.auth`, `globalThis.ai.databases`)\n * 2. HTTP: `GET /developer/v2/helpers/app-context?appId={appId}`\n *\n * @throws {MindStudioError} if no `appId` is available\n *\n * @example\n * ```ts\n * await agent.ensureContext();\n * // auth is now available synchronously\n * agent.auth.requireRole(Roles.admin);\n * ```\n */\n async ensureContext(): Promise<void> {\n // Already hydrated — nothing to do\n if (this._context) return;\n\n // Deduplicate concurrent calls: if a fetch is already in-flight,\n // all callers await the same promise\n if (!this._contextPromise) {\n this._contextPromise = this._hydrateContext();\n }\n\n await this._contextPromise;\n }\n\n /**\n * @internal Fetch and cache app context, then create auth + db instances.\n *\n * In managed mode (CALLBACK_TOKEN), the platform resolves the app from\n * the token — no appId needed. With an API key, appId is required.\n */\n private async _hydrateContext(): Promise<void> {\n if (!this._appId && this._authType !== 'internal') {\n throw new MindStudioError(\n 'No app ID available for context resolution. Pass `appId` to the ' +\n 'constructor, set the MINDSTUDIO_APP_ID environment variable, or ' +\n 'make a step execution call first (which auto-detects the app ID).',\n 'missing_app_id',\n 400,\n );\n }\n\n const context = await this.getAppContext(this._appId);\n this._applyContext(context);\n }\n\n /**\n * @internal Apply a resolved context object — creates AuthContext and Db.\n * Used by both the HTTP path and sandbox hydration.\n */\n private _applyContext(context: AppContextResult): void {\n this._context = context;\n this._auth = new AuthContext(context.auth);\n this._db = createDb(\n context.databases,\n this._executeDbBatch.bind(this),\n );\n }\n\n /**\n * @internal Try to hydrate context synchronously from sandbox globals.\n * Called in the constructor when CALLBACK_TOKEN auth is detected.\n *\n * The MindStudio sandbox pre-populates `globalThis.ai` with:\n * - `ai.auth`: { userId, roleAssignments[] }\n * - `ai.databases`: [{ id, name, tables[] }]\n */\n private _trySandboxHydration(): void {\n const ai = (globalThis as Record<string, unknown>).ai as\n | { auth?: AppContextResult['auth']; databases?: AppContextResult['databases'] }\n | undefined;\n\n if (ai?.auth && ai?.databases) {\n this._applyContext({\n auth: ai.auth,\n databases: ai.databases,\n });\n }\n }\n\n /**\n * @internal Execute a batch of SQL queries against a managed database.\n * Used as the `executeBatch` callback for Table/Query instances.\n *\n * Calls `POST /_internal/v2/db/query` directly with the hook token\n * (raw, no Bearer prefix). All queries run on a single SQLite connection,\n * enabling RETURNING clauses and multi-statement batches.\n */\n private async _executeDbBatch(\n databaseId: string,\n queries: { sql: string; params?: unknown[] }[],\n ): Promise<{ rows: unknown[]; changes: number }[]> {\n const url = `${this._httpConfig.baseUrl}/_internal/v2/db/query`;\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this._httpConfig.token,\n },\n body: JSON.stringify({ databaseId, queries }),\n });\n\n if (!res.ok) {\n let message = `Database query failed: ${res.status} ${res.statusText}`;\n let code = 'db_query_error';\n\n try {\n const text = await res.text();\n try {\n // Try parsing as JSON — API may return { error, code, message, details }\n const body = JSON.parse(text) as Record<string, unknown>;\n // Accept various error shapes the API might use\n const errMsg =\n (body.error as string) ??\n (body.message as string) ??\n (body.details as string);\n if (errMsg) message = errMsg;\n if (body.code) code = body.code as string;\n } catch {\n // Not JSON — use raw text if it's informative\n if (text && text.length < 500) message = text;\n }\n } catch {\n // Couldn't read response body at all\n }\n\n throw new MindStudioError(\n `[db] ${message}`,\n code,\n res.status,\n );\n }\n\n const data = (await res.json()) as {\n results: { rows: unknown[]; changes: number }[];\n };\n return data.results;\n }\n\n /**\n * @internal Create a lazy Db proxy that auto-hydrates context.\n *\n * defineTable() returns Table instances immediately (no async needed).\n * But the Table's executeBatch callback is wrapped to call ensureContext()\n * before the first query, so context is fetched lazily.\n */\n private _createLazyDb(): Db {\n const agent = this;\n\n return {\n defineTable<T>(name: string, options?: DefineTableOptions) {\n // Lazy table — context hasn't been fetched yet, so executeBatch\n // calls ensureContext() first, then delegates to the real endpoint.\n const databaseHint = options?.database;\n\n return new Table<T>({\n databaseId: '',\n tableName: name,\n columns: [],\n unique: options?.unique as string[][] | undefined,\n defaults: options?.defaults as Record<string, unknown> | undefined,\n executeBatch: async (queries) => {\n await agent.ensureContext();\n const databases = agent._context!.databases;\n let targetDb;\n\n if (databaseHint) {\n targetDb = databases.find(\n (d) => d.id === databaseHint || d.name === databaseHint,\n );\n } else {\n targetDb = databases.find((d) =>\n d.tables.some((t) => t.name === name),\n );\n }\n\n const databaseId = targetDb?.id ?? databases[0]?.id ?? '';\n return agent._executeDbBatch(databaseId, queries);\n },\n });\n },\n\n // Time helpers work without context\n now: () => Date.now(),\n days: (n: number) => n * 86_400_000,\n hours: (n: number) => n * 3_600_000,\n minutes: (n: number) => n * 60_000,\n ago: (ms: number) => Date.now() - ms,\n fromNow: (ms: number) => Date.now() + ms,\n\n // Batch needs context — hydrate first, then delegate to real db\n batch: ((...queries: PromiseLike<unknown>[]) => {\n return (async () => {\n await agent.ensureContext();\n return agent._db!.batch(...queries);\n })();\n }) as Db['batch'],\n };\n }\n\n // -------------------------------------------------------------------------\n // Helper methods — user resolution\n // -------------------------------------------------------------------------\n\n /**\n * Resolve a single user ID to display info (name, email, profile picture).\n *\n * Use this when you have a `User`-typed field value and need the person's\n * display name, email, or avatar. Returns null if the user ID is not found.\n *\n * Also available as a top-level import:\n * ```ts\n * import { resolveUser } from '@mindstudio-ai/agent';\n * ```\n *\n * @param userId - The user ID to resolve (a `User` branded string or plain UUID)\n * @returns Resolved user info, or null if not found\n *\n * @example\n * ```ts\n * const user = await agent.resolveUser(order.requestedBy);\n * if (user) {\n * console.log(user.name); // \"Jane Smith\"\n * console.log(user.email); // \"jane@example.com\"\n * console.log(user.profilePictureUrl); // \"https://...\" or null\n * }\n * ```\n */\n async resolveUser(userId: string): Promise<ResolvedUser | null> {\n const { users } = await this.resolveUsers([userId]);\n return users[0] ?? null;\n }\n\n /**\n * Resolve multiple user IDs to display info in a single request.\n * Maximum 100 user IDs per request.\n *\n * Use this for batch resolution when you have multiple user references\n * to display (e.g. all approvers on a purchase order, all team members).\n *\n * @param userIds - Array of user IDs to resolve (max 100)\n * @returns Object with `users` array of resolved user info\n *\n * @example\n * ```ts\n * // Resolve all approvers at once\n * const approverIds = approvals.map(a => a.assignedTo);\n * const { users } = await agent.resolveUsers(approverIds);\n *\n * for (const u of users) {\n * console.log(`${u.name} (${u.email})`);\n * }\n * ```\n */\n async resolveUsers(\n userIds: string[],\n ): Promise<{ users: ResolvedUser[] }> {\n const { data } = await request<{ users: ResolvedUser[] }>(\n this._httpConfig,\n 'POST',\n '/helpers/resolve-users',\n { userIds },\n );\n return data;\n }\n\n // -------------------------------------------------------------------------\n // App context\n // -------------------------------------------------------------------------\n\n /**\n * Get auth and database context for an app.\n *\n * Returns role assignments and managed database schemas. Useful for\n * hydrating `auth` and `db` namespaces when running outside the sandbox.\n *\n * When called with a CALLBACK_TOKEN (managed mode), `appId` is optional —\n * the platform resolves the app from the token. With an API key, `appId`\n * is required.\n *\n * ```ts\n * const ctx = await agent.getAppContext('your-app-id');\n * console.log(ctx.auth.roleAssignments, ctx.databases);\n * ```\n */\n async getAppContext(appId?: string): Promise<AppContextResult> {\n const query = appId ? `?appId=${encodeURIComponent(appId)}` : '';\n const { data } = await request<AppContextResult>(\n this._httpConfig,\n 'GET',\n `/helpers/app-context${query}`,\n );\n return data;\n }\n\n // -------------------------------------------------------------------------\n // Account methods\n // -------------------------------------------------------------------------\n\n /** Update the display name of the authenticated user/agent. */\n async changeName(displayName: string): Promise<void> {\n await request(this._httpConfig, 'POST', '/account/change-name', {\n name: displayName,\n });\n }\n\n /** Update the profile picture of the authenticated user/agent. */\n async changeProfilePicture(url: string): Promise<void> {\n await request(this._httpConfig, 'POST', '/account/change-profile-picture', {\n url,\n });\n }\n\n /**\n * Upload a file to the MindStudio CDN.\n *\n * Gets a signed upload URL, PUTs the file content, and returns the\n * permanent public URL.\n */\n async uploadFile(\n content: Buffer | Uint8Array,\n options: { extension: string; type?: string },\n ): Promise<UploadFileResult> {\n const { data } = await request<{ uploadUrl: string; url: string }>(\n this._httpConfig,\n 'POST',\n '/account/upload',\n {\n extension: options.extension,\n ...(options.type != null && { type: options.type }),\n },\n );\n const buf = content.buffer.slice(\n content.byteOffset,\n content.byteOffset + content.byteLength,\n ) as ArrayBuffer;\n const res = await fetch(data.uploadUrl, {\n method: 'PUT',\n body: buf,\n headers: options.type ? { 'Content-Type': options.type } : {},\n });\n if (!res.ok) {\n const errorBody = await res.json().catch(() => ({}));\n throw new MindStudioError(\n (errorBody as Record<string, string>).message ??\n (errorBody as Record<string, string>).error ??\n `Upload failed: ${res.status} ${res.statusText}`,\n (errorBody as Record<string, string>).code ?? 'upload_error',\n res.status,\n errorBody,\n );\n }\n return { url: data.url };\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// Attach generated step methods to the prototype\nimport { applyStepMethods } from './generated/steps.js';\napplyStepMethods(MindStudioAgent);\n\nfunction resolveToken(\n provided?: string,\n config?: MindStudioConfig,\n): {\n token: string;\n authType: AuthType;\n} {\n // CALLBACK_TOKEN takes priority — when running inside the MindStudio\n // sandbox, the hook token must be used regardless of other auth sources.\n if (process.env.CALLBACK_TOKEN)\n return { token: process.env.CALLBACK_TOKEN, authType: 'internal' };\n if (provided) return { token: provided, authType: 'apiKey' };\n if (process.env.MINDSTUDIO_API_KEY)\n return { token: process.env.MINDSTUDIO_API_KEY, authType: 'apiKey' };\n if (config?.apiKey)\n return { token: config.apiKey, authType: 'apiKey' };\n throw new MindStudioError(\n 'No API key provided. Run `mindstudio login`, pass `apiKey` to the ' +\n 'constructor, or set the MINDSTUDIO_API_KEY environment variable.',\n 'missing_api_key',\n 401,\n );\n}\n","// AUTO-GENERATED — DO NOT EDIT\n// Run `npm run codegen` to regenerate from the OpenAPI spec.\n// Generated: 2026-03-24T14:58:04.580Z\n\n\nexport type MonacoSnippetFieldType = 'string' | 'number' | 'boolean' | 'array' | 'object' | string[];\nexport type MonacoSnippetField = [name: string, type: MonacoSnippetFieldType];\n\nexport interface MonacoSnippet {\n fields: MonacoSnippetField[];\n outputKeys: string[];\n}\n\nexport const monacoSnippets: Record<string, MonacoSnippet> = {\n \"activeCampaignAddNote\": { fields: [[\"contactId\", 'string'], [\"note\", 'string']], outputKeys: [] },\n \"activeCampaignCreateContact\": { fields: [[\"email\", 'string'], [\"firstName\", 'string'], [\"lastName\", 'string'], [\"phone\", 'string'], [\"accountId\", 'string'], [\"customFields\", 'object']], outputKeys: [\"contactId\"] },\n \"addSubtitlesToVideo\": { fields: [[\"videoUrl\", 'string'], [\"language\", 'string'], [\"fontName\", 'string'], [\"fontSize\", 'number'], [\"fontWeight\", [\"normal\", \"bold\", \"black\"]], [\"fontColor\", [\"white\", \"black\", \"red\", \"green\", \"blue\", \"yellow\", \"orange\", \"purple\", \"pink\", \"brown\", \"gray\", \"cyan\", \"magenta\"]], [\"highlightColor\", [\"white\", \"black\", \"red\", \"green\", \"blue\", \"yellow\", \"orange\", \"purple\", \"pink\", \"brown\", \"gray\", \"cyan\", \"magenta\"]], [\"strokeWidth\", 'number'], [\"strokeColor\", [\"black\", \"white\", \"red\", \"green\", \"blue\", \"yellow\", \"orange\", \"purple\", \"pink\", \"brown\", \"gray\", \"cyan\", \"magenta\"]], [\"backgroundColor\", [\"black\", \"white\", \"red\", \"green\", \"blue\", \"yellow\", \"orange\", \"purple\", \"pink\", \"brown\", \"gray\", \"cyan\", \"magenta\", \"none\"]], [\"backgroundOpacity\", 'number'], [\"position\", [\"top\", \"center\", \"bottom\"]], [\"yOffset\", 'number'], [\"wordsPerSubtitle\", 'number'], [\"enableAnimation\", 'boolean']], outputKeys: [\"videoUrl\"] },\n \"airtableCreateUpdateRecord\": { fields: [[\"baseId\", 'string'], [\"tableId\", 'string'], [\"fields\", 'string'], [\"recordData\", 'object']], outputKeys: [\"recordId\"] },\n \"airtableDeleteRecord\": { fields: [[\"baseId\", 'string'], [\"tableId\", 'string'], [\"recordId\", 'string']], outputKeys: [\"deleted\"] },\n \"airtableGetRecord\": { fields: [[\"baseId\", 'string'], [\"tableId\", 'string'], [\"recordId\", 'string']], outputKeys: [\"record\"] },\n \"airtableGetTableRecords\": { fields: [[\"baseId\", 'string'], [\"tableId\", 'string']], outputKeys: [\"records\"] },\n \"analyzeImage\": { fields: [[\"prompt\", 'string'], [\"imageUrl\", 'string']], outputKeys: [\"analysis\"] },\n \"analyzeVideo\": { fields: [[\"prompt\", 'string'], [\"videoUrl\", 'string']], outputKeys: [\"analysis\"] },\n \"captureThumbnail\": { fields: [[\"videoUrl\", 'string'], [\"at\", 'string']], outputKeys: [\"thumbnailUrl\"] },\n \"checkAppRole\": { fields: [[\"roleName\", 'string']], outputKeys: [\"hasRole\",\"userRoles\"] },\n \"codaCreateUpdatePage\": { fields: [[\"pageData\", 'object']], outputKeys: [\"pageId\"] },\n \"codaCreateUpdateRow\": { fields: [[\"docId\", 'string'], [\"tableId\", 'string'], [\"rowData\", 'object']], outputKeys: [\"rowId\"] },\n \"codaFindRow\": { fields: [[\"docId\", 'string'], [\"tableId\", 'string'], [\"rowData\", 'object']], outputKeys: [\"row\"] },\n \"codaGetPage\": { fields: [[\"docId\", 'string'], [\"pageId\", 'string']], outputKeys: [\"content\"] },\n \"codaGetTableRows\": { fields: [[\"docId\", 'string'], [\"tableId\", 'string']], outputKeys: [\"rows\"] },\n \"convertPdfToImages\": { fields: [[\"pdfUrl\", 'string']], outputKeys: [\"imageUrls\"] },\n \"createDataSource\": { fields: [[\"name\", 'string']], outputKeys: [] },\n \"createGmailDraft\": { fields: [[\"to\", 'string'], [\"subject\", 'string'], [\"message\", 'string'], [\"messageType\", [\"plain\", \"html\", \"markdown\"]]], outputKeys: [\"draftId\"] },\n \"createGoogleCalendarEvent\": { fields: [[\"summary\", 'string'], [\"startDateTime\", 'string'], [\"endDateTime\", 'string']], outputKeys: [\"eventId\",\"htmlLink\"] },\n \"createGoogleDoc\": { fields: [[\"title\", 'string'], [\"text\", 'string'], [\"textType\", [\"plain\", \"html\", \"markdown\"]]], outputKeys: [\"documentUrl\"] },\n \"createGoogleSheet\": { fields: [[\"title\", 'string'], [\"text\", 'string']], outputKeys: [\"spreadsheetUrl\"] },\n \"deleteDataSource\": { fields: [[\"dataSourceId\", 'string']], outputKeys: [] },\n \"deleteDataSourceDocument\": { fields: [[\"dataSourceId\", 'string'], [\"documentId\", 'string']], outputKeys: [] },\n \"deleteGmailEmail\": { fields: [[\"messageId\", 'string']], outputKeys: [] },\n \"deleteGoogleCalendarEvent\": { fields: [[\"eventId\", 'string']], outputKeys: [] },\n \"deleteGoogleSheetRows\": { fields: [[\"documentId\", 'string'], [\"startRow\", 'string'], [\"endRow\", 'string']], outputKeys: [] },\n \"detectChanges\": { fields: [[\"mode\", [\"ai\", \"comparison\"]], [\"input\", 'string']], outputKeys: [\"hasChanged\",\"currentValue\",\"previousValue\",\"isFirstRun\"] },\n \"detectPII\": { fields: [[\"input\", 'string'], [\"language\", 'string'], [\"entities\", 'array']], outputKeys: [\"detected\",\"detections\"] },\n \"discordEditMessage\": { fields: [[\"botToken\", 'string'], [\"channelId\", 'string'], [\"messageId\", 'string'], [\"text\", 'string']], outputKeys: [] },\n \"discordSendFollowUp\": { fields: [[\"applicationId\", 'string'], [\"interactionToken\", 'string'], [\"text\", 'string']], outputKeys: [\"messageId\"] },\n \"discordSendMessage\": { fields: [[\"mode\", [\"edit\", \"send\"]], [\"text\", 'string']], outputKeys: [] },\n \"downloadVideo\": { fields: [[\"videoUrl\", 'string'], [\"format\", [\"mp4\", \"mp3\"]]], outputKeys: [\"videoUrl\"] },\n \"enhanceImageGenerationPrompt\": { fields: [[\"initialPrompt\", 'string'], [\"includeNegativePrompt\", 'boolean'], [\"systemPrompt\", 'string']], outputKeys: [\"prompt\"] },\n \"enhanceVideoGenerationPrompt\": { fields: [[\"initialPrompt\", 'string'], [\"includeNegativePrompt\", 'boolean'], [\"systemPrompt\", 'string']], outputKeys: [\"prompt\"] },\n \"enrichPerson\": { fields: [[\"params\", 'object']], outputKeys: [\"data\"] },\n \"extractAudioFromVideo\": { fields: [[\"videoUrl\", 'string']], outputKeys: [\"audioUrl\"] },\n \"extractText\": { fields: [[\"url\", 'string']], outputKeys: [\"text\"] },\n \"fetchDataSourceDocument\": { fields: [[\"dataSourceId\", 'string'], [\"documentId\", 'string']], outputKeys: [] },\n \"fetchGoogleDoc\": { fields: [[\"documentId\", 'string'], [\"exportType\", [\"html\", \"markdown\", \"json\", \"plain\"]]], outputKeys: [\"content\"] },\n \"fetchGoogleSheet\": { fields: [[\"spreadsheetId\", 'string'], [\"range\", 'string'], [\"exportType\", [\"csv\", \"json\"]]], outputKeys: [\"content\"] },\n \"fetchSlackChannelHistory\": { fields: [[\"channelId\", 'string']], outputKeys: [\"messages\"] },\n \"fetchYoutubeCaptions\": { fields: [[\"videoUrl\", 'string'], [\"exportType\", [\"text\", \"json\"]], [\"language\", 'string']], outputKeys: [\"transcripts\"] },\n \"fetchYoutubeChannel\": { fields: [[\"channelUrl\", 'string']], outputKeys: [] },\n \"fetchYoutubeComments\": { fields: [[\"videoUrl\", 'string'], [\"exportType\", [\"text\", \"json\"]], [\"limitPages\", 'string']], outputKeys: [\"comments\"] },\n \"fetchYoutubeVideo\": { fields: [[\"videoUrl\", 'string']], outputKeys: [] },\n \"generateAsset\": { fields: [[\"source\", 'string'], [\"sourceType\", [\"html\", \"markdown\", \"spa\", \"raw\", \"dynamic\", \"customInterface\"]], [\"outputFormat\", [\"pdf\", \"png\", \"html\", \"mp4\", \"openGraph\"]], [\"pageSize\", [\"full\", \"letter\", \"A4\", \"custom\"]], [\"testData\", 'object']], outputKeys: [\"url\"] },\n \"generateChart\": { fields: [[\"chart\", 'object']], outputKeys: [\"chartUrl\"] },\n \"generateImage\": { fields: [[\"prompt\", 'string']], outputKeys: [\"imageUrl\"] },\n \"generateLipsync\": { fields: [], outputKeys: [] },\n \"generateMusic\": { fields: [[\"text\", 'string']], outputKeys: [] },\n \"generatePdf\": { fields: [[\"source\", 'string'], [\"sourceType\", [\"html\", \"markdown\", \"spa\", \"raw\", \"dynamic\", \"customInterface\"]], [\"outputFormat\", [\"pdf\", \"png\", \"html\", \"mp4\", \"openGraph\"]], [\"pageSize\", [\"full\", \"letter\", \"A4\", \"custom\"]], [\"testData\", 'object']], outputKeys: [\"url\"] },\n \"generateStaticVideoFromImage\": { fields: [[\"imageUrl\", 'string'], [\"duration\", 'string']], outputKeys: [\"videoUrl\"] },\n \"generateText\": { fields: [[\"message\", 'string']], outputKeys: [\"content\"] },\n \"generateVideo\": { fields: [[\"prompt\", 'string']], outputKeys: [\"videoUrl\"] },\n \"getGmailAttachments\": { fields: [[\"messageId\", 'string']], outputKeys: [] },\n \"getGmailDraft\": { fields: [[\"draftId\", 'string']], outputKeys: [\"draftId\",\"messageId\",\"subject\",\"to\",\"from\",\"body\"] },\n \"getGmailEmail\": { fields: [[\"messageId\", 'string']], outputKeys: [\"messageId\",\"subject\",\"from\",\"to\",\"date\",\"body\",\"labels\"] },\n \"getGmailUnreadCount\": { fields: [], outputKeys: [] },\n \"getGoogleCalendarEvent\": { fields: [[\"eventId\", 'string'], [\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"event\"] },\n \"getGoogleDriveFile\": { fields: [[\"fileId\", 'string']], outputKeys: [\"url\",\"name\",\"mimeType\",\"size\"] },\n \"getGoogleSheetInfo\": { fields: [[\"documentId\", 'string']], outputKeys: [\"title\",\"sheets\"] },\n \"getMediaMetadata\": { fields: [[\"mediaUrl\", 'string']], outputKeys: [\"metadata\"] },\n \"httpRequest\": { fields: [[\"url\", 'string'], [\"method\", 'string'], [\"headers\", 'object'], [\"queryParams\", 'object'], [\"body\", 'string'], [\"bodyItems\", 'object'], [\"contentType\", [\"none\", \"application/json\", \"application/x-www-form-urlencoded\", \"multipart/form-data\", \"custom\"]], [\"customContentType\", 'string']], outputKeys: [\"ok\",\"status\",\"statusText\",\"response\"] },\n \"hubspotCreateCompany\": { fields: [[\"company\", 'object'], [\"enabledProperties\", 'array']], outputKeys: [\"companyId\"] },\n \"hubspotCreateContact\": { fields: [[\"contact\", 'object'], [\"enabledProperties\", 'array'], [\"companyDomain\", 'string']], outputKeys: [\"contactId\"] },\n \"hubspotGetCompany\": { fields: [[\"searchBy\", [\"domain\", \"id\"]], [\"companyDomain\", 'string'], [\"companyId\", 'string'], [\"additionalProperties\", 'array']], outputKeys: [\"company\"] },\n \"hubspotGetContact\": { fields: [[\"searchBy\", [\"email\", \"id\"]], [\"contactEmail\", 'string'], [\"contactId\", 'string'], [\"additionalProperties\", 'array']], outputKeys: [\"contact\"] },\n \"hunterApiCompanyEnrichment\": { fields: [[\"domain\", 'string']], outputKeys: [\"data\"] },\n \"hunterApiDomainSearch\": { fields: [[\"domain\", 'string']], outputKeys: [\"data\"] },\n \"hunterApiEmailFinder\": { fields: [[\"domain\", 'string'], [\"firstName\", 'string'], [\"lastName\", 'string']], outputKeys: [\"data\"] },\n \"hunterApiEmailVerification\": { fields: [[\"email\", 'string']], outputKeys: [\"data\"] },\n \"hunterApiPersonEnrichment\": { fields: [[\"email\", 'string']], outputKeys: [\"data\"] },\n \"imageFaceSwap\": { fields: [[\"imageUrl\", 'string'], [\"faceImageUrl\", 'string'], [\"engine\", 'string']], outputKeys: [\"imageUrl\"] },\n \"imageRemoveWatermark\": { fields: [[\"imageUrl\", 'string'], [\"engine\", 'string']], outputKeys: [\"imageUrl\"] },\n \"insertVideoClips\": { fields: [[\"baseVideoUrl\", 'string'], [\"overlayVideos\", 'array']], outputKeys: [\"videoUrl\"] },\n \"listDataSources\": { fields: [], outputKeys: [] },\n \"listGmailDrafts\": { fields: [[\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"drafts\"] },\n \"listGmailLabels\": { fields: [], outputKeys: [] },\n \"listGoogleCalendarEvents\": { fields: [[\"limit\", 'number'], [\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"events\"] },\n \"listGoogleDriveFiles\": { fields: [[\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"files\"] },\n \"listRecentGmailEmails\": { fields: [[\"exportType\", [\"json\", \"text\"]], [\"limit\", 'string']], outputKeys: [] },\n \"logic\": { fields: [[\"context\", 'string'], [\"cases\", 'array']], outputKeys: [\"selectedCase\"] },\n \"makeDotComRunScenario\": { fields: [[\"webhookUrl\", 'string'], [\"input\", 'object']], outputKeys: [\"data\"] },\n \"mergeAudio\": { fields: [[\"mp3Urls\", 'array']], outputKeys: [\"audioUrl\"] },\n \"mergeVideos\": { fields: [[\"videoUrls\", 'array']], outputKeys: [\"videoUrl\"] },\n \"mixAudioIntoVideo\": { fields: [[\"videoUrl\", 'string'], [\"audioUrl\", 'string'], [\"options\", 'object']], outputKeys: [\"videoUrl\"] },\n \"muteVideo\": { fields: [[\"videoUrl\", 'string']], outputKeys: [\"videoUrl\"] },\n \"n8nRunNode\": { fields: [[\"method\", 'string'], [\"authentication\", [\"none\", \"basic\", \"string\"]], [\"user\", 'string'], [\"password\", 'string'], [\"webhookUrl\", 'string'], [\"input\", 'object']], outputKeys: [\"data\"] },\n \"notionCreatePage\": { fields: [[\"pageId\", 'string'], [\"content\", 'string'], [\"title\", 'string']], outputKeys: [\"pageId\",\"pageUrl\"] },\n \"notionUpdatePage\": { fields: [[\"pageId\", 'string'], [\"content\", 'string'], [\"mode\", [\"append\", \"overwrite\"]]], outputKeys: [\"pageId\",\"pageUrl\"] },\n \"peopleSearch\": { fields: [[\"smartQuery\", 'string'], [\"enrichPeople\", 'boolean'], [\"enrichOrganizations\", 'boolean'], [\"limit\", 'string'], [\"page\", 'string'], [\"params\", 'object']], outputKeys: [\"results\"] },\n \"postToLinkedIn\": { fields: [[\"message\", 'string'], [\"visibility\", [\"PUBLIC\", \"CONNECTIONS\"]]], outputKeys: [] },\n \"postToSlackChannel\": { fields: [[\"channelId\", 'string'], [\"messageType\", [\"string\", \"blocks\"]], [\"message\", 'string']], outputKeys: [] },\n \"postToX\": { fields: [[\"text\", 'string']], outputKeys: [] },\n \"postToZapier\": { fields: [[\"webhookUrl\", 'string'], [\"input\", 'object']], outputKeys: [\"data\"] },\n \"queryAppDatabase\": { fields: [[\"databaseId\", 'string'], [\"sql\", 'string']], outputKeys: [\"rows\",\"changes\"] },\n \"queryDataSource\": { fields: [[\"dataSourceId\", 'string'], [\"query\", 'string'], [\"maxResults\", 'number']], outputKeys: [\"text\",\"chunks\",\"query\",\"citations\",\"latencyMs\"] },\n \"queryExternalDatabase\": { fields: [[\"query\", 'string'], [\"outputFormat\", [\"json\", \"csv\"]]], outputKeys: [\"data\"] },\n \"redactPII\": { fields: [[\"input\", 'string'], [\"language\", 'string'], [\"entities\", 'array']], outputKeys: [\"text\"] },\n \"removeBackgroundFromImage\": { fields: [[\"imageUrl\", 'string']], outputKeys: [\"imageUrl\"] },\n \"replyToGmailEmail\": { fields: [[\"messageId\", 'string'], [\"message\", 'string'], [\"messageType\", [\"plain\", \"html\", \"markdown\"]]], outputKeys: [\"messageId\"] },\n \"resizeVideo\": { fields: [[\"videoUrl\", 'string'], [\"mode\", [\"fit\", \"exact\"]]], outputKeys: [\"videoUrl\"] },\n \"runFromConnectorRegistry\": { fields: [[\"actionId\", 'string'], [\"displayName\", 'string'], [\"icon\", 'string'], [\"configurationValues\", 'object']], outputKeys: [\"data\"] },\n \"runPackagedWorkflow\": { fields: [[\"appId\", 'string'], [\"workflowId\", 'string'], [\"inputVariables\", 'object'], [\"outputVariables\", 'object'], [\"name\", 'string']], outputKeys: [\"data\"] },\n \"scrapeFacebookPage\": { fields: [[\"pageUrl\", 'string']], outputKeys: [\"data\"] },\n \"scrapeFacebookPosts\": { fields: [[\"pageUrl\", 'string']], outputKeys: [\"data\"] },\n \"scrapeInstagramComments\": { fields: [[\"postUrl\", 'string'], [\"resultsLimit\", 'string']], outputKeys: [\"data\"] },\n \"scrapeInstagramMentions\": { fields: [[\"profileUrl\", 'string'], [\"resultsLimit\", 'string']], outputKeys: [\"data\"] },\n \"scrapeInstagramPosts\": { fields: [[\"profileUrl\", 'string'], [\"resultsLimit\", 'string'], [\"onlyPostsNewerThan\", 'string']], outputKeys: [\"data\"] },\n \"scrapeInstagramProfile\": { fields: [[\"profileUrl\", 'string']], outputKeys: [\"data\"] },\n \"scrapeInstagramReels\": { fields: [[\"profileUrl\", 'string'], [\"resultsLimit\", 'string']], outputKeys: [\"data\"] },\n \"scrapeLinkedInCompany\": { fields: [[\"url\", 'string']], outputKeys: [\"company\"] },\n \"scrapeLinkedInProfile\": { fields: [[\"url\", 'string']], outputKeys: [\"profile\"] },\n \"scrapeMetaThreadsProfile\": { fields: [[\"profileUrl\", 'string']], outputKeys: [\"data\"] },\n \"scrapeUrl\": { fields: [[\"url\", 'string']], outputKeys: [\"content\"] },\n \"scrapeXPost\": { fields: [[\"url\", 'string']], outputKeys: [\"post\"] },\n \"scrapeXProfile\": { fields: [[\"url\", 'string']], outputKeys: [\"profile\"] },\n \"screenshotUrl\": { fields: [[\"url\", 'string']], outputKeys: [\"screenshotUrl\"] },\n \"searchGmailEmails\": { fields: [[\"query\", 'string'], [\"exportType\", [\"json\", \"text\"]], [\"limit\", 'string']], outputKeys: [\"emails\"] },\n \"searchGoogle\": { fields: [[\"query\", 'string'], [\"exportType\", [\"text\", \"json\"]]], outputKeys: [\"results\"] },\n \"searchGoogleCalendarEvents\": { fields: [[\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"events\"] },\n \"searchGoogleDrive\": { fields: [[\"query\", 'string'], [\"exportType\", [\"json\", \"text\"]]], outputKeys: [\"files\"] },\n \"searchGoogleImages\": { fields: [[\"query\", 'string'], [\"exportType\", [\"text\", \"json\"]]], outputKeys: [\"images\"] },\n \"searchGoogleNews\": { fields: [[\"text\", 'string'], [\"exportType\", [\"text\", \"json\"]]], outputKeys: [\"articles\"] },\n \"searchGoogleTrends\": { fields: [[\"text\", 'string'], [\"hl\", 'string'], [\"geo\", 'string'], [\"data_type\", [\"TIMESERIES\", \"GEO_MAP\", \"GEO_MAP_0\", \"RELATED_TOPICS\", \"RELATED_QUERIES\"]], [\"cat\", 'string'], [\"date\", 'string'], [\"ts\", 'string']], outputKeys: [\"trends\"] },\n \"searchPerplexity\": { fields: [[\"query\", 'string'], [\"exportType\", [\"text\", \"json\"]]], outputKeys: [\"results\"] },\n \"searchXPosts\": { fields: [[\"query\", 'string'], [\"scope\", [\"recent\", \"all\"]], [\"options\", 'object']], outputKeys: [\"posts\"] },\n \"searchYoutube\": { fields: [[\"query\", 'string'], [\"limitPages\", 'string'], [\"filter\", 'string'], [\"filterType\", 'string']], outputKeys: [\"results\"] },\n \"searchYoutubeTrends\": { fields: [[\"bp\", [\"now\", \"music\", \"gaming\", \"films\"]], [\"hl\", 'string'], [\"gl\", 'string']], outputKeys: [] },\n \"sendEmail\": { fields: [[\"subject\", 'string'], [\"body\", 'string']], outputKeys: [\"recipients\"] },\n \"sendGmailDraft\": { fields: [[\"draftId\", 'string']], outputKeys: [] },\n \"sendGmailMessage\": { fields: [[\"to\", 'string'], [\"subject\", 'string'], [\"message\", 'string'], [\"messageType\", [\"plain\", \"html\", \"markdown\"]]], outputKeys: [\"messageId\"] },\n \"sendSMS\": { fields: [[\"body\", 'string']], outputKeys: [] },\n \"setGmailReadStatus\": { fields: [[\"messageIds\", 'string'], [\"markAsRead\", 'boolean']], outputKeys: [] },\n \"setRunTitle\": { fields: [[\"title\", 'string']], outputKeys: [] },\n \"setVariable\": { fields: [[\"value\", 'string']], outputKeys: [] },\n \"telegramEditMessage\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"messageId\", 'string'], [\"text\", 'string']], outputKeys: [] },\n \"telegramReplyToMessage\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"replyToMessageId\", 'string'], [\"text\", 'string']], outputKeys: [\"messageId\"] },\n \"telegramSendAudio\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"audioUrl\", 'string'], [\"mode\", [\"audio\", \"voice\"]]], outputKeys: [] },\n \"telegramSendFile\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"fileUrl\", 'string']], outputKeys: [] },\n \"telegramSendImage\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"imageUrl\", 'string']], outputKeys: [] },\n \"telegramSendMessage\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"text\", 'string']], outputKeys: [\"messageId\"] },\n \"telegramSendVideo\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string'], [\"videoUrl\", 'string']], outputKeys: [] },\n \"telegramSetTyping\": { fields: [[\"botToken\", 'string'], [\"chatId\", 'string']], outputKeys: [] },\n \"textToSpeech\": { fields: [[\"text\", 'string']], outputKeys: [\"audioUrl\"] },\n \"transcribeAudio\": { fields: [[\"audioUrl\", 'string'], [\"prompt\", 'string']], outputKeys: [\"text\"] },\n \"trimMedia\": { fields: [[\"inputUrl\", 'string']], outputKeys: [\"mediaUrl\"] },\n \"updateGmailLabels\": { fields: [[\"query\", 'string'], [\"messageIds\", 'string'], [\"addLabelIds\", 'string'], [\"removeLabelIds\", 'string']], outputKeys: [\"updatedMessageIds\"] },\n \"updateGoogleCalendarEvent\": { fields: [[\"eventId\", 'string']], outputKeys: [\"eventId\",\"htmlLink\"] },\n \"updateGoogleDoc\": { fields: [[\"documentId\", 'string'], [\"text\", 'string'], [\"textType\", [\"plain\", \"html\", \"markdown\"]], [\"operationType\", [\"addToTop\", \"addToBottom\", \"overwrite\"]]], outputKeys: [\"documentUrl\"] },\n \"updateGoogleSheet\": { fields: [[\"text\", 'string'], [\"spreadsheetId\", 'string'], [\"range\", 'string'], [\"operationType\", [\"addToBottom\", \"overwrite\", \"range\"]]], outputKeys: [\"spreadsheetUrl\"] },\n \"uploadDataSourceDocument\": { fields: [[\"dataSourceId\", 'string'], [\"file\", 'string'], [\"fileName\", 'string']], outputKeys: [] },\n \"upscaleImage\": { fields: [[\"imageUrl\", 'string'], [\"targetResolution\", [\"2k\", \"4k\", \"8k\"]], [\"engine\", [\"standard\", \"pro\"]]], outputKeys: [\"imageUrl\"] },\n \"upscaleVideo\": { fields: [[\"videoUrl\", 'string'], [\"targetResolution\", [\"720p\", \"1080p\", \"2K\", \"4K\"]], [\"engine\", [\"standard\", \"pro\", \"ultimate\", \"flashvsr\", \"seedance\", \"seedvr2\", \"runwayml/upscale-v1\"]]], outputKeys: [\"videoUrl\"] },\n \"userMessage\": { fields: [[\"message\", 'string']], outputKeys: [\"content\"] },\n \"videoFaceSwap\": { fields: [[\"videoUrl\", 'string'], [\"faceImageUrl\", 'string'], [\"targetIndex\", 'number'], [\"engine\", 'string']], outputKeys: [\"videoUrl\"] },\n \"videoRemoveBackground\": { fields: [[\"videoUrl\", 'string'], [\"newBackground\", [\"transparent\", \"image\"]], [\"engine\", 'string']], outputKeys: [\"videoUrl\"] },\n \"videoRemoveWatermark\": { fields: [[\"videoUrl\", 'string'], [\"engine\", 'string']], outputKeys: [\"videoUrl\"] },\n \"watermarkImage\": { fields: [[\"imageUrl\", 'string'], [\"watermarkImageUrl\", 'string'], [\"corner\", [\"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"]], [\"paddingPx\", 'number'], [\"widthPx\", 'number']], outputKeys: [\"imageUrl\"] },\n \"watermarkVideo\": { fields: [[\"videoUrl\", 'string'], [\"imageUrl\", 'string'], [\"corner\", [\"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"]], [\"paddingPx\", 'number'], [\"widthPx\", 'number']], outputKeys: [\"videoUrl\"] },\n};\n\nexport const blockTypeAliases: Record<string, string> = {\n \"userMessage\": \"generateText\",\n \"generatePdf\": \"generateAsset\",\n};\n","// AUTO-GENERATED — DO NOT EDIT\n// Run `npm run codegen` to regenerate from the OpenAPI spec.\n// Generated: 2026-03-24T14:58:04.580Z\n\n\nexport interface StepMetadata {\n stepType: string;\n description: string;\n usageNotes: string;\n inputSchema: Record<string, unknown>;\n outputSchema: Record<string, unknown> | null;\n}\n\nexport const stepMetadata: Record<string, StepMetadata> = {\n \"activeCampaignAddNote\": {\n stepType: \"activeCampaignAddNote\",\n description: \"Add a note to an existing contact in ActiveCampaign.\",\n usageNotes: \"- Requires an ActiveCampaign OAuth connection (connectionId).\\n- The contact must already exist — use the contact ID from a previous create or search step.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"contactId\":{\"type\":\"string\",\"description\":\"ActiveCampaign contact ID to add the note to\"},\"note\":{\"type\":\"string\",\"description\":\"Note text content\"},\"connectionId\":{\"type\":\"string\",\"description\":\"ActiveCampaign OAuth connection ID\"}},\"required\":[\"contactId\",\"note\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"activeCampaignCreateContact\": {\n stepType: \"activeCampaignCreateContact\",\n description: \"Create or sync a contact in ActiveCampaign.\",\n usageNotes: \"- Requires an ActiveCampaign OAuth connection (connectionId).\\n- If a contact with the email already exists, it may be updated depending on ActiveCampaign settings.\\n- Custom fields are passed as a key-value map where keys are field IDs.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"email\":{\"type\":\"string\",\"description\":\"Contact email address\"},\"firstName\":{\"type\":\"string\",\"description\":\"Contact first name\"},\"lastName\":{\"type\":\"string\",\"description\":\"Contact last name\"},\"phone\":{\"type\":\"string\",\"description\":\"Contact phone number\"},\"accountId\":{\"type\":\"string\",\"description\":\"ActiveCampaign account ID to associate the contact with\"},\"customFields\":{\"type\":\"object\",\"description\":\"Custom field values keyed by field ID\"},\"connectionId\":{\"type\":\"string\",\"description\":\"ActiveCampaign OAuth connection ID\"}},\"required\":[\"email\",\"firstName\",\"lastName\",\"phone\",\"accountId\",\"customFields\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"contactId\":{\"type\":\"string\",\"description\":\"ActiveCampaign contact ID of the created contact\"}},\"required\":[\"contactId\"]},\n },\n \"addSubtitlesToVideo\": {\n stepType: \"addSubtitlesToVideo\",\n description: \"Automatically add subtitles to a video\",\n usageNotes: \"- Can control style of text and animation\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video\"},\"language\":{\"type\":\"string\",\"description\":\"ISO language code for subtitle transcription\"},\"fontName\":{\"type\":\"string\",\"description\":\"Google Font name for subtitle text\"},\"fontSize\":{\"type\":\"number\",\"description\":\"Font size in pixels. Default: 100.\"},\"fontWeight\":{\"enum\":[\"normal\",\"bold\",\"black\"],\"type\":\"string\",\"description\":\"Font weight for subtitle text\"},\"fontColor\":{\"enum\":[\"white\",\"black\",\"red\",\"green\",\"blue\",\"yellow\",\"orange\",\"purple\",\"pink\",\"brown\",\"gray\",\"cyan\",\"magenta\"],\"type\":\"string\",\"description\":\"Color of the subtitle text\"},\"highlightColor\":{\"enum\":[\"white\",\"black\",\"red\",\"green\",\"blue\",\"yellow\",\"orange\",\"purple\",\"pink\",\"brown\",\"gray\",\"cyan\",\"magenta\"],\"type\":\"string\",\"description\":\"Color used to highlight the currently spoken word\"},\"strokeWidth\":{\"type\":\"number\",\"description\":\"Width of the text stroke outline in pixels\"},\"strokeColor\":{\"enum\":[\"black\",\"white\",\"red\",\"green\",\"blue\",\"yellow\",\"orange\",\"purple\",\"pink\",\"brown\",\"gray\",\"cyan\",\"magenta\"],\"type\":\"string\",\"description\":\"Color of the text stroke outline\"},\"backgroundColor\":{\"enum\":[\"black\",\"white\",\"red\",\"green\",\"blue\",\"yellow\",\"orange\",\"purple\",\"pink\",\"brown\",\"gray\",\"cyan\",\"magenta\",\"none\"],\"type\":\"string\",\"description\":\"Background color behind subtitle text. Use 'none' for transparent.\"},\"backgroundOpacity\":{\"type\":\"number\",\"description\":\"Opacity of the subtitle background. 0.0 = fully transparent, 1.0 = fully opaque.\"},\"position\":{\"enum\":[\"top\",\"center\",\"bottom\"],\"type\":\"string\",\"description\":\"Vertical position of subtitle text on screen\"},\"yOffset\":{\"type\":\"number\",\"description\":\"Vertical offset in pixels from the position. Positive moves down, negative moves up. Default: 75.\"},\"wordsPerSubtitle\":{\"type\":\"number\",\"description\":\"Maximum number of words per subtitle segment. Use 1 for single-word display, 2-3 for short phrases, or 8-12 for full sentences. Default: 3.\"},\"enableAnimation\":{\"type\":\"boolean\",\"description\":\"When true, enables bounce-style entrance animation for subtitles. Default: true.\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"language\",\"fontName\",\"fontSize\",\"fontWeight\",\"fontColor\",\"highlightColor\",\"strokeWidth\",\"strokeColor\",\"backgroundColor\",\"backgroundOpacity\",\"position\",\"yOffset\",\"wordsPerSubtitle\",\"enableAnimation\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video with subtitles added\"}},\"required\":[\"videoUrl\"]},\n },\n \"airtableCreateUpdateRecord\": {\n stepType: \"airtableCreateUpdateRecord\",\n description: \"Create a new record or update an existing record in an Airtable table.\",\n usageNotes: \"- If recordId is provided, updates that record. Otherwise, creates a new one.\\n- When updating with updateMode \\\"onlySpecified\\\", unspecified fields are left as-is. With \\\"all\\\", unspecified fields are cleared.\\n- Array fields (e.g. multipleAttachments) accept arrays of values.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Airtable OAuth connection ID\"},\"baseId\":{\"type\":\"string\",\"description\":\"Airtable base ID\"},\"tableId\":{\"type\":\"string\",\"description\":\"Airtable table ID\"},\"recordId\":{\"type\":\"string\",\"description\":\"Record ID to update. Omit to create a new record\"},\"updateMode\":{\"enum\":[\"onlySpecified\",\"all\"],\"type\":\"string\",\"description\":\"How to handle unspecified fields on update. 'onlySpecified' leaves them as-is, 'all' clears them\"},\"fields\":{\"description\":\"Field schema metadata used for type resolution\"},\"recordData\":{\"type\":\"object\",\"description\":\"Field values to set, keyed by field ID\"}},\"required\":[\"baseId\",\"tableId\",\"fields\",\"recordData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"recordId\":{\"type\":\"string\",\"description\":\"The Airtable record ID of the created or updated record\"}},\"required\":[\"recordId\"]},\n },\n \"airtableDeleteRecord\": {\n stepType: \"airtableDeleteRecord\",\n description: \"Delete a record from an Airtable table by its record ID.\",\n usageNotes: \"- Requires an active Airtable OAuth connection (connectionId).\\n- Silently succeeds if the record does not exist.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Airtable OAuth connection ID\"},\"baseId\":{\"type\":\"string\",\"description\":\"Airtable base ID\"},\"tableId\":{\"type\":\"string\",\"description\":\"Airtable table ID\"},\"recordId\":{\"type\":\"string\",\"description\":\"Record ID to delete\"}},\"required\":[\"baseId\",\"tableId\",\"recordId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"deleted\":{\"type\":\"boolean\",\"description\":\"Whether the record was successfully deleted\"}},\"required\":[\"deleted\"]},\n },\n \"airtableGetRecord\": {\n stepType: \"airtableGetRecord\",\n description: \"Fetch a single record from an Airtable table by its record ID.\",\n usageNotes: \"- Requires an active Airtable OAuth connection (connectionId).\\n- If the record is not found, returns a string message instead of a record object.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Airtable OAuth connection ID\"},\"baseId\":{\"type\":\"string\",\"description\":\"Airtable base ID (e.g. \\\"appXXXXXX\\\")\"},\"tableId\":{\"type\":\"string\",\"description\":\"Airtable table ID (e.g. \\\"tblXXXXXX\\\")\"},\"recordId\":{\"type\":\"string\",\"description\":\"Record ID to fetch (e.g. \\\"recXXXXXX\\\")\"}},\"required\":[\"baseId\",\"tableId\",\"recordId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"record\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Airtable record ID\"},\"createdTime\":{\"type\":\"string\",\"description\":\"ISO 8601 timestamp when the record was created\"},\"fields\":{\"type\":\"object\",\"description\":\"Field values keyed by field name\"}},\"required\":[\"id\",\"createdTime\",\"fields\"]},{\"type\":\"null\"}]}},\"required\":[\"record\"]},\n },\n \"airtableGetTableRecords\": {\n stepType: \"airtableGetTableRecords\",\n description: \"Fetch multiple records from an Airtable table with optional pagination.\",\n usageNotes: \"- Requires an active Airtable OAuth connection (connectionId).\\n- Default limit is 100 records. Maximum is 1000.\\n- When outputFormat is 'csv', the variable receives CSV text. The direct execution output always returns parsed records.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Airtable OAuth connection ID\"},\"baseId\":{\"type\":\"string\",\"description\":\"Airtable base ID (e.g. \\\"appXXXXXX\\\")\"},\"tableId\":{\"type\":\"string\",\"description\":\"Airtable table ID (e.g. \\\"tblXXXXXX\\\")\"},\"outputFormat\":{\"enum\":[\"json\",\"csv\"],\"type\":\"string\",\"description\":\"Output format for the result. Defaults to 'json'\"},\"limit\":{\"type\":\"number\",\"description\":\"Maximum number of records to return. Defaults to 100, max 1000\"}},\"required\":[\"baseId\",\"tableId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"records\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Airtable record ID\"},\"createdTime\":{\"type\":\"string\",\"description\":\"ISO 8601 timestamp when the record was created\"},\"fields\":{\"type\":\"object\",\"description\":\"Field values keyed by field name\"}},\"required\":[\"id\",\"createdTime\",\"fields\"]},\"description\":\"The list of records retrieved from the Airtable table\"}},\"required\":[\"records\"]},\n },\n \"analyzeImage\": {\n stepType: \"analyzeImage\",\n description: \"Analyze an image using a vision model based on a text prompt.\",\n usageNotes: \"- Uses the configured vision model to generate a text analysis of the image.\\n- The prompt should describe what to look for or extract from the image.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"Instructions describing what to look for or extract from the image\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the image to analyze\"},\"visionModelOverride\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\"},\"config\":{\"type\":\"object\"}},\"required\":[\"model\"]},{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"]}]}},\"required\":[\"prompt\",\"imageUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"analysis\":{\"type\":\"string\",\"description\":\"Text analysis of the image generated by the vision model\"}},\"required\":[\"analysis\"]},\n },\n \"analyzeVideo\": {\n stepType: \"analyzeVideo\",\n description: \"Analyze a video using a video analysis model based on a text prompt.\",\n usageNotes: \"- Uses the configured video analysis model to generate a text analysis of the video.\\n- The prompt should describe what to look for or extract from the video.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"Instructions describing what to look for or extract from the video\"},\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video to analyze\"},\"videoAnalysisModelOverride\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\"},\"config\":{\"type\":\"object\"}},\"required\":[\"model\"]},{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"]}]}},\"required\":[\"prompt\",\"videoUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"analysis\":{\"type\":\"string\",\"description\":\"Text analysis of the video generated by the video analysis model\"}},\"required\":[\"analysis\"]},\n },\n \"captureThumbnail\": {\n stepType: \"captureThumbnail\",\n description: \"Capture a thumbnail from a video at a specified timestamp\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video to capture a frame from\"},\"at\":{\"anyOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]}},\"required\":[\"videoUrl\",\"at\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"thumbnailUrl\":{\"type\":\"string\",\"description\":\"URL of the captured thumbnail image\"}},\"required\":[\"thumbnailUrl\"]},\n },\n \"checkAppRole\": {\n stepType: \"checkAppRole\",\n description: \"Check whether the current user has a specific app role and branch accordingly.\",\n usageNotes: \"- Checks if the current user has been assigned a specific role in this app.\\n- If the user has the role, transitions to the \\\"has role\\\" path.\\n- If the user does not have the role, transitions to the \\\"no role\\\" path, or errors if no path is configured.\\n- Role names are defined by the app creator and assigned to users via the app roles system.\\n- The roleName field supports {{variables}} for dynamic role checks.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"roleName\":{\"type\":\"string\",\"description\":\"The role name to check (supports {{variables}})\"},\"hasRoleStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if the user has the role (same workflow)\"},\"hasRoleWorkflowId\":{\"type\":\"string\",\"description\":\"Workflow to jump to if the user has the role (cross workflow)\"},\"noRoleStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if the user does not have the role (same workflow)\"},\"noRoleWorkflowId\":{\"type\":\"string\",\"description\":\"Workflow to jump to if the user does not have the role (cross workflow)\"}},\"required\":[\"roleName\"],\"description\":\"Configuration for the check app role step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"hasRole\":{\"type\":\"boolean\",\"description\":\"Whether the current user has the checked role\"},\"userRoles\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"All roles assigned to the current user for this app\"}},\"required\":[\"hasRole\",\"userRoles\"]},\n },\n \"codaCreateUpdatePage\": {\n stepType: \"codaCreateUpdatePage\",\n description: \"Create a new page or update an existing page in a Coda document.\",\n usageNotes: \"- Requires a Coda OAuth connection (connectionId).\\n- If pageData.pageId is provided, updates that page. Otherwise, creates a new one.\\n- Page content is provided as markdown and converted to Coda's canvas format.\\n- When updating, insertionMode controls how content is applied (default: 'append').\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Coda OAuth connection ID\"},\"pageData\":{\"type\":\"object\",\"properties\":{\"docId\":{\"type\":\"string\",\"description\":\"Coda document ID\"},\"pageId\":{\"type\":\"string\",\"description\":\"Page ID to update. Omit to create a new page\"},\"name\":{\"type\":\"string\",\"description\":\"Page title\"},\"subtitle\":{\"type\":\"string\",\"description\":\"Page subtitle\"},\"iconName\":{\"type\":\"string\",\"description\":\"Page icon name\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"Page cover image URL\"},\"parentPageId\":{\"type\":\"string\",\"description\":\"Parent page ID for nesting under another page\"},\"pageContent\":{\"anyOf\":[{\"type\":\"string\"},{}]},\"contentUpdate\":{\"description\":\"Content update payload for partial updates\"},\"insertionMode\":{\"type\":\"string\",\"description\":\"How to insert content on update: \\\"append\\\" or \\\"replace\\\"\"}},\"required\":[\"docId\",\"name\",\"subtitle\",\"iconName\",\"imageUrl\",\"pageContent\"],\"description\":\"Page configuration including document ID, title, content, and optional parent page\"}},\"required\":[\"pageData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"pageId\":{\"type\":\"string\",\"description\":\"The Coda page ID of the created or updated page\"}},\"required\":[\"pageId\"]},\n },\n \"codaCreateUpdateRow\": {\n stepType: \"codaCreateUpdateRow\",\n description: \"Create a new row or update an existing row in a Coda table.\",\n usageNotes: \"- Requires a Coda OAuth connection (connectionId).\\n- If rowId is provided, updates that row. Otherwise, creates a new one.\\n- Row data keys are column IDs. Empty values are excluded.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Coda OAuth connection ID\"},\"docId\":{\"type\":\"string\",\"description\":\"Coda document ID\"},\"tableId\":{\"type\":\"string\",\"description\":\"Table ID within the document\"},\"rowId\":{\"type\":\"string\",\"description\":\"Row ID to update. Omit to create a new row\"},\"rowData\":{\"type\":\"object\",\"description\":\"Column values to set, keyed by column ID\"}},\"required\":[\"docId\",\"tableId\",\"rowData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"rowId\":{\"type\":\"string\",\"description\":\"The Coda row ID of the created or updated row\"}},\"required\":[\"rowId\"]},\n },\n \"codaFindRow\": {\n stepType: \"codaFindRow\",\n description: \"Search for a row in a Coda table by matching column values.\",\n usageNotes: \"- Requires a Coda OAuth connection (connectionId).\\n- Returns the first row matching all specified column values, or null if no match.\\n- Search criteria in rowData are ANDed together.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Coda OAuth connection ID\"},\"docId\":{\"type\":\"string\",\"description\":\"Coda document ID\"},\"tableId\":{\"type\":\"string\",\"description\":\"Table ID to search within\"},\"rowData\":{\"type\":\"object\",\"description\":\"Column values to match against, keyed by column ID. All criteria are ANDed together\"}},\"required\":[\"docId\",\"tableId\",\"rowData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"row\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Coda row ID\"},\"values\":{\"type\":\"object\",\"description\":\"Column values keyed by column name\"}},\"required\":[\"id\",\"values\"]},{\"type\":\"null\"}]}},\"required\":[\"row\"]},\n },\n \"codaGetPage\": {\n stepType: \"codaGetPage\",\n description: \"Export and read the contents of a page from a Coda document.\",\n usageNotes: \"- Requires a Coda OAuth connection (connectionId).\\n- Page export is asynchronous on Coda's side — there may be a brief delay while it processes.\\n- If a page was just created in a prior step, there is an automatic 20-second retry if the first export attempt fails.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Coda OAuth connection ID\"},\"docId\":{\"type\":\"string\",\"description\":\"Coda document ID\"},\"pageId\":{\"type\":\"string\",\"description\":\"Page ID within the document\"},\"outputFormat\":{\"enum\":[\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Export format for the page content. Defaults to 'html'\"}},\"required\":[\"docId\",\"pageId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"type\":\"string\",\"description\":\"Page content in the requested format (HTML or Markdown)\"}},\"required\":[\"content\"]},\n },\n \"codaGetTableRows\": {\n stepType: \"codaGetTableRows\",\n description: \"Fetch rows from a Coda table with optional pagination.\",\n usageNotes: \"- Requires a Coda OAuth connection (connectionId).\\n- Default limit is 10000 rows. Rows are fetched in pages of 500.\\n- When outputFormat is 'csv', the variable receives CSV text. The direct execution output always returns parsed rows.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Coda OAuth connection ID\"},\"docId\":{\"type\":\"string\",\"description\":\"Coda document ID\"},\"tableId\":{\"type\":\"string\",\"description\":\"Table ID within the document\"},\"limit\":{\"type\":[\"number\",\"string\"]},\"outputFormat\":{\"enum\":[\"json\",\"csv\"],\"type\":\"string\",\"description\":\"Output format for the result. Defaults to 'json'\"}},\"required\":[\"docId\",\"tableId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Coda row ID\"},\"values\":{\"type\":\"object\",\"description\":\"Column values keyed by column name\"}},\"required\":[\"id\",\"values\"]},\"description\":\"The list of rows retrieved from the Coda table\"}},\"required\":[\"rows\"]},\n },\n \"convertPdfToImages\": {\n stepType: \"convertPdfToImages\",\n description: \"Convert each page of a PDF document into a PNG image.\",\n usageNotes: \"- Each page is converted to a separate PNG and re-hosted on the CDN.\\n- Returns an array of image URLs, one per page.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"pdfUrl\":{\"type\":\"string\",\"description\":\"URL of the PDF document to convert\"}},\"required\":[\"pdfUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrls\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"CDN URLs of the generated page images, one per page of the PDF\"}},\"required\":[\"imageUrls\"]},\n },\n \"createDataSource\": {\n stepType: \"createDataSource\",\n description: \"Create a new empty vector data source for the current app.\",\n usageNotes: \"- Creates a new data source (vector database) associated with the current app version.\\n- The data source is created empty — use the \\\"Upload Data Source Document\\\" block to add documents.\\n- Returns the new data source ID which can be used in subsequent blocks.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"description\":\"Name for the new data source (supports variable interpolation)\"}},\"required\":[\"name\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"createGmailDraft\": {\n stepType: \"createGmailDraft\",\n description: \"Create a draft email in the connected Gmail account.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail compose scope.\\n- The draft appears in the user's Gmail Drafts folder but is not sent.\\n- messageType controls the body format: \\\"plain\\\" for plain text, \\\"html\\\" for raw HTML, \\\"markdown\\\" for auto-converted markdown.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"to\":{\"type\":\"string\",\"description\":\"Recipient email address(es), comma-separated for multiple\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject line\"},\"message\":{\"type\":\"string\",\"description\":\"Email body content\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"messageType\":{\"enum\":[\"plain\",\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Body format: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\"\"}},\"required\":[\"to\",\"subject\",\"message\",\"messageType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"draftId\":{\"type\":\"string\",\"description\":\"Gmail draft ID\"}},\"required\":[\"draftId\"]},\n },\n \"createGoogleCalendarEvent\": {\n stepType: \"createGoogleCalendarEvent\",\n description: \"Create a new event on a Google Calendar.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- Date/time values must be ISO 8601 format (e.g. \\\"2025-07-02T10:00:00-07:00\\\").\\n- Attendees are specified as one email address per line in a single string.\\n- Set addMeetLink to true to automatically attach a Google Meet video call.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"summary\":{\"type\":\"string\",\"description\":\"Event title\"},\"description\":{\"type\":\"string\",\"description\":\"Event description\"},\"location\":{\"type\":\"string\",\"description\":\"Event location\"},\"startDateTime\":{\"type\":\"string\",\"description\":\"Start time in ISO 8601 format\"},\"endDateTime\":{\"type\":\"string\",\"description\":\"End time in ISO 8601 format\"},\"attendees\":{\"type\":\"string\",\"description\":\"Attendee email addresses, one per line\"},\"addMeetLink\":{\"type\":\"boolean\",\"description\":\"Whether to attach a Google Meet video call link\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\" if omitted)\"}},\"required\":[\"summary\",\"startDateTime\",\"endDateTime\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"eventId\":{\"type\":\"string\",\"description\":\"Google Calendar event ID\"},\"htmlLink\":{\"type\":\"string\",\"description\":\"URL to view the event in Google Calendar\"}},\"required\":[\"eventId\",\"htmlLink\"]},\n },\n \"createGoogleDoc\": {\n stepType: \"createGoogleDoc\",\n description: \"Create a new Google Document and optionally populate it with content.\",\n usageNotes: \"- textType determines how the text field is interpreted: \\\"plain\\\" for plain text, \\\"html\\\" for HTML markup, \\\"markdown\\\" for Markdown.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Title for the new document\"},\"text\":{\"type\":\"string\",\"description\":\"Document body content\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"textType\":{\"enum\":[\"plain\",\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Format of the text field: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\"\"}},\"required\":[\"title\",\"text\",\"textType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"documentUrl\":{\"type\":\"string\",\"description\":\"URL of the newly created Google Document\"}},\"required\":[\"documentUrl\"]},\n },\n \"createGoogleSheet\": {\n stepType: \"createGoogleSheet\",\n description: \"Create a new Google Spreadsheet and populate it with CSV data.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Title for the new spreadsheet\"},\"text\":{\"type\":\"string\",\"description\":\"CSV data to populate the sheet with\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"title\",\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"spreadsheetUrl\":{\"type\":\"string\",\"description\":\"URL of the newly created Google Spreadsheet\"}},\"required\":[\"spreadsheetUrl\"]},\n },\n \"deleteDataSource\": {\n stepType: \"deleteDataSource\",\n description: \"Delete a vector data source from the current app.\",\n usageNotes: \"- Soft-deletes a data source (vector database) by marking it as deleted.\\n- The Milvus partition is cleaned up asynchronously by a background cron job.\\n- The data source must belong to the current app version.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"dataSourceId\":{\"type\":\"string\",\"description\":\"ID of the data source to delete (supports variable interpolation)\"}},\"required\":[\"dataSourceId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"deleteDataSourceDocument\": {\n stepType: \"deleteDataSourceDocument\",\n description: \"Delete a single document from a data source.\",\n usageNotes: \"- Soft-deletes a document by marking it as deleted.\\n- Requires both the data source ID and document ID.\\n- After deletion, reloads vectors into Milvus so the data source reflects the change immediately.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"dataSourceId\":{\"type\":\"string\",\"description\":\"ID of the data source containing the document (supports variable interpolation)\"},\"documentId\":{\"type\":\"string\",\"description\":\"ID of the document to delete (supports variable interpolation)\"}},\"required\":[\"dataSourceId\",\"documentId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"deleteGmailEmail\": {\n stepType: \"deleteGmailEmail\",\n description: \"Move an email to trash in the connected Gmail account (recoverable delete).\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail modify scope.\\n- Uses trash (recoverable) rather than permanent delete.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID to delete (move to trash)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"messageId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"deleteGoogleCalendarEvent\": {\n stepType: \"deleteGoogleCalendarEvent\",\n description: \"Retrieve a specific event from a Google Calendar by event ID.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns the structured event.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"eventId\":{\"type\":\"string\",\"description\":\"Google Calendar event ID to delete\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\" if omitted)\"}},\"required\":[\"eventId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"deleteGoogleSheetRows\": {\n stepType: \"deleteGoogleSheetRows\",\n description: \"Delete a range of rows from a Google Spreadsheet.\",\n usageNotes: \"- Requires a Google OAuth connection with Drive scope.\\n- startRow and endRow are 1-based row numbers (inclusive).\\n- If sheetName is omitted, operates on the first sheet.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"description\":\"Google Spreadsheet ID or URL\"},\"sheetName\":{\"type\":\"string\",\"description\":\"Sheet/tab name (defaults to first sheet)\"},\"startRow\":{\"type\":\"string\",\"description\":\"First row to delete (1-based, inclusive)\"},\"endRow\":{\"type\":\"string\",\"description\":\"Last row to delete (1-based, inclusive)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"documentId\",\"startRow\",\"endRow\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"detectChanges\": {\n stepType: \"detectChanges\",\n description: \"Detect changes between runs by comparing current input against previously stored state. Routes execution based on whether a change occurred.\",\n usageNotes: \"- Persists state across runs using a global variable keyed to the step ID.\\n- Two modes: \\\"comparison\\\" (default) uses strict string inequality; \\\"ai\\\" uses an LLM to determine if a meaningful change occurred.\\n- First run always treats the value as \\\"changed\\\" since there is no previous state.\\n- Each mode supports transitions to different steps/workflows for the \\\"changed\\\" and \\\"unchanged\\\" paths.\\n- AI mode bills normally for the LLM call.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"mode\":{\"enum\":[\"ai\",\"comparison\"],\"type\":\"string\",\"description\":\"Detection mode: 'comparison' for strict string inequality, 'ai' for LLM-based. Default: 'comparison'\"},\"input\":{\"type\":\"string\",\"description\":\"Current value to check (variable template)\"},\"prompt\":{\"type\":\"string\",\"description\":\"AI mode: what constitutes a meaningful change\"},\"modelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"AI mode: model settings override\"},\"previousValueVariable\":{\"type\":\"string\",\"description\":\"Optional variable name to store the previous value into for downstream access\"},\"changedStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if changed (same workflow)\"},\"changedWorkflowId\":{\"type\":\"string\",\"description\":\"Workflow to jump to if changed (cross workflow)\"},\"unchangedStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if unchanged (same workflow)\"},\"unchangedWorkflowId\":{\"type\":\"string\",\"description\":\"Workflow to jump to if unchanged (cross workflow)\"}},\"required\":[\"mode\",\"input\"],\"description\":\"Configuration for the detect changes step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"hasChanged\":{\"type\":\"boolean\",\"description\":\"Whether a change was detected\"},\"currentValue\":{\"type\":\"string\",\"description\":\"The resolved input value\"},\"previousValue\":{\"type\":\"string\",\"description\":\"The stored value from last run (empty string on first run)\"},\"isFirstRun\":{\"type\":\"boolean\",\"description\":\"True when no previous state exists\"}},\"required\":[\"hasChanged\",\"currentValue\",\"previousValue\",\"isFirstRun\"]},\n },\n \"detectPII\": {\n stepType: \"detectPII\",\n description: \"Scan text for personally identifiable information using Microsoft Presidio.\",\n usageNotes: \"- In workflow mode, transitions to detectedStepId if PII is found, notDetectedStepId otherwise.\\n- In direct execution, returns the detection results without transitioning.\\n- If entities is empty, returns immediately with no detections.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"input\":{\"type\":\"string\",\"description\":\"Text to scan for personally identifiable information\"},\"language\":{\"type\":\"string\",\"description\":\"Language code of the input text (e.g. \\\"en\\\")\"},\"entities\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"PII entity types to scan for (e.g. [\\\"PHONE_NUMBER\\\", \\\"EMAIL_ADDRESS\\\"]). Empty array means nothing is scanned.\"},\"detectedStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if PII is detected (workflow mode)\"},\"notDetectedStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if no PII is detected (workflow mode)\"},\"outputLogVariable\":{\"type\":\"string\",\"description\":\"Variable name to store the raw detection results\"}},\"required\":[\"input\",\"language\",\"entities\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"detected\":{\"type\":\"boolean\",\"description\":\"Whether any PII was found in the input text\"},\"detections\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"entity_type\":{\"type\":\"string\",\"description\":\"PII entity type (e.g. \\\"PHONE_NUMBER\\\", \\\"EMAIL_ADDRESS\\\", \\\"PERSON\\\")\"},\"start\":{\"type\":\"number\",\"description\":\"Start character index in the input text\"},\"end\":{\"type\":\"number\",\"description\":\"End character index in the input text\"},\"score\":{\"type\":\"number\",\"description\":\"Confidence score between 0 and 1\"}},\"required\":[\"entity_type\",\"start\",\"end\",\"score\"]},\"description\":\"List of detected PII entities with type, location, and confidence\"}},\"required\":[\"detected\",\"detections\"]},\n },\n \"discordEditMessage\": {\n stepType: \"discordEditMessage\",\n description: \"Edit a previously sent Discord channel message. Use with the message ID returned by Send Discord Message.\",\n usageNotes: \"- Only messages sent by the bot can be edited.\\n- The messageId is returned by the Send Discord Message step.\\n- Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\\n- When editing with an attachment, the new attachment replaces any previous attachments on the message.\\n- URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Discord bot token for authentication\"},\"channelId\":{\"type\":\"string\",\"description\":\"Discord channel ID containing the message\"},\"messageId\":{\"type\":\"string\",\"description\":\"ID of the message to edit (returned by Send Discord Message)\"},\"text\":{\"type\":\"string\",\"description\":\"New message text to replace the existing content\"},\"attachmentUrl\":{\"type\":\"string\",\"description\":\"URL of a file to download and attach to the message (replaces any previous attachments)\"}},\"required\":[\"botToken\",\"channelId\",\"messageId\",\"text\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"discordSendFollowUp\": {\n stepType: \"discordSendFollowUp\",\n description: \"Send a follow-up message to a Discord slash command interaction.\",\n usageNotes: \"- Requires the applicationId and interactionToken from the Discord trigger variables.\\n- Follow-up messages appear as new messages in the channel after the initial response.\\n- Returns the sent message ID.\\n- Interaction tokens expire after 15 minutes.\\n- Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\\n- URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"applicationId\":{\"type\":\"string\",\"description\":\"Discord application ID from the bot registration\"},\"interactionToken\":{\"type\":\"string\",\"description\":\"Interaction token provided by the Discord trigger — expires after 15 minutes\"},\"text\":{\"type\":\"string\",\"description\":\"Message text to send as a follow-up\"},\"attachmentUrl\":{\"type\":\"string\",\"description\":\"URL of a file to download and attach to the message\"}},\"required\":[\"applicationId\",\"interactionToken\",\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"ID of the sent follow-up message\"}},\"required\":[\"messageId\"]},\n },\n \"discordSendMessage\": {\n stepType: \"discordSendMessage\",\n description: \"Send a message to Discord — either edit the loading message or send a new channel message.\",\n usageNotes: \"- mode \\\"edit\\\" replaces the loading message (interaction response) with the final result. Uses applicationId and interactionToken from trigger variables. No bot permissions required.\\n- mode \\\"send\\\" sends a new message to a channel. Uses botToken and channelId from trigger variables. Returns a messageId that can be used with Edit Discord Message.\\n- Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\\n- URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\\n- Interaction tokens expire after 15 minutes.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"mode\":{\"enum\":[\"edit\",\"send\"],\"type\":\"string\",\"description\":\"\\\"edit\\\" replaces the loading message, \\\"send\\\" sends a new channel message\"},\"text\":{\"type\":\"string\",\"description\":\"Message text to send\"},\"applicationId\":{\"type\":\"string\",\"description\":\"Discord application ID from the bot registration (required for \\\"reply\\\" mode)\"},\"interactionToken\":{\"type\":\"string\",\"description\":\"Interaction token provided by the Discord trigger — expires after 15 minutes (required for \\\"reply\\\" mode)\"},\"botToken\":{\"type\":\"string\",\"description\":\"Discord bot token for authentication (required for \\\"send\\\" mode)\"},\"channelId\":{\"type\":\"string\",\"description\":\"Discord channel ID to send the message to (required for \\\"send\\\" mode)\"},\"attachmentUrl\":{\"type\":\"string\",\"description\":\"URL of a file to download and attach to the message\"}},\"required\":[\"mode\",\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"ID of the sent Discord message, only present in \\\"send\\\" mode (use with Edit Discord Message)\"}}},\n },\n \"downloadVideo\": {\n stepType: \"downloadVideo\",\n description: \"Download a video file\",\n usageNotes: \"- Works with YouTube, TikTok, etc., by using ytdlp behind the scenes\\n- Can save as mp4 or mp3\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video to download (supports YouTube, TikTok, etc. via yt-dlp)\"},\"format\":{\"enum\":[\"mp4\",\"mp3\"],\"type\":\"string\",\"description\":\"Output format for the downloaded file\"}},\"required\":[\"videoUrl\",\"format\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the downloaded and re-hosted video file\"}},\"required\":[\"videoUrl\"]},\n },\n \"enhanceImageGenerationPrompt\": {\n stepType: \"enhanceImageGenerationPrompt\",\n description: \"Generate or enhance an image generation prompt using a language model. Optionally generates a negative prompt.\",\n usageNotes: \"- Rewrites the user's prompt with added detail about style, lighting, colors, and composition.\\n- Also useful for initial generation, it doesn't always need to be enhancing an existing prompt\\n- When includeNegativePrompt is true, a second model call generates a negative prompt.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"initialPrompt\":{\"type\":\"string\",\"description\":\"The raw prompt to enhance\"},\"includeNegativePrompt\":{\"type\":\"boolean\",\"description\":\"Whether to also generate a negative prompt\"},\"negativePromptDestinationVariableName\":{\"type\":\"string\",\"description\":\"Variable name to save the negative prompt into\"},\"systemPrompt\":{\"type\":\"string\",\"description\":\"Custom system prompt for the enhancement model. Uses a default prompt if not provided\"},\"modelOverride\":{\"description\":\"Model override settings. Leave undefined to use the default model\"}},\"required\":[\"initialPrompt\",\"includeNegativePrompt\",\"systemPrompt\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"The enhanced image generation prompt\"},\"negativePrompt\":{\"type\":\"string\",\"description\":\"The negative prompt, only present when includeNegativePrompt was true\"}},\"required\":[\"prompt\"]},\n },\n \"enhanceVideoGenerationPrompt\": {\n stepType: \"enhanceVideoGenerationPrompt\",\n description: \"Generate or enhance a video generation prompt using a language model. Optionally generates a negative prompt.\",\n usageNotes: \"- Rewrites the user's prompt with added detail about style, camera movement, lighting, and composition.\\n- Also useful for initial generation, it doesn't always need to be enhancing an existing prompt\\n- When includeNegativePrompt is true, a second model call generates a negative prompt.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"initialPrompt\":{\"type\":\"string\",\"description\":\"The raw prompt to enhance\"},\"includeNegativePrompt\":{\"type\":\"boolean\",\"description\":\"Whether to also generate a negative prompt\"},\"negativePromptDestinationVariableName\":{\"type\":\"string\",\"description\":\"Variable name to save the negative prompt into\"},\"systemPrompt\":{\"type\":\"string\",\"description\":\"Custom system prompt for the enhancement model. Uses a default prompt if not provided\"},\"modelOverride\":{\"description\":\"Model override settings. Leave undefined to use the default model\"}},\"required\":[\"initialPrompt\",\"includeNegativePrompt\",\"systemPrompt\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"The enhanced video generation prompt\"},\"negativePrompt\":{\"type\":\"string\",\"description\":\"The negative prompt, only present when includeNegativePrompt was true\"}},\"required\":[\"prompt\"]},\n },\n \"enrichPerson\": {\n stepType: \"enrichPerson\",\n description: \"Look up professional information about a person using Apollo.io. Search by ID, name, LinkedIn URL, email, or domain.\",\n usageNotes: \"- At least one search parameter must be provided.\\n- Returns enriched data from Apollo including contact details, employment info, and social profiles.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"params\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Apollo person ID\"},\"name\":{\"type\":\"string\",\"description\":\"Person's full name\"},\"linkedinUrl\":{\"type\":\"string\",\"description\":\"LinkedIn profile URL\"},\"email\":{\"type\":\"string\",\"description\":\"Email address\"},\"domain\":{\"type\":\"string\",\"description\":\"Company domain\"}},\"required\":[\"id\",\"name\",\"linkedinUrl\",\"email\",\"domain\"],\"description\":\"Search parameters to identify the person (ID, name, LinkedIn URL, email, or domain)\"}},\"required\":[\"params\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Apollo enrichment result with contact details, employment history, and social profiles\"}},\"required\":[\"data\"]},\n },\n \"extractAudioFromVideo\": {\n stepType: \"extractAudioFromVideo\",\n description: \"Extract audio MP3 from a video file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video to extract audio from\"}},\"required\":[\"videoUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the extracted audio MP3 file\"}},\"required\":[\"audioUrl\"]},\n },\n \"extractText\": {\n stepType: \"extractText\",\n description: \"Download a file from a URL and extract its text content. Supports PDFs, plain text files, and other document formats.\",\n usageNotes: \"- Best suited for PDFs and raw text/document files. For web pages, use the scrapeUrl step instead.\\n- Accepts a single URL, a comma-separated list of URLs, or a JSON array of URLs.\\n- Files are rehosted on the MindStudio CDN before extraction.\\n- Maximum file size is 50MB per URL.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}}]}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}}]}},\"required\":[\"text\"]},\n },\n \"fetchDataSourceDocument\": {\n stepType: \"fetchDataSourceDocument\",\n description: \"Fetch the full extracted text contents of a document in a data source.\",\n usageNotes: \"- Loads a document by ID and returns its full extracted text content.\\n- The document must have been successfully processed (status \\\"done\\\").\\n- Also returns document metadata (name, summary, word count).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"dataSourceId\":{\"type\":\"string\",\"description\":\"ID of the data source containing the document (supports variable interpolation)\"},\"documentId\":{\"type\":\"string\",\"description\":\"ID of the document to fetch (supports variable interpolation)\"}},\"required\":[\"dataSourceId\",\"documentId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"fetchGoogleDoc\": {\n stepType: \"fetchGoogleDoc\",\n description: \"Fetch the contents of an existing Google Document.\",\n usageNotes: \"- exportType controls the output format: \\\"html\\\" for HTML markup, \\\"markdown\\\" for Markdown, \\\"json\\\" for structured JSON, \\\"plain\\\" for plain text.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"description\":\"Google Document ID (from the document URL)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"html\",\"markdown\",\"json\",\"plain\"],\"type\":\"string\",\"description\":\"Output format: \\\"html\\\", \\\"markdown\\\", \\\"json\\\", or \\\"plain\\\"\"}},\"required\":[\"documentId\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"type\":\"string\",\"description\":\"Document contents in the requested export format\"}},\"required\":[\"content\"]},\n },\n \"fetchGoogleSheet\": {\n stepType: \"fetchGoogleSheet\",\n description: \"Fetch contents of a Google Spreadsheet range.\",\n usageNotes: \"- range uses A1 notation (e.g. \\\"Sheet1!A1:C10\\\"). Omit to fetch the entire first sheet.\\n- exportType controls the output format: \\\"csv\\\" for comma-separated values, \\\"json\\\" for structured JSON.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"spreadsheetId\":{\"type\":\"string\",\"description\":\"Google Spreadsheet ID (from the spreadsheet URL)\"},\"range\":{\"type\":\"string\",\"description\":\"Cell range in A1 notation (e.g. \\\"Sheet1!A1:C10\\\")\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"csv\",\"json\"],\"type\":\"string\",\"description\":\"Output format: \\\"csv\\\" or \\\"json\\\"\"}},\"required\":[\"spreadsheetId\",\"range\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"type\":\"string\",\"description\":\"Spreadsheet data in the requested export format\"}},\"required\":[\"content\"]},\n },\n \"fetchSlackChannelHistory\": {\n stepType: \"fetchSlackChannelHistory\",\n description: \"Fetch recent message history from a Slack channel.\",\n usageNotes: \"- The user is responsible for connecting their Slack workspace and selecting the channel\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Slack OAuth connection ID (leave empty to allow user to select)\"},\"channelId\":{\"type\":\"string\",\"description\":\"Slack channel ID (leave empty to allow user to select a channel)\"},\"limit\":{\"type\":\"number\",\"description\":\"Maximum number of messages to return (1-15)\"},\"startDate\":{\"type\":\"string\",\"description\":\"Earliest date to include messages from\"},\"endDate\":{\"type\":\"string\",\"description\":\"Latest date to include messages up to\"},\"includeImages\":{\"type\":\"boolean\",\"description\":\"Whether to include images in the output\"},\"includeRawMessage\":{\"type\":\"boolean\",\"description\":\"Whether to include the raw Slack message object (useful for bot messages with complex attachments)\"}},\"required\":[\"channelId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messages\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"from\":{\"type\":\"string\"},\"content\":{\"type\":\"string\"},\"timestamp\":{\"type\":\"string\"},\"images\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"rawMessage\":{\"type\":\"object\",\"properties\":{\"app_id\":{\"type\":\"string\"},\"assistant_app_thread\":{\"type\":\"object\",\"properties\":{\"first_user_thread_reply\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"title_blocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}}},\"attachments\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"actions\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"app_id\":{\"type\":\"string\"},\"app_unfurl_url\":{\"type\":\"string\"},\"author_icon\":{\"type\":\"string\"},\"author_id\":{\"type\":\"string\"},\"author_link\":{\"type\":\"string\"},\"author_name\":{\"type\":\"string\"},\"author_subname\":{\"type\":\"string\"},\"blocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"bot_id\":{\"type\":\"string\"},\"bot_team_id\":{\"type\":\"string\"},\"callback_id\":{\"type\":\"string\"},\"channel_id\":{\"type\":\"string\"},\"channel_name\":{\"type\":\"string\"},\"channel_team\":{\"type\":\"string\"},\"color\":{\"type\":\"string\"},\"fallback\":{\"type\":\"string\"},\"fields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"file_id\":{\"type\":\"string\"},\"filename\":{\"type\":\"string\"},\"files\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"footer\":{\"type\":\"string\"},\"footer_icon\":{\"type\":\"string\"},\"from_url\":{\"type\":\"string\"},\"hide_border\":{\"type\":\"boolean\"},\"hide_color\":{\"type\":\"boolean\"},\"id\":{\"type\":\"number\"},\"image_bytes\":{\"type\":\"number\"},\"image_height\":{\"type\":\"number\"},\"image_url\":{\"type\":\"string\"},\"image_width\":{\"type\":\"number\"},\"indent\":{\"type\":\"boolean\"},\"is_app_unfurl\":{\"type\":\"boolean\"},\"is_file_attachment\":{\"type\":\"boolean\"},\"is_msg_unfurl\":{\"type\":\"boolean\"},\"is_reply_unfurl\":{\"type\":\"boolean\"},\"is_thread_root_unfurl\":{\"type\":\"boolean\"},\"list\":{\"type\":\"string\"},\"list_record\":{\"type\":\"string\"},\"list_record_id\":{\"type\":\"string\"},\"list_records\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"list_schema\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"list_view\":{\"type\":\"string\"},\"list_view_id\":{\"type\":\"string\"},\"message_blocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"metadata\":{\"type\":\"string\"},\"mimetype\":{\"type\":\"string\"},\"mrkdwn_in\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"msg_subtype\":{\"type\":\"string\"},\"original_url\":{\"type\":\"string\"},\"pretext\":{\"type\":\"string\"},\"preview\":{\"type\":\"string\"},\"service_icon\":{\"type\":\"string\"},\"service_name\":{\"type\":\"string\"},\"service_url\":{\"type\":\"string\"},\"size\":{\"type\":\"number\"},\"text\":{\"type\":\"string\"},\"thumb_height\":{\"type\":\"number\"},\"thumb_url\":{\"type\":\"string\"},\"thumb_width\":{\"type\":\"number\"},\"title\":{\"type\":\"string\"},\"title_link\":{\"type\":\"string\"},\"ts\":{\"type\":\"string\"},\"url\":{\"type\":\"string\"},\"video_html\":{\"type\":\"string\"},\"video_html_height\":{\"type\":\"number\"},\"video_html_width\":{\"type\":\"number\"},\"video_url\":{\"type\":\"string\"}}}},\"blocks\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"accessory\":{\"type\":\"string\"},\"alt_text\":{\"type\":\"string\"},\"api_decoration_available\":{\"type\":\"boolean\"},\"app_collaborators\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"app_id\":{\"type\":\"string\"},\"author_name\":{\"type\":\"string\"},\"block_id\":{\"type\":\"string\"},\"bot_user_id\":{\"type\":\"string\"},\"button_label\":{\"type\":\"string\"},\"call\":{\"type\":\"string\"},\"call_id\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"developer_trace_id\":{\"type\":\"string\"},\"dispatch_action\":{\"type\":\"boolean\"},\"element\":{\"type\":\"string\"},\"elements\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"expand\":{\"type\":\"boolean\"},\"external_id\":{\"type\":\"string\"},\"fallback\":{\"type\":\"string\"},\"fields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"file\":{\"type\":\"string\"},\"file_id\":{\"type\":\"string\"},\"function_trigger_id\":{\"type\":\"string\"},\"hint\":{\"type\":\"string\"},\"image_bytes\":{\"type\":\"number\"},\"image_height\":{\"type\":\"number\"},\"image_url\":{\"type\":\"string\"},\"image_width\":{\"type\":\"number\"},\"is_animated\":{\"type\":\"boolean\"},\"is_workflow_app\":{\"type\":\"boolean\"},\"label\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"},\"owning_team_id\":{\"type\":\"string\"},\"provider_icon_url\":{\"type\":\"string\"},\"provider_name\":{\"type\":\"string\"},\"sales_home_workflow_app_type\":{\"type\":\"number\"},\"share_url\":{\"type\":\"string\"},\"slack_file\":{\"type\":\"string\"},\"source\":{\"type\":\"string\"},\"text\":{\"type\":\"string\"},\"thumbnail_url\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"title_url\":{\"type\":\"string\"},\"trigger_subtype\":{\"type\":\"string\"},\"trigger_type\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"url\":{\"type\":\"string\"},\"video_url\":{\"type\":\"string\"},\"workflow_id\":{\"type\":\"string\"}}}},\"bot_id\":{\"type\":\"string\"},\"bot_profile\":{\"type\":\"object\",\"properties\":{\"app_id\":{\"type\":\"string\"},\"deleted\":{\"type\":\"boolean\"},\"icons\":{\"type\":\"string\"},\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"team_id\":{\"type\":\"string\"},\"updated\":{\"type\":\"number\"}}},\"client_msg_id\":{\"type\":\"string\"},\"display_as_bot\":{\"type\":\"boolean\"},\"edited\":{\"type\":\"object\",\"properties\":{\"ts\":{\"type\":\"string\"},\"user\":{\"type\":\"string\"}}},\"files\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"access\":{\"type\":\"string\"},\"alt_txt\":{\"type\":\"string\"},\"app_id\":{\"type\":\"string\"},\"app_name\":{\"type\":\"string\"},\"attachments\":{\"type\":\"array\",\"items\":{}},\"blocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"bot_id\":{\"type\":\"string\"},\"can_toggle_canvas_lock\":{\"type\":\"boolean\"},\"canvas_printing_enabled\":{\"type\":\"boolean\"},\"canvas_template_mode\":{\"type\":\"string\"},\"cc\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"channel_actions_count\":{\"type\":\"number\"},\"channel_actions_ts\":{\"type\":\"string\"},\"channels\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"comments_count\":{\"type\":\"number\"},\"converted_pdf\":{\"type\":\"string\"},\"created\":{\"type\":\"number\"},\"deanimate\":{\"type\":\"string\"},\"deanimate_gif\":{\"type\":\"string\"},\"display_as_bot\":{\"type\":\"boolean\"},\"dm_mpdm_users_with_file_access\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"duration_ms\":{\"type\":\"number\"},\"edit_link\":{\"type\":\"string\"},\"edit_timestamp\":{\"type\":\"number\"},\"editable\":{\"type\":\"boolean\"},\"editor\":{\"type\":\"string\"},\"editors\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"external_id\":{\"type\":\"string\"},\"external_type\":{\"type\":\"string\"},\"external_url\":{\"type\":\"string\"},\"favorites\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"file_access\":{\"type\":\"string\"},\"filetype\":{\"type\":\"string\"},\"from\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"groups\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"has_more\":{\"type\":\"boolean\"},\"has_more_shares\":{\"type\":\"boolean\"},\"has_rich_preview\":{\"type\":\"boolean\"},\"headers\":{\"type\":\"string\"},\"hls\":{\"type\":\"string\"},\"hls_embed\":{\"type\":\"string\"},\"id\":{\"type\":\"string\"},\"image_exif_rotation\":{\"type\":\"number\"},\"ims\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"initial_comment\":{\"type\":\"string\"},\"is_channel_space\":{\"type\":\"boolean\"},\"is_external\":{\"type\":\"boolean\"},\"is_public\":{\"type\":\"boolean\"},\"is_restricted_sharing_enabled\":{\"type\":\"boolean\"},\"is_starred\":{\"type\":\"boolean\"},\"last_editor\":{\"type\":\"string\"},\"last_read\":{\"type\":\"number\"},\"lines\":{\"type\":\"number\"},\"lines_more\":{\"type\":\"number\"},\"linked_channel_id\":{\"type\":\"string\"},\"list_csv_download_url\":{\"type\":\"string\"},\"list_limits\":{\"type\":\"string\"},\"list_metadata\":{\"type\":\"string\"},\"media_display_type\":{\"type\":\"string\"},\"media_progress\":{\"type\":\"string\"},\"mimetype\":{\"type\":\"string\"},\"mode\":{\"type\":\"string\"},\"mp4\":{\"type\":\"string\"},\"mp4_low\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"non_owner_editable\":{\"type\":\"boolean\"},\"num_stars\":{\"type\":\"number\"},\"org_or_workspace_access\":{\"type\":\"string\"},\"original_attachment_count\":{\"type\":\"number\"},\"original_h\":{\"type\":\"string\"},\"original_w\":{\"type\":\"string\"},\"permalink\":{\"type\":\"string\"},\"permalink_public\":{\"type\":\"string\"},\"pinned_to\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"pjpeg\":{\"type\":\"string\"},\"plain_text\":{\"type\":\"string\"},\"pretty_type\":{\"type\":\"string\"},\"preview\":{\"type\":\"string\"},\"preview_highlight\":{\"type\":\"string\"},\"preview_is_truncated\":{\"type\":\"boolean\"},\"preview_plain_text\":{\"type\":\"string\"},\"private_channels_with_file_access_count\":{\"type\":\"number\"},\"private_file_with_access_count\":{\"type\":\"number\"},\"public_url_shared\":{\"type\":\"boolean\"},\"quip_thread_id\":{\"type\":\"string\"},\"reactions\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"saved\":{\"type\":\"string\"},\"sent_to_self\":{\"type\":\"boolean\"},\"shares\":{\"type\":\"string\"},\"show_badge\":{\"type\":\"boolean\"},\"simplified_html\":{\"type\":\"string\"},\"size\":{\"type\":\"number\"},\"source_team\":{\"type\":\"string\"},\"subject\":{\"type\":\"string\"},\"subtype\":{\"type\":\"string\"},\"team_pref_version_history_enabled\":{\"type\":\"boolean\"},\"teams_shared_with\":{\"type\":\"array\",\"items\":{}},\"template_conversion_ts\":{\"type\":\"number\"},\"template_description\":{\"type\":\"string\"},\"template_icon\":{\"type\":\"string\"},\"template_name\":{\"type\":\"string\"},\"template_title\":{\"type\":\"string\"},\"thumb_1024\":{\"type\":\"string\"},\"thumb_1024_gif\":{\"type\":\"string\"},\"thumb_1024_h\":{\"type\":\"string\"},\"thumb_1024_w\":{\"type\":\"string\"},\"thumb_160\":{\"type\":\"string\"},\"thumb_160_gif\":{\"type\":\"string\"},\"thumb_160_h\":{\"type\":\"string\"},\"thumb_160_w\":{\"type\":\"string\"},\"thumb_360\":{\"type\":\"string\"},\"thumb_360_gif\":{\"type\":\"string\"},\"thumb_360_h\":{\"type\":\"string\"},\"thumb_360_w\":{\"type\":\"string\"},\"thumb_480\":{\"type\":\"string\"},\"thumb_480_gif\":{\"type\":\"string\"},\"thumb_480_h\":{\"type\":\"string\"},\"thumb_480_w\":{\"type\":\"string\"},\"thumb_64\":{\"type\":\"string\"},\"thumb_64_gif\":{\"type\":\"string\"},\"thumb_64_h\":{\"type\":\"string\"},\"thumb_64_w\":{\"type\":\"string\"},\"thumb_720\":{\"type\":\"string\"},\"thumb_720_gif\":{\"type\":\"string\"},\"thumb_720_h\":{\"type\":\"string\"},\"thumb_720_w\":{\"type\":\"string\"},\"thumb_80\":{\"type\":\"string\"},\"thumb_800\":{\"type\":\"string\"},\"thumb_800_gif\":{\"type\":\"string\"},\"thumb_800_h\":{\"type\":\"string\"},\"thumb_800_w\":{\"type\":\"string\"},\"thumb_80_gif\":{\"type\":\"string\"},\"thumb_80_h\":{\"type\":\"string\"},\"thumb_80_w\":{\"type\":\"string\"},\"thumb_960\":{\"type\":\"string\"},\"thumb_960_gif\":{\"type\":\"string\"},\"thumb_960_h\":{\"type\":\"string\"},\"thumb_960_w\":{\"type\":\"string\"},\"thumb_gif\":{\"type\":\"string\"},\"thumb_pdf\":{\"type\":\"string\"},\"thumb_pdf_h\":{\"type\":\"string\"},\"thumb_pdf_w\":{\"type\":\"string\"},\"thumb_tiny\":{\"type\":\"string\"},\"thumb_video\":{\"type\":\"string\"},\"thumb_video_h\":{\"type\":\"number\"},\"thumb_video_w\":{\"type\":\"number\"},\"timestamp\":{\"type\":\"number\"},\"title\":{\"type\":\"string\"},\"title_blocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"to\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"transcription\":{\"type\":\"string\"},\"update_notification\":{\"type\":\"number\"},\"updated\":{\"type\":\"number\"},\"url_private\":{\"type\":\"string\"},\"url_private_download\":{\"type\":\"string\"},\"url_static_preview\":{\"type\":\"string\"},\"user\":{\"type\":\"string\"},\"user_team\":{\"type\":\"string\"},\"username\":{\"type\":\"string\"},\"vtt\":{\"type\":\"string\"}}}},\"icons\":{\"type\":\"object\",\"properties\":{\"emoji\":{\"type\":\"string\"},\"image_36\":{\"type\":\"string\"},\"image_48\":{\"type\":\"string\"},\"image_64\":{\"type\":\"string\"},\"image_72\":{\"type\":\"string\"}}},\"inviter\":{\"type\":\"string\"},\"is_locked\":{\"type\":\"boolean\"},\"latest_reply\":{\"type\":\"string\"},\"metadata\":{\"type\":\"object\",\"properties\":{\"event_payload\":{\"type\":\"string\"},\"event_type\":{\"type\":\"string\"}}},\"parent_user_id\":{\"type\":\"string\"},\"purpose\":{\"type\":\"string\"},\"reactions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"number\"},\"name\":{\"type\":\"string\"},\"url\":{\"type\":\"string\"},\"users\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}}}},\"reply_count\":{\"type\":\"number\"},\"reply_users\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"reply_users_count\":{\"type\":\"number\"},\"root\":{\"type\":\"object\",\"properties\":{\"bot_id\":{\"type\":\"string\"},\"icons\":{\"type\":\"string\"},\"latest_reply\":{\"type\":\"string\"},\"parent_user_id\":{\"type\":\"string\"},\"reply_count\":{\"type\":\"number\"},\"reply_users\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"reply_users_count\":{\"type\":\"number\"},\"subscribed\":{\"type\":\"boolean\"},\"subtype\":{\"type\":\"string\"},\"text\":{\"type\":\"string\"},\"thread_ts\":{\"type\":\"string\"},\"ts\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"username\":{\"type\":\"string\"}}},\"subscribed\":{\"type\":\"boolean\"},\"subtype\":{\"type\":\"string\"},\"team\":{\"type\":\"string\"},\"text\":{\"type\":\"string\"},\"thread_ts\":{\"type\":\"string\"},\"topic\":{\"type\":\"string\"},\"ts\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"upload\":{\"type\":\"boolean\"},\"user\":{\"type\":\"string\"},\"username\":{\"type\":\"string\"},\"x_files\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}}}},\"required\":[\"from\",\"content\"]},\"description\":\"List of messages from the channel history\"}},\"required\":[\"messages\"]},\n },\n \"fetchYoutubeCaptions\": {\n stepType: \"fetchYoutubeCaptions\",\n description: \"Retrieve the captions/transcript for a YouTube video.\",\n usageNotes: \"- Supports multiple languages via the language parameter.\\n- \\\"text\\\" export produces timestamped plain text; \\\"json\\\" export produces structured transcript data.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"YouTube video URL to fetch captions for\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Output format: \\\"text\\\" for timestamped plain text, \\\"json\\\" for structured transcript data\"},\"language\":{\"type\":\"string\",\"description\":\"Language code for the captions (e.g. \\\"en\\\")\"}},\"required\":[\"videoUrl\",\"exportType\",\"language\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"transcripts\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"Transcript text segment\"},\"start\":{\"type\":\"number\",\"description\":\"Start time of the segment in seconds\"}},\"required\":[\"text\",\"start\"]},\"description\":\"Parsed transcript segments with text and start timestamps\"}},\"required\":[\"transcripts\"]},\n },\n \"fetchYoutubeChannel\": {\n stepType: \"fetchYoutubeChannel\",\n description: \"Retrieve metadata and recent videos for a YouTube channel.\",\n usageNotes: \"- Accepts a YouTube channel URL (e.g. https://www.youtube.com/@ChannelName or /channel/ID).\\n- Returns channel info and video listings as a JSON object.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"channelUrl\":{\"type\":\"string\",\"description\":\"YouTube channel URL (e.g. https://www.youtube.com/@ChannelName or /channel/ID)\"}},\"required\":[\"channelUrl\"]},\n outputSchema: {\"type\":\"object\"},\n },\n \"fetchYoutubeComments\": {\n stepType: \"fetchYoutubeComments\",\n description: \"Retrieve comments for a YouTube video.\",\n usageNotes: \"- Paginates through comments (up to 5 pages).\\n- \\\"text\\\" export produces markdown-formatted text; \\\"json\\\" export produces structured comment data.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"YouTube video URL to fetch comments for\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Output format: \\\"text\\\" for markdown-formatted text, \\\"json\\\" for structured comment data\"},\"limitPages\":{\"type\":\"string\",\"description\":\"Maximum number of comment pages to fetch (1-5)\"}},\"required\":[\"videoUrl\",\"exportType\",\"limitPages\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"comments\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Unique comment identifier\"},\"link\":{\"type\":\"string\",\"description\":\"Direct URL to the comment\"},\"publishedDate\":{\"type\":\"string\",\"description\":\"Date the comment was published\"},\"text\":{\"type\":\"string\",\"description\":\"Text content of the comment\"},\"likes\":{\"type\":\"number\",\"description\":\"Number of likes on the comment\"},\"replies\":{\"type\":\"number\",\"description\":\"Number of replies to the comment\"},\"author\":{\"type\":\"string\",\"description\":\"Display name of the comment author\"},\"authorLink\":{\"type\":\"string\",\"description\":\"URL to the author's YouTube channel\"},\"authorImg\":{\"type\":\"string\",\"description\":\"URL of the author's profile image\"}},\"required\":[\"id\",\"link\",\"publishedDate\",\"text\",\"likes\",\"replies\",\"author\",\"authorLink\",\"authorImg\"]},\"description\":\"List of comments retrieved from the video\"}},\"required\":[\"comments\"]},\n },\n \"fetchYoutubeVideo\": {\n stepType: \"fetchYoutubeVideo\",\n description: \"Retrieve metadata for a YouTube video (title, description, stats, channel info).\",\n usageNotes: \"- Returns video metadata, channel info, and engagement stats.\\n- Video format data is excluded from the response.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"YouTube video URL to fetch metadata for\"}},\"required\":[\"videoUrl\"]},\n outputSchema: {\"type\":\"object\"},\n },\n \"generateAsset\": {\n stepType: \"generatePdf\",\n description: \"Generate an HTML asset and export it as a webpage, PDF, or image\",\n usageNotes: \"- Agents can generate HTML documents and export as webpage, PDFs, images, or videos. They do this by using the \\\"generatePdf\\\" block, which defines an HTML page with variables, and then the generation process renders the page to create the output and save its URL at the specified variable.\\n- The template for the HTML page is generated by a separate process, and it can only use variables that have already been defined in the workflow at the time of its execution. It has full access to handlebars to render the HTML template, including a handlebars helper to render a markdown variable string as HTML (which can be useful for creating templates that render long strings). The template can also create its own simple JavaScript to do things like format dates and strings.\\n- If PDF or composited image generation are part of the workflow, assistant adds the block and leaves the \\\"source\\\" empty. In a separate step, assistant generates a detailed request for the developer who will write the HTML.\\n- Can also auto-generate HTML from a prompt (like a generate text block to generate HTML). In these cases, create a prompt with variables in the dynamicPrompt variable describing, in detail, the document to generate\\n- Can either display output directly to user (foreground mode) or save the URL of the asset to a variable (background mode)\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\",\"description\":\"The HTML or Markdown source template for the asset\"},\"sourceType\":{\"enum\":[\"html\",\"markdown\",\"spa\",\"raw\",\"dynamic\",\"customInterface\"],\"type\":\"string\",\"description\":\"Source type: html, markdown (auto-formatted), spa (single page app), raw (pre-generated HTML in a variable), dynamic (AI-generated from prompt), or customInterface\"},\"outputFormat\":{\"enum\":[\"pdf\",\"png\",\"html\",\"mp4\",\"openGraph\"],\"type\":\"string\",\"description\":\"The output format for the generated asset\"},\"pageSize\":{\"enum\":[\"full\",\"letter\",\"A4\",\"custom\"],\"type\":\"string\",\"description\":\"Page size for PDF, PNG, or MP4 output\"},\"testData\":{\"type\":\"object\",\"description\":\"Test data used for previewing the template with sample variable values\"},\"options\":{\"type\":\"object\",\"properties\":{\"pageWidthPx\":{\"type\":\"number\",\"description\":\"Custom page width in pixels (for custom pageSize)\"},\"pageHeightPx\":{\"type\":\"number\",\"description\":\"Custom page height in pixels (for custom pageSize)\"},\"pageOrientation\":{\"enum\":[\"portrait\",\"landscape\"],\"type\":\"string\",\"description\":\"Page orientation for the rendered output\"},\"rehostMedia\":{\"type\":\"boolean\",\"description\":\"Whether to re-host third-party images on the MindStudio CDN\"},\"videoDurationSeconds\":{\"type\":\"number\",\"description\":\"Duration in seconds for MP4 video output\"}},\"description\":\"Additional rendering options\"},\"spaSource\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\",\"description\":\"Source code of the SPA (legacy, use files instead)\"},\"lastCompiledSource\":{\"type\":\"string\",\"description\":\"Last compiled source (cached)\"},\"files\":{\"type\":\"object\",\"description\":\"Multi-file SPA source\"},\"paths\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Available route paths in the SPA\"},\"root\":{\"type\":\"string\",\"description\":\"Root URL of the SPA bundle\"},\"zipUrl\":{\"type\":\"string\",\"description\":\"URL of the zipped SPA bundle\"}},\"required\":[\"paths\",\"root\",\"zipUrl\"],\"description\":\"Single page app source configuration (advanced)\"},\"rawSource\":{\"type\":\"string\",\"description\":\"Raw HTML source stored in a variable, using handlebars syntax (e.g. {{myHtmlVariable}})\"},\"dynamicPrompt\":{\"type\":\"string\",\"description\":\"Prompt to generate the HTML dynamically when sourceType is \\\"dynamic\\\"\"},\"dynamicSourceModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Model override for dynamic HTML generation. Leave undefined to use the default model\"},\"transitionControl\":{\"enum\":[\"default\",\"native\"],\"type\":\"string\",\"description\":\"Controls how the step transitions after displaying in foreground mode\"},\"shareControl\":{\"enum\":[\"default\",\"hidden\"],\"type\":\"string\",\"description\":\"Controls visibility of the share button on displayed assets\"},\"shareImageUrl\":{\"type\":\"string\",\"description\":\"URL of a custom Open Graph share image\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"source\",\"sourceType\",\"outputFormat\",\"pageSize\",\"testData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"CDN URL of the generated asset (PDF, PNG, HTML, or MP4 depending on outputFormat)\"}},\"required\":[\"url\"]},\n },\n \"generateChart\": {\n stepType: \"generateChart\",\n description: \"Create a chart image using QuickChart (Chart.js) and return the URL.\",\n usageNotes: \"- The data field must be a Chart.js-compatible JSON object serialized as a string.\\n- Supported chart types: bar, line, pie.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"chart\":{\"type\":\"object\",\"properties\":{\"chartType\":{\"enum\":[\"bar\",\"line\",\"pie\"],\"type\":\"string\",\"description\":\"The type of chart to generate\"},\"data\":{\"type\":\"string\",\"description\":\"Chart.js-compatible JSON data serialized as a string\"},\"options\":{\"type\":\"object\",\"properties\":{\"width\":{\"type\":\"string\",\"description\":\"Image width in pixels (e.g. \\\"500\\\")\"},\"height\":{\"type\":\"string\",\"description\":\"Image height in pixels (e.g. \\\"300\\\")\"}},\"required\":[\"width\",\"height\"],\"description\":\"Image rendering options\"}},\"required\":[\"chartType\",\"data\",\"options\"],\"description\":\"Chart configuration including type, data, and rendering options\"}},\"required\":[\"chart\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"chartUrl\":{\"type\":\"string\",\"description\":\"URL of the generated chart image\"}},\"required\":[\"chartUrl\"]},\n },\n \"generateImage\": {\n stepType: \"generateImage\",\n description: \"Generate an image from a text prompt using an AI model.\",\n usageNotes: \"- Prompts should be descriptive but concise (roughly 3–6 sentences).\\n- Images are automatically hosted on a CDN.\\n- In foreground mode, the image is displayed to the user. In background mode, the URL is saved to a variable.\\n- When generateVariants is true with numVariants > 1, multiple images are generated in parallel.\\n- In direct execution, foreground mode behaves as background, and userSelect variant behavior behaves as saveAll.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"Text prompt describing the image to generate\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"},\"imageModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Image generation model identifier\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default image model if not specified\"},\"generateVariants\":{\"type\":\"boolean\",\"description\":\"Whether to generate multiple image variants in parallel\"},\"numVariants\":{\"type\":\"number\",\"description\":\"Number of variants to generate (max 10)\"},\"addWatermark\":{\"type\":\"boolean\",\"description\":\"Whether to add a MindStudio watermark to the generated image\"}},\"required\":[\"prompt\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}}]}},\"required\":[\"imageUrl\"]},\n },\n \"generateLipsync\": {\n stepType: \"generateLipsync\",\n description: \"Generate a lip sync video from provided audio and image.\",\n usageNotes: \"- In foreground mode, the video is displayed to the user. In background mode, the URL is saved to a variable.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"},\"addWatermark\":{\"type\":\"boolean\",\"description\":\"Whether to add a MindStudio watermark to the generated video\"},\"lipsyncModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\"},\"config\":{\"type\":\"object\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default lipsync model if not specified\"}}},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"generateMusic\": {\n stepType: \"generateMusic\",\n description: \"Generate an audio file from provided instructions (text) using a music model.\",\n usageNotes: \"- The text field contains the instructions (prompt) for the music generation.\\n- In foreground mode, the audio is displayed to the user. In background mode, the URL is saved to a variable.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The instructions (prompt) for the music generation\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"},\"musicModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\"},\"config\":{\"type\":\"object\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default music model if not specified\"}},\"required\":[\"text\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"generatePdf\": {\n stepType: \"generatePdf\",\n description: \"Generate an HTML asset and export it as a webpage, PDF, or image\",\n usageNotes: \"- Agents can generate HTML documents and export as webpage, PDFs, images, or videos. They do this by using the \\\"generatePdf\\\" block, which defines an HTML page with variables, and then the generation process renders the page to create the output and save its URL at the specified variable.\\n- The template for the HTML page is generated by a separate process, and it can only use variables that have already been defined in the workflow at the time of its execution. It has full access to handlebars to render the HTML template, including a handlebars helper to render a markdown variable string as HTML (which can be useful for creating templates that render long strings). The template can also create its own simple JavaScript to do things like format dates and strings.\\n- If PDF or composited image generation are part of the workflow, assistant adds the block and leaves the \\\"source\\\" empty. In a separate step, assistant generates a detailed request for the developer who will write the HTML.\\n- Can also auto-generate HTML from a prompt (like a generate text block to generate HTML). In these cases, create a prompt with variables in the dynamicPrompt variable describing, in detail, the document to generate\\n- Can either display output directly to user (foreground mode) or save the URL of the asset to a variable (background mode)\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\",\"description\":\"The HTML or Markdown source template for the asset\"},\"sourceType\":{\"enum\":[\"html\",\"markdown\",\"spa\",\"raw\",\"dynamic\",\"customInterface\"],\"type\":\"string\",\"description\":\"Source type: html, markdown (auto-formatted), spa (single page app), raw (pre-generated HTML in a variable), dynamic (AI-generated from prompt), or customInterface\"},\"outputFormat\":{\"enum\":[\"pdf\",\"png\",\"html\",\"mp4\",\"openGraph\"],\"type\":\"string\",\"description\":\"The output format for the generated asset\"},\"pageSize\":{\"enum\":[\"full\",\"letter\",\"A4\",\"custom\"],\"type\":\"string\",\"description\":\"Page size for PDF, PNG, or MP4 output\"},\"testData\":{\"type\":\"object\",\"description\":\"Test data used for previewing the template with sample variable values\"},\"options\":{\"type\":\"object\",\"properties\":{\"pageWidthPx\":{\"type\":\"number\",\"description\":\"Custom page width in pixels (for custom pageSize)\"},\"pageHeightPx\":{\"type\":\"number\",\"description\":\"Custom page height in pixels (for custom pageSize)\"},\"pageOrientation\":{\"enum\":[\"portrait\",\"landscape\"],\"type\":\"string\",\"description\":\"Page orientation for the rendered output\"},\"rehostMedia\":{\"type\":\"boolean\",\"description\":\"Whether to re-host third-party images on the MindStudio CDN\"},\"videoDurationSeconds\":{\"type\":\"number\",\"description\":\"Duration in seconds for MP4 video output\"}},\"description\":\"Additional rendering options\"},\"spaSource\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\",\"description\":\"Source code of the SPA (legacy, use files instead)\"},\"lastCompiledSource\":{\"type\":\"string\",\"description\":\"Last compiled source (cached)\"},\"files\":{\"type\":\"object\",\"description\":\"Multi-file SPA source\"},\"paths\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Available route paths in the SPA\"},\"root\":{\"type\":\"string\",\"description\":\"Root URL of the SPA bundle\"},\"zipUrl\":{\"type\":\"string\",\"description\":\"URL of the zipped SPA bundle\"}},\"required\":[\"paths\",\"root\",\"zipUrl\"],\"description\":\"Single page app source configuration (advanced)\"},\"rawSource\":{\"type\":\"string\",\"description\":\"Raw HTML source stored in a variable, using handlebars syntax (e.g. {{myHtmlVariable}})\"},\"dynamicPrompt\":{\"type\":\"string\",\"description\":\"Prompt to generate the HTML dynamically when sourceType is \\\"dynamic\\\"\"},\"dynamicSourceModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Model override for dynamic HTML generation. Leave undefined to use the default model\"},\"transitionControl\":{\"enum\":[\"default\",\"native\"],\"type\":\"string\",\"description\":\"Controls how the step transitions after displaying in foreground mode\"},\"shareControl\":{\"enum\":[\"default\",\"hidden\"],\"type\":\"string\",\"description\":\"Controls visibility of the share button on displayed assets\"},\"shareImageUrl\":{\"type\":\"string\",\"description\":\"URL of a custom Open Graph share image\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"source\",\"sourceType\",\"outputFormat\",\"pageSize\",\"testData\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"CDN URL of the generated asset (PDF, PNG, HTML, or MP4 depending on outputFormat)\"}},\"required\":[\"url\"]},\n },\n \"generateStaticVideoFromImage\": {\n stepType: \"generateStaticVideoFromImage\",\n description: \"Convert a static image to an MP4\",\n usageNotes: \"- Can use to create slides/intertitles/slates for video composition\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the source image to convert to video\"},\"duration\":{\"type\":\"string\",\"description\":\"Duration of the output video in seconds\"}},\"required\":[\"imageUrl\",\"duration\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the generated static video\"}},\"required\":[\"videoUrl\"]},\n },\n \"generateText\": {\n stepType: \"userMessage\",\n description: \"Send a message to an AI model and return the response, or echo a system message.\",\n usageNotes: \"- Source \\\"user\\\" sends the message to an LLM and returns the model's response.\\n- Source \\\"system\\\" echoes the message content directly (no AI call).\\n- Mode \\\"background\\\" saves the result to a variable. Mode \\\"foreground\\\" streams it to the user (not available in direct execution).\\n- Structured output (JSON/CSV) can be enforced via structuredOutputType and structuredOutputExample.\\n- When executed inside a v2 app method (managed sandbox or local dev tunnel),\\n LLM token output can be streamed to the frontend in real time via an SSE\\n side-channel. The frontend opts in by passing { stream: true } to the method\\n invocation via @mindstudio-ai/interface. Tokens are published to Redis\\n pub/sub as they arrive and forwarded as SSE events on the invoke response.\\n The method code itself is unchanged — streaming is transparent to the\\n developer. See V2ExecutionService.ts and the invoke handler in V2Apps for\\n the server-side plumbing.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"description\":\"The message to send (prompt for AI, or text for system echo)\"},\"source\":{\"enum\":[\"user\",\"system\"],\"type\":\"string\",\"description\":\"Message source: \\\"user\\\" sends to AI model, \\\"system\\\" echoes message content directly. Defaults to \\\"user\\\"\"},\"modelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Model configuration override. Optional; uses the workflow's default model if not specified\"},\"structuredOutputType\":{\"enum\":[\"text\",\"json\",\"csv\"],\"type\":\"string\",\"description\":\"Output format constraint for structured responses\"},\"structuredOutputExample\":{\"type\":\"string\",\"description\":\"Sample showing the desired output shape (for JSON/CSV formats). A TypeScript interface is also useful here for more complex types.\"},\"chatHistoryMode\":{\"enum\":[\"include\",\"exclude\"],\"type\":\"string\",\"description\":\"Whether to include or exclude prior chat history in the AI context\"}},\"required\":[\"message\"],\"description\":\"Configuration for the user message step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"type\":\"string\",\"description\":\"The AI model's response or echoed system message content\"}},\"required\":[\"content\"]},\n },\n \"generateVideo\": {\n stepType: \"generateVideo\",\n description: \"Generate a video from a text prompt using an AI model.\",\n usageNotes: \"- Prompts should be descriptive but concise (roughly 3–6 sentences).\\n- Videos are automatically hosted on a CDN.\\n- In foreground mode, the video is displayed to the user. In background mode, the URL is saved to a variable.\\n- When generateVariants is true with numVariants > 1, multiple videos are generated in parallel.\\n- In direct execution, foreground mode behaves as background, and userSelect variant behavior behaves as saveAll.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"prompt\":{\"type\":\"string\",\"description\":\"Text prompt describing the video to generate\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"},\"videoModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Video generation model identifier\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default video model if not specified\"},\"generateVariants\":{\"type\":\"boolean\",\"description\":\"Whether to generate multiple video variants in parallel\"},\"numVariants\":{\"type\":\"number\",\"description\":\"Number of variants to generate (max 10)\"},\"addWatermark\":{\"type\":\"boolean\",\"description\":\"Whether to add a MindStudio watermark to the generated video\"}},\"required\":[\"prompt\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}}]}},\"required\":[\"videoUrl\"]},\n },\n \"getGmailAttachments\": {\n stepType: \"getGmailAttachments\",\n description: \"Download attachments from a Gmail email and re-host them on CDN.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Attachments are uploaded to CDN and returned as URLs.\\n- Attachments larger than 25MB are skipped.\\n- Use the message ID from Search Gmail Emails, List Recent Gmail Emails, or Get Gmail Email steps.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"messageId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"getGmailDraft\": {\n stepType: \"getGmailDraft\",\n description: \"Retrieve a specific draft from Gmail by draft ID.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns the draft content including subject, recipients, sender, and body.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"draftId\":{\"type\":\"string\",\"description\":\"Gmail draft ID to retrieve\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"draftId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"draftId\":{\"type\":\"string\",\"description\":\"Gmail draft ID\"},\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject\"},\"to\":{\"type\":\"string\",\"description\":\"Recipient email\"},\"from\":{\"type\":\"string\",\"description\":\"Sender email\"},\"body\":{\"type\":\"string\",\"description\":\"Draft body content\"}},\"required\":[\"draftId\",\"messageId\",\"subject\",\"to\",\"from\",\"body\"]},\n },\n \"getGmailEmail\": {\n stepType: \"getGmailEmail\",\n description: \"Retrieve a specific email from Gmail by message ID.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns the email subject, sender, recipient, date, body (plain text preferred, falls back to HTML), and labels.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID to retrieve\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"messageId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject\"},\"from\":{\"type\":\"string\",\"description\":\"Sender email\"},\"to\":{\"type\":\"string\",\"description\":\"Recipient email\"},\"date\":{\"type\":\"string\",\"description\":\"Email date\"},\"body\":{\"type\":\"string\",\"description\":\"Email body content\"},\"labels\":{\"type\":\"string\",\"description\":\"Comma-separated label IDs\"}},\"required\":[\"messageId\",\"subject\",\"from\",\"to\",\"date\",\"body\",\"labels\"]},\n },\n \"getGmailUnreadCount\": {\n stepType: \"getGmailUnreadCount\",\n description: \"Get the number of unread emails in the connected Gmail inbox.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns the unread message count for the inbox label.\\n- This is a lightweight call that does not fetch any email content.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}}},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"getGoogleCalendarEvent\": {\n stepType: \"getGoogleCalendarEvent\",\n description: \"Retrieve a specific event from a Google Calendar by event ID.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns the structured event.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"eventId\":{\"type\":\"string\",\"description\":\"Google Calendar event ID to retrieve\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\" if omitted)\"}},\"required\":[\"eventId\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"event\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Google Calendar event ID\"},\"status\":{\"type\":\"string\",\"description\":\"Event status (e.g. \\\"confirmed\\\", \\\"tentative\\\", \\\"cancelled\\\")\"},\"htmlLink\":{\"type\":\"string\",\"description\":\"URL to view the event in Google Calendar\"},\"created\":{\"type\":\"string\",\"description\":\"Timestamp when the event was created\"},\"updated\":{\"type\":\"string\",\"description\":\"Timestamp when the event was last updated\"},\"summary\":{\"type\":\"string\",\"description\":\"Event title\"},\"description\":{\"type\":\"string\",\"description\":\"Event description\"},\"location\":{\"type\":\"string\",\"description\":\"Event location\"},\"organizer\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"start\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"end\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"attendees\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"},\"responseStatus\":{\"type\":\"string\"}}}},{\"type\":\"null\"}]}},\"description\":\"The retrieved calendar event\"}},\"required\":[\"event\"]},\n },\n \"getGoogleDriveFile\": {\n stepType: \"getGoogleDriveFile\",\n description: \"Download a file from Google Drive and rehost it on the CDN. Returns a public CDN URL.\",\n usageNotes: \"- Requires a Google OAuth connection with Drive scope.\\n- Google-native files (Docs, Sheets, Slides) cannot be downloaded — use dedicated steps instead.\\n- Maximum file size: 200MB.\\n- The file is downloaded and re-uploaded to the CDN; the returned URL is publicly accessible.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"fileId\":{\"type\":\"string\",\"description\":\"Google Drive file ID\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"fileId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"CDN URL of the downloaded file\"},\"name\":{\"type\":\"string\",\"description\":\"Original file name\"},\"mimeType\":{\"type\":\"string\",\"description\":\"File MIME type\"},\"size\":{\"type\":\"number\",\"description\":\"File size in bytes\"}},\"required\":[\"url\",\"name\",\"mimeType\",\"size\"]},\n },\n \"getGoogleSheetInfo\": {\n stepType: \"getGoogleSheetInfo\",\n description: \"Get metadata about a Google Spreadsheet including sheet names, row counts, and column counts.\",\n usageNotes: \"- Requires a Google OAuth connection with Drive scope.\\n- Returns the spreadsheet title and a list of all sheets with their dimensions.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"description\":\"Google Spreadsheet ID or URL\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"documentId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Spreadsheet title\"},\"sheets\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"sheetId\":{\"type\":\"number\"},\"title\":{\"type\":\"string\"},\"rowCount\":{\"type\":\"number\"},\"columnCount\":{\"type\":\"number\"}},\"required\":[\"sheetId\",\"title\",\"rowCount\",\"columnCount\"]},\"description\":\"List of sheets with their properties\"}},\"required\":[\"title\",\"sheets\"]},\n },\n \"getMediaMetadata\": {\n stepType: \"getMediaMetadata\",\n description: \"Get info about a media file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"mediaUrl\":{\"type\":\"string\",\"description\":\"URL of the audio or video file to analyze\"}},\"required\":[\"mediaUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"metadata\":{\"type\":\"string\",\"description\":\"JSON string containing the media file metadata\"}},\"required\":[\"metadata\"]},\n },\n \"httpRequest\": {\n stepType: \"httpRequest\",\n description: \"Make an HTTP request to an external endpoint and return the response.\",\n usageNotes: \"- Supports GET, POST, PATCH, DELETE, and PUT methods.\\n- Body can be raw JSON/text, URL-encoded form data, or multipart form data.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"The request URL\"},\"method\":{\"type\":\"string\",\"description\":\"HTTP method (GET, POST, PATCH, DELETE, or PUT)\"},\"headers\":{\"type\":\"object\",\"description\":\"Custom request headers as key-value pairs\"},\"queryParams\":{\"type\":\"object\",\"description\":\"Query string parameters as key-value pairs\"},\"body\":{\"type\":\"string\",\"description\":\"Raw request body (used for JSON or custom content types)\"},\"bodyItems\":{\"type\":\"object\",\"description\":\"Key-value body items (used for form data or URL-encoded content types)\"},\"contentType\":{\"enum\":[\"none\",\"application/json\",\"application/x-www-form-urlencoded\",\"multipart/form-data\",\"custom\"],\"type\":\"string\",\"description\":\"The content type for the request body\"},\"customContentType\":{\"type\":\"string\",\"description\":\"Custom Content-Type header value (used when contentType is \\\"custom\\\")\"},\"testData\":{\"type\":\"object\",\"description\":\"Test data for debug/preview mode\"}},\"required\":[\"url\",\"method\",\"headers\",\"queryParams\",\"body\",\"bodyItems\",\"contentType\",\"customContentType\"],\"description\":\"HTTP request configuration\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"ok\":{\"type\":\"boolean\",\"description\":\"Whether the HTTP response status code is in the 2xx range\"},\"status\":{\"type\":\"number\",\"description\":\"HTTP response status code\"},\"statusText\":{\"type\":\"string\",\"description\":\"HTTP response status text\"},\"response\":{\"type\":\"string\",\"description\":\"Response body as a string\"}},\"required\":[\"ok\",\"status\",\"statusText\",\"response\"]},\n },\n \"hubspotCreateCompany\": {\n stepType: \"hubspotCreateCompany\",\n description: \"Create a new company or update an existing one in HubSpot. Matches by domain.\",\n usageNotes: \"- Requires a HubSpot OAuth connection (connectionId).\\n- If a company with the given domain already exists, it is updated. Otherwise, a new one is created.\\n- Property values are type-checked against enabledProperties before being sent to HubSpot.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"HubSpot OAuth connection ID\"},\"company\":{\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Company domain, used for matching existing companies\"},\"name\":{\"type\":\"string\",\"description\":\"Company name\"}},\"required\":[\"domain\",\"name\"],\"description\":\"Company data including domain, name, and additional properties\"},\"enabledProperties\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"label\":{\"type\":\"string\",\"description\":\"Display label for the HubSpot property\"},\"value\":{\"type\":\"string\",\"description\":\"HubSpot property internal name\"},\"type\":{\"enum\":[\"string\",\"number\",\"bool\"],\"type\":\"string\",\"description\":\"Data type of the property value\"}},\"required\":[\"label\",\"value\",\"type\"]},\"description\":\"HubSpot properties enabled for this step, used for type validation\"}},\"required\":[\"company\",\"enabledProperties\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"companyId\":{\"type\":\"string\",\"description\":\"HubSpot company ID of the created or updated company\"}},\"required\":[\"companyId\"]},\n },\n \"hubspotCreateContact\": {\n stepType: \"hubspotCreateContact\",\n description: \"Create a new contact or update an existing one in HubSpot. Matches by email address.\",\n usageNotes: \"- Requires a HubSpot OAuth connection (connectionId).\\n- If a contact with the given email already exists, it is updated. Otherwise, a new one is created.\\n- If companyDomain is provided, the contact is associated with that company (creating the company if needed).\\n- Property values are type-checked against enabledProperties before being sent to HubSpot.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"HubSpot OAuth connection ID\"},\"contact\":{\"type\":\"object\",\"properties\":{\"email\":{\"type\":\"string\",\"description\":\"Contact email address, used for matching existing contacts\"},\"firstname\":{\"type\":\"string\",\"description\":\"Contact first name\"},\"lastname\":{\"type\":\"string\",\"description\":\"Contact last name\"}},\"required\":[\"email\",\"firstname\",\"lastname\"],\"description\":\"Contact data including email, first name, last name, and additional properties\"},\"enabledProperties\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"label\":{\"type\":\"string\",\"description\":\"Display label for the HubSpot property\"},\"value\":{\"type\":\"string\",\"description\":\"HubSpot property internal name\"},\"type\":{\"enum\":[\"string\",\"number\",\"bool\"],\"type\":\"string\",\"description\":\"Data type of the property value\"}},\"required\":[\"label\",\"value\",\"type\"]},\"description\":\"HubSpot properties enabled for this step, used for type validation\"},\"companyDomain\":{\"type\":\"string\",\"description\":\"Company domain to associate the contact with. Creates the company if it does not exist\"}},\"required\":[\"contact\",\"enabledProperties\",\"companyDomain\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"contactId\":{\"type\":\"string\",\"description\":\"HubSpot contact ID of the created or updated contact\"}},\"required\":[\"contactId\"]},\n },\n \"hubspotGetCompany\": {\n stepType: \"hubspotGetCompany\",\n description: \"Look up a HubSpot company by domain name or company ID.\",\n usageNotes: \"- Requires a HubSpot OAuth connection (connectionId).\\n- Returns null if the company is not found.\\n- When searching by domain, performs a search query then fetches the full company record.\\n- Use additionalProperties to request specific HubSpot properties beyond the defaults.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"HubSpot OAuth connection ID\"},\"searchBy\":{\"enum\":[\"domain\",\"id\"],\"type\":\"string\",\"description\":\"How to look up the company: by domain name or HubSpot company ID\"},\"companyDomain\":{\"type\":\"string\",\"description\":\"Domain to search by (used when searchBy is 'domain')\"},\"companyId\":{\"type\":\"string\",\"description\":\"HubSpot company ID (used when searchBy is 'id')\"},\"additionalProperties\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Extra HubSpot property names to include in the response beyond the defaults\"}},\"required\":[\"searchBy\",\"companyDomain\",\"companyId\",\"additionalProperties\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"company\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"properties\":{\"type\":\"object\"},\"createdAt\":{\"type\":\"string\"},\"updatedAt\":{\"type\":\"string\"},\"archived\":{\"type\":\"boolean\"}},\"required\":[\"id\",\"properties\",\"createdAt\",\"updatedAt\",\"archived\"]},{\"type\":\"null\"}]}},\"required\":[\"company\"]},\n },\n \"hubspotGetContact\": {\n stepType: \"hubspotGetContact\",\n description: \"Look up a HubSpot contact by email address or contact ID.\",\n usageNotes: \"- Requires a HubSpot OAuth connection (connectionId).\\n- Returns null if the contact is not found.\\n- Use additionalProperties to request specific HubSpot properties beyond the defaults.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"HubSpot OAuth connection ID\"},\"searchBy\":{\"enum\":[\"email\",\"id\"],\"type\":\"string\",\"description\":\"How to look up the contact: by email address or HubSpot contact ID\"},\"contactEmail\":{\"type\":\"string\",\"description\":\"Email address to search by (used when searchBy is 'email')\"},\"contactId\":{\"type\":\"string\",\"description\":\"HubSpot contact ID (used when searchBy is 'id')\"},\"additionalProperties\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Extra HubSpot property names to include in the response beyond the defaults\"}},\"required\":[\"searchBy\",\"contactEmail\",\"contactId\",\"additionalProperties\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"contact\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"properties\":{\"type\":\"object\"},\"createdAt\":{\"type\":\"string\"},\"updatedAt\":{\"type\":\"string\"},\"archived\":{\"type\":\"boolean\"}},\"required\":[\"id\",\"properties\",\"createdAt\",\"updatedAt\",\"archived\"]},{\"type\":\"null\"}]}},\"required\":[\"contact\"]},\n },\n \"hunterApiCompanyEnrichment\": {\n stepType: \"hunterApiCompanyEnrichment\",\n description: \"Look up company information by domain using Hunter.io.\",\n usageNotes: \"- Returns company name, description, location, industry, size, technologies, and more.\\n- If the domain input is a full URL, the hostname is automatically extracted.\\n- Returns null if the company is not found.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Domain or URL to look up (e.g. \\\"example.com\\\")\"}},\"required\":[\"domain\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"domain\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"country\":{\"type\":\"string\"},\"state\":{\"type\":\"string\"},\"city\":{\"type\":\"string\"},\"industry\":{\"type\":\"string\"},\"employees_range\":{\"type\":\"string\"},\"logo_url\":{\"type\":\"string\"},\"technologies\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"name\",\"domain\",\"description\",\"country\",\"state\",\"city\",\"industry\",\"employees_range\",\"logo_url\",\"technologies\"]},{\"type\":\"null\"}]}},\"required\":[\"data\"]},\n },\n \"hunterApiDomainSearch\": {\n stepType: \"hunterApiDomainSearch\",\n description: \"Search for email addresses associated with a domain using Hunter.io.\",\n usageNotes: \"- If the domain input is a full URL, the hostname is automatically extracted.\\n- Returns a list of email addresses found for the domain along with organization info.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Domain or URL to search for email addresses (e.g. \\\"example.com\\\")\"}},\"required\":[\"domain\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"The searched domain\"},\"disposable\":{\"type\":\"boolean\",\"description\":\"Whether the domain uses disposable email addresses\"},\"webmail\":{\"type\":\"boolean\",\"description\":\"Whether the domain is a webmail provider\"},\"accept_all\":{\"type\":\"boolean\",\"description\":\"Whether the domain accepts all email addresses\"},\"pattern\":{\"type\":\"string\",\"description\":\"Common email pattern for the domain (e.g. \\\"{first}.{last}\\\")\"},\"organization\":{\"type\":\"string\",\"description\":\"Organization name associated with the domain\"},\"country\":{\"type\":\"string\",\"description\":\"Country of the organization\"},\"state\":{\"type\":\"string\",\"description\":\"State or region of the organization\"},\"emails\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"value\":{\"type\":\"string\",\"description\":\"Email address\"},\"type\":{\"type\":\"string\",\"description\":\"Email type (e.g. \\\"personal\\\", \\\"generic\\\")\"},\"confidence\":{\"type\":\"number\",\"description\":\"Confidence score (0-100)\"},\"first_name\":{\"type\":\"string\",\"description\":\"Contact first name\"},\"last_name\":{\"type\":\"string\",\"description\":\"Contact last name\"},\"position\":{\"type\":\"string\",\"description\":\"Job title or position\"},\"seniority\":{\"type\":\"string\",\"description\":\"Seniority level\"},\"department\":{\"type\":\"string\",\"description\":\"Department within the organization\"},\"linkedin\":{\"type\":\"string\",\"description\":\"LinkedIn profile URL\"},\"twitter\":{\"type\":\"string\",\"description\":\"Twitter handle\"},\"phone_number\":{\"type\":\"string\",\"description\":\"Phone number\"}},\"required\":[\"value\",\"type\",\"confidence\",\"first_name\",\"last_name\",\"position\",\"seniority\",\"department\",\"linkedin\",\"twitter\",\"phone_number\"]},\"description\":\"List of email addresses found for the domain\"},\"linked_domains\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Other domains linked to this organization\"}},\"required\":[\"domain\",\"disposable\",\"webmail\",\"accept_all\",\"pattern\",\"organization\",\"country\",\"state\",\"emails\",\"linked_domains\"],\"description\":\"Domain search results including emails and organization info\"}},\"required\":[\"data\"]},\n },\n \"hunterApiEmailFinder\": {\n stepType: \"hunterApiEmailFinder\",\n description: \"Find an email address for a specific person at a domain using Hunter.io.\",\n usageNotes: \"- Requires a first name, last name, and domain.\\n- If the domain input is a full URL, the hostname is automatically extracted.\\n- Returns the most likely email address with a confidence score.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Domain to search (e.g. \\\"example.com\\\"). Full URLs are also accepted\"},\"firstName\":{\"type\":\"string\",\"description\":\"Person's first name\"},\"lastName\":{\"type\":\"string\",\"description\":\"Person's last name\"}},\"required\":[\"domain\",\"firstName\",\"lastName\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"properties\":{\"first_name\":{\"type\":\"string\",\"description\":\"Person's first name\"},\"last_name\":{\"type\":\"string\",\"description\":\"Person's last name\"},\"email\":{\"type\":\"string\",\"description\":\"The found email address\"},\"score\":{\"type\":\"number\",\"description\":\"Confidence score (0-100)\"},\"domain\":{\"type\":\"string\",\"description\":\"Domain searched\"},\"accept_all\":{\"type\":\"boolean\",\"description\":\"Whether the domain accepts all email addresses\"},\"position\":{\"type\":\"string\",\"description\":\"Job title or position\"},\"twitter\":{\"type\":\"string\",\"description\":\"Twitter handle\"},\"linkedin_url\":{\"type\":\"string\",\"description\":\"LinkedIn profile URL\"},\"phone_number\":{\"type\":\"string\",\"description\":\"Phone number\"},\"company\":{\"type\":\"string\",\"description\":\"Company name\"},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Domain where the email was found\"},\"uri\":{\"type\":\"string\",\"description\":\"URI of the page where the email was found\"},\"extracted_on\":{\"type\":\"string\",\"description\":\"Date when the email was extracted\"}},\"required\":[\"domain\",\"uri\",\"extracted_on\"]},\"description\":\"Sources where the email was found\"}},\"required\":[\"first_name\",\"last_name\",\"email\",\"score\",\"domain\",\"accept_all\",\"position\",\"twitter\",\"linkedin_url\",\"phone_number\",\"company\",\"sources\"],\"description\":\"Email finder results including the found email and confidence score\"}},\"required\":[\"data\"]},\n },\n \"hunterApiEmailVerification\": {\n stepType: \"hunterApiEmailVerification\",\n description: \"Verify whether an email address is valid and deliverable using Hunter.io.\",\n usageNotes: \"- Checks email format, MX records, SMTP server, and mailbox deliverability.\\n- Returns a status (\\\"valid\\\", \\\"invalid\\\", \\\"accept_all\\\", \\\"webmail\\\", \\\"disposable\\\", \\\"unknown\\\") and a score.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"email\":{\"type\":\"string\",\"description\":\"Email address to verify\"}},\"required\":[\"email\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"description\":\"Verification status (e.g. \\\"valid\\\", \\\"invalid\\\", \\\"accept_all\\\", \\\"webmail\\\", \\\"disposable\\\", \\\"unknown\\\")\"},\"result\":{\"type\":\"string\",\"description\":\"Deliverability result\"},\"score\":{\"type\":\"number\",\"description\":\"Confidence score (0-100)\"},\"email\":{\"type\":\"string\",\"description\":\"The verified email address\"},\"regexp\":{\"type\":\"boolean\",\"description\":\"Whether the email matches a valid format\"},\"gibberish\":{\"type\":\"boolean\",\"description\":\"Whether the email appears to be gibberish\"},\"disposable\":{\"type\":\"boolean\",\"description\":\"Whether the email uses a disposable email service\"},\"webmail\":{\"type\":\"boolean\",\"description\":\"Whether the email is from a webmail provider\"},\"mx_records\":{\"type\":\"boolean\",\"description\":\"Whether MX records exist for the domain\"},\"smtp_server\":{\"type\":\"boolean\",\"description\":\"Whether the SMTP server is reachable\"},\"smtp_check\":{\"type\":\"boolean\",\"description\":\"Whether the SMTP mailbox check passed\"},\"accept_all\":{\"type\":\"boolean\",\"description\":\"Whether the domain accepts all email addresses\"},\"block\":{\"type\":\"boolean\",\"description\":\"Whether the email is blocked\"},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"domain\":{\"type\":\"string\",\"description\":\"Domain where the email was found\"},\"uri\":{\"type\":\"string\",\"description\":\"URI of the page where the email was found\"},\"extracted_on\":{\"type\":\"string\",\"description\":\"Date when the email was extracted\"}},\"required\":[\"domain\",\"uri\",\"extracted_on\"]},\"description\":\"Sources where the email was found\"}},\"required\":[\"status\",\"result\",\"score\",\"email\",\"regexp\",\"gibberish\",\"disposable\",\"webmail\",\"mx_records\",\"smtp_server\",\"smtp_check\",\"accept_all\",\"block\",\"sources\"],\"description\":\"Email verification results including status, deliverability, and confidence score\"}},\"required\":[\"data\"]},\n },\n \"hunterApiPersonEnrichment\": {\n stepType: \"hunterApiPersonEnrichment\",\n description: \"Look up professional information about a person by their email address using Hunter.io.\",\n usageNotes: \"- Returns name, job title, social profiles, and company information.\\n- If the person is not found, returns an object with an error message instead of throwing.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"email\":{\"type\":\"string\",\"description\":\"Email address to look up\"}},\"required\":[\"email\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"first_name\":{\"type\":\"string\"},\"last_name\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"},\"position\":{\"type\":\"string\"},\"seniority\":{\"type\":\"string\"},\"department\":{\"type\":\"string\"},\"linkedin_url\":{\"type\":\"string\"},\"twitter\":{\"type\":\"string\"},\"phone_number\":{\"type\":\"string\"},\"company\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"domain\":{\"type\":\"string\"},\"industry\":{\"type\":\"string\"}},\"required\":[\"name\",\"domain\",\"industry\"]},{\"type\":\"null\"}]}},\"required\":[\"first_name\",\"last_name\",\"email\",\"position\",\"seniority\",\"department\",\"linkedin_url\",\"twitter\",\"phone_number\",\"company\"]},{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\"}},\"required\":[\"error\"]}]}},\"required\":[\"data\"]},\n },\n \"imageFaceSwap\": {\n stepType: \"imageFaceSwap\",\n description: \"Replace a face in an image with a face from another image using AI.\",\n usageNotes: \"- Requires both a target image and a face source image.\\n- Output is re-hosted on the CDN as a PNG.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the target image containing the face to replace\"},\"faceImageUrl\":{\"type\":\"string\",\"description\":\"URL of the image containing the replacement face\"},\"engine\":{\"type\":\"string\",\"description\":\"Face swap engine to use\"}},\"required\":[\"imageUrl\",\"faceImageUrl\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"CDN URL of the face-swapped image (PNG)\"}},\"required\":[\"imageUrl\"]},\n },\n \"imageRemoveWatermark\": {\n stepType: \"imageRemoveWatermark\",\n description: \"Remove watermarks from an image using AI.\",\n usageNotes: \"- Output is re-hosted on the CDN as a PNG.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the image to remove the watermark from\"},\"engine\":{\"type\":\"string\",\"description\":\"Watermark removal engine to use\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"imageUrl\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"CDN URL of the processed image with watermark removed (PNG)\"}},\"required\":[\"imageUrl\"]},\n },\n \"insertVideoClips\": {\n stepType: \"insertVideoClips\",\n description: \"Insert b-roll clips into a base video at a timecode, optionally with an xfade transition.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"baseVideoUrl\":{\"type\":\"string\",\"description\":\"URL of the base video to insert clips into\"},\"overlayVideos\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the overlay video clip\"},\"startTimeSec\":{\"type\":\"number\",\"description\":\"Timecode in seconds at which to insert this clip\"}},\"required\":[\"videoUrl\",\"startTimeSec\"]},\"description\":\"Array of overlay clips to insert at specified timecodes\"},\"transition\":{\"type\":\"string\",\"description\":\"Optional xfade transition effect name between clips\"},\"transitionDuration\":{\"type\":\"number\",\"description\":\"Duration of the transition in seconds\"},\"useOverlayAudio\":{\"type\":\"boolean\",\"description\":\"When true, uses audio from the overlay clips instead of the base video audio during inserts\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"baseVideoUrl\",\"overlayVideos\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video with clips inserted\"}},\"required\":[\"videoUrl\"]},\n },\n \"listDataSources\": {\n stepType: \"listDataSources\",\n description: \"List all data sources for the current app.\",\n usageNotes: \"- Returns metadata for every data source associated with the current app version.\\n- Each entry includes the data source ID, name, description, status, and document list.\",\n inputSchema: {\"type\":\"object\"},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"listGmailDrafts\": {\n stepType: \"listGmailDrafts\",\n description: \"List drafts in the connected Gmail account.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns up to 50 drafts (default 10).\\n- The variable receives text or JSON depending on exportType.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"limit\":{\"type\":\"string\",\"description\":\"Max drafts to return (default: 10, max: 50)\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"}},\"required\":[\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"drafts\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"draftId\":{\"type\":\"string\",\"description\":\"Gmail draft ID\"},\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject\"},\"to\":{\"type\":\"string\",\"description\":\"Recipient email\"},\"snippet\":{\"type\":\"string\",\"description\":\"Short preview text\"}},\"required\":[\"draftId\",\"messageId\",\"subject\",\"to\",\"snippet\"]},\"description\":\"List of draft summaries\"}},\"required\":[\"drafts\"]},\n },\n \"listGmailLabels\": {\n stepType: \"listGmailLabels\",\n description: \"List all labels in the connected Gmail account. Use these label IDs or names with the Update Gmail Labels step.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns both system labels (INBOX, SENT, TRASH, etc.) and user-created labels.\\n- Label type is \\\"system\\\" for built-in labels or \\\"user\\\" for custom labels.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}}},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"listGoogleCalendarEvents\": {\n stepType: \"listGoogleCalendarEvents\",\n description: \"List upcoming events from a Google Calendar, ordered by start time.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- Only returns future events (timeMin = now).\\n- The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns structured events.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"limit\":{\"type\":\"number\",\"description\":\"Maximum number of events to return (default: 10)\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\" if omitted)\"}},\"required\":[\"limit\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"events\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Google Calendar event ID\"},\"status\":{\"type\":\"string\",\"description\":\"Event status (e.g. \\\"confirmed\\\", \\\"tentative\\\", \\\"cancelled\\\")\"},\"htmlLink\":{\"type\":\"string\",\"description\":\"URL to view the event in Google Calendar\"},\"created\":{\"type\":\"string\",\"description\":\"Timestamp when the event was created\"},\"updated\":{\"type\":\"string\",\"description\":\"Timestamp when the event was last updated\"},\"summary\":{\"type\":\"string\",\"description\":\"Event title\"},\"description\":{\"type\":\"string\",\"description\":\"Event description\"},\"location\":{\"type\":\"string\",\"description\":\"Event location\"},\"organizer\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"start\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"end\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"attendees\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"},\"responseStatus\":{\"type\":\"string\"}}}},{\"type\":\"null\"}]}}},\"description\":\"List of upcoming calendar events ordered by start time\"}},\"required\":[\"events\"]},\n },\n \"listGoogleDriveFiles\": {\n stepType: \"listGoogleDriveFiles\",\n description: \"List files in a Google Drive folder.\",\n usageNotes: \"- Requires a Google OAuth connection with Drive scope.\\n- If folderId is omitted, lists files in the root folder.\\n- Returns file metadata including name, type, size, and links.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"folderId\":{\"type\":\"string\",\"description\":\"Google Drive folder ID (defaults to root)\"},\"limit\":{\"type\":\"number\",\"description\":\"Max files to return (default: 20)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"}},\"required\":[\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"files\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"mimeType\":{\"type\":\"string\"},\"size\":{\"type\":\"string\"},\"webViewLink\":{\"type\":\"string\"},\"createdTime\":{\"type\":\"string\"},\"modifiedTime\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"mimeType\",\"size\",\"webViewLink\",\"createdTime\",\"modifiedTime\"]},\"description\":\"List of files in the folder\"}},\"required\":[\"files\"]},\n },\n \"listRecentGmailEmails\": {\n stepType: \"listRecentGmailEmails\",\n description: \"List recent emails from the connected Gmail inbox.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Returns up to 100 emails (default 5), ordered by most recent first.\\n- Functionally equivalent to Search Gmail Emails with an \\\"in:inbox\\\" query.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"},\"limit\":{\"type\":\"string\",\"description\":\"Maximum number of emails to return (1-100, default: 5)\"}},\"required\":[\"exportType\",\"limit\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"logic\": {\n stepType: \"logic\",\n description: \"Route execution to different branches based on AI evaluation, comparison operators, or workflow jumps.\",\n usageNotes: \"- Supports two modes: \\\"ai\\\" (default) uses an AI model to pick the most accurate statement; \\\"comparison\\\" uses operator-based checks.\\n- In AI mode, the model picks the most accurate statement from the list. All possible cases must be specified.\\n- In comparison mode, the context is the left operand and each case's condition is the right operand. First matching case wins. Use operator \\\"default\\\" as a fallback.\\n- Requires at least two cases.\\n- Each case can transition to a step in the current workflow (destinationStepId) or jump to another workflow (destinationWorkflowId).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"mode\":{\"enum\":[\"ai\",\"comparison\"],\"type\":\"string\",\"description\":\"Evaluation mode: 'ai' for LLM-based, 'comparison' for operator-based. Default: 'ai'\"},\"context\":{\"type\":\"string\",\"description\":\"AI mode: prompt context. Comparison mode: left operand (resolved via variables).\"},\"cases\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Unique case identifier\"},\"condition\":{\"type\":\"string\",\"description\":\"AI mode: statement to evaluate. Comparison mode: right operand value.\"},\"operator\":{\"enum\":[\"eq\",\"neq\",\"gt\",\"lt\",\"gte\",\"lte\",\"exists\",\"not_exists\",\"contains\",\"not_contains\",\"default\"],\"type\":\"string\",\"description\":\"Comparison operator (comparison mode only)\"},\"destinationStepId\":{\"type\":\"string\",\"description\":\"Step to transition to if this case wins (workflow mode only)\"},\"destinationWorkflowId\":{\"type\":\"string\",\"description\":\"Workflow to jump to if this case wins (uses that workflow's initial step)\"}},\"required\":[\"id\",\"condition\"]},{\"type\":\"string\"}]},\"description\":\"List of conditions to evaluate (objects for managed UIs, strings for code)\"},\"modelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Optional model settings override; uses the organization default if not specified (AI mode only)\"}},\"required\":[\"context\",\"cases\"],\"description\":\"Configuration for the router step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"selectedCase\":{\"type\":\"number\",\"description\":\"The index of the winning case\"}},\"required\":[\"selectedCase\"]},\n },\n \"makeDotComRunScenario\": {\n stepType: \"makeDotComRunScenario\",\n description: \"Trigger a Make.com (formerly Integromat) scenario via webhook and return the response.\",\n usageNotes: \"- The webhook URL must be configured in your Make.com scenario.\\n- Input key-value pairs are sent as JSON in the POST body.\\n- Response format depends on the Make.com scenario configuration.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"webhookUrl\":{\"type\":\"string\",\"description\":\"Make.com webhook URL for the scenario\"},\"input\":{\"type\":\"object\",\"description\":\"Key-value pairs to send as the JSON POST body\"}},\"required\":[\"webhookUrl\",\"input\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Response from the Make.com scenario (JSON or string depending on scenario configuration)\"}},\"required\":[\"data\"]},\n },\n \"mergeAudio\": {\n stepType: \"mergeAudio\",\n description: \"Merge one or more clips into a single audio file.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"mp3Urls\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"URLs of the MP3 audio clips to merge in order\"},\"fileMetadata\":{\"type\":\"object\",\"description\":\"FFmpeg MP3 metadata key-value pairs to embed in the output file\"},\"albumArtUrl\":{\"type\":\"string\",\"description\":\"URL of an image to embed as album art in the output file\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"mp3Urls\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the merged audio file\"}},\"required\":[\"audioUrl\"]},\n },\n \"mergeVideos\": {\n stepType: \"mergeVideos\",\n description: \"Merge one or more clips into a single video.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrls\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"URLs of the video clips to merge in order\"},\"transition\":{\"type\":\"string\",\"description\":\"Optional xfade transition effect name\"},\"transitionDuration\":{\"type\":\"number\",\"description\":\"Duration of the transition in seconds\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrls\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the merged video\"}},\"required\":[\"videoUrl\"]},\n },\n \"mixAudioIntoVideo\": {\n stepType: \"mixAudioIntoVideo\",\n description: \"Mix an audio track into a video\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video\"},\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the audio track to mix into the video\"},\"options\":{\"type\":\"object\",\"properties\":{\"keepVideoAudio\":{\"type\":\"boolean\",\"description\":\"When true, preserves the original video audio alongside the new track. Defaults to false.\"},\"audioGainDb\":{\"type\":\"number\",\"description\":\"Volume adjustment for the new audio track in decibels. Defaults to 0.\"},\"videoGainDb\":{\"type\":\"number\",\"description\":\"Volume adjustment for the existing video audio in decibels. Defaults to 0.\"},\"loopAudio\":{\"type\":\"boolean\",\"description\":\"When true, loops the audio track to match the video duration. Defaults to false.\"}},\"description\":\"Audio mixing options\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"audioUrl\",\"options\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video with the mixed audio track\"}},\"required\":[\"videoUrl\"]},\n },\n \"muteVideo\": {\n stepType: \"muteVideo\",\n description: \"Mute a video file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video to mute\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the muted video\"}},\"required\":[\"videoUrl\"]},\n },\n \"n8nRunNode\": {\n stepType: \"n8nRunNode\",\n description: \"Trigger an n8n workflow node via webhook and return the response.\",\n usageNotes: \"- The webhook URL must be configured in your n8n workflow.\\n- Supports GET and POST methods with optional Basic authentication.\\n- For GET requests, input values are sent as query parameters. For POST, they are sent as JSON body.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"method\":{\"type\":\"string\",\"description\":\"HTTP method to use (GET or POST)\"},\"authentication\":{\"enum\":[\"none\",\"basic\",\"string\"],\"type\":\"string\",\"description\":\"Authentication type for the webhook request\"},\"user\":{\"type\":\"string\",\"description\":\"Username for Basic authentication\"},\"password\":{\"type\":\"string\",\"description\":\"Password for Basic authentication\"},\"webhookUrl\":{\"type\":\"string\",\"description\":\"n8n webhook URL for the workflow node\"},\"input\":{\"type\":\"object\",\"description\":\"Key-value pairs sent as query params (GET) or JSON body (POST)\"}},\"required\":[\"method\",\"authentication\",\"user\",\"password\",\"webhookUrl\",\"input\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Response from the n8n node (JSON or string depending on node configuration)\"}},\"required\":[\"data\"]},\n },\n \"notionCreatePage\": {\n stepType: \"notionCreatePage\",\n description: \"Create a new page in Notion as a child of an existing page.\",\n usageNotes: \"- Requires a Notion OAuth connection (connectionId).\\n- Content is provided as markdown and converted to Notion blocks (headings, paragraphs, lists, code, quotes).\\n- The page is created as a child of the specified parent page (pageId).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"pageId\":{\"type\":\"string\",\"description\":\"Parent page ID to create the new page under\"},\"content\":{\"type\":\"string\",\"description\":\"Page content in markdown format\"},\"title\":{\"type\":\"string\",\"description\":\"Page title\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Notion OAuth connection ID\"}},\"required\":[\"pageId\",\"content\",\"title\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"pageId\":{\"type\":\"string\",\"description\":\"Notion page ID of the created page\"},\"pageUrl\":{\"type\":\"string\",\"description\":\"URL to view the page in Notion\"}},\"required\":[\"pageId\",\"pageUrl\"]},\n },\n \"notionUpdatePage\": {\n stepType: \"notionUpdatePage\",\n description: \"Update the content of an existing Notion page.\",\n usageNotes: \"- Requires a Notion OAuth connection (connectionId).\\n- Content is provided as markdown and converted to Notion blocks.\\n- \\\"append\\\" mode adds content to the end of the page. \\\"overwrite\\\" mode deletes all existing blocks first.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"pageId\":{\"type\":\"string\",\"description\":\"Notion page ID to update\"},\"content\":{\"type\":\"string\",\"description\":\"New content in markdown format\"},\"mode\":{\"enum\":[\"append\",\"overwrite\"],\"type\":\"string\",\"description\":\"How to apply the content: 'append' adds to end, 'overwrite' replaces all existing content\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Notion OAuth connection ID\"}},\"required\":[\"pageId\",\"content\",\"mode\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"pageId\":{\"type\":\"string\",\"description\":\"Notion page ID of the updated page\"},\"pageUrl\":{\"type\":\"string\",\"description\":\"URL to view the page in Notion\"}},\"required\":[\"pageId\",\"pageUrl\"]},\n },\n \"peopleSearch\": {\n stepType: \"peopleSearch\",\n description: \"Search for people matching specific criteria using Apollo.io. Supports natural language queries and advanced filters.\",\n usageNotes: \"- Can use a natural language \\\"smartQuery\\\" which is converted to Apollo search parameters by an AI model.\\n- Advanced params can override or supplement the smart query results.\\n- Optionally enriches returned people and/or their organizations for additional detail.\\n- Results are paginated. Use limit and page to control the result window.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"smartQuery\":{\"type\":\"string\",\"description\":\"Natural language search query (e.g. \\\"marketing directors at SaaS companies in NYC\\\")\"},\"enrichPeople\":{\"type\":\"boolean\",\"description\":\"Whether to enrich each result with full contact details\"},\"enrichOrganizations\":{\"type\":\"boolean\",\"description\":\"Whether to enrich each result with full company details\"},\"limit\":{\"type\":\"string\",\"description\":\"Maximum number of results to return\"},\"page\":{\"type\":\"string\",\"description\":\"Page number for pagination\"},\"params\":{\"type\":\"object\",\"properties\":{\"personTitles\":{\"type\":\"string\",\"description\":\"Job titles to search for (comma-separated)\"},\"includeSimilarTitles\":{\"type\":\"string\",\"description\":\"Whether to include similar/related job titles\"},\"qKeywords\":{\"type\":\"string\",\"description\":\"Keywords to search for in person profiles\"},\"personLocations\":{\"type\":\"string\",\"description\":\"Geographic locations of people (comma-separated)\"},\"personSeniorities\":{\"type\":\"string\",\"description\":\"Seniority levels to filter by (comma-separated)\"},\"organizationLocations\":{\"type\":\"string\",\"description\":\"Geographic locations of organizations (comma-separated)\"},\"qOrganizationDomainsList\":{\"type\":\"string\",\"description\":\"Organization domains to filter by (comma-separated)\"},\"contactEmailStatus\":{\"type\":\"string\",\"description\":\"Email verification status filter\"},\"organizationNumEmployeesRanges\":{\"type\":\"string\",\"description\":\"Employee count ranges as semicolon-separated pairs (e.g. \\\"1,10; 250,500\\\")\"},\"revenueRangeMin\":{\"type\":\"string\",\"description\":\"Minimum annual revenue filter\"},\"revenueRangeMax\":{\"type\":\"string\",\"description\":\"Maximum annual revenue filter\"},\"currentlyUsingAllOfTechnologyUids\":{\"type\":\"string\",\"description\":\"Technology UIDs the organization must use (all required)\"},\"currentlyUsingAnyOfTechnologyUids\":{\"type\":\"string\",\"description\":\"Technology UIDs the organization uses (any match)\"},\"currentlyNotUsingAnyOfTechnologyUids\":{\"type\":\"string\",\"description\":\"Technology UIDs the organization must not use\"}},\"required\":[\"personTitles\",\"includeSimilarTitles\",\"qKeywords\",\"personLocations\",\"personSeniorities\",\"organizationLocations\",\"qOrganizationDomainsList\",\"contactEmailStatus\",\"organizationNumEmployeesRanges\",\"revenueRangeMin\",\"revenueRangeMax\",\"currentlyUsingAllOfTechnologyUids\",\"currentlyUsingAnyOfTechnologyUids\",\"currentlyNotUsingAnyOfTechnologyUids\"],\"description\":\"Advanced search filter parameters\"}},\"required\":[\"smartQuery\",\"enrichPeople\",\"enrichOrganizations\",\"limit\",\"page\",\"params\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"results\":{\"description\":\"Apollo search results with matched people and optionally enriched data\"}},\"required\":[\"results\"]},\n },\n \"postToLinkedIn\": {\n stepType: \"postToLinkedIn\",\n description: \"Create a post on LinkedIn from the connected account.\",\n usageNotes: \"- Requires a LinkedIn OAuth connection (connectionId).\\n- Supports text posts, image posts, video posts, document posts, and article posts.\\n- Attach one media type per post: image, video, document, or article.\\n- Documents support PDF, PPT, PPTX, DOC, DOCX (max 100MB, 300 pages). Displays as a slideshow carousel.\\n- Articles create a link preview with optional custom title, description, and thumbnail.\\n- Visibility controls who can see the post.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"description\":\"The text content of the LinkedIn post\"},\"visibility\":{\"enum\":[\"PUBLIC\",\"CONNECTIONS\"],\"type\":\"string\",\"description\":\"Who can see the post: \\\"PUBLIC\\\" or \\\"CONNECTIONS\\\"\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of an image to attach to the post\"},\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of a video to attach to the post\"},\"documentUrl\":{\"type\":\"string\",\"description\":\"URL of a document (PDF, PPT, DOC) to attach to the post\"},\"articleUrl\":{\"type\":\"string\",\"description\":\"URL to share as an article link preview\"},\"titleText\":{\"type\":\"string\",\"description\":\"Title text for media or article attachments\"},\"descriptionText\":{\"type\":\"string\",\"description\":\"Description text for article attachments\"},\"connectionId\":{\"type\":\"string\",\"description\":\"LinkedIn OAuth connection ID\"}},\"required\":[\"message\",\"visibility\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"postToSlackChannel\": {\n stepType: \"postToSlackChannel\",\n description: \"Send a message to a Slack channel via a connected bot.\",\n usageNotes: \"- The user is responsible for connecting their Slack workspace and selecting the channel\\n- Supports both simple text messages and slack blocks messages\\n- Text messages can use limited markdown (slack-only fomatting—e.g., headers are just rendered as bold)\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"channelId\":{\"type\":\"string\",\"description\":\"Slack channel ID (leave empty to allow user to select a channel)\"},\"messageType\":{\"enum\":[\"string\",\"blocks\"],\"type\":\"string\",\"description\":\"Message format: \\\"string\\\" for plain text/markdown, \\\"blocks\\\" for Slack Block Kit JSON\"},\"message\":{\"type\":\"string\",\"description\":\"Message content (plain text/markdown for \\\"string\\\" type, or JSON for \\\"blocks\\\" type)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Slack OAuth connection ID (leave empty to allow user to select)\"}},\"required\":[\"channelId\",\"messageType\",\"message\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"postToX\": {\n stepType: \"postToX\",\n description: \"Create a post on X (Twitter) from the connected account.\",\n usageNotes: \"- Requires an X OAuth connection (connectionId).\\n- Maximum 280 characters of text.\\n- Optionally attach up to 4 media items (images, GIFs, or videos) via mediaUrls.\\n- Media URLs must be publicly accessible. The service fetches and uploads them to X.\\n- Supported formats: JPEG, PNG, GIF, WEBP, MP4. Images up to 5MB, videos up to 512MB.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The text content of the post (max 280 characters)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"X (Twitter) OAuth connection ID\"},\"mediaUrls\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Up to 4 URLs of images, GIFs, or videos to attach to the post\"}},\"required\":[\"text\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"postToZapier\": {\n stepType: \"postToZapier\",\n description: \"Send data to a Zapier Zap via webhook and return the response.\",\n usageNotes: \"- The webhook URL must be configured in the Zapier Zap settings\\n- Input keys and values are sent as the JSON body of the POST request\\n- The webhook response (JSON or plain text) is returned as the output\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"webhookUrl\":{\"type\":\"string\",\"description\":\"Zapier webhook URL to send data to\"},\"input\":{\"type\":\"object\",\"description\":\"Key-value pairs to send as the JSON POST body\"}},\"required\":[\"webhookUrl\",\"input\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Parsed webhook response from Zapier (JSON object, array, or string)\"}},\"required\":[\"data\"]},\n },\n \"queryAppDatabase\": {\n stepType: \"queryAppDatabase\",\n description: \"Execute a SQL query against the app managed database.\",\n usageNotes: \"- Executes raw SQL against a SQLite database managed by the app.\\n- For SELECT queries, returns rows as JSON.\\n- For INSERT/UPDATE/DELETE, returns the number of affected rows.\\n- Use {{variables}} directly in your SQL. By default they are automatically extracted\\n and passed as safe parameterized values (preventing SQL injection).\\n Example: INSERT INTO contacts (name, comment) VALUES ({{name}}, {{comment}})\\n- Full MindStudio handlebars syntax is supported, including helpers like {{json myVar}},\\n {{get myVar \\\"$.path\\\"}}, {{global.orgName}}, etc.\\n- Set parameterize to false for raw/dynamic SQL where variables are interpolated directly\\n into the query string. Use this when another step generates full or partial SQL, e.g.\\n a bulk INSERT with a precomputed VALUES list. The user is responsible for sanitization\\n when parameterize is false.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"databaseId\":{\"type\":\"string\",\"description\":\"Name or ID of the app data database to query\"},\"sql\":{\"type\":\"string\",\"description\":\"SQL query to execute. Use {{variables}} directly in the SQL — they are handled according to the `parameterize` setting.\\n\\nWhen parameterize is true (default): {{variables}} are extracted from the SQL, replaced with ? placeholders, resolved via the full MindStudio handlebars pipeline, and passed as safe parameterized values to SQLite. This prevents SQL injection. Example: INSERT INTO contacts (name, email) VALUES ({{name}}, {{email}})\\n\\nWhen parameterize is false: The entire SQL string is resolved via compileString (standard handlebars interpolation) and executed as-is. Use this for dynamic/generated SQL where another step builds the query. The user is responsible for safety. Example: {{generatedInsertQuery}}\\n\\nAsk the user for the database schema if they have not already provided it.\"},\"parameterize\":{\"type\":\"boolean\",\"description\":\"Whether to treat {{variables}} as parameterized query values (default: true).\\n\\n- true: {{vars}} are extracted, replaced with ?, and passed as bind params. Safe from SQL injection. Use for standard CRUD operations.\\n- false: {{vars}} are interpolated directly into the SQL string via handlebars. Use when another step generates full or partial SQL (e.g. bulk inserts with precomputed VALUES). The user is responsible for sanitization.\"}},\"required\":[\"databaseId\",\"sql\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{},\"description\":\"Result rows for SELECT queries (empty array for write queries)\"},\"changes\":{\"type\":\"number\",\"description\":\"Number of rows affected by INSERT, UPDATE, or DELETE queries (0 for SELECT)\"}},\"required\":[\"rows\",\"changes\"]},\n },\n \"queryDataSource\": {\n stepType: \"queryDataSource\",\n description: \"Search a vector data source (RAG) and return relevant document chunks.\",\n usageNotes: \"- Queries a vectorized data source and returns the most relevant chunks.\\n- Useful for retrieval-augmented generation (RAG) workflows.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"dataSourceId\":{\"type\":\"string\",\"description\":\"ID of the vector data source to query\"},\"query\":{\"type\":\"string\",\"description\":\"The search query to run against the data source\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of chunks to return (recommended 1-3)\"}},\"required\":[\"dataSourceId\",\"query\",\"maxResults\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"All matching chunks joined with newlines\"},\"chunks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Individual matching text chunks from the data source\"},\"query\":{\"type\":\"string\",\"description\":\"The resolved search query that was executed\"},\"citations\":{\"type\":\"array\",\"items\":{},\"description\":\"Source citations for the matched chunks\"},\"latencyMs\":{\"type\":\"number\",\"description\":\"Query execution time in milliseconds\"}},\"required\":[\"text\",\"chunks\",\"query\",\"citations\",\"latencyMs\"]},\n },\n \"queryExternalDatabase\": {\n stepType: \"queryExternalDatabase\",\n description: \"Execute a SQL query against an external database connected to the workspace.\",\n usageNotes: \"- Requires a database connection configured in the workspace.\\n- Supports PostgreSQL (including Supabase), MySQL, and MSSQL.\\n- Results can be returned as JSON or CSV.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Database connection ID configured in the workspace\"},\"query\":{\"type\":\"string\",\"description\":\"SQL query to execute (supports variable interpolation)\"},\"outputFormat\":{\"enum\":[\"json\",\"csv\"],\"type\":\"string\",\"description\":\"Output format for the result variable\"}},\"required\":[\"query\",\"outputFormat\"],\"description\":\"Configuration for the external database query step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Query result rows (array of objects for JSON, CSV string for CSV format)\"}},\"required\":[\"data\"]},\n },\n \"redactPII\": {\n stepType: \"redactPII\",\n description: \"Replace personally identifiable information in text with placeholders using Microsoft Presidio.\",\n usageNotes: \"- PII is replaced with entity type placeholders (e.g. \\\"Call me at <PHONE_NUMBER>\\\").\\n- If entities is empty, returns empty text immediately without processing.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"input\":{\"type\":\"string\",\"description\":\"Text to redact PII from\"},\"language\":{\"type\":\"string\",\"description\":\"Language code of the input text (e.g. \\\"en\\\")\"},\"entities\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"PII entity types to redact (e.g. [\\\"PHONE_NUMBER\\\", \\\"EMAIL_ADDRESS\\\"]). Empty array means nothing is redacted.\"}},\"required\":[\"input\",\"language\",\"entities\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The input text with detected PII replaced by entity type placeholders (e.g. \\\"<PHONE_NUMBER>\\\")\"}},\"required\":[\"text\"]},\n },\n \"removeBackgroundFromImage\": {\n stepType: \"removeBackgroundFromImage\",\n description: \"Remove the background from an image using AI, producing a transparent PNG.\",\n usageNotes: \"- Uses the Bria background removal model via fal.ai.\\n- Output is re-hosted on the CDN as a PNG with transparency.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the source image to remove the background from\"}},\"required\":[\"imageUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"CDN URL of the image with background removed (transparent PNG)\"}},\"required\":[\"imageUrl\"]},\n },\n \"replyToGmailEmail\": {\n stepType: \"replyToGmailEmail\",\n description: \"Reply to an existing email in Gmail. The reply is threaded under the original message.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail compose and readonly scopes.\\n- The reply is sent to the original sender and threaded under the original message.\\n- messageType controls the body format: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\".\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID to reply to\"},\"message\":{\"type\":\"string\",\"description\":\"Reply body content\"},\"messageType\":{\"enum\":[\"plain\",\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Body format: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\"\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"messageId\",\"message\",\"messageType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID of the sent reply\"}},\"required\":[\"messageId\"]},\n },\n \"resizeVideo\": {\n stepType: \"resizeVideo\",\n description: \"Resize a video file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video to resize\"},\"mode\":{\"enum\":[\"fit\",\"exact\"],\"type\":\"string\",\"description\":\"Resize mode: 'fit' scales within max dimensions, 'exact' forces exact dimensions\"},\"maxWidth\":{\"type\":\"number\",\"description\":\"Maximum width in pixels (used with 'fit' mode)\"},\"maxHeight\":{\"type\":\"number\",\"description\":\"Maximum height in pixels (used with 'fit' mode)\"},\"width\":{\"type\":\"number\",\"description\":\"Exact width in pixels (used with 'exact' mode)\"},\"height\":{\"type\":\"number\",\"description\":\"Exact height in pixels (used with 'exact' mode)\"},\"strategy\":{\"enum\":[\"pad\",\"crop\"],\"type\":\"string\",\"description\":\"Strategy for handling aspect ratio mismatch in 'exact' mode\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"mode\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the resized video\"}},\"required\":[\"videoUrl\"]},\n },\n \"runFromConnectorRegistry\": {\n stepType: \"runFromConnectorRegistry\",\n description: \"Run a raw API connector to a third-party service\",\n usageNotes: \"- Use the /developer/v2/helpers/connectors endpoint to list available services and actions.\\n- Use /developer/v2/helpers/connectors/{serviceId}/{actionId} to get the full input configuration for an action.\\n- Use /developer/v2/helpers/connections to list your available OAuth connections.\\n- The actionId format is \\\"serviceId/actionId\\\" (e.g., \\\"slack/send-message\\\").\\n- Pass a __connectionId to authenticate the request with a specific OAuth connection, otherwise the default will be used (if configured).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"actionId\":{\"type\":\"string\",\"description\":\"The connector action identifier in the format serviceId/actionId\"},\"displayName\":{\"type\":\"string\",\"description\":\"Human-readable name of the connector action\"},\"icon\":{\"type\":\"string\",\"description\":\"Icon URL for the connector\"},\"configurationValues\":{\"type\":\"object\",\"description\":\"Key-value configuration parameters for the connector action\"},\"__connectionId\":{\"type\":\"string\",\"description\":\"OAuth connection ID used to authenticate the connector request\"}},\"required\":[\"actionId\",\"displayName\",\"icon\",\"configurationValues\"],\"description\":\"Configuration for the connector registry step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"description\":\"Key-value map of output variables set by the connector\"}},\"required\":[\"data\"]},\n },\n \"runPackagedWorkflow\": {\n stepType: \"runPackagedWorkflow\",\n description: \"Run a packaged workflow (\\\"custom block\\\")\",\n usageNotes: \"- From the user's perspective, packaged workflows are just ordinary blocks. Behind the scenes, they operate like packages/libraries in a programming language, letting the user execute custom functionality.\\n- Some of these packaged workflows are available as part of MindStudio's \\\"Standard Library\\\" and available to every user.\\n- Available packaged workflows are documented here as individual blocks, but the runPackagedWorkflow block is how they need to be wrapped in order to be executed correctly.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"appId\":{\"type\":\"string\",\"description\":\"The app ID of the packaged workflow source\"},\"workflowId\":{\"type\":\"string\",\"description\":\"The source workflow ID to execute\"},\"inputVariables\":{\"type\":\"object\",\"description\":\"Variables to pass as input to the packaged workflow\"},\"outputVariables\":{\"type\":\"object\",\"description\":\"Variables to capture from the packaged workflow output\"},\"name\":{\"type\":\"string\",\"description\":\"Display name of the packaged workflow\"}},\"required\":[\"appId\",\"workflowId\",\"inputVariables\",\"outputVariables\",\"name\"],\"description\":\"Configuration for the packaged workflow step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the packaged workflow\"}},\"required\":[\"data\"]},\n },\n \"scrapeFacebookPage\": {\n stepType: \"scrapeFacebookPage\",\n description: \"Scrape a Facebook page\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"pageUrl\":{\"type\":\"string\",\"description\":\"Full URL to the Facebook page to scrape\"}},\"required\":[\"pageUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeFacebookPosts\": {\n stepType: \"scrapeFacebookPosts\",\n description: \"Get all the posts for a Facebook page\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"pageUrl\":{\"type\":\"string\",\"description\":\"Full URL to the Facebook page to scrape posts from\"}},\"required\":[\"pageUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeInstagramComments\": {\n stepType: \"scrapeInstagramComments\",\n description: \"Get all the comments for an Instagram post\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"postUrl\":{\"type\":\"string\",\"description\":\"Full URL to the Instagram post to scrape comments from\"},\"resultsLimit\":{\"type\":\"string\",\"description\":\"Maximum number of comments to return\"}},\"required\":[\"postUrl\",\"resultsLimit\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeInstagramMentions\": {\n stepType: \"scrapeInstagramMentions\",\n description: \"Scrape an Instagram profile's mentions\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"profileUrl\":{\"type\":\"string\",\"description\":\"Instagram profile URL or username to scrape mentions for\"},\"resultsLimit\":{\"type\":\"string\",\"description\":\"Maximum number of mentions to return\"}},\"required\":[\"profileUrl\",\"resultsLimit\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeInstagramPosts\": {\n stepType: \"scrapeInstagramPosts\",\n description: \"Get all the posts for an Instagram profile\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"profileUrl\":{\"type\":\"string\",\"description\":\"Instagram profile URL or username to scrape posts from\"},\"resultsLimit\":{\"type\":\"string\",\"description\":\"Maximum number of posts to return\"},\"onlyPostsNewerThan\":{\"type\":\"string\",\"description\":\"Only return posts newer than this date (ISO 8601 format)\"}},\"required\":[\"profileUrl\",\"resultsLimit\",\"onlyPostsNewerThan\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeInstagramProfile\": {\n stepType: \"scrapeInstagramProfile\",\n description: \"Scrape an Instagram profile\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"profileUrl\":{\"type\":\"string\",\"description\":\"Instagram profile URL or username to scrape\"}},\"required\":[\"profileUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeInstagramReels\": {\n stepType: \"scrapeInstagramReels\",\n description: \"Get all the reels for an Instagram profile\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"profileUrl\":{\"type\":\"string\",\"description\":\"Instagram profile URL or username to scrape reels from\"},\"resultsLimit\":{\"type\":\"string\",\"description\":\"Maximum number of reels to return\"}},\"required\":[\"profileUrl\",\"resultsLimit\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeLinkedInCompany\": {\n stepType: \"scrapeLinkedInCompany\",\n description: \"Scrape public company data from a LinkedIn company page.\",\n usageNotes: \"- Requires a LinkedIn company URL (e.g. https://www.linkedin.com/company/mindstudioai).\\n- Returns structured company data including description, employees, updates, and similar companies.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"LinkedIn company page URL (e.g. https://www.linkedin.com/company/mindstudioai)\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"company\":{\"description\":\"Scraped LinkedIn company data\"}},\"required\":[\"company\"]},\n },\n \"scrapeLinkedInProfile\": {\n stepType: \"scrapeLinkedInProfile\",\n description: \"Scrape public profile data from a LinkedIn profile page.\",\n usageNotes: \"- Requires a LinkedIn profile URL (e.g. https://www.linkedin.com/in/username).\\n- Returns structured profile data including experience, education, articles, and activities.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"LinkedIn profile URL (e.g. https://www.linkedin.com/in/username)\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"profile\":{\"description\":\"Scraped LinkedIn profile data\"}},\"required\":[\"profile\"]},\n },\n \"scrapeMetaThreadsProfile\": {\n stepType: \"scrapeMetaThreadsProfile\",\n description: \"Scrape a Meta Threads profile\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"profileUrl\":{\"type\":\"string\",\"description\":\"Meta Threads profile URL or username to scrape\"}},\"required\":[\"profileUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"The result data returned from the Apify actor run\"}},\"required\":[\"data\"]},\n },\n \"scrapeUrl\": {\n stepType: \"scrapeUrl\",\n description: \"Extract text, HTML, or structured content from one or more web pages.\",\n usageNotes: \"- Accepts a single URL or multiple URLs (as a JSON array, comma-separated, or newline-separated).\\n- Output format controls the result shape: \\\"text\\\" returns markdown, \\\"html\\\" returns raw HTML, \\\"json\\\" returns structured scraper data.\\n- Can optionally capture a screenshot of each page.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"URL(s) to scrape. Accepts a single URL, JSON array, or comma/newline-separated list\"},\"service\":{\"enum\":[\"default\",\"firecrawl\"],\"type\":\"string\",\"description\":\"Scraping service to use\"},\"autoEnhance\":{\"type\":\"boolean\",\"description\":\"Whether to enable enhanced scraping for social media URLs (e.g. Twitter, LinkedIn)\"},\"pageOptions\":{\"type\":\"object\",\"properties\":{\"onlyMainContent\":{\"type\":\"boolean\",\"description\":\"Whether to extract only the main content of the page, excluding navigation, footers, etc.\"},\"screenshot\":{\"type\":\"boolean\",\"description\":\"Whether to capture a screenshot of the page\"},\"waitFor\":{\"type\":\"number\",\"description\":\"Milliseconds to wait before scraping (0 for immediate)\"},\"replaceAllPathsWithAbsolutePaths\":{\"type\":\"boolean\",\"description\":\"Whether to convert relative URLs to absolute URLs in the result\"},\"headers\":{\"type\":\"object\",\"description\":\"Custom HTTP request headers as key-value pairs\"},\"removeTags\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"HTML tags to remove from the scraped result\"},\"mobile\":{\"type\":\"boolean\",\"description\":\"Whether to scrape using a mobile user-agent\"}},\"required\":[\"onlyMainContent\",\"screenshot\",\"waitFor\",\"replaceAllPathsWithAbsolutePaths\",\"headers\",\"removeTags\",\"mobile\"],\"description\":\"Page-level scraping options (content filtering, screenshots, headers, etc.)\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"Markdown/plain-text content of the scraped page\"},\"html\":{\"type\":\"string\",\"description\":\"Raw HTML content of the scraped page\"},\"json\":{\"type\":\"object\",\"description\":\"Structured data extracted from the page\"},\"screenshotUrl\":{\"type\":\"string\",\"description\":\"Screenshot URL of the page (if requested)\"},\"metadata\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Page title\"},\"description\":{\"type\":\"string\",\"description\":\"Page meta description\"},\"url\":{\"type\":\"string\",\"description\":\"Canonical URL\"},\"image\":{\"type\":\"string\",\"description\":\"Open Graph image URL\"}},\"required\":[\"title\",\"description\",\"url\",\"image\"],\"description\":\"Page metadata (Open Graph / meta tags)\"}},\"required\":[\"text\",\"html\"]},{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"Markdown/plain-text content of the scraped page\"},\"html\":{\"type\":\"string\",\"description\":\"Raw HTML content of the scraped page\"},\"json\":{\"type\":\"object\",\"description\":\"Structured data extracted from the page\"},\"screenshotUrl\":{\"type\":\"string\",\"description\":\"Screenshot URL of the page (if requested)\"},\"metadata\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Page title\"},\"description\":{\"type\":\"string\",\"description\":\"Page meta description\"},\"url\":{\"type\":\"string\",\"description\":\"Canonical URL\"},\"image\":{\"type\":\"string\",\"description\":\"Open Graph image URL\"}},\"required\":[\"title\",\"description\",\"url\",\"image\"],\"description\":\"Page metadata (Open Graph / meta tags)\"}},\"required\":[\"text\",\"html\"]}}]},\"screenshot\":{\"type\":\"string\",\"description\":\"Screenshot URL, only present when screenshot was requested via pageOptions\"}},\"required\":[\"content\"]},\n },\n \"scrapeXPost\": {\n stepType: \"scrapeXPost\",\n description: \"Scrape data from a single X (Twitter) post by URL.\",\n usageNotes: \"- Returns structured post data (text, html, optional json/screenshot/metadata).\\n- Optionally saves the text content to a variable.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"Full URL to the X post (e.g. https://x.com/elonmusk/status/1655608985058267139)\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"post\":{\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"Markdown/plain-text content of the scraped page\"},\"html\":{\"type\":\"string\",\"description\":\"Raw HTML content of the scraped page\"},\"json\":{\"type\":\"object\",\"description\":\"Structured data extracted from the page\"},\"screenshotUrl\":{\"type\":\"string\",\"description\":\"Screenshot URL of the page (if requested)\"},\"metadata\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Page title\"},\"description\":{\"type\":\"string\",\"description\":\"Page meta description\"},\"url\":{\"type\":\"string\",\"description\":\"Canonical URL\"},\"image\":{\"type\":\"string\",\"description\":\"Open Graph image URL\"}},\"required\":[\"title\",\"description\",\"url\",\"image\"],\"description\":\"Page metadata (Open Graph / meta tags)\"}},\"required\":[\"text\",\"html\"],\"description\":\"Scraped post data including text, HTML, and optional structured JSON\"}},\"required\":[\"post\"]},\n },\n \"scrapeXProfile\": {\n stepType: \"scrapeXProfile\",\n description: \"Scrape public profile data from an X (Twitter) account by URL.\",\n usageNotes: \"- Returns structured profile data.\\n- Optionally saves the result to a variable.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"Full URL or username for the X profile (e.g. https://x.com/elonmusk)\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"profile\":{\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"Markdown/plain-text content of the scraped page\"},\"html\":{\"type\":\"string\",\"description\":\"Raw HTML content of the scraped page\"},\"json\":{\"type\":\"object\",\"description\":\"Structured data extracted from the page\"},\"screenshotUrl\":{\"type\":\"string\",\"description\":\"Screenshot URL of the page (if requested)\"},\"metadata\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Page title\"},\"description\":{\"type\":\"string\",\"description\":\"Page meta description\"},\"url\":{\"type\":\"string\",\"description\":\"Canonical URL\"},\"image\":{\"type\":\"string\",\"description\":\"Open Graph image URL\"}},\"required\":[\"title\",\"description\",\"url\",\"image\"],\"description\":\"Page metadata (Open Graph / meta tags)\"}},\"required\":[\"text\",\"html\"],\"description\":\"Scraped profile data including text, HTML, and optional structured JSON\"}},\"required\":[\"profile\"]},\n },\n \"screenshotUrl\": {\n stepType: \"screenshotUrl\",\n description: \"Capture a screenshot of a web page as a PNG image.\",\n usageNotes: \"- Takes a viewport or full-page screenshot of the given URL.\\n- Returns a CDN-hosted PNG image URL.\\n- Viewport mode captures only the visible area; fullPage captures the entire scrollable page.\\n- You can customize viewport width/height, add a delay, or wait for a CSS selector before capturing.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"url\":{\"type\":\"string\",\"description\":\"URL to screenshot\"},\"mode\":{\"enum\":[\"viewport\",\"fullPage\"],\"type\":\"string\",\"description\":\"Screenshot mode: viewport captures visible area, fullPage captures entire page\"},\"width\":{\"type\":\"number\",\"description\":\"Viewport width in pixels (default: 1280)\"},\"height\":{\"type\":\"number\",\"description\":\"Viewport height in pixels (default: 800, ignored for fullPage mode)\"},\"delay\":{\"type\":\"number\",\"description\":\"Milliseconds to wait before capturing (default: 0)\"},\"waitFor\":{\"type\":\"string\",\"description\":\"CSS selector to wait for before capturing\"}},\"required\":[\"url\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"screenshotUrl\":{\"type\":\"string\"}},\"required\":[\"screenshotUrl\"]},\n },\n \"searchGmailEmails\": {\n stepType: \"searchGmailEmails\",\n description: \"Search for emails in the connected Gmail account using a Gmail search query. To list recent inbox emails, pass an empty query string.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail readonly scope.\\n- Uses Gmail search syntax (e.g. \\\"from:user@example.com\\\", \\\"subject:invoice\\\", \\\"is:unread\\\").\\n- To list recent inbox emails, use an empty query string or \\\"in:inbox\\\".\\n- Returns up to 100 emails (default 5). The variable receives text or JSON depending on exportType.\\n- The direct execution output always returns structured email objects.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Gmail search query (e.g. \\\"from:user@example.com\\\", \\\"subject:invoice\\\", \\\"is:unread\\\")\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"},\"limit\":{\"type\":\"string\",\"description\":\"Maximum number of emails to return (1-10, default: 5)\"}},\"required\":[\"query\",\"exportType\",\"limit\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"emails\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Gmail message ID\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject line\"},\"from\":{\"type\":\"string\",\"description\":\"Sender email address\"},\"to\":{\"type\":\"string\",\"description\":\"Recipient email address\"},\"date\":{\"type\":\"string\",\"description\":\"Email date\"},\"plainBody\":{\"type\":\"string\",\"description\":\"Plain text body content\"},\"htmlBody\":{\"type\":\"string\",\"description\":\"HTML body content (if available)\"},\"labels\":{\"type\":\"string\",\"description\":\"Comma-separated label IDs applied to the email\"}},\"required\":[\"id\",\"subject\",\"from\",\"to\",\"date\",\"plainBody\",\"htmlBody\",\"labels\"]},\"description\":\"List of matching email messages\"}},\"required\":[\"emails\"]},\n },\n \"searchGoogle\": {\n stepType: \"searchGoogle\",\n description: \"Search the web using Google and return structured results.\",\n usageNotes: \"- Defaults to us/english, but can optionally specify country and/or language.\\n- Defaults to any time, but can optionally specify last hour, last day, week, month, or year.\\n- Defaults to top 30 results, but can specify 1 to 100 results to return.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"The search query to send to Google\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Format for the variable value: \\\"text\\\" or \\\"json\\\"\"},\"countryCode\":{\"type\":\"string\",\"description\":\"Google gl country code (defaults to US)\"},\"languageCode\":{\"type\":\"string\",\"description\":\"Google hl language code (defaults to \\\"en\\\")\"},\"dateRange\":{\"enum\":[\"hour\",\"day\",\"week\",\"month\",\"year\",\"any\"],\"type\":\"string\",\"description\":\"Time range filter: \\\"hour\\\", \\\"day\\\", \\\"week\\\", \\\"month\\\", \\\"year\\\", or \\\"any\\\"\"},\"numResults\":{\"type\":\"number\",\"description\":\"Number of results to return (1-100, default: 30)\"}},\"required\":[\"query\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Title of the search result\"},\"description\":{\"type\":\"string\",\"description\":\"Snippet/description of the search result\"},\"url\":{\"type\":\"string\",\"description\":\"URL of the search result page\"}},\"required\":[\"title\",\"description\",\"url\"]},\"description\":\"List of search result entries\"}},\"required\":[\"results\"]},\n },\n \"searchGoogleCalendarEvents\": {\n stepType: \"searchGoogleCalendarEvents\",\n description: \"Search for events in a Google Calendar by keyword, date range, or both.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- Supports keyword search via \\\"query\\\" and date filtering via \\\"timeMin\\\"/\\\"timeMax\\\" (ISO 8601 format).\\n- Unlike \\\"List Events\\\" which only shows future events, this allows searching past events too.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Text search term\"},\"timeMin\":{\"type\":\"string\",\"description\":\"Start of time range (ISO 8601)\"},\"timeMax\":{\"type\":\"string\",\"description\":\"End of time range (ISO 8601)\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\")\"},\"limit\":{\"type\":\"number\",\"description\":\"Maximum number of events to return (default: 10)\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"events\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Google Calendar event ID\"},\"status\":{\"type\":\"string\",\"description\":\"Event status (e.g. \\\"confirmed\\\", \\\"tentative\\\", \\\"cancelled\\\")\"},\"htmlLink\":{\"type\":\"string\",\"description\":\"URL to view the event in Google Calendar\"},\"created\":{\"type\":\"string\",\"description\":\"Timestamp when the event was created\"},\"updated\":{\"type\":\"string\",\"description\":\"Timestamp when the event was last updated\"},\"summary\":{\"type\":\"string\",\"description\":\"Event title\"},\"description\":{\"type\":\"string\",\"description\":\"Event description\"},\"location\":{\"type\":\"string\",\"description\":\"Event location\"},\"organizer\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"start\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"end\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"dateTime\":{\"type\":\"string\"},\"timeZone\":{\"type\":\"string\"}}},{\"type\":\"null\"}]},\"attendees\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"},\"responseStatus\":{\"type\":\"string\"}}}},{\"type\":\"null\"}]}}},\"description\":\"List of matching calendar events\"}},\"required\":[\"events\"]},\n },\n \"searchGoogleDrive\": {\n stepType: \"searchGoogleDrive\",\n description: \"Search for files in Google Drive by keyword.\",\n usageNotes: \"- Requires a Google OAuth connection with Drive scope.\\n- Searches file content and names using Google Drive's fullText search.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Search keyword\"},\"limit\":{\"type\":\"number\",\"description\":\"Max files to return (default: 20)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"exportType\":{\"enum\":[\"json\",\"text\"],\"type\":\"string\",\"description\":\"Format for the variable output: \\\"json\\\" or \\\"text\\\"\"}},\"required\":[\"query\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"files\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"mimeType\":{\"type\":\"string\"},\"size\":{\"type\":\"string\"},\"webViewLink\":{\"type\":\"string\"},\"createdTime\":{\"type\":\"string\"},\"modifiedTime\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"mimeType\",\"size\",\"webViewLink\",\"createdTime\",\"modifiedTime\"]},\"description\":\"List of matching files\"}},\"required\":[\"files\"]},\n },\n \"searchGoogleImages\": {\n stepType: \"searchGoogleImages\",\n description: \"Search Google Images and return image results with URLs and metadata.\",\n usageNotes: \"- Defaults to us/english, but can optionally specify country and/or language.\\n- Defaults to any time, but can optionally specify last hour, last day, week, month, or year.\\n- Defaults to top 30 results, but can specify 1 to 100 results to return.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"The image search query\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Format for the variable value: \\\"text\\\" or \\\"json\\\"\"},\"countryCode\":{\"type\":\"string\",\"description\":\"Google gl country code (defaults to US)\"},\"languageCode\":{\"type\":\"string\",\"description\":\"Google hl language code (defaults to \\\"en\\\")\"},\"dateRange\":{\"enum\":[\"hour\",\"day\",\"week\",\"month\",\"year\",\"any\"],\"type\":\"string\",\"description\":\"Time range filter: \\\"hour\\\", \\\"day\\\", \\\"week\\\", \\\"month\\\", \\\"year\\\", or \\\"any\\\"\"},\"numResults\":{\"type\":\"number\",\"description\":\"Number of results to return (1-100, default: 30)\"}},\"required\":[\"query\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"images\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Title/alt text of the image\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"Direct URL of the full-size image\"},\"imageWidth\":{\"type\":\"number\",\"description\":\"Width of the full-size image in pixels\"},\"imageHeight\":{\"type\":\"number\",\"description\":\"Height of the full-size image in pixels\"},\"thumbnailUrl\":{\"type\":\"string\",\"description\":\"URL of the thumbnail image\"},\"thumbnailWidth\":{\"type\":\"number\",\"description\":\"Width of the thumbnail in pixels\"},\"thumbnailHeight\":{\"type\":\"number\",\"description\":\"Height of the thumbnail in pixels\"},\"source\":{\"type\":\"string\",\"description\":\"Source website name\"},\"domain\":{\"type\":\"string\",\"description\":\"Domain of the source website\"},\"link\":{\"type\":\"string\",\"description\":\"URL of the page containing the image\"},\"googleUrl\":{\"type\":\"string\",\"description\":\"Google Images URL for this result\"},\"position\":{\"type\":\"number\",\"description\":\"Position/rank of this result in the search results\"}},\"required\":[\"title\",\"imageUrl\",\"imageWidth\",\"imageHeight\",\"thumbnailUrl\",\"thumbnailWidth\",\"thumbnailHeight\",\"source\",\"domain\",\"link\",\"googleUrl\",\"position\"]},\"description\":\"List of image search results with URLs and metadata\"}},\"required\":[\"images\"]},\n },\n \"searchGoogleNews\": {\n stepType: \"searchGoogleNews\",\n description: \"Search Google News for recent news articles matching a query.\",\n usageNotes: \"- Defaults to top 30 results, but can specify 1 to 100 results to return.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The news search query\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Format for the variable value: \\\"text\\\" or \\\"json\\\"\"},\"numResults\":{\"type\":\"number\",\"description\":\"Number of results to return (1-100, default: 30)\"}},\"required\":[\"text\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"articles\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Headline of the news article\"},\"link\":{\"type\":\"string\",\"description\":\"URL to the full article\"},\"date\":{\"type\":\"string\",\"description\":\"Publication date of the article\"},\"source\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"description\":\"Name of the news source\"}},\"required\":[\"name\"],\"description\":\"Source publication\"},\"snippet\":{\"type\":\"string\",\"description\":\"Brief excerpt or summary of the article\"}},\"required\":[\"title\",\"link\",\"date\",\"source\"]},\"description\":\"List of matching news articles\"}},\"required\":[\"articles\"]},\n },\n \"searchGoogleTrends\": {\n stepType: \"searchGoogleTrends\",\n description: \"Fetch Google Trends data for a search term.\",\n usageNotes: \"- date accepts shorthand (\\\"now 1-H\\\", \\\"today 1-m\\\", \\\"today 5-y\\\", etc.) or custom \\\"yyyy-mm-dd yyyy-mm-dd\\\" ranges.\\n- data_type controls the shape of returned data: TIMESERIES, GEO_MAP, GEO_MAP_0, RELATED_TOPICS, or RELATED_QUERIES.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The search term to look up on Google Trends\"},\"hl\":{\"type\":\"string\",\"description\":\"Language code (e.g. \\\"en\\\")\"},\"geo\":{\"type\":\"string\",\"description\":\"Geographic region: empty string for worldwide, or a two-letter country code\"},\"data_type\":{\"enum\":[\"TIMESERIES\",\"GEO_MAP\",\"GEO_MAP_0\",\"RELATED_TOPICS\",\"RELATED_QUERIES\"],\"type\":\"string\",\"description\":\"Type of trend data to return\"},\"cat\":{\"type\":\"string\",\"description\":\"Category filter (\\\"0\\\" for all categories)\"},\"date\":{\"type\":\"string\",\"description\":\"Date range for trend data. Available options: - \\\"now 1-H\\\" - Past hour - \\\"now 4-H\\\" - Past 4 hours - \\\"now 1-d\\\" - Past day - \\\"now 7-d\\\" - Past 7 days - \\\"today 1-m\\\" - Past 30 days - \\\"today 3-m\\\" - Past 90 days - \\\"today 12-m\\\" - Past 12 months - \\\"today 5-y\\\" - Past 5 years - \\\"all - 2004\\\" - present - You can also pass custom values: \\\"yyyy-mm-dd yyyy-mm-dd\\\"\"},\"ts\":{\"type\":\"string\",\"description\":\"Timezone offset in minutes (-1439 to 1439, default: 420 for PDT)\"}},\"required\":[\"text\",\"hl\",\"geo\",\"data_type\",\"cat\",\"date\",\"ts\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"trends\":{\"type\":\"object\",\"description\":\"Google Trends data for the searched term\"}},\"required\":[\"trends\"]},\n },\n \"searchPerplexity\": {\n stepType: \"searchPerplexity\",\n description: \"Search the web using the Perplexity API and return structured results.\",\n usageNotes: \"- Defaults to US results. Use countryCode (ISO code) to filter by country.\\n- Returns 10 results by default, configurable from 1 to 20.\\n- The variable receives text or JSON depending on exportType. The direct execution output always returns structured results.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Search query to send to Perplexity\"},\"exportType\":{\"enum\":[\"text\",\"json\"],\"type\":\"string\",\"description\":\"Output format for the variable: plain text or structured JSON\"},\"countryCode\":{\"type\":\"string\",\"description\":\"ISO country code to filter results by region (e.g. \\\"us\\\", \\\"gb\\\")\"},\"numResults\":{\"type\":\"number\",\"description\":\"Number of results to return (1-20, default: 10)\"}},\"required\":[\"query\",\"exportType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"Page title of the search result\"},\"description\":{\"type\":\"string\",\"description\":\"Snippet or description of the search result\"},\"url\":{\"type\":\"string\",\"description\":\"URL of the search result page\"}},\"required\":[\"title\",\"description\",\"url\"]},\"description\":\"List of structured search results\"}},\"required\":[\"results\"]},\n },\n \"searchXPosts\": {\n stepType: \"searchXPosts\",\n description: \"Search recent X (Twitter) posts matching a query.\",\n usageNotes: \"- Searches only the past 7 days of posts.\\n- Query supports X API v2 search operators (up to 512 characters).\\n\\nAvailable search operators in query:\\n\\n| Operator | Description |\\n| -----------------| -------------------------------------------------|\\n| from: | Posts from a specific user (e.g., from:elonmusk) |\\n| to: | Posts sent to a specific user (e.g., to:NASA) |\\n| @ | Mentions a user (e.g., @openai) |\\n| # | Hashtag search (e.g., #AI) |\\n| is:retweet | Filters retweets |\\n| is:reply | Filters replies |\\n| has:media | Posts containing media (images, videos, or GIFs) |\\n| has:links | Posts containing URLs |\\n| lang: | Filters by language (e.g., lang:en) |\\n| - | Excludes specific terms (e.g., -spam) |\\n| () | Groups terms or operators (e.g., (AI OR ML)) |\\n| AND, OR, NOT | Boolean logic for combining or excluding terms |\\n\\nConjunction-Required Operators (must be combined with a standalone operator):\\n\\n| Operator | Description |\\n| ------------ | -----------------------------------------------|\\n| has:media | Posts containing media (images, videos, or GIFs) |\\n| has:links | Posts containing URLs |\\n| is:retweet | Filters retweets |\\n| is:reply | Filters replies |\\n\\nFor example, has:media alone is invalid, but #AI has:media is valid.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Search query (max 512 chars, supports X API v2 search operators)\"},\"scope\":{\"enum\":[\"recent\",\"all\"],\"type\":\"string\",\"description\":\"Search scope: \\\"recent\\\" for past 7 days or \\\"all\\\" for full archive\"},\"options\":{\"type\":\"object\",\"properties\":{\"startTime\":{\"type\":\"string\",\"description\":\"ISO 8601 date; only return posts after this time\"},\"endTime\":{\"type\":\"string\",\"description\":\"ISO 8601 date; only return posts before this time\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Number of results to return (default: 50, max: 100)\"}},\"description\":\"Additional search options\"}},\"required\":[\"query\",\"scope\",\"options\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"posts\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"Unique post identifier\"},\"authorId\":{\"type\":\"string\",\"description\":\"Author's X user ID\"},\"dateCreated\":{\"type\":\"string\",\"description\":\"ISO 8601 timestamp when the post was created\"},\"text\":{\"type\":\"string\",\"description\":\"Text content of the post\"},\"stats\":{\"type\":\"object\",\"properties\":{\"retweets\":{\"type\":\"number\",\"description\":\"Number of retweets/reposts\"},\"replies\":{\"type\":\"number\",\"description\":\"Number of replies\"},\"likes\":{\"type\":\"number\",\"description\":\"Number of likes\"}},\"required\":[\"retweets\",\"replies\",\"likes\"],\"description\":\"Engagement statistics for the post\"}},\"required\":[\"id\",\"authorId\",\"dateCreated\",\"text\",\"stats\"]},\"description\":\"List of matching X posts\"}},\"required\":[\"posts\"]},\n },\n \"searchYoutube\": {\n stepType: \"searchYoutube\",\n description: \"Search for YouTube videos by keyword.\",\n usageNotes: \"- Supports pagination (up to 5 pages) and country/language filters.\\n- Use the filter/filterType fields for YouTube search parameter (sp) filters.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Search query for YouTube videos\"},\"limitPages\":{\"type\":\"string\",\"description\":\"Maximum number of pages to fetch (1-5)\"},\"filter\":{\"type\":\"string\",\"description\":\"YouTube search parameter (sp) filter value\"},\"filterType\":{\"type\":\"string\",\"description\":\"Filter type identifier\"},\"countryCode\":{\"type\":\"string\",\"description\":\"Google gl country code for regional results (default: \\\"US\\\")\"},\"languageCode\":{\"type\":\"string\",\"description\":\"Google hl language code for result language (default: \\\"en\\\")\"}},\"required\":[\"query\",\"limitPages\",\"filter\",\"filterType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"results\":{\"type\":\"object\",\"description\":\"YouTube search results including video_results, channel_results, etc.\"}},\"required\":[\"results\"]},\n },\n \"searchYoutubeTrends\": {\n stepType: \"searchYoutubeTrends\",\n description: \"Retrieve trending videos on YouTube by category and region.\",\n usageNotes: \"- Categories: \\\"now\\\" (trending now), \\\"music\\\", \\\"gaming\\\", \\\"films\\\".\\n- Supports country and language filtering.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"bp\":{\"enum\":[\"now\",\"music\",\"gaming\",\"films\"],\"type\":\"string\",\"description\":\"Trending category: \\\"now\\\" (trending now), \\\"music\\\", \\\"gaming\\\", or \\\"films\\\"\"},\"hl\":{\"type\":\"string\",\"description\":\"Language code (e.g. \\\"en\\\")\"},\"gl\":{\"type\":\"string\",\"description\":\"Country code (e.g. \\\"US\\\")\"}},\"required\":[\"bp\",\"hl\",\"gl\"]},\n outputSchema: {\"type\":\"object\"},\n },\n \"sendEmail\": {\n stepType: \"sendEmail\",\n description: \"Send an email to one or more configured recipient addresses.\",\n usageNotes: \"- Recipient email addresses are resolved from OAuth connections configured by the app creator. The user running the workflow does not specify the recipient directly.\\n- If the body is a URL to a hosted HTML file on the CDN, the HTML is fetched and used as the email body.\\n- When generateHtml is enabled, the body text is converted to a styled HTML email using an AI model.\\n- connectionId can be a comma-separated list to send to multiple recipients.\\n- The special connectionId \\\"trigger_email\\\" uses the email address that triggered the workflow.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"subject\":{\"type\":\"string\",\"description\":\"Email subject line\"},\"body\":{\"type\":\"string\",\"description\":\"Email body content (plain text, markdown, HTML, or a CDN URL to an HTML file)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"OAuth connection ID(s) for the recipient(s), comma-separated for multiple\"},\"generateHtml\":{\"type\":\"boolean\",\"description\":\"When true, auto-convert the body text into a styled HTML email using AI\"},\"generateHtmlInstructions\":{\"type\":\"string\",\"description\":\"Natural language instructions for the HTML generation style\"},\"generateHtmlModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Model settings override for HTML generation\"},\"attachments\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"URLs of files to attach to the email\"}},\"required\":[\"subject\",\"body\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"recipients\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Email addresses the message was sent to\"}},\"required\":[\"recipients\"]},\n },\n \"sendGmailDraft\": {\n stepType: \"sendGmailDraft\",\n description: \"Send an existing draft from the connected Gmail account.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail compose scope.\\n- The draft is sent and removed from the Drafts folder.\\n- Use the draft ID returned by the Create Gmail Draft or List Gmail Drafts steps.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"draftId\":{\"type\":\"string\",\"description\":\"Gmail draft ID to send\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"draftId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"sendGmailMessage\": {\n stepType: \"sendGmailMessage\",\n description: \"Send an email from the connected Gmail account.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail compose scope.\\n- messageType controls the body format: \\\"plain\\\" for plain text, \\\"html\\\" for raw HTML, \\\"markdown\\\" for auto-converted markdown.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"to\":{\"type\":\"string\",\"description\":\"Recipient email address(es), comma-separated for multiple\"},\"subject\":{\"type\":\"string\",\"description\":\"Email subject line\"},\"message\":{\"type\":\"string\",\"description\":\"Email body content\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"messageType\":{\"enum\":[\"plain\",\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Body format: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\"\"}},\"required\":[\"to\",\"subject\",\"message\",\"messageType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"string\",\"description\":\"Gmail message ID of the sent email\"}},\"required\":[\"messageId\"]},\n },\n \"sendSMS\": {\n stepType: \"sendSMS\",\n description: \"Send an SMS or MMS message to a phone number configured via OAuth connection.\",\n usageNotes: \"- User is responsible for configuring the connection to the number (MindStudio requires double opt-in to prevent spam)\\n- If mediaUrls are provided, the message is sent as MMS instead of SMS\\n- MMS supports up to 10 media URLs (images, video, audio, PDF) with a 5MB limit per file\\n- MMS is only supported on US and Canadian carriers; international numbers will receive SMS only (media silently dropped)\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"body\":{\"type\":\"string\",\"description\":\"SMS message body text\"},\"connectionId\":{\"type\":\"string\",\"description\":\"OAuth connection ID for the recipient phone number\"},\"mediaUrls\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Optional array of media URLs to send as MMS (up to 10, 5MB each)\"}},\"required\":[\"body\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"setGmailReadStatus\": {\n stepType: \"setGmailReadStatus\",\n description: \"Mark one or more Gmail emails as read or unread.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail modify scope.\\n- Accepts one or more message IDs as a comma-separated string or array.\\n- Set markAsRead to true to mark as read, false to mark as unread.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"messageIds\":{\"type\":\"string\",\"description\":\"Gmail message ID(s), comma-separated\"},\"markAsRead\":{\"type\":\"boolean\",\"description\":\"true = mark as read, false = mark as unread\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"}},\"required\":[\"messageIds\",\"markAsRead\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"setRunTitle\": {\n stepType: \"setRunTitle\",\n description: \"Set the title of the agent run for the user's history\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\",\"description\":\"The title to assign to the agent run (supports variable interpolation)\"}},\"required\":[\"title\"],\"description\":\"Configuration for the set run title step\"},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"setVariable\": {\n stepType: \"setVariable\",\n description: \"Explicitly set a variable to a given value.\",\n usageNotes: \"- Useful for bootstrapping global variables or setting constants.\\n- The variable name and value both support variable interpolation.\\n- The type field is a UI hint only (controls input widget in the editor).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"value\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}}]}},\"required\":[\"value\"],\"description\":\"Configuration for the set variable step\"},\n outputSchema: {\"type\":\"object\"},\n },\n \"telegramEditMessage\": {\n stepType: \"telegramEditMessage\",\n description: \"Edit a previously sent Telegram message. Use with the message ID returned by Send Telegram Message.\",\n usageNotes: \"- Only text messages sent by the bot can be edited.\\n- The messageId is returned by the Send Telegram Message step.\\n- Common pattern: send a \\\"Processing...\\\" message, do work, then edit it with the result.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID containing the message\"},\"messageId\":{\"type\":\"string\",\"description\":\"ID of the message to edit\"},\"text\":{\"type\":\"string\",\"description\":\"New message text (MarkdownV2 formatting supported)\"}},\"required\":[\"botToken\",\"chatId\",\"messageId\",\"text\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"telegramReplyToMessage\": {\n stepType: \"telegramReplyToMessage\",\n description: \"Send a reply to a specific Telegram message. The reply will be visually threaded in the chat.\",\n usageNotes: \"- Use the rawMessage.message_id from the incoming trigger variables to reply to the user's message.\\n- Especially useful in group chats where replies provide context.\\n- Returns the sent message ID, which can be used with Edit Telegram Message.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the reply to\"},\"replyToMessageId\":{\"type\":\"string\",\"description\":\"ID of the message to reply to\"},\"text\":{\"type\":\"string\",\"description\":\"Reply text (MarkdownV2 formatting supported)\"}},\"required\":[\"botToken\",\"chatId\",\"replyToMessageId\",\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"number\",\"description\":\"ID of the sent reply message\"}},\"required\":[\"messageId\"]},\n },\n \"telegramSendAudio\": {\n stepType: \"telegramSendAudio\",\n description: \"Send an audio file to a Telegram chat as music or a voice note via a bot.\",\n usageNotes: \"- \\\"audio\\\" mode sends as a standard audio file. \\\"voice\\\" mode sends as a voice message (re-uploads the file for large file support).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the audio to\"},\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the audio file to send\"},\"mode\":{\"enum\":[\"audio\",\"voice\"],\"type\":\"string\",\"description\":\"Send as a standard audio track (\\\"audio\\\") or as a voice note (\\\"voice\\\")\"},\"caption\":{\"type\":\"string\",\"description\":\"Optional caption text for the audio\"}},\"required\":[\"botToken\",\"chatId\",\"audioUrl\",\"mode\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"telegramSendFile\": {\n stepType: \"telegramSendFile\",\n description: \"Send a document/file to a Telegram chat via a bot.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the file to\"},\"fileUrl\":{\"type\":\"string\",\"description\":\"URL of the document/file to send\"},\"caption\":{\"type\":\"string\",\"description\":\"Optional caption text for the file\"}},\"required\":[\"botToken\",\"chatId\",\"fileUrl\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"telegramSendImage\": {\n stepType: \"telegramSendImage\",\n description: \"Send an image to a Telegram chat via a bot.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the image to\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the image to send\"},\"caption\":{\"type\":\"string\",\"description\":\"Optional caption text for the image\"}},\"required\":[\"botToken\",\"chatId\",\"imageUrl\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"telegramSendMessage\": {\n stepType: \"telegramSendMessage\",\n description: \"Send a text message to a Telegram chat via a bot.\",\n usageNotes: \"- Messages are sent using MarkdownV2 formatting. Special characters are auto-escaped.\\n- botToken format is \\\"botId:token\\\" — both parts are required.\\n- Returns the sent message ID, which can be used with Edit Telegram Message to update the message later.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the message to\"},\"text\":{\"type\":\"string\",\"description\":\"Message text to send (MarkdownV2 formatting supported)\"}},\"required\":[\"botToken\",\"chatId\",\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"messageId\":{\"type\":\"number\",\"description\":\"ID of the sent Telegram message\"}},\"required\":[\"messageId\"]},\n },\n \"telegramSendVideo\": {\n stepType: \"telegramSendVideo\",\n description: \"Send a video to a Telegram chat via a bot.\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to send the video to\"},\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video to send\"},\"caption\":{\"type\":\"string\",\"description\":\"Optional caption text for the video\"}},\"required\":[\"botToken\",\"chatId\",\"videoUrl\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"telegramSetTyping\": {\n stepType: \"telegramSetTyping\",\n description: \"Show the \\\"typing...\\\" indicator in a Telegram chat via a bot.\",\n usageNotes: \"- The typing indicator automatically expires after a few seconds. Use this right before sending a message for a natural feel.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"botToken\":{\"type\":\"string\",\"description\":\"Telegram bot token in \\\"botId:token\\\" format\"},\"chatId\":{\"type\":\"string\",\"description\":\"Telegram chat ID to show the typing indicator in\"}},\"required\":[\"botToken\",\"chatId\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"textToSpeech\": {\n stepType: \"textToSpeech\",\n description: \"Generate an audio file from provided text using a speech model.\",\n usageNotes: \"- The text field contains the exact words to be spoken (not instructions).\\n- In foreground mode, the audio is displayed to the user. In background mode, the URL is saved to a variable.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The text to convert to speech\"},\"intermediateAsset\":{\"type\":\"boolean\"},\"speechModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Speech synthesis model identifier\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default speech model if not specified\"}},\"required\":[\"text\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the generated audio file\"}},\"required\":[\"audioUrl\"]},\n },\n \"transcribeAudio\": {\n stepType: \"transcribeAudio\",\n description: \"Convert an audio file to text using a transcription model.\",\n usageNotes: \"- The prompt field provides optional context to improve transcription accuracy (e.g. language, speaker names, domain).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"audioUrl\":{\"type\":\"string\",\"description\":\"URL of the audio file to transcribe\"},\"prompt\":{\"type\":\"string\",\"description\":\"Optional context to improve transcription accuracy (e.g. language, speaker names, domain terms)\"},\"transcriptionModelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Audio transcription model identifier\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\"],\"description\":\"Optional model configuration override. Uses the workflow's default transcription model if not specified\"}},\"required\":[\"audioUrl\",\"prompt\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"The transcribed text from the audio file\"}},\"required\":[\"text\"]},\n },\n \"trimMedia\": {\n stepType: \"trimMedia\",\n description: \"Trim an audio or video clip\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"inputUrl\":{\"type\":\"string\",\"description\":\"URL of the source audio or video file to trim\"},\"start\":{\"type\":[\"number\",\"string\"]},\"duration\":{\"type\":[\"string\",\"number\"]},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"inputUrl\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"mediaUrl\":{\"type\":\"string\",\"description\":\"URL of the trimmed media file\"}},\"required\":[\"mediaUrl\"]},\n },\n \"updateGmailLabels\": {\n stepType: \"updateGmailLabels\",\n description: \"Add or remove labels on Gmail messages, identified by message IDs or a search query.\",\n usageNotes: \"- Requires a Google OAuth connection with Gmail modify scope.\\n- Provide either a query (Gmail search syntax) or explicit messageIds to target messages.\\n- Label IDs can be label names or Gmail label IDs — names are resolved automatically.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Gmail search query to find messages (alternative to messageIds)\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"messageIds\":{\"type\":\"string\",\"description\":\"Comma-separated message IDs to target (alternative to query)\"},\"addLabelIds\":{\"type\":\"string\",\"description\":\"Comma-separated label names or IDs to add\"},\"removeLabelIds\":{\"type\":\"string\",\"description\":\"Comma-separated label names or IDs to remove\"}},\"required\":[\"query\",\"messageIds\",\"addLabelIds\",\"removeLabelIds\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"updatedMessageIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Gmail message IDs that were updated\"}},\"required\":[\"updatedMessageIds\"]},\n },\n \"updateGoogleCalendarEvent\": {\n stepType: \"updateGoogleCalendarEvent\",\n description: \"Update an existing event on a Google Calendar. Only specified fields are changed.\",\n usageNotes: \"- Requires a Google OAuth connection with Calendar events scope.\\n- Fetches the existing event first, then applies only the provided updates. Omitted fields are left unchanged.\\n- Attendees are specified as one email address per line, and replace the entire attendee list.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"eventId\":{\"type\":\"string\",\"description\":\"Google Calendar event ID to update\"},\"summary\":{\"type\":\"string\",\"description\":\"Updated event title\"},\"description\":{\"type\":\"string\",\"description\":\"Updated event description\"},\"location\":{\"type\":\"string\",\"description\":\"Updated event location\"},\"startDateTime\":{\"type\":\"string\",\"description\":\"Updated start time in ISO 8601 format\"},\"endDateTime\":{\"type\":\"string\",\"description\":\"Updated end time in ISO 8601 format\"},\"attendees\":{\"type\":\"string\",\"description\":\"Updated attendee email addresses (one per line, replaces all existing attendees)\"},\"calendarId\":{\"type\":\"string\",\"description\":\"Calendar ID (defaults to \\\"primary\\\" if omitted)\"}},\"required\":[\"eventId\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"eventId\":{\"type\":\"string\",\"description\":\"Google Calendar event ID\"},\"htmlLink\":{\"type\":\"string\",\"description\":\"URL to view the updated event in Google Calendar\"}},\"required\":[\"eventId\",\"htmlLink\"]},\n },\n \"updateGoogleDoc\": {\n stepType: \"updateGoogleDoc\",\n description: \"Update the contents of an existing Google Document.\",\n usageNotes: \"- operationType controls how content is applied: \\\"addToTop\\\" prepends, \\\"addToBottom\\\" appends, \\\"overwrite\\\" replaces all content.\\n- textType determines how the text field is interpreted: \\\"plain\\\" for plain text, \\\"html\\\" for HTML markup, \\\"markdown\\\" for Markdown.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"description\":\"Google Document ID to update\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"text\":{\"type\":\"string\",\"description\":\"New content to write to the document\"},\"textType\":{\"enum\":[\"plain\",\"html\",\"markdown\"],\"type\":\"string\",\"description\":\"Format of the text field: \\\"plain\\\", \\\"html\\\", or \\\"markdown\\\"\"},\"operationType\":{\"enum\":[\"addToTop\",\"addToBottom\",\"overwrite\"],\"type\":\"string\",\"description\":\"How to apply the content: \\\"addToTop\\\", \\\"addToBottom\\\", or \\\"overwrite\\\"\"}},\"required\":[\"documentId\",\"text\",\"textType\",\"operationType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"documentUrl\":{\"type\":\"string\",\"description\":\"URL of the updated Google Document\"}},\"required\":[\"documentUrl\"]},\n },\n \"updateGoogleSheet\": {\n stepType: \"updateGoogleSheet\",\n description: \"Update a Google Spreadsheet with new data.\",\n usageNotes: \"- operationType controls how data is written: \\\"addToBottom\\\" appends rows, \\\"overwrite\\\" replaces all data, \\\"range\\\" writes to a specific cell range.\\n- Data should be provided as CSV in the text field.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\",\"description\":\"CSV data to write to the spreadsheet\"},\"connectionId\":{\"type\":\"string\",\"description\":\"Google OAuth connection ID\"},\"spreadsheetId\":{\"type\":\"string\",\"description\":\"Google Spreadsheet ID to update\"},\"range\":{\"type\":\"string\",\"description\":\"Target cell range in A1 notation (used with \\\"range\\\" operationType)\"},\"operationType\":{\"enum\":[\"addToBottom\",\"overwrite\",\"range\"],\"type\":\"string\",\"description\":\"How to apply the data: \\\"addToBottom\\\", \\\"overwrite\\\", or \\\"range\\\"\"}},\"required\":[\"text\",\"spreadsheetId\",\"range\",\"operationType\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"spreadsheetUrl\":{\"type\":\"string\",\"description\":\"URL of the updated Google Spreadsheet\"}},\"required\":[\"spreadsheetUrl\"]},\n },\n \"uploadDataSourceDocument\": {\n stepType: \"uploadDataSourceDocument\",\n description: \"Upload a file into an existing data source from a URL or raw text content.\",\n usageNotes: \"- If \\\"file\\\" is a single URL, the file is downloaded from that URL and uploaded.\\n- If \\\"file\\\" is any other string, a .txt document is created from that content and uploaded.\\n- The block waits (polls) for processing to complete before transitioning, up to 5 minutes.\\n- Once processing finishes, vectors are loaded into Milvus so the data source is immediately queryable.\\n- Supported file types (when using a URL) are the same as the data source upload UI (PDF, DOCX, TXT, etc.).\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"dataSourceId\":{\"type\":\"string\",\"description\":\"ID of the target data source (supports variable interpolation)\"},\"file\":{\"type\":\"string\",\"description\":\"A URL to download, or raw text content to create a .txt document from (supports variable interpolation)\"},\"fileName\":{\"type\":\"string\",\"description\":\"Display name for the document (supports variable interpolation)\"}},\"required\":[\"dataSourceId\",\"file\",\"fileName\"]},\n outputSchema: {\"description\":\"This step does not produce output data.\"},\n },\n \"upscaleImage\": {\n stepType: \"upscaleImage\",\n description: \"Increase the resolution of an image using AI upscaling.\",\n usageNotes: \"- Output is re-hosted on the CDN as a PNG.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the image to upscale\"},\"targetResolution\":{\"enum\":[\"2k\",\"4k\",\"8k\"],\"type\":\"string\",\"description\":\"Target output resolution\"},\"engine\":{\"enum\":[\"standard\",\"pro\"],\"type\":\"string\",\"description\":\"Upscaling engine quality tier\"}},\"required\":[\"imageUrl\",\"targetResolution\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"CDN URL of the upscaled image (PNG)\"}},\"required\":[\"imageUrl\"]},\n },\n \"upscaleVideo\": {\n stepType: \"upscaleVideo\",\n description: \"Upscale a video file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video to upscale\"},\"targetResolution\":{\"enum\":[\"720p\",\"1080p\",\"2K\",\"4K\"],\"type\":\"string\",\"description\":\"Target output resolution for the upscaled video\"},\"engine\":{\"enum\":[\"standard\",\"pro\",\"ultimate\",\"flashvsr\",\"seedance\",\"seedvr2\",\"runwayml/upscale-v1\"],\"type\":\"string\",\"description\":\"Upscaling engine to use. Higher tiers produce better quality at higher cost.\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"targetResolution\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the upscaled video\"}},\"required\":[\"videoUrl\"]},\n },\n \"userMessage\": {\n stepType: \"userMessage\",\n description: \"Send a message to an AI model and return the response, or echo a system message.\",\n usageNotes: \"- Source \\\"user\\\" sends the message to an LLM and returns the model's response.\\n- Source \\\"system\\\" echoes the message content directly (no AI call).\\n- Mode \\\"background\\\" saves the result to a variable. Mode \\\"foreground\\\" streams it to the user (not available in direct execution).\\n- Structured output (JSON/CSV) can be enforced via structuredOutputType and structuredOutputExample.\\n- When executed inside a v2 app method (managed sandbox or local dev tunnel),\\n LLM token output can be streamed to the frontend in real time via an SSE\\n side-channel. The frontend opts in by passing { stream: true } to the method\\n invocation via @mindstudio-ai/interface. Tokens are published to Redis\\n pub/sub as they arrive and forwarded as SSE events on the invoke response.\\n The method code itself is unchanged — streaming is transparent to the\\n developer. See V2ExecutionService.ts and the invoke handler in V2Apps for\\n the server-side plumbing.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"description\":\"The message to send (prompt for AI, or text for system echo)\"},\"source\":{\"enum\":[\"user\",\"system\"],\"type\":\"string\",\"description\":\"Message source: \\\"user\\\" sends to AI model, \\\"system\\\" echoes message content directly. Defaults to \\\"user\\\"\"},\"modelOverride\":{\"type\":\"object\",\"properties\":{\"model\":{\"type\":\"string\",\"description\":\"Model identifier (e.g. \\\"gpt-4\\\", \\\"claude-3-opus\\\")\"},\"temperature\":{\"type\":\"number\",\"description\":\"Sampling temperature for the model (0-2)\"},\"maxResponseTokens\":{\"type\":\"number\",\"description\":\"Maximum number of tokens in the model's response\"},\"ignorePreamble\":{\"type\":\"boolean\",\"description\":\"Whether to skip the system preamble/instructions\"},\"userMessagePreprocessor\":{\"type\":\"object\",\"properties\":{\"dataSource\":{\"type\":\"string\",\"description\":\"Data source identifier for the preprocessor\"},\"messageTemplate\":{\"type\":\"string\",\"description\":\"Template string applied to user messages before sending to the model\"},\"maxResults\":{\"type\":\"number\",\"description\":\"Maximum number of results to include from the data source\"},\"enabled\":{\"type\":\"boolean\",\"description\":\"Whether the preprocessor is active\"},\"shouldInherit\":{\"type\":\"boolean\",\"description\":\"Whether child steps should inherit this preprocessor configuration\"}},\"description\":\"Preprocessor applied to user messages before sending to the model\"},\"preamble\":{\"type\":\"string\",\"description\":\"System preamble/instructions for the model\"},\"multiModelEnabled\":{\"type\":\"boolean\",\"description\":\"Whether multi-model candidate generation is enabled\"},\"editResponseEnabled\":{\"type\":\"boolean\",\"description\":\"Whether the user can edit the model's response\"},\"config\":{\"type\":\"object\",\"description\":\"Additional model-specific configuration\"}},\"required\":[\"model\",\"temperature\",\"maxResponseTokens\"],\"description\":\"Model configuration override. Optional; uses the workflow's default model if not specified\"},\"structuredOutputType\":{\"enum\":[\"text\",\"json\",\"csv\"],\"type\":\"string\",\"description\":\"Output format constraint for structured responses\"},\"structuredOutputExample\":{\"type\":\"string\",\"description\":\"Sample showing the desired output shape (for JSON/CSV formats). A TypeScript interface is also useful here for more complex types.\"},\"chatHistoryMode\":{\"enum\":[\"include\",\"exclude\"],\"type\":\"string\",\"description\":\"Whether to include or exclude prior chat history in the AI context\"}},\"required\":[\"message\"],\"description\":\"Configuration for the user message step\"},\n outputSchema: {\"type\":\"object\",\"properties\":{\"content\":{\"type\":\"string\",\"description\":\"The AI model's response or echoed system message content\"}},\"required\":[\"content\"]},\n },\n \"videoFaceSwap\": {\n stepType: \"videoFaceSwap\",\n description: \"Swap faces in a video file\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video containing faces to swap\"},\"faceImageUrl\":{\"type\":\"string\",\"description\":\"URL of the image containing the replacement face\"},\"targetIndex\":{\"type\":\"number\",\"description\":\"Zero-based index of the face to replace in the video\"},\"engine\":{\"type\":\"string\",\"description\":\"Face swap engine to use\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"faceImageUrl\",\"targetIndex\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the face-swapped video\"}},\"required\":[\"videoUrl\"]},\n },\n \"videoRemoveBackground\": {\n stepType: \"videoRemoveBackground\",\n description: \"Remove or replace background from a video\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video\"},\"newBackground\":{\"enum\":[\"transparent\",\"image\"],\"type\":\"string\",\"description\":\"Whether to make the background transparent or replace it with an image\"},\"newBackgroundImageUrl\":{\"type\":\"string\",\"description\":\"URL of a replacement background image. Required when newBackground is 'image'.\"},\"engine\":{\"type\":\"string\",\"description\":\"Background removal engine to use\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"newBackground\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video with background removed or replaced\"}},\"required\":[\"videoUrl\"]},\n },\n \"videoRemoveWatermark\": {\n stepType: \"videoRemoveWatermark\",\n description: \"Remove a watermark from a video\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video containing a watermark\"},\"engine\":{\"type\":\"string\",\"description\":\"Watermark removal engine to use\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"engine\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the video with watermark removed\"}},\"required\":[\"videoUrl\"]},\n },\n \"watermarkImage\": {\n stepType: \"watermarkImage\",\n description: \"Overlay a watermark image onto another image.\",\n usageNotes: \"- The watermark is placed at the specified corner with configurable padding and width.\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the base image\"},\"watermarkImageUrl\":{\"type\":\"string\",\"description\":\"URL of the watermark image to overlay\"},\"corner\":{\"enum\":[\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"],\"type\":\"string\",\"description\":\"Corner position for the watermark placement\"},\"paddingPx\":{\"type\":\"number\",\"description\":\"Padding from the corner in pixels\"},\"widthPx\":{\"type\":\"number\",\"description\":\"Width of the watermark overlay in pixels\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"imageUrl\",\"watermarkImageUrl\",\"corner\",\"paddingPx\",\"widthPx\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"imageUrl\":{\"type\":\"string\",\"description\":\"CDN URL of the watermarked image\"}},\"required\":[\"imageUrl\"]},\n },\n \"watermarkVideo\": {\n stepType: \"watermarkVideo\",\n description: \"Add an image watermark to a video\",\n usageNotes: \"\",\n inputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the source video\"},\"imageUrl\":{\"type\":\"string\",\"description\":\"URL of the watermark image to overlay\"},\"corner\":{\"enum\":[\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"],\"type\":\"string\",\"description\":\"Corner position for the watermark placement\"},\"paddingPx\":{\"type\":\"number\",\"description\":\"Padding from the corner in pixels\"},\"widthPx\":{\"type\":\"number\",\"description\":\"Width of the watermark overlay in pixels\"},\"intermediateAsset\":{\"type\":\"boolean\",\"description\":\"When true, the asset is created but hidden from the user's gallery (tagged as intermediate)\"}},\"required\":[\"videoUrl\",\"imageUrl\",\"corner\",\"paddingPx\",\"widthPx\"]},\n outputSchema: {\"type\":\"object\",\"properties\":{\"videoUrl\":{\"type\":\"string\",\"description\":\"URL of the watermarked video\"}},\"required\":[\"videoUrl\"]},\n },\n};\n","import { MindStudioAgent as _MindStudioAgent } from './client.js';\nimport type { StepMethods } from './generated/steps.js';\nimport type { AgentOptions } from './types.js';\nimport type { AuthContext as _AuthContext } from './auth/index.js';\nimport type { Db as _Db } from './db/index.js';\n\n/** MindStudioAgent with all generated step methods. */\nexport type MindStudioAgent = _MindStudioAgent & StepMethods;\n\n/** {@inheritDoc MindStudioAgent} */\nexport const MindStudioAgent = _MindStudioAgent as unknown as {\n new (options?: AgentOptions): MindStudioAgent;\n};\n\nexport { MindStudioError } from './errors.js';\nexport { AuthContext, Roles } from './auth/index.js';\nexport type { Db, DefineTableOptions, Table, Query, Predicate, Accessor, PushInput, UpdateInput, SystemFields } from './db/index.js';\nexport type {\n AgentOptions,\n StepExecutionOptions,\n StepExecutionResult,\n StepExecutionMeta,\n StepLogEvent,\n User,\n ResolvedUser,\n AgentInfo,\n ListAgentsResult,\n UserInfoResult,\n RunAgentOptions,\n RunAgentResult,\n MindStudioModel,\n MindStudioModelSummary,\n ModelType,\n ConnectorService,\n ConnectorActionDetail,\n Connection,\n StepCostEstimateEntry,\n UploadFileResult,\n AppRoleAssignment,\n AppAuthContext,\n AppDatabaseColumnSchema,\n AppDatabaseTable,\n AppDatabase,\n AppContextResult,\n BatchStepInput,\n BatchStepResult,\n ExecuteStepBatchOptions,\n ExecuteStepBatchResult,\n} from './types.js';\n\n// Re-export all generated types\nexport * from './generated/types.js';\nexport type { StepMethods } from './generated/steps.js';\nexport {\n monacoSnippets,\n blockTypeAliases,\n type MonacoSnippet,\n type MonacoSnippetField,\n type MonacoSnippetFieldType,\n} from './generated/snippets.js';\nexport {\n stepMetadata,\n type StepMetadata,\n} from './generated/metadata.js';\n\n// ---------------------------------------------------------------------------\n// Lazy default singleton\n// ---------------------------------------------------------------------------\n\n/**\n * Lazy default instance — created on first property access.\n * Uses env/config auth, so no constructor args needed.\n *\n * ```ts\n * import { mindstudio } from '@mindstudio-ai/agent';\n * const { imageUrl } = await mindstudio.generateImage({ prompt: 'a sunset' });\n * ```\n */\nlet _default: MindStudioAgent;\nexport const mindstudio: MindStudioAgent = new Proxy(\n {} as MindStudioAgent,\n {\n get(_, prop, receiver) {\n _default ??= new MindStudioAgent();\n const value = Reflect.get(_default, prop, _default);\n return typeof value === 'function' ? value.bind(_default) : value;\n },\n },\n);\n\nexport default mindstudio;\n\n// ---------------------------------------------------------------------------\n// Top-level auth and db — bound to the lazy singleton\n// ---------------------------------------------------------------------------\n//\n// These provide the ergonomic import style matching the sketch's\n// `import { db, auth, Roles } from '@mindstudio/app'`:\n//\n// ```ts\n// import { db, auth, Roles } from '@mindstudio-ai/agent';\n//\n// const Orders = db.defineTable<Order>('orders');\n// auth.requireRole(Roles.admin);\n// ```\n//\n// Under the hood they proxy to `mindstudio.db` and `mindstudio.auth`.\n// The mindstudio singleton is lazily created on first access, so these\n// are safe to reference at module scope.\n\n/**\n * Top-level `auth` namespace bound to the default singleton.\n *\n * Provides the current user's identity and roles. Requires context\n * hydration before use — call `await mindstudio.ensureContext()` or\n * perform any `db` operation first.\n *\n * @example\n * ```ts\n * import { auth, Roles } from '@mindstudio-ai/agent';\n *\n * auth.requireRole(Roles.admin);\n * const admins = auth.getUsersByRole(Roles.admin);\n * ```\n */\nexport const auth: _AuthContext = new Proxy(\n {} as _AuthContext,\n {\n get(_, prop) {\n const target = mindstudio.auth;\n const value = Reflect.get(target, prop, target);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n },\n);\n\n/**\n * Top-level `db` namespace bound to the default singleton.\n *\n * Use `db.defineTable<T>(name)` to create typed collections. Table\n * definitions are lazy — no HTTP until you await a query. Context is\n * auto-hydrated on first query execution.\n *\n * @example\n * ```ts\n * import { db } from '@mindstudio-ai/agent';\n *\n * const Orders = db.defineTable<Order>('orders');\n * const active = await Orders.filter(o => o.status === 'active').take(10);\n * ```\n */\nexport const db: _Db = new Proxy(\n {} as _Db,\n {\n get(_, prop) {\n const target = mindstudio.db;\n const value = Reflect.get(target, prop, target);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n },\n);\n\n/**\n * Top-level `stream` function bound to the default singleton.\n *\n * Send a stream chunk to the caller via SSE. When the method was called\n * with `stream: true`, chunks arrive in real-time. When there is no active\n * stream, calls are silently ignored.\n *\n * @example\n * ```ts\n * import { stream } from '@mindstudio-ai/agent';\n *\n * await stream('Processing...');\n * await stream({ progress: 50 });\n * ```\n */\nexport const stream = (data: string | Record<string, unknown>) =>\n mindstudio.stream(data);\n\n/**\n * Resolve a user ID to display info (name, email, profile picture).\n * Bound to the default singleton.\n *\n * @example\n * ```ts\n * import { resolveUser } from '@mindstudio-ai/agent';\n *\n * const user = await resolveUser(order.requestedBy);\n * if (user) console.log(user.name, user.email);\n * ```\n */\nexport const resolveUser = (userId: string) => mindstudio.resolveUser(userId);\n"],"mappings":"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","names":["inner","db","sleep","MindStudioAgent"]}