@tailor-platform/sdk 1.15.2 → 1.16.0
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/CHANGELOG.md +16 -0
- package/dist/application-CNpRSiWJ.mjs +4 -0
- package/dist/{application-DLUgR1gv.mjs → application-DQ2F9UmJ.mjs} +7 -3
- package/dist/application-DQ2F9UmJ.mjs.map +1 -0
- package/dist/cli/index.mjs +2 -2
- package/dist/cli/lib.d.mts +19 -3
- package/dist/cli/lib.mjs +2 -2
- package/dist/configure/index.d.mts +3 -3
- package/dist/{index-Bg_UJxhL.d.mts → index-1V_2bvT4.d.mts} +3 -3
- package/dist/{index-pQbghcVa.d.mts → index-Ds8lbSJb.d.mts} +2 -2
- package/dist/plugin/index.d.mts +1 -1
- package/dist/schema-DRYB-nzA.mjs.map +1 -1
- package/dist/{types-BZRw-Iys.d.mts → types-_sYDzqHG.d.mts} +54 -10
- package/dist/types-b-ig8nW_.mjs.map +1 -1
- package/dist/{update-70uX2TDG.mjs → update-C5jgLxpK.mjs} +17 -5
- package/dist/update-C5jgLxpK.mjs.map +1 -0
- package/dist/utils/test/index.d.mts +3 -3
- package/package.json +1 -1
- package/dist/application-DLUgR1gv.mjs.map +0 -1
- package/dist/application-DhvHS3pX.mjs +0 -4
- package/dist/update-70uX2TDG.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-C5jgLxpK.mjs","names":["fs","fs","os","arg","fs","fs","builtinGenerators","generateFieldType","fs","fs","sanitizePluginId","toCamelCase","toKebabCase","require","fs","code","fs","packageJson","create","trn","idpConfigs","create","planServices","trn","client","create","planServices","trn","idpConfig","attr","fs","create","create","trn","executors","create","planServices","trn","create","trn","fs","fs","waitForExecution","arg","trn","fs","trn","create","create","db","fs","app","pipeline","nameArgs","getCommand","sleep","formatTime","colorizeStatus","getCommand","formatTime","arg","attempts","setTimeout","job","listCommand","processResolver","fs","relativePath","watch","db","generate","generateCommand","listCommand","getCommand","listCommand","loadOptions","removeCommand","appInfo","fs","fs","fs","fsPromises","defineApplication","listCommand","loadOptions","loadOptions","listCommand","loadOptions","loadOptions","listCommand","loadOptions","loadOptions","loadOptions","loadOptions"],"sources":["../src/cli/utils/errors.ts","../src/cli/args.ts","../../tailor-proto/src/buf/validate/validate_pb.js","../../tailor-proto/src/tailor/fieldmask/v1/option_pb.js","../../tailor-proto/src/google/api/field_behavior_pb.js","../../tailor-proto/src/tailor/v1/application_resource_pb.js","../../tailor-proto/src/tailor/v1/resource_pb.js","../../tailor-proto/src/tailor/v1/application_pb.js","../../tailor-proto/src/tailor/v1/secret_manager_resource_pb.js","../../tailor-proto/src/tailor/v1/auth_resource_pb.js","../../tailor-proto/src/tailor/v1/auth_pb.js","../../tailor-proto/src/tailor/v1/events_resource_pb.js","../../tailor-proto/src/tailor/v1/events_pb.js","../../tailor-proto/src/tailor/v1/executor_resource_pb.js","../../tailor-proto/src/tailor/v1/executor_pb.js","../../tailor-proto/src/tailor/v1/function_resource_pb.js","../../tailor-proto/src/tailor/v1/function_pb.js","../../tailor-proto/src/tailor/v1/function_registry_pb.js","../../tailor-proto/src/tailor/v1/idp_resource_pb.js","../../tailor-proto/src/tailor/v1/idp_pb.js","../../tailor-proto/src/tailor/v1/metadata_resource_pb.js","../../tailor-proto/src/tailor/v1/metadata_pb.js","../../tailor-proto/src/tailor/v1/meter_pb.js","../../tailor-proto/src/tailor/v1/pipeline_resource_pb.js","../../tailor-proto/src/tailor/v1/pipeline_pb.js","../../tailor-proto/src/tailor/v1/secret_manager_pb.js","../../tailor-proto/src/tailor/v1/stateflow_resource_pb.js","../../tailor-proto/src/tailor/v1/stateflow_pb.js","../../tailor-proto/src/tailor/v1/staticwebsite_resource_pb.js","../../tailor-proto/src/tailor/v1/staticwebsite_pb.js","../../tailor-proto/src/tailor/v1/tailordb_resource_pb.js","../../tailor-proto/src/tailor/v1/tailordb_pb.js","../../tailor-proto/src/tailor/v1/workflow_resource_pb.js","../../tailor-proto/src/tailor/v1/workflow_pb.js","../../tailor-proto/src/tailor/v1/workspace_resource_pb.js","../../tailor-proto/src/tailor/v1/workspace_pb.js","../../tailor-proto/src/tailor/v1/service_pb.js","../src/cli/utils/package-json.ts","../src/cli/client.ts","../src/cli/context.ts","../src/cli/api.ts","../src/cli/application/workflow/service.ts","../src/cli/bundler/inline-sourcemap.ts","../src/cli/utils/dist-dir.ts","../src/cli/bundler/workflow/ast-utils.ts","../src/cli/bundler/workflow/sdk-binding-collector.ts","../src/cli/bundler/workflow/job-detector.ts","../src/cli/bundler/workflow/workflow-detector.ts","../src/cli/bundler/workflow/trigger-transformer.ts","../src/cli/bundler/trigger-context.ts","../src/cli/bundler/executor/loader.ts","../src/cli/bundler/executor/executor-bundler.ts","../src/cli/bundler/resolver/loader.ts","../src/cli/bundler/resolver/resolver-bundler.ts","../src/cli/bundler/workflow/source-transformer.ts","../src/cli/bundler/workflow/workflow-bundler.ts","../src/parser/generator-config/index.ts","../src/parser/plugin-config/schema.ts","../src/cli/generator/types.ts","../src/cli/generator/builtin/enum-constants/generate-enum-constants.ts","../src/cli/generator/builtin/enum-constants/process-enum-type.ts","../src/cli/generator/builtin/enum-constants/index.ts","../src/cli/generator/builtin/file-utils/generate-file-utils.ts","../src/cli/generator/builtin/file-utils/process-file-type.ts","../src/cli/generator/builtin/file-utils/index.ts","../src/cli/generator/builtin/kysely-type/type-processor.ts","../src/cli/generator/builtin/kysely-type/index.ts","../src/cli/generator/builtin/seed/idp-user-processor.ts","../src/cli/generator/builtin/seed/lines-db-processor.ts","../src/cli/generator/builtin/seed/seed-type-processor.ts","../src/cli/generator/builtin/seed/index.ts","../src/cli/mock.ts","../src/cli/config-loader.ts","../src/cli/utils/plugin-import.ts","../src/parser/plugin-config/types.ts","../src/cli/generator/plugin-executor-generator.ts","../src/cli/generator/plugin-type-generator.ts","../src/cli/type-generator.ts","../src/plugin/manager.ts","../src/cli/apply/services/label.ts","../src/cli/apply/services/index.ts","../src/cli/apply/services/application.ts","../src/cli/apply/services/idp.ts","../src/cli/apply/services/auth.ts","../src/cli/apply/services/confirm.ts","../src/cli/apply/services/function-registry.ts","../src/cli/apply/services/executor.ts","../src/cli/apply/services/resolver.ts","../src/cli/apply/services/staticwebsite.ts","../src/cli/tailordb/migrate/config.ts","../src/cli/tailordb/migrate/diff-calculator.ts","../src/cli/tailordb/migrate/snapshot.ts","../src/cli/bundler/migration/migration-bundler.ts","../src/cli/tailordb/migrate/types.ts","../src/cli/utils/script-executor.ts","../src/cli/apply/services/tailordb/migration.ts","../src/cli/apply/services/tailordb/index.ts","../src/cli/apply/services/workflow.ts","../src/cli/apply/index.ts","../src/cli/executor/status.ts","../src/cli/executor/transform.ts","../src/cli/executor/get.ts","../src/cli/utils/format.ts","../src/cli/utils/function-execution.ts","../src/cli/workflow/args.ts","../src/cli/workflow/status.ts","../src/cli/workflow/transform.ts","../src/cli/workflow/executions.ts","../src/cli/workflow/get.ts","../src/cli/workflow/start.ts","../src/cli/executor/jobs.ts","../src/cli/executor/list.ts","../src/cli/executor/trigger.ts","../src/cli/executor/webhook.ts","../src/cli/generator/watch/index.ts","../src/cli/generator/index.ts","../src/cli/machineuser/list.ts","../src/cli/machineuser/token.ts","../src/cli/oauth2client/transform.ts","../src/cli/oauth2client/get.ts","../src/cli/oauth2client/list.ts","../src/cli/remove.ts","../src/cli/show.ts","../src/cli/utils/beta.ts","../src/cli/tailordb/migrate/db-types-generator.ts","../src/cli/tailordb/migrate/template-generator.ts","../src/cli/tailordb/migrate/generate.ts","../src/cli/tailordb/truncate.ts","../src/cli/workflow/list.ts","../src/cli/workflow/resume.ts","../src/cli/workspace/app/transform.ts","../src/cli/workspace/app/health.ts","../src/cli/workspace/app/list.ts","../src/cli/workspace/transform.ts","../src/cli/workspace/create.ts","../src/cli/workspace/delete.ts","../src/cli/workspace/get.ts","../src/cli/workspace/list.ts","../src/cli/workspace/restore.ts","../src/cli/workspace/user/transform.ts","../src/cli/workspace/user/invite.ts","../src/cli/workspace/user/list.ts","../src/cli/workspace/user/remove.ts","../src/cli/workspace/user/update.ts"],"sourcesContent":["import chalk from \"chalk\";\n\n/**\n * Options for creating a CLI error\n */\nexport interface CLIErrorOptions {\n message: string;\n details?: string;\n suggestion?: string;\n command?: string;\n code?: string;\n}\n\n/**\n * CLI error interface with formatted output\n */\nexport interface CLIError extends Error {\n readonly code?: string;\n readonly details?: string;\n readonly suggestion?: string;\n readonly command?: string;\n format(): string;\n}\n\ntype CLIErrorInternal = Error & {\n code?: string;\n details?: string;\n suggestion?: string;\n command?: string;\n format(): string;\n};\n\n/**\n * Format CLI error for output\n * @param error - CLIError instance to format\n * @returns Formatted error message\n */\nfunction formatError(error: CLIError): string {\n const parts: string[] = [\n chalk.red(`Error${error.code ? ` [${error.code}]` : \"\"}: ${error.message}`),\n ];\n\n if (error.details) {\n parts.push(`\\n ${chalk.gray(\"Details:\")} ${error.details}`);\n }\n\n if (error.suggestion) {\n parts.push(`\\n ${chalk.cyan(\"Suggestion:\")} ${error.suggestion}`);\n }\n\n if (error.command) {\n parts.push(\n `\\n ${chalk.gray(\"Help:\")} Run \\`tailor-sdk ${error.command} --help\\` for usage information.`,\n );\n }\n\n return parts.join(\"\");\n}\n\n/**\n * Create a CLI error with formatted output\n * @param options - Options to construct a CLIError\n * @returns Constructed CLIError instance\n */\nfunction createCLIError(options: CLIErrorOptions): CLIError {\n const error = new Error(options.message) as CLIErrorInternal;\n error.name = \"CLIError\";\n error.code = options.code;\n error.details = options.details;\n error.suggestion = options.suggestion;\n error.command = options.command;\n error.format = () => formatError(error);\n return error;\n}\n\n/**\n * Type guard to check if an error is a CLIError\n * @param error - Error to check\n * @returns True if the error is a CLIError\n */\nexport function isCLIError(error: unknown): error is CLIError {\n return error instanceof Error && error.name === \"CLIError\";\n}\n\n// Re-export createCLIError as CLIError for backward compatibility\nexport { createCLIError as CLIError };\n","import * as fs from \"node:fs\";\nimport { parseEnv } from \"node:util\";\nimport * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { isCLIError } from \"./utils/errors\";\nimport { logger } from \"./utils/logger\";\n\ntype ArgsShape = Record<string, z.ZodType>;\n\n// ============================================================================\n// Validators\n// ============================================================================\n\nconst durationUnits = [\"ms\", \"s\", \"m\"] as const;\ntype DurationUnit = (typeof durationUnits)[number];\n\nconst unitToMs: Record<DurationUnit, number> = {\n ms: 1,\n s: 1000,\n m: 60 * 1000,\n};\n\nconst durationPattern = /^(\\d+)(ms|s|m)$/;\n\n/**\n * Schema for duration string validation (e.g., \"3s\", \"500ms\", \"1m\")\n * Only validates format; use parseDuration() to convert to milliseconds\n */\nexport const durationArg = z\n .string()\n .refine((val) => durationPattern.test(val), {\n message: \"Invalid duration format. Expected format: '3s', '500ms', '1m'\",\n })\n .refine(\n (val) => {\n const match = val.match(durationPattern)!;\n return parseInt(match[1], 10) > 0;\n },\n { message: \"Duration must be greater than 0\" },\n );\n\n/**\n * Parse a validated duration string into milliseconds\n * @param duration - Duration string (e.g., \"3s\", \"500ms\", \"1m\")\n * @returns Duration in milliseconds\n */\nexport function parseDuration(duration: string): number {\n const match = duration.match(durationPattern)!;\n const value = parseInt(match[1], 10);\n const unit = match[2] as DurationUnit;\n return value * unitToMs[unit];\n}\n\n/**\n * Schema for positive integer validation (from string input)\n * Transforms the string to a number\n */\nexport const positiveIntArg = z.coerce.number().int().positive();\n\n// ============================================================================\n// Env File Helpers\n// ============================================================================\n\ntype EnvFileArg = string | string[] | undefined;\n\n/**\n * Load env files from parsed arguments.\n * Processes --env-file first, then --env-file-if-exists.\n *\n * Follows Node.js --env-file behavior:\n * - Variables already set in the environment are NOT overwritten\n * - Variables from later files override those from earlier files\n * @param envFiles - Required env file path(s) that must exist\n * @param envFilesIfExists - Optional env file path(s) that are loaded if they exist\n */\nexport function loadEnvFiles(envFiles: EnvFileArg, envFilesIfExists: EnvFileArg): void {\n // Snapshot of originally set environment variables (before loading any files)\n const originalEnvKeys = new Set(Object.keys(process.env));\n\n const load = (files: EnvFileArg, required: boolean) => {\n for (const file of [files ?? []].flat()) {\n const envPath = path.resolve(process.cwd(), file);\n if (!fs.existsSync(envPath)) {\n if (required) {\n throw new Error(`Environment file not found: ${envPath}`);\n }\n continue;\n }\n const content = fs.readFileSync(envPath, \"utf-8\");\n const parsed = parseEnv(content);\n for (const [key, value] of Object.entries(parsed)) {\n // Skip if the variable was originally set in the environment\n if (originalEnvKeys.has(key)) {\n continue;\n }\n // Allow overwriting between env files\n process.env[key] = value;\n }\n }\n };\n\n load(envFiles, true);\n load(envFilesIfExists, false);\n}\n\n// ============================================================================\n// Argument Definitions\n// ============================================================================\n\n/**\n * Common arguments for all CLI commands\n *\n * NOTE: --env-file and --env-file-if-exists collide with Node.js flags due to a bug\n * (https://github.com/nodejs/node/issues/54232). Node.js parses these even after the\n * script path, causing warnings (twice due to tsx loader).\n */\nexport const commonArgs = {\n \"env-file\": arg(z.string().optional(), {\n alias: \"e\",\n description: \"Path to the environment file (error if not found)\",\n }),\n \"env-file-if-exists\": arg(z.string().optional(), {\n description: \"Path to the environment file (ignored if not found)\",\n }),\n verbose: arg(z.boolean().default(false), {\n description: \"Enable verbose logging\",\n }),\n} satisfies ArgsShape;\n\n/**\n * Arguments for commands that require workspace context\n */\nexport const workspaceArgs = {\n \"workspace-id\": arg(z.string().optional(), {\n alias: \"w\",\n description: \"Workspace ID\",\n }),\n profile: arg(z.string().optional(), {\n alias: \"p\",\n description: \"Workspace profile\",\n }),\n} satisfies ArgsShape;\n\n/**\n * Arguments for commands that interact with deployed resources (includes config)\n */\nexport const deploymentArgs = {\n ...workspaceArgs,\n config: arg(z.string().default(\"tailor.config.ts\"), {\n alias: \"c\",\n description: \"Path to SDK config file\",\n }),\n} satisfies ArgsShape;\n\n/**\n * Arguments for commands that require confirmation\n */\nexport const confirmationArgs = {\n yes: arg(z.boolean().default(false), {\n alias: \"y\",\n description: \"Skip confirmation prompts\",\n }),\n} satisfies ArgsShape;\n\n/**\n * Arguments for JSON output\n */\nexport const jsonArgs = {\n json: arg(z.boolean().default(false), {\n alias: \"j\",\n description: \"Output as JSON\",\n }),\n} satisfies ArgsShape;\n\nexport type CommonArgsType = z.infer<z.ZodObject<typeof commonArgs>>;\n\n/**\n * Wrapper for command handlers that provides:\n * - Environment file loading\n * - Error handling with formatted output\n * - Exit code management\n * @template T\n * @param handler - Command handler function\n * @returns Wrapped handler\n */\nexport const withCommonArgs =\n <T extends CommonArgsType>(handler: (args: T) => Promise<void>) =>\n async (args: T) => {\n try {\n // Set JSON mode if --json flag is provided\n if (\"json\" in args && typeof args.json === \"boolean\") {\n logger.jsonMode = args.json;\n }\n\n // Load env files\n loadEnvFiles(args[\"env-file\"] as EnvFileArg, args[\"env-file-if-exists\"] as EnvFileArg);\n\n await handler(args);\n } catch (error) {\n if (isCLIError(error)) {\n logger.log(error.format());\n if (args.verbose && error.stack) {\n logger.debug(`\\nStack trace:\\n${error.stack}`);\n }\n } else if (error instanceof Error) {\n logger.error(error.message);\n if (args.verbose && error.stack) {\n logger.debug(`\\nStack trace:\\n${error.stack}`);\n }\n } else {\n logger.error(`Unknown error: ${error}`);\n }\n process.exit(1);\n }\n process.exit(0);\n };\n","// Copyright 2023-2025 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.6.3\n// @generated from file buf/validate/validate.proto (package buf.validate, syntax proto2)\n/* eslint-disable */\n\nimport { enumDesc, extDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Describes the file buf/validate/validate.proto.\n */\nexport const file_buf_validate_validate = /*@__PURE__*/\n fileDesc(\"ChtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8SDGJ1Zi52YWxpZGF0ZSI3CgRSdWxlEgoKAmlkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKZXhwcmVzc2lvbhgDIAEoCSJuCgxNZXNzYWdlUnVsZXMSHwoDY2VsGAMgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGUSLQoFb25lb2YYBCADKAsyHi5idWYudmFsaWRhdGUuTWVzc2FnZU9uZW9mUnVsZUoECAEQAlIIZGlzYWJsZWQiNAoQTWVzc2FnZU9uZW9mUnVsZRIOCgZmaWVsZHMYASADKAkSEAoIcmVxdWlyZWQYAiABKAgiHgoKT25lb2ZSdWxlcxIQCghyZXF1aXJlZBgBIAEoCCK/CAoKRmllbGRSdWxlcxIfCgNjZWwYFyADKAsyEi5idWYudmFsaWRhdGUuUnVsZRIQCghyZXF1aXJlZBgZIAEoCBIkCgZpZ25vcmUYGyABKA4yFC5idWYudmFsaWRhdGUuSWdub3JlEikKBWZsb2F0GAEgASgLMhguYnVmLnZhbGlkYXRlLkZsb2F0UnVsZXNIABIrCgZkb3VibGUYAiABKAsyGS5idWYudmFsaWRhdGUuRG91YmxlUnVsZXNIABIpCgVpbnQzMhgDIAEoCzIYLmJ1Zi52YWxpZGF0ZS5JbnQzMlJ1bGVzSAASKQoFaW50NjQYBCABKAsyGC5idWYudmFsaWRhdGUuSW50NjRSdWxlc0gAEisKBnVpbnQzMhgFIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50MzJSdWxlc0gAEisKBnVpbnQ2NBgGIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50NjRSdWxlc0gAEisKBnNpbnQzMhgHIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TSW50MzJSdWxlc0gAEisKBnNpbnQ2NBgIIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TSW50NjRSdWxlc0gAEi0KB2ZpeGVkMzIYCSABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQzMlJ1bGVzSAASLQoHZml4ZWQ2NBgKIAEoCzIaLmJ1Zi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIABIvCghzZml4ZWQzMhgLIAEoCzIbLmJ1Zi52YWxpZGF0ZS5TRml4ZWQzMlJ1bGVzSAASLwoIc2ZpeGVkNjQYDCABKAsyGy5idWYudmFsaWRhdGUuU0ZpeGVkNjRSdWxlc0gAEicKBGJvb2wYDSABKAsyFy5idWYudmFsaWRhdGUuQm9vbFJ1bGVzSAASKwoGc3RyaW5nGA4gASgLMhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzSAASKQoFYnl0ZXMYDyABKAsyGC5idWYudmFsaWRhdGUuQnl0ZXNSdWxlc0gAEicKBGVudW0YECABKAsyFy5idWYudmFsaWRhdGUuRW51bVJ1bGVzSAASLwoIcmVwZWF0ZWQYEiABKAsyGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlc0gAEiUKA21hcBgTIAEoCzIWLmJ1Zi52YWxpZGF0ZS5NYXBSdWxlc0gAEiUKA2FueRgUIAEoCzIWLmJ1Zi52YWxpZGF0ZS5BbnlSdWxlc0gAEi8KCGR1cmF0aW9uGBUgASgLMhsuYnVmLnZhbGlkYXRlLkR1cmF0aW9uUnVsZXNIABIxCgl0aW1lc3RhbXAYFiABKAsyHC5idWYudmFsaWRhdGUuVGltZXN0YW1wUnVsZXNIAEIGCgR0eXBlSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHkiVQoPUHJlZGVmaW5lZFJ1bGVzEh8KA2NlbBgBIAMoCzISLmJ1Zi52YWxpZGF0ZS5SdWxlSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHki2hcKCkZsb2F0UnVsZXMSgwEKBWNvbnN0GAEgASgCQnTCSHEKbwoLZmxvYXQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKfAQoCbHQYAiABKAJCkAHCSIwBCokBCghmbG9hdC5sdBp9IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKvAQoDbHRlGAMgASgCQp8BwkibAQqYAQoJZmxvYXQubHRlGooBIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAAS7wcKAmd0GAQgASgCQuAHwkjcBwqNAQoIZmxvYXQuZ3QagAEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwrDAQoLZmxvYXQuZ3RfbHQaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrNAQoVZmxvYXQuZ3RfbHRfZXhjbHVzaXZlGrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycK0wEKDGZsb2F0Lmd0X2x0ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCt0BChZmbG9hdC5ndF9sdGVfZXhjbHVzaXZlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARK6CAoDZ3RlGAUgASgCQqoIwkimCAqbAQoJZmxvYXQuZ3RlGo0BIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCtIBCgxmbG9hdC5ndGVfbHQawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtwBChZmbG9hdC5ndGVfbHRfZXhjbHVzaXZlGsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwriAQoNZmxvYXQuZ3RlX2x0ZRrQAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK7AEKF2Zsb2F0Lmd0ZV9sdGVfZXhjbHVzaXZlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEn8KAmluGAYgAygCQnPCSHAKbgoIZmxvYXQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgHIAMoAkJmwkhjCmEKDGZsb2F0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEnUKBmZpbml0ZRgIIAEoCEJlwkhiCmAKDGZsb2F0LmZpbml0ZRpQcnVsZXMuZmluaXRlID8gKHRoaXMuaXNOYW4oKSB8fCB0aGlzLmlzSW5mKCkgPyAndmFsdWUgbXVzdCBiZSBmaW5pdGUnIDogJycpIDogJycSKwoHZXhhbXBsZRgJIAMoAkIawkgXChUKDWZsb2F0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIu0XCgtEb3VibGVSdWxlcxKEAQoFY29uc3QYASABKAFCdcJIcgpwCgxkb3VibGUuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKgAQoCbHQYAiABKAFCkQHCSI0BCooBCglkb3VibGUubHQafSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASsAEKA2x0ZRgDIAEoAUKgAcJInAEKmQEKCmRvdWJsZS5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABL0BwoCZ3QYBCABKAFC5QfCSOEHCo4BCglkb3VibGUuZ3QagAEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwrEAQoMZG91YmxlLmd0X2x0GrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzgEKFmRvdWJsZS5ndF9sdF9leGNsdXNpdmUaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrUAQoNZG91YmxlLmd0X2x0ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCt4BChdkb3VibGUuZ3RfbHRlX2V4Y2x1c2l2ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESvwgKA2d0ZRgFIAEoAUKvCMJIqwgKnAEKCmRvdWJsZS5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0wEKDWRvdWJsZS5ndGVfbHQawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCt0BChdkb3VibGUuZ3RlX2x0X2V4Y2x1c2l2ZRrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK4wEKDmRvdWJsZS5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrtAQoYZG91YmxlLmd0ZV9sdGVfZXhjbHVzaXZlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoAUJ0wkhxCm8KCWRvdWJsZS5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygBQmfCSGQKYgoNZG91YmxlLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEnYKBmZpbml0ZRgIIAEoCEJmwkhjCmEKDWRvdWJsZS5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnEiwKB2V4YW1wbGUYCSADKAFCG8JIGAoWCg5kb3VibGUuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ijBUKCkludDMyUnVsZXMSgwEKBWNvbnN0GAEgASgFQnTCSHEKbwoLaW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKKAQoCbHQYAiABKAVCfMJIeQp3CghpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKcAQoDbHRlGAMgASgFQowBwkiIAQqFAQoJaW50MzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKXBwoCZ3QYBCABKAVCiAfCSIQHCnoKCGludDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50MzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES4wcKA2d0ZRgFIAEoBULTB8JIzwcKiAEKCWludDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsIBCgxpbnQzMi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKygEKFmludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtIBCg1pbnQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtoBChdpbnQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ/CgJpbhgGIAMoBUJzwkhwCm4KCGludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ2CgZub3RfaW4YByADKAVCZsJIYwphCgxpbnQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIrCgdleGFtcGxlGAggAygFQhrCSBcKFQoNaW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ijBUKCkludDY0UnVsZXMSgwEKBWNvbnN0GAEgASgDQnTCSHEKbwoLaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKKAQoCbHQYAiABKANCfMJIeQp3CghpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKcAQoDbHRlGAMgASgDQowBwkiIAQqFAQoJaW50NjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKXBwoCZ3QYBCABKANCiAfCSIQHCnoKCGludDY0Lmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50NjQuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES4wcKA2d0ZRgFIAEoA0LTB8JIzwcKiAEKCWludDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsIBCgxpbnQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKygEKFmludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtIBCg1pbnQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtoBChdpbnQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ/CgJpbhgGIAMoA0JzwkhwCm4KCGludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ2CgZub3RfaW4YByADKANCZsJIYwphCgxpbnQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIrCgdleGFtcGxlGAkgAygDQhrCSBcKFQoNaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1VJbnQzMlJ1bGVzEoQBCgVjb25zdBgBIAEoDUJ1wkhyCnAKDHVpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoDUJ9wkh6CngKCXVpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgNQo0BwkiJAQqGAQoKdWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgNQo0HwkiJBwp7Cgl1aW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgx1aW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZ1aW50MzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXVpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChd1aW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoDULYB8JI1AcKiQEKCnVpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoDUJ0wkhxCm8KCXVpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygNQmfCSGQKYgoNdWludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKA1CG8JIGAoWCg51aW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1VJbnQ2NFJ1bGVzEoQBCgVjb25zdBgBIAEoBEJ1wkhyCnAKDHVpbnQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoBEJ9wkh6CngKCXVpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgEQo0BwkiJAQqGAQoKdWludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgEQo0HwkiJBwp7Cgl1aW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgx1aW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZ1aW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXVpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChd1aW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoBELYB8JI1AcKiQEKCnVpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoBEJ0wkhxCm8KCXVpbnQ2NC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygEQmfCSGQKYgoNdWludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKARCG8JIGAoWCg51aW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1NJbnQzMlJ1bGVzEoQBCgVjb25zdBgBIAEoEUJ1wkhyCnAKDHNpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoEUJ9wkh6CngKCXNpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgRQo0BwkiJAQqGAQoKc2ludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgRQo0HwkiJBwp7CglzaW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgxzaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZzaW50MzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXNpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChdzaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoEULYB8JI1AcKiQEKCnNpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoEUJ0wkhxCm8KCXNpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygRQmfCSGQKYgoNc2ludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBFCG8JIGAoWCg5zaW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1NJbnQ2NFJ1bGVzEoQBCgVjb25zdBgBIAEoEkJ1wkhyCnAKDHNpbnQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoEkJ9wkh6CngKCXNpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgSQo0BwkiJAQqGAQoKc2ludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgSQo0HwkiJBwp7CglzaW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgxzaW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZzaW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXNpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChdzaW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoEkLYB8JI1AcKiQEKCnNpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoEkJ0wkhxCm8KCXNpbnQ2NC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygSQmfCSGQKYgoNc2ludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBJCG8JIGAoWCg5zaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4irxUKDEZpeGVkMzJSdWxlcxKFAQoFY29uc3QYASABKAdCdsJIcwpxCg1maXhlZDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSjAEKAmx0GAIgASgHQn7CSHsKeQoKZml4ZWQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKeAQoDbHRlGAMgASgHQo4BwkiKAQqHAQoLZml4ZWQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEqEHCgJndBgEIAEoB0KSB8JIjgcKfAoKZml4ZWQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtQEKDWZpeGVkMzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr0BChdmaXhlZDMyLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsUBCg5maXhlZDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzQEKGGZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES7QcKA2d0ZRgFIAEoB0LdB8JI2QcKigEKC2ZpeGVkMzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxAEKDmZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCswBChhmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtQBCg9maXhlZDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3AEKGWZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgQEKAmluGAYgAygHQnXCSHIKcAoKZml4ZWQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSeAoGbm90X2luGAcgAygHQmjCSGUKYwoOZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxItCgdleGFtcGxlGAggAygHQhzCSBkKFwoPZml4ZWQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKvFQoMRml4ZWQ2NFJ1bGVzEoUBCgVjb25zdBgBIAEoBkJ2wkhzCnEKDWZpeGVkNjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKMAQoCbHQYAiABKAZCfsJIewp5CgpmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp4BCgNsdGUYAyABKAZCjgHCSIoBCocBCgtmaXhlZDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASoQcKAmd0GAQgASgGQpIHwkiOBwp8CgpmaXhlZDY0Lmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq1AQoNZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKF2ZpeGVkNjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxQEKDmZpeGVkNjQuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrNAQoYZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLtBwoDZ3RlGAUgASgGQt0HwkjZBwqKAQoLZml4ZWQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrEAQoOZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKGGZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1AEKD2ZpeGVkNjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrcAQoZZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKBAQoCaW4YBiADKAZCdcJIcgpwCgpmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ4CgZub3RfaW4YByADKAZCaMJIZQpjCg5maXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi0KB2V4YW1wbGUYCCADKAZCHMJIGQoXCg9maXhlZDY0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIsAVCg1TRml4ZWQzMlJ1bGVzEoYBCgVjb25zdBgBIAEoD0J3wkh0CnIKDnNmaXhlZDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSjQEKAmx0GAIgASgPQn/CSHwKegoLc2ZpeGVkMzIubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASnwEKA2x0ZRgDIAEoD0KPAcJIiwEKiAEKDHNmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASpgcKAmd0GAQgASgPQpcHwkiTBwp9CgtzZml4ZWQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDnNmaXhlZDMyLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYc2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD3NmaXhlZDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGXNmaXhlZDMyLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEvIHCgNndGUYBSABKA9C4gfCSN4HCosBCgxzZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESggEKAmluGAYgAygPQnbCSHMKcQoLc2ZpeGVkMzIuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnkKBm5vdF9pbhgHIAMoD0JpwkhmCmQKD3NmaXhlZDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi4KB2V4YW1wbGUYCCADKA9CHcJIGgoYChBzZml4ZWQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLAFQoNU0ZpeGVkNjRSdWxlcxKGAQoFY29uc3QYASABKBBCd8JIdApyCg5zZml4ZWQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEo0BCgJsdBgCIAEoEEJ/wkh8CnoKC3NmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp8BCgNsdGUYAyABKBBCjwHCSIsBCogBCgxzZml4ZWQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEqYHCgJndBgEIAEoEEKXB8JIkwcKfQoLc2ZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrYBCg5zZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvgEKGHNmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsYBCg9zZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs4BChlzZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLyBwoDZ3RlGAUgASgQQuIHwkjeBwqLAQoMc2ZpeGVkNjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxQEKD3NmaXhlZDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrNAQoZc2ZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1QEKEHNmaXhlZDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3QEKGnNmaXhlZDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoIBCgJpbhgGIAMoEEJ2wkhzCnEKC3NmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ5CgZub3RfaW4YByADKBBCacJIZgpkCg9zZml4ZWQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIuCgdleGFtcGxlGAggAygQQh3CSBoKGAoQc2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ixwEKCUJvb2xSdWxlcxKCAQoFY29uc3QYASABKAhCc8JIcApuCgpib29sLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSKgoHZXhhbXBsZRgCIAMoCEIZwkgWChQKDGJvb2wuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIpA3CgtTdHJpbmdSdWxlcxKGAQoFY29uc3QYASABKAlCd8JIdApyCgxzdHJpbmcuY29uc3QaYnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgYCVzYCcuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEn4KA2xlbhgTIAEoBEJxwkhuCmwKCnN0cmluZy5sZW4aXnVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJycSmQEKB21pbl9sZW4YAiABKARChwHCSIMBCoABCg5zdHJpbmcubWluX2xlbhpudWludCh0aGlzLnNpemUoKSkgPCBydWxlcy5taW5fbGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0ICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubWluX2xlbl0pIDogJycSlwEKB21heF9sZW4YAyABKARChQHCSIEBCn8KDnN0cmluZy5tYXhfbGVuGm11aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbW9zdCAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLm1heF9sZW5dKSA6ICcnEpsBCglsZW5fYnl0ZXMYFCABKARChwHCSIMBCoABChBzdHJpbmcubGVuX2J5dGVzGmx1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgIT0gcnVsZXMubGVuX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl9ieXRlc10pIDogJycSowEKCW1pbl9ieXRlcxgEIAEoBEKPAcJIiwEKiAEKEHN0cmluZy5taW5fYnl0ZXMadHVpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fYnl0ZXNdKSA6ICcnEqIBCgltYXhfYnl0ZXMYBSABKARCjgHCSIoBCocBChBzdHJpbmcubWF4X2J5dGVzGnN1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgPiBydWxlcy5tYXhfYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbW9zdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5tYXhfYnl0ZXNdKSA6ICcnEo0BCgdwYXR0ZXJuGAYgASgJQnzCSHkKdwoOc3RyaW5nLnBhdHRlcm4aZSF0aGlzLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgZG9lcyBub3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnEoQBCgZwcmVmaXgYByABKAlCdMJIcQpvCg1zdHJpbmcucHJlZml4Gl4hdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBwcmVmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnEoIBCgZzdWZmaXgYCCABKAlCcsJIbwptCg1zdHJpbmcuc3VmZml4GlwhdGhpcy5lbmRzV2l0aChydWxlcy5zdWZmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgc3VmZml4IGAlc2AnLmZvcm1hdChbcnVsZXMuc3VmZml4XSkgOiAnJxKQAQoIY29udGFpbnMYCSABKAlCfsJIewp5Cg9zdHJpbmcuY29udGFpbnMaZiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJxKYAQoMbm90X2NvbnRhaW5zGBcgASgJQoEBwkh+CnwKE3N0cmluZy5ub3RfY29udGFpbnMaZXRoaXMuY29udGFpbnMocnVsZXMubm90X2NvbnRhaW5zKSA/ICd2YWx1ZSBjb250YWlucyBzdWJzdHJpbmcgYCVzYCcuZm9ybWF0KFtydWxlcy5ub3RfY29udGFpbnNdKSA6ICcnEoABCgJpbhgKIAMoCUJ0wkhxCm8KCXN0cmluZy5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAsgAygJQmfCSGQKYgoNc3RyaW5nLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEt8BCgVlbWFpbBgMIAEoCELNAcJIyQEKYQoMc3RyaW5nLmVtYWlsEiN2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcxosIXJ1bGVzLmVtYWlsIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0VtYWlsKCkKZAoSc3RyaW5nLmVtYWlsX2VtcHR5EjJ2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzcxoaIXJ1bGVzLmVtYWlsIHx8IHRoaXMgIT0gJydIABLnAQoIaG9zdG5hbWUYDSABKAhC0gHCSM4BCmUKD3N0cmluZy5ob3N0bmFtZRIedmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIABLHAQoCaXAYDiABKAhCuAHCSLQBClUKCXN0cmluZy5pcBIgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIGFkZHJlc3MaJiFydWxlcy5pcCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCgpClsKD3N0cmluZy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaFyFydWxlcy5pcCB8fCB0aGlzICE9ICcnSAAS1gEKBGlwdjQYDyABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY0EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzGikhcnVsZXMuaXB2NCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg0KQphChFzdHJpbmcuaXB2NF9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcxoZIXJ1bGVzLmlwdjQgfHwgdGhpcyAhPSAnJ0gAEtYBCgRpcHY2GBAgASgIQsUBwkjBAQpcCgtzdHJpbmcuaXB2NhIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxopIXJ1bGVzLmlwdjYgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoNikKYQoRc3RyaW5nLmlwdjZfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MaGSFydWxlcy5pcHY2IHx8IHRoaXMgIT0gJydIABK/AQoDdXJpGBEgASgIQq8BwkirAQpRCgpzdHJpbmcudXJpEhl2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVJJGighcnVsZXMudXJpIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc1VyaSgpClYKEHN0cmluZy51cmlfZW1wdHkSKHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVUkkaGCFydWxlcy51cmkgfHwgdGhpcyAhPSAnJ0gAEnAKB3VyaV9yZWYYEiABKAhCXcJIWgpYCg5zdHJpbmcudXJpX3JlZhIjdmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVSSSBSZWZlcmVuY2UaISFydWxlcy51cmlfcmVmIHx8IHRoaXMuaXNVcmlSZWYoKUgAEpACCgdhZGRyZXNzGBUgASgIQvwBwkj4AQqBAQoOc3RyaW5nLmFkZHJlc3MSLXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0bmFtZSwgb3IgaXAgYWRkcmVzcxpAIXJ1bGVzLmFkZHJlc3MgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKSB8fCB0aGlzLmlzSXAoKQpyChRzdHJpbmcuYWRkcmVzc19lbXB0eRI8dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGhwhcnVsZXMuYWRkcmVzcyB8fCB0aGlzICE9ICcnSAASmAIKBHV1aWQYFiABKAhChwLCSIMCCqUBCgtzdHJpbmcudXVpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeiFydWxlcy51dWlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpClkKEXN0cmluZy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBoZIXJ1bGVzLnV1aWQgfHwgdGhpcyAhPSAnJ0gAEvABCgV0dXVpZBghIAEoCELeAcJI2gEKcwoMc3RyaW5nLnR1dWlkEiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgdHJpbW1lZCBVVUlEGj8hcnVsZXMudHV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXszMn0kJykKYwoSc3RyaW5nLnR1dWlkX2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgdHJpbW1lZCBVVUlEGhohcnVsZXMudHV1aWQgfHwgdGhpcyAhPSAnJ0gAEpYCChFpcF93aXRoX3ByZWZpeGxlbhgaIAEoCEL4AcJI9AEKeAoYc3RyaW5nLmlwX3dpdGhfcHJlZml4bGVuEh92YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVAgcHJlZml4GjshcnVsZXMuaXBfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoKQp4Ch5zdHJpbmcuaXBfd2l0aF9wcmVmaXhsZW5fZW1wdHkSLnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUCBwcmVmaXgaJiFydWxlcy5pcF93aXRoX3ByZWZpeGxlbiB8fCB0aGlzICE9ICcnSAASzwIKE2lwdjRfd2l0aF9wcmVmaXhsZW4YGyABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQpCpIBCiBzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIABLPAgoTaXB2Nl93aXRoX3ByZWZpeGxlbhgcIAEoCEKvAsJIqwIKkwEKGnN0cmluZy5pcHY2X3dpdGhfcHJlZml4bGVuEjV2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBo+IXJ1bGVzLmlwdjZfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNikKkgEKIHN0cmluZy5pcHY2X3dpdGhfcHJlZml4bGVuX2VtcHR5EkR2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NiBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBooIXJ1bGVzLmlwdjZfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAEvIBCglpcF9wcmVmaXgYHSABKAhC3AHCSNgBCmwKEHN0cmluZy5pcF9wcmVmaXgSH3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBwcmVmaXgaNyFydWxlcy5pcF9wcmVmaXggfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgodHJ1ZSkKaAoWc3RyaW5nLmlwX3ByZWZpeF9lbXB0eRIudmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIHByZWZpeBoeIXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzICE9ICcnSAASgwIKC2lwdjRfcHJlZml4GB4gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2NF9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IHByZWZpeBo8IXJ1bGVzLmlwdjRfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQsIHRydWUpCm4KGHN0cmluZy5pcHY0X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgcHJlZml4GiAhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAEoMCCgtpcHY2X3ByZWZpeBgfIAEoCELrAcJI5wEKdQoSc3RyaW5nLmlwdjZfcHJlZml4EiF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBwcmVmaXgaPCFydWxlcy5pcHY2X3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2LCB0cnVlKQpuChhzdHJpbmcuaXB2Nl9wcmVmaXhfZW1wdHkSMHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IHByZWZpeBogIXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgIT0gJydIABK1AgoNaG9zdF9hbmRfcG9ydBggIAEoCEKbAsJIlwIKmQEKFHN0cmluZy5ob3N0X2FuZF9wb3J0EkF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaG9zdCAoaG9zdG5hbWUgb3IgSVAgYWRkcmVzcykgYW5kIHBvcnQgcGFpcho+IXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdEFuZFBvcnQodHJ1ZSkKeQoac3RyaW5nLmhvc3RfYW5kX3BvcnRfZW1wdHkSN3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0IGFuZCBwb3J0IHBhaXIaIiFydWxlcy5ob3N0X2FuZF9wb3J0IHx8IHRoaXMgIT0gJydIABKoBQoQd2VsbF9rbm93bl9yZWdleBgYIAEoDjIYLmJ1Zi52YWxpZGF0ZS5Lbm93blJlZ2V4QvEEwkjtBArwAQojc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWUSJnZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGqABcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeOj9bMC05YS16QS1aISMkJSZcJyorLS5eX3x+XHg2MF0rJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKyQnKQqNAQopc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWVfZW1wdHkSNXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGilydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyAhPSAnJwrnAQokc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX3ZhbHVlEid2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgdmFsdWUalQFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDIgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeW15cdTAwMDAtXHUwMDA4XHUwMDBBLVx1MDAxRlx1MDA3Rl0qJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKiQnKUgAEg4KBnN0cmljdBgZIAEoCBIsCgdleGFtcGxlGCIgAygJQhvCSBgKFgoOc3RyaW5nLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duIuoQCgpCeXRlc1J1bGVzEoABCgVjb25zdBgBIAEoDEJxwkhuCmwKC2J5dGVzLmNvbnN0Gl10aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGJlICV4Jy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSeAoDbGVuGA0gASgEQmvCSGgKZgoJYnl0ZXMubGVuGll1aW50KHRoaXMuc2l6ZSgpKSAhPSBydWxlcy5sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubGVuXSkgOiAnJxKQAQoHbWluX2xlbhgCIAEoBEJ/wkh8CnoKDWJ5dGVzLm1pbl9sZW4aaXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJxKIAQoHbWF4X2xlbhgDIAEoBEJ3wkh0CnIKDWJ5dGVzLm1heF9sZW4aYXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2xlbiA/ICd2YWx1ZSBtdXN0IGJlIGF0IG1vc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWF4X2xlbl0pIDogJycSkAEKB3BhdHRlcm4YBCABKAlCf8JIfAp6Cg1ieXRlcy5wYXR0ZXJuGmkhc3RyaW5nKHRoaXMpLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgbXVzdCBtYXRjaCByZWdleCBwYXR0ZXJuIGAlc2AnLmZvcm1hdChbcnVsZXMucGF0dGVybl0pIDogJycSgQEKBnByZWZpeBgFIAEoDEJxwkhuCmwKDGJ5dGVzLnByZWZpeBpcIXRoaXMuc3RhcnRzV2l0aChydWxlcy5wcmVmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgcHJlZml4ICV4Jy5mb3JtYXQoW3J1bGVzLnByZWZpeF0pIDogJycSfwoGc3VmZml4GAYgASgMQm/CSGwKagoMYnl0ZXMuc3VmZml4GlohdGhpcy5lbmRzV2l0aChydWxlcy5zdWZmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgc3VmZml4ICV4Jy5mb3JtYXQoW3J1bGVzLnN1ZmZpeF0pIDogJycSgwEKCGNvbnRhaW5zGAcgASgMQnHCSG4KbAoOYnl0ZXMuY29udGFpbnMaWiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluICV4Jy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJxKnAQoCaW4YCCADKAxCmgHCSJYBCpMBCghieXRlcy5pbhqGAWdldEZpZWxkKHJ1bGVzLCAnaW4nKS5zaXplKCkgPiAwICYmICEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgJIAMoDEJmwkhjCmEKDGJ5dGVzLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEusBCgJpcBgKIAEoCELcAcJI2AEKdAoIYnl0ZXMuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGkYhcnVsZXMuaXAgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0IHx8IHRoaXMuc2l6ZSgpID09IDE2CmAKDmJ5dGVzLmlwX2VtcHR5Ei92YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcxodIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpICE9IDBIABLkAQoEaXB2NBgLIAEoCELTAcJIzwEKZQoKYnl0ZXMuaXB2NBIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcxozIXJ1bGVzLmlwdjQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0CmYKEGJ5dGVzLmlwdjRfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY0IGFkZHJlc3MaHyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpICE9IDBIABLlAQoEaXB2NhgMIAEoCELUAcJI0AEKZgoKYnl0ZXMuaXB2NhIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxo0IXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpmChBieXRlcy5pcHY2X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NiBhZGRyZXNzGh8hcnVsZXMuaXB2NiB8fCB0aGlzLnNpemUoKSAhPSAwSAASKwoHZXhhbXBsZRgOIAMoDEIawkgXChUKDWJ5dGVzLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duItQDCglFbnVtUnVsZXMSggEKBWNvbnN0GAEgASgFQnPCSHAKbgoKZW51bS5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEhQKDGRlZmluZWRfb25seRgCIAEoCBJ+CgJpbhgDIAMoBUJywkhvCm0KB2VudW0uaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnUKBm5vdF9pbhgEIAMoBUJlwkhiCmAKC2VudW0ubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKgoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIvsDCg1SZXBlYXRlZFJ1bGVzEp4BCgltaW5faXRlbXMYASABKARCigHCSIYBCoMBChJyZXBlYXRlZC5taW5faXRlbXMabXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBhdCBsZWFzdCAlZCBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1pbl9pdGVtc10pIDogJycSogEKCW1heF9pdGVtcxgCIAEoBEKOAcJIigEKhwEKEnJlcGVhdGVkLm1heF9pdGVtcxpxdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfaXRlbXMgPyAndmFsdWUgbXVzdCBjb250YWluIG5vIG1vcmUgdGhhbiAlcyBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1heF9pdGVtc10pIDogJycScAoGdW5pcXVlGAMgASgIQmDCSF0KWwoPcmVwZWF0ZWQudW5pcXVlEihyZXBlYXRlZCB2YWx1ZSBtdXN0IGNvbnRhaW4gdW5pcXVlIGl0ZW1zGh4hcnVsZXMudW5pcXVlIHx8IHRoaXMudW5pcXVlKCkSJwoFaXRlbXMYBCABKAsyGC5idWYudmFsaWRhdGUuRmllbGRSdWxlcyoJCOgHEICAgIACIooDCghNYXBSdWxlcxKPAQoJbWluX3BhaXJzGAEgASgEQnzCSHkKdwoNbWFwLm1pbl9wYWlycxpmdWludCh0aGlzLnNpemUoKSkgPCBydWxlcy5taW5fcGFpcnMgPyAnbWFwIG11c3QgYmUgYXQgbGVhc3QgJWQgZW50cmllcycuZm9ybWF0KFtydWxlcy5taW5fcGFpcnNdKSA6ICcnEo4BCgltYXhfcGFpcnMYAiABKARCe8JIeAp2Cg1tYXAubWF4X3BhaXJzGmV1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBtb3N0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWF4X3BhaXJzXSkgOiAnJxImCgRrZXlzGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMSKAoGdmFsdWVzGAUgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMqCQjoBxCAgICAAiImCghBbnlSdWxlcxIKCgJpbhgCIAMoCRIOCgZub3RfaW4YAyADKAkimRcKDUR1cmF0aW9uUnVsZXMSoQEKBWNvbnN0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnfCSHQKcgoOZHVyYXRpb24uY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKoAQoCbHQYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cf8JIfAp6CgtkdXJhdGlvbi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABK6AQoDbHRlGAQgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQo8BwkiLAQqIAQoMZHVyYXRpb24ubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABLBBwoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25ClwfCSJMHCn0KC2R1cmF0aW9uLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOZHVyYXRpb24uZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPZHVyYXRpb24uZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZZHVyYXRpb24uZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESjQgKA2d0ZRgGIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkLiB8JI3gcKiwEKDGR1cmF0aW9uLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9kdXJhdGlvbi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGWR1cmF0aW9uLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBkdXJhdGlvbi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpkdXJhdGlvbi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKdAQoCaW4YByADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CdsJIcwpxCgtkdXJhdGlvbi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSlAEKBm5vdF9pbhgIIAMoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkJpwkhmCmQKD2R1cmF0aW9uLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEkkKB2V4YW1wbGUYCSADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CHcJIGgoYChBkdXJhdGlvbi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKSGAoOVGltZXN0YW1wUnVsZXMSowEKBWNvbnN0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEJ4wkh1CnMKD3RpbWVzdGFtcC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEqsBCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCgAHCSH0KewoMdGltZXN0YW1wLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAErwBCgNsdGUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQpABwkiMAQqJAQoNdGltZXN0YW1wLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASbAoGbHRfbm93GAcgASgIQlrCSFcKVQoQdGltZXN0YW1wLmx0X25vdxpBKHJ1bGVzLmx0X25vdyAmJiB0aGlzID4gbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cnIDogJydIABLHBwoCZ3QYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQpwHwkiYBwp+Cgx0aW1lc3RhbXAuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrcBCg90aW1lc3RhbXAuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr8BChl0aW1lc3RhbXAuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxwEKEHRpbWVzdGFtcC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs8BChp0aW1lc3RhbXAuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESkwgKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBC5wfCSOMHCowBCg10aW1lc3RhbXAuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxgEKEHRpbWVzdGFtcC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzgEKGnRpbWVzdGFtcC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrWAQoRdGltZXN0YW1wLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3gEKG3RpbWVzdGFtcC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJvCgZndF9ub3cYCCABKAhCXcJIWgpYChB0aW1lc3RhbXAuZ3Rfbm93GkQocnVsZXMuZ3Rfbm93ICYmIHRoaXMgPCBub3cpID8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG5vdycgOiAnJ0gBErgBCgZ3aXRoaW4YCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CjAHCSIgBCoUBChB0aW1lc3RhbXAud2l0aGluGnF0aGlzIDwgbm93LXJ1bGVzLndpdGhpbiB8fCB0aGlzID4gbm93K3J1bGVzLndpdGhpbiA/ICd2YWx1ZSBtdXN0IGJlIHdpdGhpbiAlcyBvZiBub3cnLmZvcm1hdChbcnVsZXMud2l0aGluXSkgOiAnJxJLCgdleGFtcGxlGAogAygLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIewkgbChkKEXRpbWVzdGFtcC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiI5CgpWaW9sYXRpb25zEisKCnZpb2xhdGlvbnMYASADKAsyFy5idWYudmFsaWRhdGUuVmlvbGF0aW9uIp8BCglWaW9sYXRpb24SJgoFZmllbGQYBSABKAsyFy5idWYudmFsaWRhdGUuRmllbGRQYXRoEiUKBHJ1bGUYBiABKAsyFy5idWYudmFsaWRhdGUuRmllbGRQYXRoEg8KB3J1bGVfaWQYAiABKAkSDwoHbWVzc2FnZRgDIAEoCRIPCgdmb3Jfa2V5GAQgASgISgQIARACUgpmaWVsZF9wYXRoIj0KCUZpZWxkUGF0aBIwCghlbGVtZW50cxgBIAMoCzIeLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhFbGVtZW50IukCChBGaWVsZFBhdGhFbGVtZW50EhQKDGZpZWxkX251bWJlchgBIAEoBRISCgpmaWVsZF9uYW1lGAIgASgJEj4KCmZpZWxkX3R5cGUYAyABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRI8CghrZXlfdHlwZRgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlEj4KCnZhbHVlX3R5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRIPCgVpbmRleBgGIAEoBEgAEhIKCGJvb2xfa2V5GAcgASgISAASEQoHaW50X2tleRgIIAEoA0gAEhIKCHVpbnRfa2V5GAkgASgESAASFAoKc3RyaW5nX2tleRgKIAEoCUgAQgsKCXN1YnNjcmlwdCqhAQoGSWdub3JlEhYKEklHTk9SRV9VTlNQRUNJRklFRBAAEhgKFElHTk9SRV9JRl9aRVJPX1ZBTFVFEAESEQoNSUdOT1JFX0FMV0FZUxADIgQIAhACKgxJR05PUkVfRU1QVFkqDklHTk9SRV9ERUZBVUxUKhdJR05PUkVfSUZfREVGQVVMVF9WQUxVRSoVSUdOT1JFX0lGX1VOUE9QVUxBVEVEKm4KCktub3duUmVnZXgSGwoXS05PV05fUkVHRVhfVU5TUEVDSUZJRUQQABIgChxLTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9OQU1FEAESIQodS05PV05fUkVHRVhfSFRUUF9IRUFERVJfVkFMVUUQAjpWCgdtZXNzYWdlEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGIcJIAEoCzIaLmJ1Zi52YWxpZGF0ZS5NZXNzYWdlUnVsZXNSB21lc3NhZ2U6TgoFb25lb2YSHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zGIcJIAEoCzIYLmJ1Zi52YWxpZGF0ZS5PbmVvZlJ1bGVzUgVvbmVvZjpOCgVmaWVsZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYhwkgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXNSBWZpZWxkOl0KCnByZWRlZmluZWQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIgJIAEoCzIdLmJ1Zi52YWxpZGF0ZS5QcmVkZWZpbmVkUnVsZXNSCnByZWRlZmluZWRCbgoSYnVpbGQuYnVmLnZhbGlkYXRlQg1WYWxpZGF0ZVByb3RvUAFaR2J1Zi5idWlsZC9nZW4vZ28vYnVmYnVpbGQvcHJvdG92YWxpZGF0ZS9wcm90b2NvbGJ1ZmZlcnMvZ28vYnVmL3ZhbGlkYXRl\", [file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_timestamp]);\n\n/**\n * Describes the message buf.validate.Rule.\n * Use `create(RuleSchema)` to create a new message.\n */\nexport const RuleSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 0);\n\n/**\n * Describes the message buf.validate.MessageRules.\n * Use `create(MessageRulesSchema)` to create a new message.\n */\nexport const MessageRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 1);\n\n/**\n * Describes the message buf.validate.MessageOneofRule.\n * Use `create(MessageOneofRuleSchema)` to create a new message.\n */\nexport const MessageOneofRuleSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 2);\n\n/**\n * Describes the message buf.validate.OneofRules.\n * Use `create(OneofRulesSchema)` to create a new message.\n */\nexport const OneofRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 3);\n\n/**\n * Describes the message buf.validate.FieldRules.\n * Use `create(FieldRulesSchema)` to create a new message.\n */\nexport const FieldRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 4);\n\n/**\n * Describes the message buf.validate.PredefinedRules.\n * Use `create(PredefinedRulesSchema)` to create a new message.\n */\nexport const PredefinedRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 5);\n\n/**\n * Describes the message buf.validate.FloatRules.\n * Use `create(FloatRulesSchema)` to create a new message.\n */\nexport const FloatRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 6);\n\n/**\n * Describes the message buf.validate.DoubleRules.\n * Use `create(DoubleRulesSchema)` to create a new message.\n */\nexport const DoubleRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 7);\n\n/**\n * Describes the message buf.validate.Int32Rules.\n * Use `create(Int32RulesSchema)` to create a new message.\n */\nexport const Int32RulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 8);\n\n/**\n * Describes the message buf.validate.Int64Rules.\n * Use `create(Int64RulesSchema)` to create a new message.\n */\nexport const Int64RulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 9);\n\n/**\n * Describes the message buf.validate.UInt32Rules.\n * Use `create(UInt32RulesSchema)` to create a new message.\n */\nexport const UInt32RulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 10);\n\n/**\n * Describes the message buf.validate.UInt64Rules.\n * Use `create(UInt64RulesSchema)` to create a new message.\n */\nexport const UInt64RulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 11);\n\n/**\n * Describes the message buf.validate.SInt32Rules.\n * Use `create(SInt32RulesSchema)` to create a new message.\n */\nexport const SInt32RulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 12);\n\n/**\n * Describes the message buf.validate.SInt64Rules.\n * Use `create(SInt64RulesSchema)` to create a new message.\n */\nexport const SInt64RulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 13);\n\n/**\n * Describes the message buf.validate.Fixed32Rules.\n * Use `create(Fixed32RulesSchema)` to create a new message.\n */\nexport const Fixed32RulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 14);\n\n/**\n * Describes the message buf.validate.Fixed64Rules.\n * Use `create(Fixed64RulesSchema)` to create a new message.\n */\nexport const Fixed64RulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 15);\n\n/**\n * Describes the message buf.validate.SFixed32Rules.\n * Use `create(SFixed32RulesSchema)` to create a new message.\n */\nexport const SFixed32RulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 16);\n\n/**\n * Describes the message buf.validate.SFixed64Rules.\n * Use `create(SFixed64RulesSchema)` to create a new message.\n */\nexport const SFixed64RulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 17);\n\n/**\n * Describes the message buf.validate.BoolRules.\n * Use `create(BoolRulesSchema)` to create a new message.\n */\nexport const BoolRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 18);\n\n/**\n * Describes the message buf.validate.StringRules.\n * Use `create(StringRulesSchema)` to create a new message.\n */\nexport const StringRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 19);\n\n/**\n * Describes the message buf.validate.BytesRules.\n * Use `create(BytesRulesSchema)` to create a new message.\n */\nexport const BytesRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 20);\n\n/**\n * Describes the message buf.validate.EnumRules.\n * Use `create(EnumRulesSchema)` to create a new message.\n */\nexport const EnumRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 21);\n\n/**\n * Describes the message buf.validate.RepeatedRules.\n * Use `create(RepeatedRulesSchema)` to create a new message.\n */\nexport const RepeatedRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 22);\n\n/**\n * Describes the message buf.validate.MapRules.\n * Use `create(MapRulesSchema)` to create a new message.\n */\nexport const MapRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 23);\n\n/**\n * Describes the message buf.validate.AnyRules.\n * Use `create(AnyRulesSchema)` to create a new message.\n */\nexport const AnyRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 24);\n\n/**\n * Describes the message buf.validate.DurationRules.\n * Use `create(DurationRulesSchema)` to create a new message.\n */\nexport const DurationRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 25);\n\n/**\n * Describes the message buf.validate.TimestampRules.\n * Use `create(TimestampRulesSchema)` to create a new message.\n */\nexport const TimestampRulesSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 26);\n\n/**\n * Describes the message buf.validate.Violations.\n * Use `create(ViolationsSchema)` to create a new message.\n */\nexport const ViolationsSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 27);\n\n/**\n * Describes the message buf.validate.Violation.\n * Use `create(ViolationSchema)` to create a new message.\n */\nexport const ViolationSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 28);\n\n/**\n * Describes the message buf.validate.FieldPath.\n * Use `create(FieldPathSchema)` to create a new message.\n */\nexport const FieldPathSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 29);\n\n/**\n * Describes the message buf.validate.FieldPathElement.\n * Use `create(FieldPathElementSchema)` to create a new message.\n */\nexport const FieldPathElementSchema = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 30);\n\n/**\n * Describes the enum buf.validate.Ignore.\n */\nexport const IgnoreSchema = /*@__PURE__*/\n enumDesc(file_buf_validate_validate, 0);\n\n/**\n * Specifies how `FieldRules.ignore` behaves, depending on the field's value, and\n * whether the field tracks presence.\n *\n * @generated from enum buf.validate.Ignore\n */\nexport const Ignore = /*@__PURE__*/\n tsEnum(IgnoreSchema);\n\n/**\n * Describes the enum buf.validate.KnownRegex.\n */\nexport const KnownRegexSchema = /*@__PURE__*/\n enumDesc(file_buf_validate_validate, 1);\n\n/**\n * KnownRegex contains some well-known patterns.\n *\n * @generated from enum buf.validate.KnownRegex\n */\nexport const KnownRegex = /*@__PURE__*/\n tsEnum(KnownRegexSchema);\n\n/**\n * Rules specify the validations to be performed on this message. By default,\n * no validation is performed against a message.\n *\n * @generated from extension: optional buf.validate.MessageRules message = 1159;\n */\nexport const message = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 0);\n\n/**\n * Rules specify the validations to be performed on this oneof. By default,\n * no validation is performed against a oneof.\n *\n * @generated from extension: optional buf.validate.OneofRules oneof = 1159;\n */\nexport const oneof = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 1);\n\n/**\n * Rules specify the validations to be performed on this field. By default,\n * no validation is performed against a field.\n *\n * @generated from extension: optional buf.validate.FieldRules field = 1159;\n */\nexport const field = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 2);\n\n/**\n * Specifies predefined rules. When extending a standard rule message,\n * this adds additional CEL expressions that apply when the extension is used.\n *\n * ```proto\n * extend buf.validate.Int32Rules {\n * bool is_zero [(buf.validate.predefined).cel = {\n * id: \"int32.is_zero\",\n * message: \"value must be zero\",\n * expression: \"!rule || this == 0\",\n * }];\n * }\n *\n * message Foo {\n * int32 reserved = 1 [(buf.validate.field).int32.(is_zero) = true];\n * }\n * ```\n *\n * @generated from extension: optional buf.validate.PredefinedRules predefined = 1160;\n */\nexport const predefined = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 3);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/fieldmask/v1/option.proto (package tailor.fieldmask.v1, syntax proto3)\n/* eslint-disable */\n\nimport { extDesc, fileDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_google_protobuf_descriptor } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Describes the file tailor/fieldmask/v1/option.proto.\n */\nexport const file_tailor_fieldmask_v1_option = /*@__PURE__*/\n fileDesc(\"CiB0YWlsb3IvZmllbGRtYXNrL3YxL29wdGlvbi5wcm90bxITdGFpbG9yLmZpZWxkbWFzay52MTo1CgVtYXNrcxIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYkb8FIAMoCVIFbWFza3NiBnByb3RvMw\", [file_google_protobuf_descriptor]);\n\n/**\n * @generated from extension: repeated string masks = 90001;\n */\nexport const masks = /*@__PURE__*/\n extDesc(file_tailor_fieldmask_v1_option, 0);\n\n","// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.6.3\n// @generated from file google/api/field_behavior.proto (package google.api, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, extDesc, fileDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_google_protobuf_descriptor } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Describes the file google/api/field_behavior.proto.\n */\nexport const file_google_api_field_behavior = /*@__PURE__*/\n fileDesc(\"Ch9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvEgpnb29nbGUuYXBpKrYBCg1GaWVsZEJlaGF2aW9yEh4KGkZJRUxEX0JFSEFWSU9SX1VOU1BFQ0lGSUVEEAASDAoIT1BUSU9OQUwQARIMCghSRVFVSVJFRBACEg8KC09VVFBVVF9PTkxZEAMSDgoKSU5QVVRfT05MWRAEEg0KCUlNTVVUQUJMRRAFEhIKDlVOT1JERVJFRF9MSVNUEAYSFQoRTk9OX0VNUFRZX0RFRkFVTFQQBxIOCgpJREVOVElGSUVSEAg6ZAoOZmllbGRfYmVoYXZpb3ISHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJwIIAMoDjIZLmdvb2dsZS5hcGkuRmllbGRCZWhhdmlvckICEABSDWZpZWxkQmVoYXZpb3JCcAoOY29tLmdvb2dsZS5hcGlCEkZpZWxkQmVoYXZpb3JQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc6ICBEdBUEliBnByb3RvMw\", [file_google_protobuf_descriptor]);\n\n/**\n * Describes the enum google.api.FieldBehavior.\n */\nexport const FieldBehaviorSchema = /*@__PURE__*/\n enumDesc(file_google_api_field_behavior, 0);\n\n/**\n * An indicator of the behavior of a given field (for example, that a field\n * is required in requests, or given as output but ignored as input).\n * This **does not** change the behavior in protocol buffers itself; it only\n * denotes the behavior and may affect how API tooling handles the field.\n *\n * Note: This enum **may** receive new values in the future.\n *\n * @generated from enum google.api.FieldBehavior\n */\nexport const FieldBehavior = /*@__PURE__*/\n tsEnum(FieldBehaviorSchema);\n\n/**\n * A designation of a specific field behavior (required, output only, etc.)\n * in protobuf messages.\n *\n * Examples:\n *\n * string name = 1 [(google.api.field_behavior) = REQUIRED];\n * State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];\n * google.protobuf.Duration ttl = 1\n * [(google.api.field_behavior) = INPUT_ONLY];\n * google.protobuf.Timestamp expire_time = 1\n * [(google.api.field_behavior) = OUTPUT_ONLY,\n * (google.api.field_behavior) = IMMUTABLE];\n *\n * @generated from extension: repeated google.api.FieldBehavior field_behavior = 1052 [packed = false];\n */\nexport const field_behavior = /*@__PURE__*/\n extDesc(file_google_api_field_behavior, 0);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/application_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_api_field_behavior } from \"../../google/api/field_behavior_pb\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Describes the file tailor/v1/application_resource.proto.\n */\nexport const file_tailor_v1_application_resource = /*@__PURE__*/\n fileDesc(\"CiR0YWlsb3IvdjEvYXBwbGljYXRpb25fcmVzb3VyY2UucHJvdG8SCXRhaWxvci52MSLQAwoLQXBwbGljYXRpb24SDAoEbmFtZRgBIAEoCRITCgZkb21haW4YAiABKAlCA+BBAxIWCg5hdXRoX25hbWVzcGFjZRgDIAEoCRIMCgRjb3JzGAQgAygJEhwKFGFsbG93ZWRfaXBfYWRkcmVzc2VzGAsgAygJEiYKCXN1YmdyYXBocxgFIAMoCzITLnRhaWxvci52MS5TdWJncmFwaBIbCg5jcmVhdGVfdXNlcl9pZBgGIAEoCUID4EEDEhsKDnVwZGF0ZV91c2VyX2lkGAcgASgJQgPgQQMSNAoLY3JlYXRlX3RpbWUYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNAoLdXBkYXRlX3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSEAoDdXJsGAogASgJQgPgQQMSHQoVZGlzYWJsZV9pbnRyb3NwZWN0aW9uGAwgASgIEhAKCGRpc2FibGVkGA0gASgIEkkKFGF1dGhfaWRwX2NvbmZpZ19uYW1lGA4gASgJQiu6SChyJjIkXihbYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldKT8kIqIBCh5BcHBsaWNhdGlvblNjaGVtYVVwZGF0ZUF0dGVtcHQSMAoMYXR0ZW1wdF90aW1lGAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI/CgZzdGF0dXMYAiABKA4yLy50YWlsb3IudjEuQXBwbGljYXRpb25TY2hlbWFVcGRhdGVBdHRlbXB0U3RhdHVzEg0KBWVycm9yGAMgASgJIsgCCghTdWJncmFwaBI1CgxzZXJ2aWNlX3R5cGUYASABKA4yHy50YWlsb3IudjEuU3ViZ3JhcGguU2VydmljZVR5cGUSQwoRc2VydmljZV9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQivwEKC1NlcnZpY2VUeXBlEhwKGFNFUlZJQ0VfVFlQRV9VTlNQRUNJRklFRBAAEhkKFVNFUlZJQ0VfVFlQRV9QSVBFTElORRABEhoKFlNFUlZJQ0VfVFlQRV9TVEFURUZMT1cQAhIZChVTRVJWSUNFX1RZUEVfVEFJTE9SREIQAxIVChFTRVJWSUNFX1RZUEVfQVVUSBAEEhMKD1NFUlZJQ0VfVFlQRV9BSRAFEhQKEFNFUlZJQ0VfVFlQRV9JRFAQBirNAQokQXBwbGljYXRpb25TY2hlbWFVcGRhdGVBdHRlbXB0U3RhdHVzEjgKNEFQUExJQ0FUSU9OX1NDSEVNQV9VUERBVEVfQVRURU1QVF9TVEFUVVNfVU5TUEVDSUZJRUQQABI2CjJBUFBMSUNBVElPTl9TQ0hFTUFfVVBEQVRFX0FUVEVNUFRfU1RBVFVTX1NVQ0NFRURFRBABEjMKL0FQUExJQ0FUSU9OX1NDSEVNQV9VUERBVEVfQVRURU1QVF9TVEFUVVNfRkFJTEVEEAJiBnByb3RvMw\", [file_buf_validate_validate, file_google_api_field_behavior, file_google_protobuf_timestamp]);\n\n/**\n * Describes the message tailor.v1.Application.\n * Use `create(ApplicationSchema)` to create a new message.\n */\nexport const ApplicationSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application_resource, 0);\n\n/**\n * Describes the message tailor.v1.ApplicationSchemaUpdateAttempt.\n * Use `create(ApplicationSchemaUpdateAttemptSchema)` to create a new message.\n */\nexport const ApplicationSchemaUpdateAttemptSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application_resource, 1);\n\n/**\n * Describes the message tailor.v1.Subgraph.\n * Use `create(SubgraphSchema)` to create a new message.\n */\nexport const SubgraphSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application_resource, 2);\n\n/**\n * Describes the enum tailor.v1.Subgraph.ServiceType.\n */\nexport const Subgraph_ServiceTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_application_resource, 2, 0);\n\n/**\n * @generated from enum tailor.v1.Subgraph.ServiceType\n */\nexport const Subgraph_ServiceType = /*@__PURE__*/\n tsEnum(Subgraph_ServiceTypeSchema);\n\n/**\n * Describes the enum tailor.v1.ApplicationSchemaUpdateAttemptStatus.\n */\nexport const ApplicationSchemaUpdateAttemptStatusSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_application_resource, 0);\n\n/**\n * @generated from enum tailor.v1.ApplicationSchemaUpdateAttemptStatus\n */\nexport const ApplicationSchemaUpdateAttemptStatus = /*@__PURE__*/\n tsEnum(ApplicationSchemaUpdateAttemptStatusSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_protobuf_struct } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Describes the file tailor/v1/resource.proto.\n */\nexport const file_tailor_v1_resource = /*@__PURE__*/\n fileDesc(\"Chh0YWlsb3IvdjEvcmVzb3VyY2UucHJvdG8SCXRhaWxvci52MSKqAgoHU2VydmljZRInCgluYW1lc3BhY2UYASABKAsyFC50YWlsb3IudjEuTmFtZXNwYWNlEjQKDHNlcnZpY2VfdHlwZRgCIAEoDjIeLnRhaWxvci52MS5TZXJ2aWNlLlNlcnZpY2VUeXBlIr8BCgtTZXJ2aWNlVHlwZRIcChhTRVJWSUNFX1RZUEVfVU5TUEVDSUZJRUQQABIZChVTRVJWSUNFX1RZUEVfVEFJTE9SREIQARIVChFTRVJWSUNFX1RZUEVfQVVUSBACEhkKFVNFUlZJQ0VfVFlQRV9QSVBFTElORRADEhoKFlNFUlZJQ0VfVFlQRV9TVEFURUZMT1cQBBITCg9TRVJWSUNFX1RZUEVfQUkQBRIUChBTRVJWSUNFX1RZUEVfSURQEAYiGQoJTmFtZXNwYWNlEgwKBG5hbWUYASABKAkiFgoGU2NyaXB0EgwKBGV4cHIYASABKAkicAoGRmlsdGVyEicKCWNvbmRpdGlvbhgBIAEoCzIULnRhaWxvci52MS5Db25kaXRpb24SHgoDYW5kGAIgAygLMhEudGFpbG9yLnYxLkZpbHRlchIdCgJvchgDIAMoCzIRLnRhaWxvci52MS5GaWx0ZXIirAIKCUNvbmRpdGlvbhINCgVmaWVsZBgBIAEoCRI7CghvcGVyYXRvchgCIAEoDjIdLnRhaWxvci52MS5Db25kaXRpb24uT3BlcmF0b3JCCrpIB4IBBBABIAASJQoFdmFsdWUYAyABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWUiqwEKCE9wZXJhdG9yEhgKFE9QRVJBVE9SX1VOU1BFQ0lGSUVEEAASDwoLT1BFUkFUT1JfRVEQARIVChFPUEVSQVRPUl9DT05UQUlOUxACEg8KC09QRVJBVE9SX0dUEAMSDwoLT1BFUkFUT1JfR0UQBBIPCgtPUEVSQVRPUl9MVBAFEg8KC09QRVJBVE9SX0xFEAYSGQoVT1BFUkFUT1JfTk9UX0NPTlRBSU5TEAcqYAoNUGFnZURpcmVjdGlvbhIeChpQQUdFX0RJUkVDVElPTl9VTlNQRUNJRklFRBAAEhYKElBBR0VfRElSRUNUSU9OX0FTQxABEhcKE1BBR0VfRElSRUNUSU9OX0RFU0MQAmIGcHJvdG8z\", [file_buf_validate_validate, file_google_protobuf_struct]);\n\n/**\n * Describes the message tailor.v1.Service.\n * Use `create(ServiceSchema)` to create a new message.\n */\nexport const ServiceSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_resource, 0);\n\n/**\n * Describes the enum tailor.v1.Service.ServiceType.\n */\nexport const Service_ServiceTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_resource, 0, 0);\n\n/**\n * @generated from enum tailor.v1.Service.ServiceType\n */\nexport const Service_ServiceType = /*@__PURE__*/\n tsEnum(Service_ServiceTypeSchema);\n\n/**\n * Describes the message tailor.v1.Namespace.\n * Use `create(NamespaceSchema)` to create a new message.\n */\nexport const NamespaceSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_resource, 1);\n\n/**\n * Describes the message tailor.v1.Script.\n * Use `create(ScriptSchema)` to create a new message.\n */\nexport const ScriptSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_resource, 2);\n\n/**\n * Describes the message tailor.v1.Filter.\n * Use `create(FilterSchema)` to create a new message.\n */\nexport const FilterSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_resource, 3);\n\n/**\n * Describes the message tailor.v1.Condition.\n * Use `create(ConditionSchema)` to create a new message.\n */\nexport const ConditionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_resource, 4);\n\n/**\n * Describes the enum tailor.v1.Condition.Operator.\n */\nexport const Condition_OperatorSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_resource, 4, 0);\n\n/**\n * @generated from enum tailor.v1.Condition.Operator\n */\nexport const Condition_Operator = /*@__PURE__*/\n tsEnum(Condition_OperatorSchema);\n\n/**\n * Describes the enum tailor.v1.PageDirection.\n */\nexport const PageDirectionSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_resource, 0);\n\n/**\n * @generated from enum tailor.v1.PageDirection\n */\nexport const PageDirection = /*@__PURE__*/\n tsEnum(PageDirectionSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/application.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_tailor_fieldmask_v1_option } from \"../fieldmask/v1/option_pb\";\nimport { file_tailor_v1_application_resource } from \"./application_resource_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/application.proto.\n */\nexport const file_tailor_v1_application = /*@__PURE__*/\n fileDesc(\"Cht0YWlsb3IvdjEvYXBwbGljYXRpb24ucHJvdG8SCXRhaWxvci52MSKTAwoYQ3JlYXRlQXBwbGljYXRpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQgoQYXBwbGljYXRpb25fbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDI4fVthLXowLTldJBJDCg5hdXRoX25hbWVzcGFjZRgDIAEoCUIrukgociYyJF4oW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSk/JBJJChRhdXRoX2lkcF9jb25maWdfbmFtZRgEIAEoCUIrukgociYyJF4oW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSk/JBIMCgRjb3JzGAUgAygJEiYKCXN1YmdyYXBocxgGIAMoCzITLnRhaWxvci52MS5TdWJncmFwaBIcChRhbGxvd2VkX2lwX2FkZHJlc3NlcxgHIAMoCRIdChVkaXNhYmxlX2ludHJvc3BlY3Rpb24YCCABKAgSEAoIZGlzYWJsZWQYCSABKAgiSAoZQ3JlYXRlQXBwbGljYXRpb25SZXNwb25zZRIrCgthcHBsaWNhdGlvbhgBIAEoCzIWLnRhaWxvci52MS5BcHBsaWNhdGlvbiLDBAoYVXBkYXRlQXBwbGljYXRpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQgoQYXBwbGljYXRpb25fbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDI4fVthLXowLTldJBJDCg5hdXRoX25hbWVzcGFjZRgDIAEoCUIrukgociYyJF4oW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSk/JBJJChRhdXRoX2lkcF9jb25maWdfbmFtZRgEIAEoCUIrukgociYyJF4oW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSk/JBIMCgRjb3JzGAUgAygJEiYKCXN1YmdyYXBocxgGIAMoCzITLnRhaWxvci52MS5TdWJncmFwaBIcChRhbGxvd2VkX2lwX2FkZHJlc3NlcxgHIAMoCRIdChVkaXNhYmxlX2ludHJvc3BlY3Rpb24YCCABKAgSEAoIZGlzYWJsZWQYCSABKAgSrQEKC3VwZGF0ZV9tYXNrGGQgASgLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza0J8ivkrFWRpc2FibGVfaW50cm9zcGVjdGlvbor5KwhkaXNhYmxlZIr5Kw5hdXRoX25hbWVzcGFjZYr5KxRhdXRoX2lkcF9jb25maWdfbmFtZYr5KwRjb3JzivkrCXN1YmdyYXBoc4r5KxRhbGxvd2VkX2lwX2FkZHJlc3NlcyJIChlVcGRhdGVBcHBsaWNhdGlvblJlc3BvbnNlEisKC2FwcGxpY2F0aW9uGAEgASgLMhYudGFpbG9yLnYxLkFwcGxpY2F0aW9uIn4KGERlbGV0ZUFwcGxpY2F0aW9uUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkIKEGFwcGxpY2F0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSwyOH1bYS16MC05XSQiGwoZRGVsZXRlQXBwbGljYXRpb25SZXNwb25zZSKSAQoXTGlzdEFwcGxpY2F0aW9uc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARISCgpwYWdlX3Rva2VuGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgEIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInYKGExpc3RBcHBsaWNhdGlvbnNSZXNwb25zZRIsCgxhcHBsaWNhdGlvbnMYASADKAsyFi50YWlsb3IudjEuQXBwbGljYXRpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDInsKFUdldEFwcGxpY2F0aW9uUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkIKEGFwcGxpY2F0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSwyOH1bYS16MC05XSQiRQoWR2V0QXBwbGljYXRpb25SZXNwb25zZRIrCgthcHBsaWNhdGlvbhgBIAEoCzIWLnRhaWxvci52MS5BcHBsaWNhdGlvbiKHAQohR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQgoQYXBwbGljYXRpb25fbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDI4fVthLXowLTldJCLNAwoiR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXNwb25zZRJbCgZzdGF0dXMYASABKA4ySy50YWlsb3IudjEuR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXNwb25zZS5BcHBsaWNhdGlvblNjaGVtYUhlYWx0aFN0YXR1cxJGCiJjdXJyZW50X3NlcnZpbmdfc2NoZW1hX3VwZGF0ZV90aW1lGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBJNChpsYXN0X3NjaGVtYV91cGRhdGVfYXR0ZW1wdBgDIAEoCzIpLnRhaWxvci52MS5BcHBsaWNhdGlvblNjaGVtYVVwZGF0ZUF0dGVtcHQisgEKHUFwcGxpY2F0aW9uU2NoZW1hSGVhbHRoU3RhdHVzEjAKLEFQUExJQ0FUSU9OX1NDSEVNQV9IRUFMVEhfU1RBVFVTX1VOU1BFQ0lGSUVEEAASJwojQVBQTElDQVRJT05fU0NIRU1BX0hFQUxUSF9TVEFUVVNfT0sQARI2CjJBUFBMSUNBVElPTl9TQ0hFTUFfSEVBTFRIX1NUQVRVU19DT01QT1NJVElPTl9FUlJPUhACYgZwcm90bzM\", [file_buf_validate_validate, file_google_protobuf_field_mask, file_google_protobuf_timestamp, file_tailor_fieldmask_v1_option, file_tailor_v1_application_resource, file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.CreateApplicationRequest.\n * Use `create(CreateApplicationRequestSchema)` to create a new message.\n */\nexport const CreateApplicationRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 0);\n\n/**\n * Describes the message tailor.v1.CreateApplicationResponse.\n * Use `create(CreateApplicationResponseSchema)` to create a new message.\n */\nexport const CreateApplicationResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 1);\n\n/**\n * Describes the message tailor.v1.UpdateApplicationRequest.\n * Use `create(UpdateApplicationRequestSchema)` to create a new message.\n */\nexport const UpdateApplicationRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 2);\n\n/**\n * Describes the message tailor.v1.UpdateApplicationResponse.\n * Use `create(UpdateApplicationResponseSchema)` to create a new message.\n */\nexport const UpdateApplicationResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 3);\n\n/**\n * Describes the message tailor.v1.DeleteApplicationRequest.\n * Use `create(DeleteApplicationRequestSchema)` to create a new message.\n */\nexport const DeleteApplicationRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 4);\n\n/**\n * Describes the message tailor.v1.DeleteApplicationResponse.\n * Use `create(DeleteApplicationResponseSchema)` to create a new message.\n */\nexport const DeleteApplicationResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 5);\n\n/**\n * Describes the message tailor.v1.ListApplicationsRequest.\n * Use `create(ListApplicationsRequestSchema)` to create a new message.\n */\nexport const ListApplicationsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 6);\n\n/**\n * Describes the message tailor.v1.ListApplicationsResponse.\n * Use `create(ListApplicationsResponseSchema)` to create a new message.\n */\nexport const ListApplicationsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 7);\n\n/**\n * Describes the message tailor.v1.GetApplicationRequest.\n * Use `create(GetApplicationRequestSchema)` to create a new message.\n */\nexport const GetApplicationRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 8);\n\n/**\n * Describes the message tailor.v1.GetApplicationResponse.\n * Use `create(GetApplicationResponseSchema)` to create a new message.\n */\nexport const GetApplicationResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 9);\n\n/**\n * Describes the message tailor.v1.GetApplicationSchemaHealthRequest.\n * Use `create(GetApplicationSchemaHealthRequestSchema)` to create a new message.\n */\nexport const GetApplicationSchemaHealthRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 10);\n\n/**\n * Describes the message tailor.v1.GetApplicationSchemaHealthResponse.\n * Use `create(GetApplicationSchemaHealthResponseSchema)` to create a new message.\n */\nexport const GetApplicationSchemaHealthResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_application, 11);\n\n/**\n * Describes the enum tailor.v1.GetApplicationSchemaHealthResponse.ApplicationSchemaHealthStatus.\n */\nexport const GetApplicationSchemaHealthResponse_ApplicationSchemaHealthStatusSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_application, 11, 0);\n\n/**\n * @generated from enum tailor.v1.GetApplicationSchemaHealthResponse.ApplicationSchemaHealthStatus\n */\nexport const GetApplicationSchemaHealthResponse_ApplicationSchemaHealthStatus = /*@__PURE__*/\n tsEnum(GetApplicationSchemaHealthResponse_ApplicationSchemaHealthStatusSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/secret_manager_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_google_api_field_behavior } from \"../../google/api/field_behavior_pb\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Describes the file tailor/v1/secret_manager_resource.proto.\n */\nexport const file_tailor_v1_secret_manager_resource = /*@__PURE__*/\n fileDesc(\"Cid0YWlsb3IvdjEvc2VjcmV0X21hbmFnZXJfcmVzb3VyY2UucHJvdG8SCXRhaWxvci52MSKOAQoSU2VjcmV0TWFuYWdlclZhdWx0EgwKBG5hbWUYASABKAkSNAoLY3JlYXRlX3RpbWUYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNAoLdXBkYXRlX3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMijwEKE1NlY3JldE1hbmFnZXJTZWNyZXQSDAoEbmFtZRgBIAEoCRI0CgtjcmVhdGVfdGltZRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI0Cgt1cGRhdGVfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAyI1CgtTZWNyZXRWYWx1ZRISCgp2YXVsdF9uYW1lGAEgASgJEhIKCnNlY3JldF9rZXkYAiABKAliBnByb3RvMw\", [file_google_api_field_behavior, file_google_protobuf_timestamp]);\n\n/**\n * Describes the message tailor.v1.SecretManagerVault.\n * Use `create(SecretManagerVaultSchema)` to create a new message.\n */\nexport const SecretManagerVaultSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager_resource, 0);\n\n/**\n * Describes the message tailor.v1.SecretManagerSecret.\n * Use `create(SecretManagerSecretSchema)` to create a new message.\n */\nexport const SecretManagerSecretSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager_resource, 1);\n\n/**\n * Describes the message tailor.v1.SecretValue.\n * Use `create(SecretValueSchema)` to create a new message.\n */\nexport const SecretValueSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager_resource, 2);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/auth_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_api_field_behavior } from \"../../google/api/field_behavior_pb\";\nimport { file_google_protobuf_duration, file_google_protobuf_struct, file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\nimport { file_tailor_v1_secret_manager_resource } from \"./secret_manager_resource_pb\";\n\n/**\n * Describes the file tailor/v1/auth_resource.proto.\n */\nexport const file_tailor_v1_auth_resource = /*@__PURE__*/\n fileDesc(\"Ch10YWlsb3IvdjEvYXV0aF9yZXNvdXJjZS5wcm90bxIJdGFpbG9yLnYxIlYKC0F1dGhTZXJ2aWNlEicKCW5hbWVzcGFjZRgBIAEoCzIULnRhaWxvci52MS5OYW1lc3BhY2USHgoWcHVibGlzaF9zZXNzaW9uX2V2ZW50cxgCIAEoCCK0BgoNQXV0aElEUENvbmZpZxI2CgRuYW1lGAEgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjQKCWF1dGhfdHlwZRgCIAEoDjIhLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLkF1dGhUeXBlEi8KBmNvbmZpZxgDIAEoCzIfLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLkNvbmZpZxq4AQoGQ29uZmlnEjMKBG9pZGMYASABKAsyIy50YWlsb3IudjEuQXV0aElEUENvbmZpZy5PSURDQ29uZmlnSAASMwoEc2FtbBgCIAEoCzIjLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLlNBTUxDb25maWdIABI6CghpZF90b2tlbhgDIAEoCzImLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLklEVG9rZW5Db25maWdIAEIICgZjb25maWcamAEKCk9JRENDb25maWcSFQoNY2xpZW50X2lkX2tleRgBIAEoCRIxChFjbGllbnRfc2VjcmV0X2tleRgCIAEoCzIWLnRhaWxvci52MS5TZWNyZXRWYWx1ZRIUCgxwcm92aWRlcl91cmwYAyABKAkSEgoKaXNzdWVyX3VybBgEIAEoCRIWCg51c2VybmFtZV9jbGFpbRgFIAEoCRphCgpTQU1MQ29uZmlnEhQKDG1ldGFkYXRhX3VybBgBIAEoCRIUCgxyYXdfbWV0YWRhdGEYBCABKAkSGwoTZW5hYmxlX3NpZ25fcmVxdWVzdBgFIAEoCEoECAIQA0oECAMQBBpkCg1JRFRva2VuQ29uZmlnEhQKDHByb3ZpZGVyX3VybBgBIAEoCRIRCgljbGllbnRfaWQYAiABKAkSEgoKaXNzdWVyX3VybBgDIAEoCRIWCg51c2VybmFtZV9jbGFpbRgEIAEoCSJlCghBdXRoVHlwZRIZChVBVVRIX1RZUEVfVU5TUEVDSUZJRUQQABISCg5BVVRIX1RZUEVfT0lEQxABEhIKDkFVVEhfVFlQRV9TQU1MEAISFgoSQVVUSF9UWVBFX0lEX1RPS0VOEAMirQYKGVVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcSFAoIcHJvdmlkZXIYASABKAlCAhgBElMKDXByb3ZpZGVyX3R5cGUYAiABKA4yPC50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5Vc2VyUHJvZmlsZVByb3ZpZGVyVHlwZRI7CgZjb25maWcYAyABKAsyKy50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5Db25maWcaYwoGQ29uZmlnEk8KCHRhaWxvcmRiGAEgASgLMjsudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcuVGFpbG9yREJQcm92aWRlckNvbmZpZ0gAQggKBmNvbmZpZxqSAwoWVGFpbG9yREJQcm92aWRlckNvbmZpZxI7CgluYW1lc3BhY2UYASABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLQoEdHlwZRgCIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JBIWCg51c2VybmFtZV9maWVsZBgDIAEoCRIZChFhdHRyaWJ1dGVzX2ZpZWxkcxgEIAMoCRIXCg90ZW5hbnRfaWRfZmllbGQYBSABKAkSigEKDWF0dHJpYnV0ZV9tYXAYBiADKAsyTS50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5UYWlsb3JEQlByb3ZpZGVyQ29uZmlnLkF0dHJpYnV0ZU1hcEVudHJ5QiS6SCGaAR4iHHIaMhheW2Etel1bMC05YS16QS1aXXswLDYyfSQaMwoRQXR0cmlidXRlTWFwRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJuChdVc2VyUHJvZmlsZVByb3ZpZGVyVHlwZRIqCiZVU0VSX1BST0ZJTEVfUFJPVklERVJfVFlQRV9VTlNQRUNJRklFRBAAEicKI1VTRVJfUFJPRklMRV9QUk9WSURFUl9UWVBFX1RBSUxPUkRCEAEivgMKFFRlbmFudFByb3ZpZGVyQ29uZmlnEhAKCHByb3ZpZGVyGAEgASgJEkkKDXByb3ZpZGVyX3R5cGUYAiABKA4yMi50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWcuVGVuYW50UHJvdmlkZXJUeXBlEjYKBmNvbmZpZxgDIAEoCzImLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZy5Db25maWcaXgoGQ29uZmlnEkoKCHRhaWxvcmRiGAEgASgLMjYudGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnLlRhaWxvckRCUHJvdmlkZXJDb25maWdIAEIICgZjb25maWcaUgoWVGFpbG9yREJQcm92aWRlckNvbmZpZxIRCgluYW1lc3BhY2UYASABKAkSDAoEdHlwZRgCIAEoCRIXCg9zaWduYXR1cmVfZmllbGQYAyABKAkiXQoSVGVuYW50UHJvdmlkZXJUeXBlEiQKIFRFTkFOVF9QUk9WSURFUl9UWVBFX1VOU1BFQ0lGSUVEEAASIQodVEVOQU5UX1BST1ZJREVSX1RZUEVfVEFJTE9SREIQASI7CgtBdXRoSW52b2tlchIRCgluYW1lc3BhY2UYASABKAkSGQoRbWFjaGluZV91c2VyX25hbWUYAiABKAkiSAoTUGVyc29uYWxBY2Nlc3NUb2tlbhIMCgRuYW1lGAEgASgJEiMKBnNjb3BlcxgCIAMoDjITLnRhaWxvci52MS5QQVRTY29wZSLGAwoLTWFjaGluZVVzZXISCgoCaWQYASABKAkSNgoEbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIWCgljbGllbnRfaWQYAyABKAlCA+BBAxIaCg1jbGllbnRfc2VjcmV0GAQgASgJQgPgQQMSIQoKYXR0cmlidXRlcxgFIAMoCUINukgKkgEHIgVyA7ABARIzCgpjcmVhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjMKCnVwZGF0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSZQoNYXR0cmlidXRlX21hcBgIIAMoCzIoLnRhaWxvci52MS5NYWNoaW5lVXNlci5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEi3gIKDkF1dGhTQ0lNQ29uZmlnEkMKEW1hY2hpbmVfdXNlcl9uYW1lGAEgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKEmF1dGhvcml6YXRpb25fdHlwZRgCIAEoDjIrLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZy5BdXRob3JpemF0aW9uVHlwZRIvCg1iZWFyZXJfc2VjcmV0GAogASgLMhYudGFpbG9yLnYxLlNlY3JldFZhbHVlSAAidQoRQXV0aG9yaXphdGlvblR5cGUSIgoeQVVUSE9SSVpBVElPTl9UWVBFX1VOU1BFQ0lGSUVEEAASHQoZQVVUSE9SSVpBVElPTl9UWVBFX0JFQVJFUhABEh0KGUFVVEhPUklaQVRJT05fVFlQRV9PQVVUSDIQAkIWChRhdXRob3JpemF0aW9uX2NvbmZpZyLDAgoQQXV0aFNDSU1SZXNvdXJjZRI/CgRuYW1lGAEgASgJQjG6SC5yLDIqXltBLVphLXowLTldW0EtWmEtejAtOS1dezEsNjF9W0EtWmEtejAtOV0kEkUKE3RhaWxvcl9kYl9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNwoOdGFpbG9yX2RiX3R5cGUYAyABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQSPgoRYXR0cmlidXRlX21hcHBpbmcYBCADKAsyIy50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGVNYXBwaW5nEi4KC2NvcmVfc2NoZW1hGAUgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNU2NoZW1hIkYKGEF1dGhTQ0lNQXR0cmlidXRlTWFwcGluZxIXCg90YWlsb3JfZGJfZmllbGQYASABKAkSEQoJc2NpbV9wYXRoGAIgASgJIlAKDkF1dGhTQ0lNU2NoZW1hEgwKBG5hbWUYASABKAkSMAoKYXR0cmlidXRlcxgCIAMoCzIcLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZSLZBQoRQXV0aFNDSU1BdHRyaWJ1dGUSLwoEdHlwZRgBIAEoDjIhLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZS5UeXBlEi4KBG5hbWUYAiABKAlCILpIHXIbMhleW0EtWmEtel1bYS16QS1aMC05XyQtXSokEhMKC2Rlc2NyaXB0aW9uGAMgASgJEjsKCm11dGFiaWxpdHkYBCABKA4yJy50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUuTXV0YWJpbGl0eRIQCghyZXF1aXJlZBgFIAEoCBIUCgxtdWx0aV92YWx1ZWQYBiABKAgSOwoKdW5pcXVlbmVzcxgHIAEoDjInLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZS5VbmlxdWVuZXNzEhgKEGNhbm9uaWNhbF92YWx1ZXMYCCADKAkSNAoOc3ViX2F0dHJpYnV0ZXMYCSADKAsyHC50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUidQoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASEAoMVFlQRV9DT01QTEVYEAESDwoLVFlQRV9TVFJJTkcQAhIPCgtUWVBFX05VTUJFUhADEhAKDFRZUEVfQk9PTEVBThAEEhEKDVRZUEVfREFURVRJTUUQBSJ4CgpNdXRhYmlsaXR5EhoKFk1VVEFCSUxJVFlfVU5TUEVDSUZJRUQQABIYChRNVVRBQklMSVRZX1JFQURfT05MWRABEhkKFU1VVEFCSUxJVFlfUkVBRF9XUklURRACEhkKFU1VVEFCSUxJVFlfV1JJVEVfT05MWRADImsKClVuaXF1ZW5lc3MSGgoWVU5JUVVFTkVTU19VTlNQRUNJRklFRBAAEhMKD1VOSVFVRU5FU1NfTk9ORRABEhUKEVVOSVFVRU5FU1NfU0VSVkVSEAISFQoRVU5JUVVFTkVTU19HTE9CQUwQAyK+BAoOQXV0aENvbm5lY3Rpb24SNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIsCgR0eXBlGAIgASgOMh4udGFpbG9yLnYxLkF1dGhDb25uZWN0aW9uLlR5cGUSRgoGb2F1dGgyGAMgASgLMjQudGFpbG9yLnYxLkF1dGhDb25uZWN0aW9uLkF1dGhDb25uZWN0aW9uT0F1dGgyQ29uZmlnSAASMwoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxqIAgoaQXV0aENvbm5lY3Rpb25PQXV0aDJDb25maWcSFAoMcHJvdmlkZXJfdXJsGAEgASgJEhIKCmlzc3Vlcl91cmwYAiABKAkSEQoJY2xpZW50X2lkGAMgASgJEhoKDWNsaWVudF9zZWNyZXQYBCABKAlCA+BBBBJHCghhdXRoX3VybBgFIAEoCUI1ukgy2AEBci0yKF5odHRwczovL1tBLVphLXowLTkuLV0rKDpbMC05XSspPygvLiopPySIAQESSAoJdG9rZW5fdXJsGAYgASgJQjW6SDLYAQFyLTIoXmh0dHBzOi8vW0EtWmEtejAtOS4tXSsoOlswLTldKyk/KC8uKik/JIgBASItCgRUeXBlEhQKEFRZUEVfVU5TUEVDSUZJRUQQABIPCgtUWVBFX09BVVRIMhABQg8KBmNvbmZpZxIFukgCCAEiowcKEEF1dGhPQXV0aDJDbGllbnQSDAoEbmFtZRgBIAEoCRITCgtkZXNjcmlwdGlvbhgCIAEoCRI6CgtncmFudF90eXBlcxgDIAMoDjIlLnRhaWxvci52MS5BdXRoT0F1dGgyQ2xpZW50LkdyYW50VHlwZRIVCg1yZWRpcmVjdF91cmlzGAQgAygJEhYKCWNsaWVudF9pZBgFIAEoCUID4EEDEhoKDWNsaWVudF9zZWNyZXQYBiABKAlCA+BBAxIzCgpjcmVhdGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEkoKC2NsaWVudF90eXBlGAggASgOMiYudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQuQ2xpZW50VHlwZUINukgK2AEBggEEEAEgABJKChVhY2Nlc3NfdG9rZW5fbGlmZXRpbWUYCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CELpIDaoBCiIECICjBTICCDwSSwoWcmVmcmVzaF90b2tlbl9saWZldGltZRgKIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkIQukgNqgEKIgQIgPUkMgIIPBIUCgxyZXF1aXJlX2Rwb3AYCyABKAgiaAoJR3JhbnRUeXBlEhoKFkdSQU5UX1RZUEVfVU5TUEVDSUZJRUQQABIhCh1HUkFOVF9UWVBFX0FVVEhPUklaQVRJT05fQ09ERRABEhwKGEdSQU5UX1RZUEVfUkVGUkVTSF9UT0tFThACIngKCkNsaWVudFR5cGUSGwoXQ0xJRU5UX1RZUEVfVU5TUEVDSUZJRUQQABIcChhDTElFTlRfVFlQRV9DT05GSURFTlRJQUwQARIWChJDTElFTlRfVFlQRV9QVUJMSUMQAhIXChNDTElFTlRfVFlQRV9CUk9XU0VSEAM60AG6SMwBGskBCiJicm93c2VyX2NsaWVudF9jYW5ub3RfcmVxdWlyZV9kcG9wEjZyZXF1aXJlX2Rwb3AgY2Fubm90IGJlIHNldCB0byB0cnVlIGZvciBicm93c2VyIGNsaWVudHMaa3RoaXMuY2xpZW50X3R5cGUgIT0gdGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQuQ2xpZW50VHlwZS5DTElFTlRfVFlQRV9CUk9XU0VSIHx8IHRoaXMucmVxdWlyZV9kcG9wID09IGZhbHNlIrcBChdDb250cm9scGxhbmVNYWNoaW5lVXNlchIPCgJpZBgBIAEoCUID4EEDEgwKBG5hbWUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSHAoPb3JnYW5pemF0aW9uX2lkGAQgASgJQgPgQQMSFgoJZm9sZGVyX2lkGAUgASgJQgPgQQMSFgoJY2xpZW50X2lkGAYgASgJQgPgQQMSGgoNY2xpZW50X3NlY3JldBgHIAEoCUID4EEDKk4KCFBBVFNjb3BlEhkKFVBBVF9TQ09QRV9VTlNQRUNJRklFRBAAEhIKDlBBVF9TQ09QRV9SRUFEEAESEwoPUEFUX1NDT1BFX1dSSVRFEAJiBnByb3RvMw\", [file_buf_validate_validate, file_google_api_field_behavior, file_google_protobuf_duration, file_google_protobuf_struct, file_google_protobuf_timestamp, file_tailor_v1_resource, file_tailor_v1_secret_manager_resource]);\n\n/**\n * Describes the message tailor.v1.AuthService.\n * Use `create(AuthServiceSchema)` to create a new message.\n */\nexport const AuthServiceSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 0);\n\n/**\n * Describes the message tailor.v1.AuthIDPConfig.\n * Use `create(AuthIDPConfigSchema)` to create a new message.\n */\nexport const AuthIDPConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 1);\n\n/**\n * Describes the message tailor.v1.AuthIDPConfig.Config.\n * Use `create(AuthIDPConfig_ConfigSchema)` to create a new message.\n */\nexport const AuthIDPConfig_ConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 1, 0);\n\n/**\n * Describes the message tailor.v1.AuthIDPConfig.OIDCConfig.\n * Use `create(AuthIDPConfig_OIDCConfigSchema)` to create a new message.\n */\nexport const AuthIDPConfig_OIDCConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 1, 1);\n\n/**\n * Describes the message tailor.v1.AuthIDPConfig.SAMLConfig.\n * Use `create(AuthIDPConfig_SAMLConfigSchema)` to create a new message.\n */\nexport const AuthIDPConfig_SAMLConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 1, 2);\n\n/**\n * Describes the message tailor.v1.AuthIDPConfig.IDTokenConfig.\n * Use `create(AuthIDPConfig_IDTokenConfigSchema)` to create a new message.\n */\nexport const AuthIDPConfig_IDTokenConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 1, 3);\n\n/**\n * Describes the enum tailor.v1.AuthIDPConfig.AuthType.\n */\nexport const AuthIDPConfig_AuthTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_auth_resource, 1, 0);\n\n/**\n * @generated from enum tailor.v1.AuthIDPConfig.AuthType\n */\nexport const AuthIDPConfig_AuthType = /*@__PURE__*/\n tsEnum(AuthIDPConfig_AuthTypeSchema);\n\n/**\n * Describes the message tailor.v1.UserProfileProviderConfig.\n * Use `create(UserProfileProviderConfigSchema)` to create a new message.\n */\nexport const UserProfileProviderConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 2);\n\n/**\n * Describes the message tailor.v1.UserProfileProviderConfig.Config.\n * Use `create(UserProfileProviderConfig_ConfigSchema)` to create a new message.\n */\nexport const UserProfileProviderConfig_ConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 2, 0);\n\n/**\n * Describes the message tailor.v1.UserProfileProviderConfig.TailorDBProviderConfig.\n * Use `create(UserProfileProviderConfig_TailorDBProviderConfigSchema)` to create a new message.\n */\nexport const UserProfileProviderConfig_TailorDBProviderConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 2, 1);\n\n/**\n * Describes the enum tailor.v1.UserProfileProviderConfig.UserProfileProviderType.\n */\nexport const UserProfileProviderConfig_UserProfileProviderTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_auth_resource, 2, 0);\n\n/**\n * @generated from enum tailor.v1.UserProfileProviderConfig.UserProfileProviderType\n */\nexport const UserProfileProviderConfig_UserProfileProviderType = /*@__PURE__*/\n tsEnum(UserProfileProviderConfig_UserProfileProviderTypeSchema);\n\n/**\n * Describes the message tailor.v1.TenantProviderConfig.\n * Use `create(TenantProviderConfigSchema)` to create a new message.\n */\nexport const TenantProviderConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 3);\n\n/**\n * Describes the message tailor.v1.TenantProviderConfig.Config.\n * Use `create(TenantProviderConfig_ConfigSchema)` to create a new message.\n */\nexport const TenantProviderConfig_ConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 3, 0);\n\n/**\n * Describes the message tailor.v1.TenantProviderConfig.TailorDBProviderConfig.\n * Use `create(TenantProviderConfig_TailorDBProviderConfigSchema)` to create a new message.\n */\nexport const TenantProviderConfig_TailorDBProviderConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 3, 1);\n\n/**\n * Describes the enum tailor.v1.TenantProviderConfig.TenantProviderType.\n */\nexport const TenantProviderConfig_TenantProviderTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_auth_resource, 3, 0);\n\n/**\n * @generated from enum tailor.v1.TenantProviderConfig.TenantProviderType\n */\nexport const TenantProviderConfig_TenantProviderType = /*@__PURE__*/\n tsEnum(TenantProviderConfig_TenantProviderTypeSchema);\n\n/**\n * Describes the message tailor.v1.AuthInvoker.\n * Use `create(AuthInvokerSchema)` to create a new message.\n */\nexport const AuthInvokerSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 4);\n\n/**\n * Describes the message tailor.v1.PersonalAccessToken.\n * Use `create(PersonalAccessTokenSchema)` to create a new message.\n */\nexport const PersonalAccessTokenSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 5);\n\n/**\n * Describes the message tailor.v1.MachineUser.\n * Use `create(MachineUserSchema)` to create a new message.\n */\nexport const MachineUserSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 6);\n\n/**\n * Describes the message tailor.v1.AuthSCIMConfig.\n * Use `create(AuthSCIMConfigSchema)` to create a new message.\n */\nexport const AuthSCIMConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 7);\n\n/**\n * Describes the enum tailor.v1.AuthSCIMConfig.AuthorizationType.\n */\nexport const AuthSCIMConfig_AuthorizationTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_auth_resource, 7, 0);\n\n/**\n * @generated from enum tailor.v1.AuthSCIMConfig.AuthorizationType\n */\nexport const AuthSCIMConfig_AuthorizationType = /*@__PURE__*/\n tsEnum(AuthSCIMConfig_AuthorizationTypeSchema);\n\n/**\n * Describes the message tailor.v1.AuthSCIMResource.\n * Use `create(AuthSCIMResourceSchema)` to create a new message.\n */\nexport const AuthSCIMResourceSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 8);\n\n/**\n * Describes the message tailor.v1.AuthSCIMAttributeMapping.\n * Use `create(AuthSCIMAttributeMappingSchema)` to create a new message.\n */\nexport const AuthSCIMAttributeMappingSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 9);\n\n/**\n * Describes the message tailor.v1.AuthSCIMSchema.\n * Use `create(AuthSCIMSchemaSchema)` to create a new message.\n */\nexport const AuthSCIMSchemaSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 10);\n\n/**\n * Describes the message tailor.v1.AuthSCIMAttribute.\n * Use `create(AuthSCIMAttributeSchema)` to create a new message.\n */\nexport const AuthSCIMAttributeSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 11);\n\n/**\n * Describes the enum tailor.v1.AuthSCIMAttribute.Type.\n */\nexport const AuthSCIMAttribute_TypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_auth_resource, 11, 0);\n\n/**\n * @generated from enum tailor.v1.AuthSCIMAttribute.Type\n */\nexport const AuthSCIMAttribute_Type = /*@__PURE__*/\n tsEnum(AuthSCIMAttribute_TypeSchema);\n\n/**\n * Describes the enum tailor.v1.AuthSCIMAttribute.Mutability.\n */\nexport const AuthSCIMAttribute_MutabilitySchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_auth_resource, 11, 1);\n\n/**\n * @generated from enum tailor.v1.AuthSCIMAttribute.Mutability\n */\nexport const AuthSCIMAttribute_Mutability = /*@__PURE__*/\n tsEnum(AuthSCIMAttribute_MutabilitySchema);\n\n/**\n * Describes the enum tailor.v1.AuthSCIMAttribute.Uniqueness.\n */\nexport const AuthSCIMAttribute_UniquenessSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_auth_resource, 11, 2);\n\n/**\n * @generated from enum tailor.v1.AuthSCIMAttribute.Uniqueness\n */\nexport const AuthSCIMAttribute_Uniqueness = /*@__PURE__*/\n tsEnum(AuthSCIMAttribute_UniquenessSchema);\n\n/**\n * Describes the message tailor.v1.AuthConnection.\n * Use `create(AuthConnectionSchema)` to create a new message.\n */\nexport const AuthConnectionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 12);\n\n/**\n * Describes the message tailor.v1.AuthConnection.AuthConnectionOAuth2Config.\n * Use `create(AuthConnection_AuthConnectionOAuth2ConfigSchema)` to create a new message.\n */\nexport const AuthConnection_AuthConnectionOAuth2ConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 12, 0);\n\n/**\n * Describes the enum tailor.v1.AuthConnection.Type.\n */\nexport const AuthConnection_TypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_auth_resource, 12, 0);\n\n/**\n * @generated from enum tailor.v1.AuthConnection.Type\n */\nexport const AuthConnection_Type = /*@__PURE__*/\n tsEnum(AuthConnection_TypeSchema);\n\n/**\n * Describes the message tailor.v1.AuthOAuth2Client.\n * Use `create(AuthOAuth2ClientSchema)` to create a new message.\n */\nexport const AuthOAuth2ClientSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 13);\n\n/**\n * Describes the enum tailor.v1.AuthOAuth2Client.GrantType.\n */\nexport const AuthOAuth2Client_GrantTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_auth_resource, 13, 0);\n\n/**\n * @generated from enum tailor.v1.AuthOAuth2Client.GrantType\n */\nexport const AuthOAuth2Client_GrantType = /*@__PURE__*/\n tsEnum(AuthOAuth2Client_GrantTypeSchema);\n\n/**\n * Describes the enum tailor.v1.AuthOAuth2Client.ClientType.\n */\nexport const AuthOAuth2Client_ClientTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_auth_resource, 13, 1);\n\n/**\n * @generated from enum tailor.v1.AuthOAuth2Client.ClientType\n */\nexport const AuthOAuth2Client_ClientType = /*@__PURE__*/\n tsEnum(AuthOAuth2Client_ClientTypeSchema);\n\n/**\n * Describes the message tailor.v1.ControlplaneMachineUser.\n * Use `create(ControlplaneMachineUserSchema)` to create a new message.\n */\nexport const ControlplaneMachineUserSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth_resource, 14);\n\n/**\n * Describes the enum tailor.v1.PATScope.\n */\nexport const PATScopeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_auth_resource, 0);\n\n/**\n * @generated from enum tailor.v1.PATScope\n */\nexport const PATScope = /*@__PURE__*/\n tsEnum(PATScopeSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/auth.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_protobuf_struct, file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_tailor_v1_auth_resource } from \"./auth_resource_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/auth.proto.\n */\nexport const file_tailor_v1_auth = /*@__PURE__*/\n fileDesc(\"ChR0YWlsb3IvdjEvYXV0aC5wcm90bxIJdGFpbG9yLnYxIpwBChhDcmVhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGUNyZWF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlIpwBChhVcGRhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGVVwZGF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlInwKGERlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIhsKGURlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UieQoVR2V0QXV0aFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiRgoWR2V0QXV0aFNlcnZpY2VSZXNwb25zZRIsCgxhdXRoX3NlcnZpY2UYASABKAsyFi50YWlsb3IudjEuQXV0aFNlcnZpY2UikgEKF0xpc3RBdXRoU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ3ChhMaXN0QXV0aFNlcnZpY2VzUmVzcG9uc2USLQoNYXV0aF9zZXJ2aWNlcxgBIAMoCzIWLnRhaWxvci52MS5BdXRoU2VydmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirAEKGkNyZWF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG0NyZWF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcirAEKGlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG1VwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcitgEKGkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIdChtEZWxldGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiswEKF0dldEF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJIChhHZXRBdXRoSURQQ29uZmlnUmVzcG9uc2USLAoKaWRwX2NvbmZpZxgBIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnItYBChlMaXN0QXV0aElEUENvbmZpZ3NSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ5ChpMaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZRItCgtpZHBfY29uZmlncxgBIAMoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLOAQoeQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgDIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIm0KH0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2USSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIs4BCh5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAMgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcibQofVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWciggEKHkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIiEKH0RlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UifwobR2V0VXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiagocR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcixgEKGUNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJHChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAMgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnQga6SAPIAQEiXQoaQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyLGAQoZVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKFnRlbmFudF9wcm92aWRlcl9jb25maWcYAyABKAsyHy50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWdCBrpIA8gBASJdChpVcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZRI/ChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAEgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnIn0KGURlbGV0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIcChpEZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSJ6ChZHZXRUZW5hbnRDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiWgoXR2V0VGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyKSAQogQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgZzY29wZXMYAiADKA4yEy50YWlsb3IudjEuUEFUU2NvcGVCEbpIDpIBCwgBIgeCAQQQASAAIjkKIUNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZRIUCgxhY2Nlc3NfdG9rZW4YASABKAkiWgogRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIjCiFEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiegofTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIpABCiBMaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXNwb25zZRI+ChZwZXJzb25hbF9hY2Nlc3NfdG9rZW5zGAEgAygLMh4udGFpbG9yLnYxLlBlcnNvbmFsQWNjZXNzVG9rZW4SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIqMDChxDcmVhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOYXV0aF9uYW1lc3BhY2UYAiABKAlCK7pIKHImMiReKFthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0pPyQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIqADChxVcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIrgBChxEZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIfCh1EZWxldGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSK1AQoZR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDmF1dGhfbmFtZXNwYWNlGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSgoaR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyItgBChtMaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5hdXRoX25hbWVzcGFjZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBISCgpwYWdlX3Rva2VuGAMgASgJEhEKCXBhZ2Vfc2l6ZRgEIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgFIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInsKHExpc3RBdXRoTWFjaGluZVVzZXJzUmVzcG9uc2USLQoNbWFjaGluZV91c2VycxgBIAMoCzIWLnRhaWxvci52MS5NYWNoaW5lVXNlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirwEKG0NyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHENyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcirwEKG1VwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHFVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcifAoYR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSwoZR2V0QXV0aFNDSU1Db25maWdSZXNwb25zZRIuCgtzY2ltX2NvbmZpZxgBIAEoCzIZLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZyJ/ChtEZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIeChxEZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIrUBCh1DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIrUBCh1VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIo8BCh1EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIrYBChpHZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlEjIKDXNjaW1fcmVzb3VyY2UYASABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJ/ChtHZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJTChxHZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlEjMKDnNjaW1fcmVzb3VyY2VzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhTQ0lNUmVzb3VyY2UidAobQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESNQoKY29ubmVjdGlvbhgCIAEoCzIZLnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbkIGukgDyAEBIh4KHENyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UilQEKGkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ7ChtMaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2USLgoLY29ubmVjdGlvbnMYASADKAsyGS50YWlsb3IudjEuQXV0aENvbm5lY3Rpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIoABChtSZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHgocUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSLmAQokUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQQoPY29ubmVjdGlvbl9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhQKDGFjY2Vzc190b2tlbhgDIAEoCRIVCg1yZWZyZXNoX3Rva2VuGAQgASgJEi4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIicKJVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVzcG9uc2Ui1wEKLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIwoSYXV0aG9yaXphdGlvbl9jb2RlGAMgASgJQge6SARyAhABEh0KDHJlZGlyZWN0X3VyaRgEIAEoCUIHukgEcgIQASIxCi9FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSKLAQodQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKLAQodVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCJlCh1EZWxldGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIrYBChpHZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKvAQocTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24iggEKHUxpc3RBdXRoT0F1dGgyQ2xpZW50c1Jlc3BvbnNlEjMKDm9hdXRoMl9jbGllbnRzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIrYBCiRDcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEwoLZGVzY3JpcHRpb24YBCABKAkiYQolQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIi/AEKJFVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABARI7CgRuYW1lGAQgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kSACIAQESGAoLZGVzY3JpcHRpb24YBSABKAlIAYgBAUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb24iYQolVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIiiQEKIUdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABASJeCiJHZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlEjgKDG1hY2hpbmVfdXNlchgBIAEoCzIiLnRhaWxvci52MS5Db250cm9scGxhbmVNYWNoaW5lVXNlciKkAQonR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJCeU5hbWVSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAIgASgJQgu6SAjYAQFyA7ABARI2CgRuYW1lGAMgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kImQKKEdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyQnlOYW1lUmVzcG9uc2USOAoMbWFjaGluZV91c2VyGAEgASgLMiIudGFpbG9yLnYxLkNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyIsEBCiNMaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiKPAQokTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1Jlc3BvbnNlEjkKDW1hY2hpbmVfdXNlcnMYASADKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXISFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIowBCiREZWxldGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEiEKD21hY2hpbmVfdXNlcl9pZBgDIAEoCUIIukgFcgOwAQEiJwolRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZWIGcHJvdG8z\", [file_buf_validate_validate, file_google_protobuf_struct, file_google_protobuf_timestamp, file_tailor_v1_auth_resource, file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.CreateAuthServiceRequest.\n * Use `create(CreateAuthServiceRequestSchema)` to create a new message.\n */\nexport const CreateAuthServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 0);\n\n/**\n * Describes the message tailor.v1.CreateAuthServiceResponse.\n * Use `create(CreateAuthServiceResponseSchema)` to create a new message.\n */\nexport const CreateAuthServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 1);\n\n/**\n * Describes the message tailor.v1.UpdateAuthServiceRequest.\n * Use `create(UpdateAuthServiceRequestSchema)` to create a new message.\n */\nexport const UpdateAuthServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 2);\n\n/**\n * Describes the message tailor.v1.UpdateAuthServiceResponse.\n * Use `create(UpdateAuthServiceResponseSchema)` to create a new message.\n */\nexport const UpdateAuthServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 3);\n\n/**\n * Describes the message tailor.v1.DeleteAuthServiceRequest.\n * Use `create(DeleteAuthServiceRequestSchema)` to create a new message.\n */\nexport const DeleteAuthServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 4);\n\n/**\n * Describes the message tailor.v1.DeleteAuthServiceResponse.\n * Use `create(DeleteAuthServiceResponseSchema)` to create a new message.\n */\nexport const DeleteAuthServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 5);\n\n/**\n * Describes the message tailor.v1.GetAuthServiceRequest.\n * Use `create(GetAuthServiceRequestSchema)` to create a new message.\n */\nexport const GetAuthServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 6);\n\n/**\n * Describes the message tailor.v1.GetAuthServiceResponse.\n * Use `create(GetAuthServiceResponseSchema)` to create a new message.\n */\nexport const GetAuthServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 7);\n\n/**\n * Describes the message tailor.v1.ListAuthServicesRequest.\n * Use `create(ListAuthServicesRequestSchema)` to create a new message.\n */\nexport const ListAuthServicesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 8);\n\n/**\n * Describes the message tailor.v1.ListAuthServicesResponse.\n * Use `create(ListAuthServicesResponseSchema)` to create a new message.\n */\nexport const ListAuthServicesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 9);\n\n/**\n * Describes the message tailor.v1.CreateAuthIDPConfigRequest.\n * Use `create(CreateAuthIDPConfigRequestSchema)` to create a new message.\n */\nexport const CreateAuthIDPConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 10);\n\n/**\n * Describes the message tailor.v1.CreateAuthIDPConfigResponse.\n * Use `create(CreateAuthIDPConfigResponseSchema)` to create a new message.\n */\nexport const CreateAuthIDPConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 11);\n\n/**\n * Describes the message tailor.v1.UpdateAuthIDPConfigRequest.\n * Use `create(UpdateAuthIDPConfigRequestSchema)` to create a new message.\n */\nexport const UpdateAuthIDPConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 12);\n\n/**\n * Describes the message tailor.v1.UpdateAuthIDPConfigResponse.\n * Use `create(UpdateAuthIDPConfigResponseSchema)` to create a new message.\n */\nexport const UpdateAuthIDPConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 13);\n\n/**\n * Describes the message tailor.v1.DeleteAuthIDPConfigRequest.\n * Use `create(DeleteAuthIDPConfigRequestSchema)` to create a new message.\n */\nexport const DeleteAuthIDPConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 14);\n\n/**\n * Describes the message tailor.v1.DeleteAuthIDPConfigResponse.\n * Use `create(DeleteAuthIDPConfigResponseSchema)` to create a new message.\n */\nexport const DeleteAuthIDPConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 15);\n\n/**\n * Describes the message tailor.v1.GetAuthIDPConfigRequest.\n * Use `create(GetAuthIDPConfigRequestSchema)` to create a new message.\n */\nexport const GetAuthIDPConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 16);\n\n/**\n * Describes the message tailor.v1.GetAuthIDPConfigResponse.\n * Use `create(GetAuthIDPConfigResponseSchema)` to create a new message.\n */\nexport const GetAuthIDPConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 17);\n\n/**\n * Describes the message tailor.v1.ListAuthIDPConfigsRequest.\n * Use `create(ListAuthIDPConfigsRequestSchema)` to create a new message.\n */\nexport const ListAuthIDPConfigsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 18);\n\n/**\n * Describes the message tailor.v1.ListAuthIDPConfigsResponse.\n * Use `create(ListAuthIDPConfigsResponseSchema)` to create a new message.\n */\nexport const ListAuthIDPConfigsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 19);\n\n/**\n * Describes the message tailor.v1.CreateUserProfileConfigRequest.\n * Use `create(CreateUserProfileConfigRequestSchema)` to create a new message.\n */\nexport const CreateUserProfileConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 20);\n\n/**\n * Describes the message tailor.v1.CreateUserProfileConfigResponse.\n * Use `create(CreateUserProfileConfigResponseSchema)` to create a new message.\n */\nexport const CreateUserProfileConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 21);\n\n/**\n * Describes the message tailor.v1.UpdateUserProfileConfigRequest.\n * Use `create(UpdateUserProfileConfigRequestSchema)` to create a new message.\n */\nexport const UpdateUserProfileConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 22);\n\n/**\n * Describes the message tailor.v1.UpdateUserProfileConfigResponse.\n * Use `create(UpdateUserProfileConfigResponseSchema)` to create a new message.\n */\nexport const UpdateUserProfileConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 23);\n\n/**\n * Describes the message tailor.v1.DeleteUserProfileConfigRequest.\n * Use `create(DeleteUserProfileConfigRequestSchema)` to create a new message.\n */\nexport const DeleteUserProfileConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 24);\n\n/**\n * Describes the message tailor.v1.DeleteUserProfileConfigResponse.\n * Use `create(DeleteUserProfileConfigResponseSchema)` to create a new message.\n */\nexport const DeleteUserProfileConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 25);\n\n/**\n * Describes the message tailor.v1.GetUserProfileConfigRequest.\n * Use `create(GetUserProfileConfigRequestSchema)` to create a new message.\n */\nexport const GetUserProfileConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 26);\n\n/**\n * Describes the message tailor.v1.GetUserProfileConfigResponse.\n * Use `create(GetUserProfileConfigResponseSchema)` to create a new message.\n */\nexport const GetUserProfileConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 27);\n\n/**\n * Describes the message tailor.v1.CreateTenantConfigRequest.\n * Use `create(CreateTenantConfigRequestSchema)` to create a new message.\n */\nexport const CreateTenantConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 28);\n\n/**\n * Describes the message tailor.v1.CreateTenantConfigResponse.\n * Use `create(CreateTenantConfigResponseSchema)` to create a new message.\n */\nexport const CreateTenantConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 29);\n\n/**\n * Describes the message tailor.v1.UpdateTenantConfigRequest.\n * Use `create(UpdateTenantConfigRequestSchema)` to create a new message.\n */\nexport const UpdateTenantConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 30);\n\n/**\n * Describes the message tailor.v1.UpdateTenantConfigResponse.\n * Use `create(UpdateTenantConfigResponseSchema)` to create a new message.\n */\nexport const UpdateTenantConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 31);\n\n/**\n * Describes the message tailor.v1.DeleteTenantConfigRequest.\n * Use `create(DeleteTenantConfigRequestSchema)` to create a new message.\n */\nexport const DeleteTenantConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 32);\n\n/**\n * Describes the message tailor.v1.DeleteTenantConfigResponse.\n * Use `create(DeleteTenantConfigResponseSchema)` to create a new message.\n */\nexport const DeleteTenantConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 33);\n\n/**\n * Describes the message tailor.v1.GetTenantConfigRequest.\n * Use `create(GetTenantConfigRequestSchema)` to create a new message.\n */\nexport const GetTenantConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 34);\n\n/**\n * Describes the message tailor.v1.GetTenantConfigResponse.\n * Use `create(GetTenantConfigResponseSchema)` to create a new message.\n */\nexport const GetTenantConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 35);\n\n/**\n * Describes the message tailor.v1.CreatePersonalAccessTokenRequest.\n * Use `create(CreatePersonalAccessTokenRequestSchema)` to create a new message.\n */\nexport const CreatePersonalAccessTokenRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 36);\n\n/**\n * Describes the message tailor.v1.CreatePersonalAccessTokenResponse.\n * Use `create(CreatePersonalAccessTokenResponseSchema)` to create a new message.\n */\nexport const CreatePersonalAccessTokenResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 37);\n\n/**\n * Describes the message tailor.v1.DeletePersonalAccessTokenRequest.\n * Use `create(DeletePersonalAccessTokenRequestSchema)` to create a new message.\n */\nexport const DeletePersonalAccessTokenRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 38);\n\n/**\n * Describes the message tailor.v1.DeletePersonalAccessTokenResponse.\n * Use `create(DeletePersonalAccessTokenResponseSchema)` to create a new message.\n */\nexport const DeletePersonalAccessTokenResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 39);\n\n/**\n * Describes the message tailor.v1.ListPersonalAccessTokensRequest.\n * Use `create(ListPersonalAccessTokensRequestSchema)` to create a new message.\n */\nexport const ListPersonalAccessTokensRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 40);\n\n/**\n * Describes the message tailor.v1.ListPersonalAccessTokensResponse.\n * Use `create(ListPersonalAccessTokensResponseSchema)` to create a new message.\n */\nexport const ListPersonalAccessTokensResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 41);\n\n/**\n * Describes the message tailor.v1.CreateAuthMachineUserRequest.\n * Use `create(CreateAuthMachineUserRequestSchema)` to create a new message.\n */\nexport const CreateAuthMachineUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 42);\n\n/**\n * Describes the message tailor.v1.CreateAuthMachineUserResponse.\n * Use `create(CreateAuthMachineUserResponseSchema)` to create a new message.\n */\nexport const CreateAuthMachineUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 43);\n\n/**\n * Describes the message tailor.v1.UpdateAuthMachineUserRequest.\n * Use `create(UpdateAuthMachineUserRequestSchema)` to create a new message.\n */\nexport const UpdateAuthMachineUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 44);\n\n/**\n * Describes the message tailor.v1.UpdateAuthMachineUserResponse.\n * Use `create(UpdateAuthMachineUserResponseSchema)` to create a new message.\n */\nexport const UpdateAuthMachineUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 45);\n\n/**\n * Describes the message tailor.v1.DeleteAuthMachineUserRequest.\n * Use `create(DeleteAuthMachineUserRequestSchema)` to create a new message.\n */\nexport const DeleteAuthMachineUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 46);\n\n/**\n * Describes the message tailor.v1.DeleteAuthMachineUserResponse.\n * Use `create(DeleteAuthMachineUserResponseSchema)` to create a new message.\n */\nexport const DeleteAuthMachineUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 47);\n\n/**\n * Describes the message tailor.v1.GetAuthMachineUserRequest.\n * Use `create(GetAuthMachineUserRequestSchema)` to create a new message.\n */\nexport const GetAuthMachineUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 48);\n\n/**\n * Describes the message tailor.v1.GetAuthMachineUserResponse.\n * Use `create(GetAuthMachineUserResponseSchema)` to create a new message.\n */\nexport const GetAuthMachineUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 49);\n\n/**\n * Describes the message tailor.v1.ListAuthMachineUsersRequest.\n * Use `create(ListAuthMachineUsersRequestSchema)` to create a new message.\n */\nexport const ListAuthMachineUsersRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 50);\n\n/**\n * Describes the message tailor.v1.ListAuthMachineUsersResponse.\n * Use `create(ListAuthMachineUsersResponseSchema)` to create a new message.\n */\nexport const ListAuthMachineUsersResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 51);\n\n/**\n * Describes the message tailor.v1.CreateAuthSCIMConfigRequest.\n * Use `create(CreateAuthSCIMConfigRequestSchema)` to create a new message.\n */\nexport const CreateAuthSCIMConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 52);\n\n/**\n * Describes the message tailor.v1.CreateAuthSCIMConfigResponse.\n * Use `create(CreateAuthSCIMConfigResponseSchema)` to create a new message.\n */\nexport const CreateAuthSCIMConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 53);\n\n/**\n * Describes the message tailor.v1.UpdateAuthSCIMConfigRequest.\n * Use `create(UpdateAuthSCIMConfigRequestSchema)` to create a new message.\n */\nexport const UpdateAuthSCIMConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 54);\n\n/**\n * Describes the message tailor.v1.UpdateAuthSCIMConfigResponse.\n * Use `create(UpdateAuthSCIMConfigResponseSchema)` to create a new message.\n */\nexport const UpdateAuthSCIMConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 55);\n\n/**\n * Describes the message tailor.v1.GetAuthSCIMConfigRequest.\n * Use `create(GetAuthSCIMConfigRequestSchema)` to create a new message.\n */\nexport const GetAuthSCIMConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 56);\n\n/**\n * Describes the message tailor.v1.GetAuthSCIMConfigResponse.\n * Use `create(GetAuthSCIMConfigResponseSchema)` to create a new message.\n */\nexport const GetAuthSCIMConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 57);\n\n/**\n * Describes the message tailor.v1.DeleteAuthSCIMConfigRequest.\n * Use `create(DeleteAuthSCIMConfigRequestSchema)` to create a new message.\n */\nexport const DeleteAuthSCIMConfigRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 58);\n\n/**\n * Describes the message tailor.v1.DeleteAuthSCIMConfigResponse.\n * Use `create(DeleteAuthSCIMConfigResponseSchema)` to create a new message.\n */\nexport const DeleteAuthSCIMConfigResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 59);\n\n/**\n * Describes the message tailor.v1.CreateAuthSCIMResourceRequest.\n * Use `create(CreateAuthSCIMResourceRequestSchema)` to create a new message.\n */\nexport const CreateAuthSCIMResourceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 60);\n\n/**\n * Describes the message tailor.v1.CreateAuthSCIMResourceResponse.\n * Use `create(CreateAuthSCIMResourceResponseSchema)` to create a new message.\n */\nexport const CreateAuthSCIMResourceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 61);\n\n/**\n * Describes the message tailor.v1.UpdateAuthSCIMResourceRequest.\n * Use `create(UpdateAuthSCIMResourceRequestSchema)` to create a new message.\n */\nexport const UpdateAuthSCIMResourceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 62);\n\n/**\n * Describes the message tailor.v1.UpdateAuthSCIMResourceResponse.\n * Use `create(UpdateAuthSCIMResourceResponseSchema)` to create a new message.\n */\nexport const UpdateAuthSCIMResourceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 63);\n\n/**\n * Describes the message tailor.v1.DeleteAuthSCIMResourceRequest.\n * Use `create(DeleteAuthSCIMResourceRequestSchema)` to create a new message.\n */\nexport const DeleteAuthSCIMResourceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 64);\n\n/**\n * Describes the message tailor.v1.DeleteAuthSCIMResourceResponse.\n * Use `create(DeleteAuthSCIMResourceResponseSchema)` to create a new message.\n */\nexport const DeleteAuthSCIMResourceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 65);\n\n/**\n * Describes the message tailor.v1.GetAuthSCIMResourceRequest.\n * Use `create(GetAuthSCIMResourceRequestSchema)` to create a new message.\n */\nexport const GetAuthSCIMResourceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 66);\n\n/**\n * Describes the message tailor.v1.GetAuthSCIMResourceResponse.\n * Use `create(GetAuthSCIMResourceResponseSchema)` to create a new message.\n */\nexport const GetAuthSCIMResourceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 67);\n\n/**\n * Describes the message tailor.v1.GetAuthSCIMResourcesRequest.\n * Use `create(GetAuthSCIMResourcesRequestSchema)` to create a new message.\n */\nexport const GetAuthSCIMResourcesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 68);\n\n/**\n * Describes the message tailor.v1.GetAuthSCIMResourcesResponse.\n * Use `create(GetAuthSCIMResourcesResponseSchema)` to create a new message.\n */\nexport const GetAuthSCIMResourcesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 69);\n\n/**\n * Describes the message tailor.v1.CreateAuthConnectionRequest.\n * Use `create(CreateAuthConnectionRequestSchema)` to create a new message.\n */\nexport const CreateAuthConnectionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 70);\n\n/**\n * Describes the message tailor.v1.CreateAuthConnectionResponse.\n * Use `create(CreateAuthConnectionResponseSchema)` to create a new message.\n */\nexport const CreateAuthConnectionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 71);\n\n/**\n * Describes the message tailor.v1.ListAuthConnectionsRequest.\n * Use `create(ListAuthConnectionsRequestSchema)` to create a new message.\n */\nexport const ListAuthConnectionsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 72);\n\n/**\n * Describes the message tailor.v1.ListAuthConnectionsResponse.\n * Use `create(ListAuthConnectionsResponseSchema)` to create a new message.\n */\nexport const ListAuthConnectionsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 73);\n\n/**\n * Describes the message tailor.v1.RevokeAuthConnectionRequest.\n * Use `create(RevokeAuthConnectionRequestSchema)` to create a new message.\n */\nexport const RevokeAuthConnectionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 74);\n\n/**\n * Describes the message tailor.v1.RevokeAuthConnectionResponse.\n * Use `create(RevokeAuthConnectionResponseSchema)` to create a new message.\n */\nexport const RevokeAuthConnectionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 75);\n\n/**\n * Describes the message tailor.v1.RegisterAuthConnectionSessionRequest.\n * Use `create(RegisterAuthConnectionSessionRequestSchema)` to create a new message.\n */\nexport const RegisterAuthConnectionSessionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 76);\n\n/**\n * Describes the message tailor.v1.RegisterAuthConnectionSessionResponse.\n * Use `create(RegisterAuthConnectionSessionResponseSchema)` to create a new message.\n */\nexport const RegisterAuthConnectionSessionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 77);\n\n/**\n * Describes the message tailor.v1.ExchangeAuthConnectionAuthorizationCodeRequest.\n * Use `create(ExchangeAuthConnectionAuthorizationCodeRequestSchema)` to create a new message.\n */\nexport const ExchangeAuthConnectionAuthorizationCodeRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 78);\n\n/**\n * Describes the message tailor.v1.ExchangeAuthConnectionAuthorizationCodeResponse.\n * Use `create(ExchangeAuthConnectionAuthorizationCodeResponseSchema)` to create a new message.\n */\nexport const ExchangeAuthConnectionAuthorizationCodeResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 79);\n\n/**\n * Describes the message tailor.v1.CreateAuthOAuth2ClientRequest.\n * Use `create(CreateAuthOAuth2ClientRequestSchema)` to create a new message.\n */\nexport const CreateAuthOAuth2ClientRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 80);\n\n/**\n * Describes the message tailor.v1.CreateAuthOAuth2ClientResponse.\n * Use `create(CreateAuthOAuth2ClientResponseSchema)` to create a new message.\n */\nexport const CreateAuthOAuth2ClientResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 81);\n\n/**\n * Describes the message tailor.v1.UpdateAuthOAuth2ClientRequest.\n * Use `create(UpdateAuthOAuth2ClientRequestSchema)` to create a new message.\n */\nexport const UpdateAuthOAuth2ClientRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 82);\n\n/**\n * Describes the message tailor.v1.UpdateAuthOAuth2ClientResponse.\n * Use `create(UpdateAuthOAuth2ClientResponseSchema)` to create a new message.\n */\nexport const UpdateAuthOAuth2ClientResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 83);\n\n/**\n * Describes the message tailor.v1.DeleteAuthOAuth2ClientRequest.\n * Use `create(DeleteAuthOAuth2ClientRequestSchema)` to create a new message.\n */\nexport const DeleteAuthOAuth2ClientRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 84);\n\n/**\n * Describes the message tailor.v1.DeleteAuthOAuth2ClientResponse.\n * Use `create(DeleteAuthOAuth2ClientResponseSchema)` to create a new message.\n */\nexport const DeleteAuthOAuth2ClientResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 85);\n\n/**\n * Describes the message tailor.v1.GetAuthOAuth2ClientRequest.\n * Use `create(GetAuthOAuth2ClientRequestSchema)` to create a new message.\n */\nexport const GetAuthOAuth2ClientRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 86);\n\n/**\n * Describes the message tailor.v1.GetAuthOAuth2ClientResponse.\n * Use `create(GetAuthOAuth2ClientResponseSchema)` to create a new message.\n */\nexport const GetAuthOAuth2ClientResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 87);\n\n/**\n * Describes the message tailor.v1.ListAuthOAuth2ClientsRequest.\n * Use `create(ListAuthOAuth2ClientsRequestSchema)` to create a new message.\n */\nexport const ListAuthOAuth2ClientsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 88);\n\n/**\n * Describes the message tailor.v1.ListAuthOAuth2ClientsResponse.\n * Use `create(ListAuthOAuth2ClientsResponseSchema)` to create a new message.\n */\nexport const ListAuthOAuth2ClientsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 89);\n\n/**\n * Describes the message tailor.v1.CreateControlplaneMachineUserRequest.\n * Use `create(CreateControlplaneMachineUserRequestSchema)` to create a new message.\n */\nexport const CreateControlplaneMachineUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 90);\n\n/**\n * Describes the message tailor.v1.CreateControlplaneMachineUserResponse.\n * Use `create(CreateControlplaneMachineUserResponseSchema)` to create a new message.\n */\nexport const CreateControlplaneMachineUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 91);\n\n/**\n * Describes the message tailor.v1.UpdateControlplaneMachineUserRequest.\n * Use `create(UpdateControlplaneMachineUserRequestSchema)` to create a new message.\n */\nexport const UpdateControlplaneMachineUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 92);\n\n/**\n * Describes the message tailor.v1.UpdateControlplaneMachineUserResponse.\n * Use `create(UpdateControlplaneMachineUserResponseSchema)` to create a new message.\n */\nexport const UpdateControlplaneMachineUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 93);\n\n/**\n * Describes the message tailor.v1.GetControlplaneMachineUserRequest.\n * Use `create(GetControlplaneMachineUserRequestSchema)` to create a new message.\n */\nexport const GetControlplaneMachineUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 94);\n\n/**\n * Describes the message tailor.v1.GetControlplaneMachineUserResponse.\n * Use `create(GetControlplaneMachineUserResponseSchema)` to create a new message.\n */\nexport const GetControlplaneMachineUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 95);\n\n/**\n * Describes the message tailor.v1.GetControlplaneMachineUserByNameRequest.\n * Use `create(GetControlplaneMachineUserByNameRequestSchema)` to create a new message.\n */\nexport const GetControlplaneMachineUserByNameRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 96);\n\n/**\n * Describes the message tailor.v1.GetControlplaneMachineUserByNameResponse.\n * Use `create(GetControlplaneMachineUserByNameResponseSchema)` to create a new message.\n */\nexport const GetControlplaneMachineUserByNameResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 97);\n\n/**\n * Describes the message tailor.v1.ListControlplaneMachineUsersRequest.\n * Use `create(ListControlplaneMachineUsersRequestSchema)` to create a new message.\n */\nexport const ListControlplaneMachineUsersRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 98);\n\n/**\n * Describes the message tailor.v1.ListControlplaneMachineUsersResponse.\n * Use `create(ListControlplaneMachineUsersResponseSchema)` to create a new message.\n */\nexport const ListControlplaneMachineUsersResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 99);\n\n/**\n * Describes the message tailor.v1.DeleteControlplaneMachineUserRequest.\n * Use `create(DeleteControlplaneMachineUserRequestSchema)` to create a new message.\n */\nexport const DeleteControlplaneMachineUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 100);\n\n/**\n * Describes the message tailor.v1.DeleteControlplaneMachineUserResponse.\n * Use `create(DeleteControlplaneMachineUserResponseSchema)` to create a new message.\n */\nexport const DeleteControlplaneMachineUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_auth, 101);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/events_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_google_protobuf_struct, file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Describes the file tailor/v1/events_resource.proto.\n */\nexport const file_tailor_v1_events_resource = /*@__PURE__*/\n fileDesc(\"Ch90YWlsb3IvdjEvZXZlbnRzX3Jlc291cmNlLnByb3RvEgl0YWlsb3IudjEitgEKDkRhdGFwbGFuZUV2ZW50EhcKD2lkZW1wb3RlbmN5X2tleRgBIAEoCRIUCgx3b3Jrc3BhY2VfaWQYAiABKAkSEgoKZXZlbnRfdHlwZRgDIAEoCRIQCghhY3Rvcl9pZBgEIAEoCRIlCgRkYXRhGAUgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdBIoCgR0aW1lGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCLBAQoXQ29udHJvbHBsYW5lQWN0aXZpdHlMb2cSFwoPaWRlbXBvdGVuY3lfa2V5GAEgASgJEhQKDHdvcmtzcGFjZV9pZBgCIAEoCRIQCghhY3Rvcl9pZBgDIAEoCRIQCghyZXNvdXJjZRgEIAEoCRIOCgZhY3Rpb24YBSABKAkSEgoKaWRlbnRpZmllchgGIAEoCRIvCgtvcGVyYXRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBiBnByb3RvMw\", [file_google_protobuf_struct, file_google_protobuf_timestamp]);\n\n/**\n * Describes the message tailor.v1.DataplaneEvent.\n * Use `create(DataplaneEventSchema)` to create a new message.\n */\nexport const DataplaneEventSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_events_resource, 0);\n\n/**\n * Describes the message tailor.v1.ControlplaneActivityLog.\n * Use `create(ControlplaneActivityLogSchema)` to create a new message.\n */\nexport const ControlplaneActivityLogSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_events_resource, 1);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/events.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_tailor_v1_events_resource } from \"./events_resource_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/events.proto.\n */\nexport const file_tailor_v1_events = /*@__PURE__*/\n fileDesc(\"ChZ0YWlsb3IvdjEvZXZlbnRzLnByb3RvEgl0YWlsb3IudjEiuAEKGkxpc3REYXRhcGxhbmVFdmVudHNSZXF1ZXN0EhIKCnBhZ2VfdG9rZW4YASABKAkSEQoJcGFnZV9zaXplGAIgASgNEh4KDHdvcmtzcGFjZV9pZBgDIAEoCUIIukgFcgOwAQESMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbhIhCgZmaWx0ZXIYBSABKAsyES50YWlsb3IudjEuRmlsdGVyInYKG0xpc3REYXRhcGxhbmVFdmVudHNSZXNwb25zZRIXCg9uZXh0X3BhZ2VfdG9rZW4YASABKAkSKQoGZXZlbnRzGAIgAygLMhkudGFpbG9yLnYxLkRhdGFwbGFuZUV2ZW50EhMKC3RvdGFsX2NvdW50GAMgASgDIsEBCiNMaXN0Q29udHJvbHBsYW5lQWN0aXZpdHlMb2dzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIeCgx3b3Jrc3BhY2VfaWQYAyABKAlCCLpIBXIDsAEBEjAKDnBhZ2VfZGlyZWN0aW9uGAQgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24SIQoGZmlsdGVyGAUgASgLMhEudGFpbG9yLnYxLkZpbHRlciKGAQokTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1Jlc3BvbnNlEhcKD25leHRfcGFnZV90b2tlbhgBIAEoCRIwCgRsb2dzGAIgAygLMiIudGFpbG9yLnYxLkNvbnRyb2xwbGFuZUFjdGl2aXR5TG9nEhMKC3RvdGFsX2NvdW50GAMgASgDYgZwcm90bzM\", [file_buf_validate_validate, file_tailor_v1_events_resource, file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.ListDataplaneEventsRequest.\n * Use `create(ListDataplaneEventsRequestSchema)` to create a new message.\n */\nexport const ListDataplaneEventsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_events, 0);\n\n/**\n * Describes the message tailor.v1.ListDataplaneEventsResponse.\n * Use `create(ListDataplaneEventsResponseSchema)` to create a new message.\n */\nexport const ListDataplaneEventsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_events, 1);\n\n/**\n * Describes the message tailor.v1.ListControlplaneActivityLogsRequest.\n * Use `create(ListControlplaneActivityLogsRequestSchema)` to create a new message.\n */\nexport const ListControlplaneActivityLogsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_events, 2);\n\n/**\n * Describes the message tailor.v1.ListControlplaneActivityLogsResponse.\n * Use `create(ListControlplaneActivityLogsResponseSchema)` to create a new message.\n */\nexport const ListControlplaneActivityLogsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_events, 3);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/executor_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_api_field_behavior } from \"../../google/api/field_behavior_pb\";\nimport { file_google_protobuf_struct, file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_tailor_v1_auth_resource } from \"./auth_resource_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\nimport { file_tailor_v1_secret_manager_resource } from \"./secret_manager_resource_pb\";\n\n/**\n * Describes the file tailor/v1/executor_resource.proto.\n */\nexport const file_tailor_v1_executor_resource = /*@__PURE__*/\n fileDesc(\"CiF0YWlsb3IvdjEvZXhlY3V0b3JfcmVzb3VyY2UucHJvdG8SCXRhaWxvci52MSL9AgoQRXhlY3V0b3JFeGVjdXRvchI2CgRuYW1lGAEgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhMKC2Rlc2NyaXB0aW9uGAIgASgJEkIKDHRyaWdnZXJfdHlwZRgDIAEoDjIeLnRhaWxvci52MS5FeGVjdXRvclRyaWdnZXJUeXBlQgy6SAmCAQYYARgCGAMSQAoOdHJpZ2dlcl9jb25maWcYBCABKAsyIC50YWlsb3IudjEuRXhlY3V0b3JUcmlnZ2VyQ29uZmlnQga6SAPIAQESRAoLdGFyZ2V0X3R5cGUYBSABKA4yHS50YWlsb3IudjEuRXhlY3V0b3JUYXJnZXRUeXBlQhC6SA2CAQoYARgCGAMYBBgFEj4KDXRhcmdldF9jb25maWcYBiABKAsyHy50YWlsb3IudjEuRXhlY3V0b3JUYXJnZXRDb25maWdCBrpIA8gBARIQCghkaXNhYmxlZBgHIAEoCCLrAQoVRXhlY3V0b3JUcmlnZ2VyQ29uZmlnEjwKCHNjaGVkdWxlGAEgASgLMigudGFpbG9yLnYxLkV4ZWN1dG9yVHJpZ2dlclNjaGVkdWxlQ29uZmlnSAASNgoFZXZlbnQYAiABKAsyJS50YWlsb3IudjEuRXhlY3V0b3JUcmlnZ2VyRXZlbnRDb25maWdIABJLChBpbmNvbWluZ193ZWJob29rGAMgASgLMi8udGFpbG9yLnYxLkV4ZWN1dG9yVHJpZ2dlckluY29taW5nV2ViaG9va0NvbmZpZ0gAQg8KBmNvbmZpZxIFukgCCAEiVgodRXhlY3V0b3JUcmlnZ2VyU2NoZWR1bGVDb25maWcSGQoIdGltZXpvbmUYASABKAlCB7pIBHICEAESGgoJZnJlcXVlbmN5GAIgASgJQge6SARyAhABIl8KGkV4ZWN1dG9yVHJpZ2dlckV2ZW50Q29uZmlnEhsKCmV2ZW50X3R5cGUYASABKAlCB7pIBHICEAESJAoJY29uZGl0aW9uGAIgASgLMhEudGFpbG9yLnYxLlNjcmlwdCI7CiRFeGVjdXRvclRyaWdnZXJJbmNvbWluZ1dlYmhvb2tDb25maWcSEwoGc2VjcmV0GAEgASgJQgPgQQMingIKFEV4ZWN1dG9yVGFyZ2V0Q29uZmlnEjMKB3dlYmhvb2sYASABKAsyIC50YWlsb3IudjEuRXhlY3V0b3JXZWJob29rQ29uZmlnSAASRgoOdGFpbG9yX2dyYXBocWwYAiABKAsyLC50YWlsb3IudjEuRXhlY3V0b3JUYXJnZXRUYWlsb3JHcmFwaHFsQ29uZmlnSAASOwoIZnVuY3Rpb24YAyABKAsyJy50YWlsb3IudjEuRXhlY3V0b3JUYXJnZXRGdW5jdGlvbkNvbmZpZ0gAEjsKCHdvcmtmbG93GAUgASgLMicudGFpbG9yLnYxLkV4ZWN1dG9yVGFyZ2V0V29ya2Zsb3dDb25maWdIAEIPCgZjb25maWcSBbpIAggBIrkBChVFeGVjdXRvcldlYmhvb2tDb25maWcSHgoDdXJsGAEgASgLMhEudGFpbG9yLnYxLlNjcmlwdBImCgZzZWNyZXQYAiABKAsyFi50YWlsb3IudjEuU2VjcmV0VmFsdWUSNwoHaGVhZGVycxgDIAMoCzImLnRhaWxvci52MS5FeGVjdXRvclRhcmdldFdlYmhvb2tIZWFkZXISHwoEYm9keRgEIAEoCzIRLnRhaWxvci52MS5TY3JpcHQikQEKG0V4ZWN1dG9yVGFyZ2V0V2ViaG9va0hlYWRlchIUCgNrZXkYASABKAlCB7pIBHICEAESHAoJcmF3X3ZhbHVlGAIgASgJQge6SARyAhABSAASLgoMc2VjcmV0X3ZhbHVlGAMgASgLMhYudGFpbG9yLnYxLlNlY3JldFZhbHVlSABCDgoFdmFsdWUSBbpIAggBIqUBCiFFeGVjdXRvclRhcmdldFRhaWxvckdyYXBocWxDb25maWcSGQoIYXBwX25hbWUYASABKAlCB7pIBHICEAESFgoFcXVlcnkYAiABKAlCB7pIBHICEAESJAoJdmFyaWFibGVzGAMgASgLMhEudGFpbG9yLnYxLlNjcmlwdBInCgdpbnZva2VyGAQgASgLMhYudGFpbG9yLnYxLkF1dGhJbnZva2VyIsUBChxFeGVjdXRvclRhcmdldEZ1bmN0aW9uQ29uZmlnEhUKBG5hbWUYASABKAlCB7pIBHICEAESDgoGc2NyaXB0GAIgASgJEiQKCXZhcmlhYmxlcxgDIAEoCzIRLnRhaWxvci52MS5TY3JpcHQSJwoHaW52b2tlchgEIAEoCzIWLnRhaWxvci52MS5BdXRoSW52b2tlchIgCgpzY3JpcHRfcmVmGAUgASgJQge6SARyAhABSACIAQFCDQoLX3NjcmlwdF9yZWYijQEKHEV4ZWN1dG9yVGFyZ2V0V29ya2Zsb3dDb25maWcSHgoNd29ya2Zsb3dfbmFtZRgBIAEoCUIHukgEcgIQARIkCgl2YXJpYWJsZXMYAiABKAsyES50YWlsb3IudjEuU2NyaXB0EicKB2ludm9rZXIYAyABKAsyFi50YWlsb3IudjEuQXV0aEludm9rZXIi3gIKC0V4ZWN1dG9ySm9iEgoKAmlkGAEgASgJEhUKDWV4ZWN1dG9yX25hbWUYAiABKAkSLAoGc3RhdHVzGAMgASgOMhwudGFpbG9yLnYxLkV4ZWN1dG9ySm9iU3RhdHVzEiYKBWFjdG9yGAQgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdBIlCgRkYXRhGAUgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdBIdChVldmVudF9pZGVtcG90ZW5jeV9rZXkYBiABKAkSMAoMc2NoZWR1bGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgpjcmVhdGVkX2F0GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCLLAgoSRXhlY3V0b3JKb2JBdHRlbXB0EgoKAmlkGAEgASgJEg4KBmpvYl9pZBgCIAEoCRIsCgZzdGF0dXMYAyABKA4yHC50YWlsb3IudjEuRXhlY3V0b3JKb2JTdGF0dXMSDQoFZXJyb3IYBCABKAkSLgoKc3RhcnRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoLZmluaXNoZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCmNyZWF0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhsKE29wZXJhdGlvbl9yZWZlcmVuY2UYCSABKAkiTwoXRXhlY3V0b3JJbmNvbWluZ1dlYmhvb2sSFQoNZXhlY3V0b3JfbmFtZRgBIAEoCRILCgN1cmwYAiABKAkSEAoIZGlzYWJsZWQYAyABKAgqrQEKE0V4ZWN1dG9yVHJpZ2dlclR5cGUSJQohRVhFQ1VUT1JfVFJJR0dFUl9UWVBFX1VOU1BFQ0lGSUVEEAASIgoeRVhFQ1VUT1JfVFJJR0dFUl9UWVBFX1NDSEVEVUxFEAESHwobRVhFQ1VUT1JfVFJJR0dFUl9UWVBFX0VWRU5UEAISKgomRVhFQ1VUT1JfVFJJR0dFUl9UWVBFX0lOQ09NSU5HX1dFQkhPT0sQAyryAQoSRXhlY3V0b3JUYXJnZXRUeXBlEiQKIEVYRUNVVE9SX1RBUkdFVF9UWVBFX1VOU1BFQ0lGSUVEEAASIAocRVhFQ1VUT1JfVEFSR0VUX1RZUEVfV0VCSE9PSxABEicKI0VYRUNVVE9SX1RBUkdFVF9UWVBFX1RBSUxPUl9HUkFQSFFMEAISIQodRVhFQ1VUT1JfVEFSR0VUX1RZUEVfRlVOQ1RJT04QAxIlCiFFWEVDVVRPUl9UQVJHRVRfVFlQRV9KT0JfRlVOQ1RJT04QBBIhCh1FWEVDVVRPUl9UQVJHRVRfVFlQRV9XT1JLRkxPVxAFKt0BChFFeGVjdXRvckpvYlN0YXR1cxIjCh9FWEVDVVRPUl9KT0JfU1RBVFVTX1VOU1BFQ0lGSUVEEAASHwobRVhFQ1VUT1JfSk9CX1NUQVRVU19QRU5ESU5HEAESHwobRVhFQ1VUT1JfSk9CX1NUQVRVU19SVU5OSU5HEAISHwobRVhFQ1VUT1JfSk9CX1NUQVRVU19TVUNDRVNTEAMSHgoaRVhFQ1VUT1JfSk9CX1NUQVRVU19GQUlMRUQQBBIgChxFWEVDVVRPUl9KT0JfU1RBVFVTX0NBTkNFTEVEEAViBnByb3RvMw\", [file_buf_validate_validate, file_google_api_field_behavior, file_google_protobuf_struct, file_google_protobuf_timestamp, file_tailor_v1_auth_resource, file_tailor_v1_resource, file_tailor_v1_secret_manager_resource]);\n\n/**\n * Describes the message tailor.v1.ExecutorExecutor.\n * Use `create(ExecutorExecutorSchema)` to create a new message.\n */\nexport const ExecutorExecutorSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 0);\n\n/**\n * Describes the message tailor.v1.ExecutorTriggerConfig.\n * Use `create(ExecutorTriggerConfigSchema)` to create a new message.\n */\nexport const ExecutorTriggerConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 1);\n\n/**\n * Describes the message tailor.v1.ExecutorTriggerScheduleConfig.\n * Use `create(ExecutorTriggerScheduleConfigSchema)` to create a new message.\n */\nexport const ExecutorTriggerScheduleConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 2);\n\n/**\n * Describes the message tailor.v1.ExecutorTriggerEventConfig.\n * Use `create(ExecutorTriggerEventConfigSchema)` to create a new message.\n */\nexport const ExecutorTriggerEventConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 3);\n\n/**\n * Describes the message tailor.v1.ExecutorTriggerIncomingWebhookConfig.\n * Use `create(ExecutorTriggerIncomingWebhookConfigSchema)` to create a new message.\n */\nexport const ExecutorTriggerIncomingWebhookConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 4);\n\n/**\n * Describes the message tailor.v1.ExecutorTargetConfig.\n * Use `create(ExecutorTargetConfigSchema)` to create a new message.\n */\nexport const ExecutorTargetConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 5);\n\n/**\n * Describes the message tailor.v1.ExecutorWebhookConfig.\n * Use `create(ExecutorWebhookConfigSchema)` to create a new message.\n */\nexport const ExecutorWebhookConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 6);\n\n/**\n * Describes the message tailor.v1.ExecutorTargetWebhookHeader.\n * Use `create(ExecutorTargetWebhookHeaderSchema)` to create a new message.\n */\nexport const ExecutorTargetWebhookHeaderSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 7);\n\n/**\n * Describes the message tailor.v1.ExecutorTargetTailorGraphqlConfig.\n * Use `create(ExecutorTargetTailorGraphqlConfigSchema)` to create a new message.\n */\nexport const ExecutorTargetTailorGraphqlConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 8);\n\n/**\n * Describes the message tailor.v1.ExecutorTargetFunctionConfig.\n * Use `create(ExecutorTargetFunctionConfigSchema)` to create a new message.\n */\nexport const ExecutorTargetFunctionConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 9);\n\n/**\n * Describes the message tailor.v1.ExecutorTargetWorkflowConfig.\n * Use `create(ExecutorTargetWorkflowConfigSchema)` to create a new message.\n */\nexport const ExecutorTargetWorkflowConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 10);\n\n/**\n * Describes the message tailor.v1.ExecutorJob.\n * Use `create(ExecutorJobSchema)` to create a new message.\n */\nexport const ExecutorJobSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 11);\n\n/**\n * Describes the message tailor.v1.ExecutorJobAttempt.\n * Use `create(ExecutorJobAttemptSchema)` to create a new message.\n */\nexport const ExecutorJobAttemptSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 12);\n\n/**\n * Describes the message tailor.v1.ExecutorIncomingWebhook.\n * Use `create(ExecutorIncomingWebhookSchema)` to create a new message.\n */\nexport const ExecutorIncomingWebhookSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor_resource, 13);\n\n/**\n * Describes the enum tailor.v1.ExecutorTriggerType.\n */\nexport const ExecutorTriggerTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_executor_resource, 0);\n\n/**\n * @generated from enum tailor.v1.ExecutorTriggerType\n */\nexport const ExecutorTriggerType = /*@__PURE__*/\n tsEnum(ExecutorTriggerTypeSchema);\n\n/**\n * Describes the enum tailor.v1.ExecutorTargetType.\n */\nexport const ExecutorTargetTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_executor_resource, 1);\n\n/**\n * @generated from enum tailor.v1.ExecutorTargetType\n */\nexport const ExecutorTargetType = /*@__PURE__*/\n tsEnum(ExecutorTargetTypeSchema);\n\n/**\n * Describes the enum tailor.v1.ExecutorJobStatus.\n */\nexport const ExecutorJobStatusSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_executor_resource, 2);\n\n/**\n * @generated from enum tailor.v1.ExecutorJobStatus\n */\nexport const ExecutorJobStatus = /*@__PURE__*/\n tsEnum(ExecutorJobStatusSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/executor.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_protobuf_struct } from \"@bufbuild/protobuf/wkt\";\nimport { file_tailor_v1_executor_resource } from \"./executor_resource_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/executor.proto.\n */\nexport const file_tailor_v1_executor = /*@__PURE__*/\n fileDesc(\"Chh0YWlsb3IvdjEvZXhlY3V0b3IucHJvdG8SCXRhaWxvci52MSJ2Ch1DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEjUKCGV4ZWN1dG9yGAIgASgLMhsudGFpbG9yLnYxLkV4ZWN1dG9yRXhlY3V0b3JCBrpIA8gBASJPCh5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2USLQoIZXhlY3V0b3IYASABKAsyGy50YWlsb3IudjEuRXhlY3V0b3JFeGVjdXRvciJ2Ch1VcGRhdGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEjUKCGV4ZWN1dG9yGAIgASgLMhsudGFpbG9yLnYxLkV4ZWN1dG9yRXhlY3V0b3JCBrpIA8gBASJPCh5VcGRhdGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2USLQoIZXhlY3V0b3IYASABKAsyGy50YWlsb3IudjEuRXhlY3V0b3JFeGVjdXRvciJ0ChpHZXRFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEjYKBG5hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiTAobR2V0RXhlY3V0b3JFeGVjdXRvclJlc3BvbnNlEi0KCGV4ZWN1dG9yGAEgASgLMhsudGFpbG9yLnYxLkV4ZWN1dG9yRXhlY3V0b3IidwodRGVsZXRlRXhlY3V0b3JFeGVjdXRvclJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARI2CgRuYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIiAKHkRlbGV0ZUV4ZWN1dG9yRXhlY3V0b3JSZXNwb25zZSKXAQocTGlzdEV4ZWN1dG9yRXhlY3V0b3JzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhIKCnBhZ2VfdG9rZW4YAiABKAkSEQoJcGFnZV9zaXplGAMgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAQgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ifQodTGlzdEV4ZWN1dG9yRXhlY3V0b3JzUmVzcG9uc2USLgoJZXhlY3V0b3JzGAEgAygLMhsudGFpbG9yLnYxLkV4ZWN1dG9yRXhlY3V0b3ISFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIpIBChVHZXRFeGVjdXRvckpvYlJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARI/Cg1leGVjdXRvcl9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhgKBmpvYl9pZBgDIAEoCUIIukgFcgOwAQEiPQoWR2V0RXhlY3V0b3JKb2JSZXNwb25zZRIjCgNqb2IYASABKAsyFi50YWlsb3IudjEuRXhlY3V0b3JKb2Ii9gEKF0xpc3RFeGVjdXRvckpvYnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESPwoNZXhlY3V0b3JfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBISCgpwYWdlX3Rva2VuGAMgASgJEhEKCXBhZ2Vfc2l6ZRgEIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgFIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEiEKBmZpbHRlchgGIAEoCzIRLnRhaWxvci52MS5GaWx0ZXIibgoYTGlzdEV4ZWN1dG9ySm9ic1Jlc3BvbnNlEiQKBGpvYnMYASADKAsyFi50YWlsb3IudjEuRXhlY3V0b3JKb2ISFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIrMBCh5MaXN0RXhlY3V0b3JKb2JBdHRlbXB0c1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIYCgZqb2JfaWQYAiABKAlCCLpIBXIDsAEBEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24igAEKH0xpc3RFeGVjdXRvckpvYkF0dGVtcHRzUmVzcG9uc2USLwoIYXR0ZW1wdHMYASADKAsyHS50YWlsb3IudjEuRXhlY3V0b3JKb2JBdHRlbXB0EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKeAQojTGlzdEV4ZWN1dG9ySW5jb21pbmdXZWJob29rc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARISCgpwYWdlX3Rva2VuGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgEIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIooBCiRMaXN0RXhlY3V0b3JJbmNvbWluZ1dlYmhvb2tzUmVzcG9uc2USNAoId2ViaG9va3MYASADKAsyIi50YWlsb3IudjEuRXhlY3V0b3JJbmNvbWluZ1dlYmhvb2sSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDInsKIUdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEjYKBG5hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiWQoiR2V0RXhlY3V0b3JJbmNvbWluZ1dlYmhvb2tSZXNwb25zZRIzCgd3ZWJob29rGAEgASgLMiIudGFpbG9yLnYxLkV4ZWN1dG9ySW5jb21pbmdXZWJob29rIqMBChZUcmlnZ2VyRXhlY3V0b3JSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESPwoNZXhlY3V0b3JfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIoCgdwYXlsb2FkGAMgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCIzChdUcmlnZ2VyRXhlY3V0b3JSZXNwb25zZRIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBYgZwcm90bzM\", [file_buf_validate_validate, file_google_protobuf_struct, file_tailor_v1_executor_resource, file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.CreateExecutorExecutorRequest.\n * Use `create(CreateExecutorExecutorRequestSchema)` to create a new message.\n */\nexport const CreateExecutorExecutorRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 0);\n\n/**\n * Describes the message tailor.v1.CreateExecutorExecutorResponse.\n * Use `create(CreateExecutorExecutorResponseSchema)` to create a new message.\n */\nexport const CreateExecutorExecutorResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 1);\n\n/**\n * Describes the message tailor.v1.UpdateExecutorExecutorRequest.\n * Use `create(UpdateExecutorExecutorRequestSchema)` to create a new message.\n */\nexport const UpdateExecutorExecutorRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 2);\n\n/**\n * Describes the message tailor.v1.UpdateExecutorExecutorResponse.\n * Use `create(UpdateExecutorExecutorResponseSchema)` to create a new message.\n */\nexport const UpdateExecutorExecutorResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 3);\n\n/**\n * Describes the message tailor.v1.GetExecutorExecutorRequest.\n * Use `create(GetExecutorExecutorRequestSchema)` to create a new message.\n */\nexport const GetExecutorExecutorRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 4);\n\n/**\n * Describes the message tailor.v1.GetExecutorExecutorResponse.\n * Use `create(GetExecutorExecutorResponseSchema)` to create a new message.\n */\nexport const GetExecutorExecutorResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 5);\n\n/**\n * Describes the message tailor.v1.DeleteExecutorExecutorRequest.\n * Use `create(DeleteExecutorExecutorRequestSchema)` to create a new message.\n */\nexport const DeleteExecutorExecutorRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 6);\n\n/**\n * Describes the message tailor.v1.DeleteExecutorExecutorResponse.\n * Use `create(DeleteExecutorExecutorResponseSchema)` to create a new message.\n */\nexport const DeleteExecutorExecutorResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 7);\n\n/**\n * Describes the message tailor.v1.ListExecutorExecutorsRequest.\n * Use `create(ListExecutorExecutorsRequestSchema)` to create a new message.\n */\nexport const ListExecutorExecutorsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 8);\n\n/**\n * Describes the message tailor.v1.ListExecutorExecutorsResponse.\n * Use `create(ListExecutorExecutorsResponseSchema)` to create a new message.\n */\nexport const ListExecutorExecutorsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 9);\n\n/**\n * Describes the message tailor.v1.GetExecutorJobRequest.\n * Use `create(GetExecutorJobRequestSchema)` to create a new message.\n */\nexport const GetExecutorJobRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 10);\n\n/**\n * Describes the message tailor.v1.GetExecutorJobResponse.\n * Use `create(GetExecutorJobResponseSchema)` to create a new message.\n */\nexport const GetExecutorJobResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 11);\n\n/**\n * Describes the message tailor.v1.ListExecutorJobsRequest.\n * Use `create(ListExecutorJobsRequestSchema)` to create a new message.\n */\nexport const ListExecutorJobsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 12);\n\n/**\n * Describes the message tailor.v1.ListExecutorJobsResponse.\n * Use `create(ListExecutorJobsResponseSchema)` to create a new message.\n */\nexport const ListExecutorJobsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 13);\n\n/**\n * Describes the message tailor.v1.ListExecutorJobAttemptsRequest.\n * Use `create(ListExecutorJobAttemptsRequestSchema)` to create a new message.\n */\nexport const ListExecutorJobAttemptsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 14);\n\n/**\n * Describes the message tailor.v1.ListExecutorJobAttemptsResponse.\n * Use `create(ListExecutorJobAttemptsResponseSchema)` to create a new message.\n */\nexport const ListExecutorJobAttemptsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 15);\n\n/**\n * Describes the message tailor.v1.ListExecutorIncomingWebhooksRequest.\n * Use `create(ListExecutorIncomingWebhooksRequestSchema)` to create a new message.\n */\nexport const ListExecutorIncomingWebhooksRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 16);\n\n/**\n * Describes the message tailor.v1.ListExecutorIncomingWebhooksResponse.\n * Use `create(ListExecutorIncomingWebhooksResponseSchema)` to create a new message.\n */\nexport const ListExecutorIncomingWebhooksResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 17);\n\n/**\n * Describes the message tailor.v1.GetExecutorIncomingWebhookRequest.\n * Use `create(GetExecutorIncomingWebhookRequestSchema)` to create a new message.\n */\nexport const GetExecutorIncomingWebhookRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 18);\n\n/**\n * Describes the message tailor.v1.GetExecutorIncomingWebhookResponse.\n * Use `create(GetExecutorIncomingWebhookResponseSchema)` to create a new message.\n */\nexport const GetExecutorIncomingWebhookResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 19);\n\n/**\n * Describes the message tailor.v1.TriggerExecutorRequest.\n * Use `create(TriggerExecutorRequestSchema)` to create a new message.\n */\nexport const TriggerExecutorRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 20);\n\n/**\n * Describes the message tailor.v1.TriggerExecutorResponse.\n * Use `create(TriggerExecutorResponseSchema)` to create a new message.\n */\nexport const TriggerExecutorResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_executor, 21);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/function_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Describes the file tailor/v1/function_resource.proto.\n */\nexport const file_tailor_v1_function_resource = /*@__PURE__*/\n fileDesc(\"CiF0YWlsb3IvdjEvZnVuY3Rpb25fcmVzb3VyY2UucHJvdG8SCXRhaWxvci52MSLrAwoRRnVuY3Rpb25FeGVjdXRpb24SFAoCaWQYASABKAlCCLpIBXIDsAEBEh4KDHdvcmtzcGFjZV9pZBgCIAEoCUIIukgFcgOwAQESEwoLc2NyaXB0X25hbWUYAyABKAkSMwoGc3RhdHVzGAQgASgOMiMudGFpbG9yLnYxLkZ1bmN0aW9uRXhlY3V0aW9uLlN0YXR1cxIMCgRsb2dzGAUgASgJEi4KCnN0YXJ0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2ZpbmlzaGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI7CgR0eXBlGAggASgOMiEudGFpbG9yLnYxLkZ1bmN0aW9uRXhlY3V0aW9uLlR5cGVCCrpIB4IBBBgBGAISDgoGcmVzdWx0GAkgASgJIlsKBlN0YXR1cxIWChJTVEFUVVNfVU5TUEVDSUZJRUQQABISCg5TVEFUVVNfU1VDQ0VTUxABEhEKDVNUQVRVU19GQUlMRUQQAhISCg5TVEFUVVNfUlVOTklORxADIj0KBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhEKDVRZUEVfU1RBTkRBUkQQARIMCghUWVBFX0pPQhACYgZwcm90bzM\", [file_buf_validate_validate, file_google_protobuf_timestamp]);\n\n/**\n * Describes the message tailor.v1.FunctionExecution.\n * Use `create(FunctionExecutionSchema)` to create a new message.\n */\nexport const FunctionExecutionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_resource, 0);\n\n/**\n * Describes the enum tailor.v1.FunctionExecution.Status.\n */\nexport const FunctionExecution_StatusSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_function_resource, 0, 0);\n\n/**\n * @generated from enum tailor.v1.FunctionExecution.Status\n */\nexport const FunctionExecution_Status = /*@__PURE__*/\n tsEnum(FunctionExecution_StatusSchema);\n\n/**\n * Describes the enum tailor.v1.FunctionExecution.Type.\n */\nexport const FunctionExecution_TypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_function_resource, 0, 1);\n\n/**\n * @generated from enum tailor.v1.FunctionExecution.Type\n */\nexport const FunctionExecution_Type = /*@__PURE__*/\n tsEnum(FunctionExecution_TypeSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/function.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_tailor_v1_auth_resource } from \"./auth_resource_pb\";\nimport { file_tailor_v1_function_resource } from \"./function_resource_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/function.proto.\n */\nexport const file_tailor_v1_function = /*@__PURE__*/\n fileDesc(\"Chh0YWlsb3IvdjEvZnVuY3Rpb24ucHJvdG8SCXRhaWxvci52MSKcAQoVVGVzdEV4ZWNTY3JpcHRSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESDAoEbmFtZRgCIAEoCRIMCgRjb2RlGAMgASgJEhAKA2FyZxgEIAEoCUgAiAEBEicKB2ludm9rZXIYBSABKAsyFi50YWlsb3IudjEuQXV0aEludm9rZXJCBgoEX2FyZ0oECAYQByJOChZUZXN0RXhlY1NjcmlwdFJlc3BvbnNlEg4KBnJlc3VsdBgBIAEoCRIeCgxleGVjdXRpb25faWQYAyABKAlCCLpIBXIDsAEBSgQIAhADIl0KG0dldEZ1bmN0aW9uRXhlY3V0aW9uUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEh4KDGV4ZWN1dGlvbl9pZBgCIAEoCUIIukgFcgOwAQEiTwocR2V0RnVuY3Rpb25FeGVjdXRpb25SZXNwb25zZRIvCglleGVjdXRpb24YASABKAsyHC50YWlsb3IudjEuRnVuY3Rpb25FeGVjdXRpb24izAEKHUxpc3RGdW5jdGlvbkV4ZWN1dGlvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbhIhCgZmaWx0ZXIYBSABKAsyES50YWlsb3IudjEuRmlsdGVyEg8KB3NvcnRfYnkYBiABKAkigAEKHkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnNSZXNwb25zZRIwCgpleGVjdXRpb25zGAEgAygLMhwudGFpbG9yLnYxLkZ1bmN0aW9uRXhlY3V0aW9uEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoA2IGcHJvdG8z\", [file_buf_validate_validate, file_tailor_v1_auth_resource, file_tailor_v1_function_resource, file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.TestExecScriptRequest.\n * Use `create(TestExecScriptRequestSchema)` to create a new message.\n */\nexport const TestExecScriptRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function, 0);\n\n/**\n * Describes the message tailor.v1.TestExecScriptResponse.\n * Use `create(TestExecScriptResponseSchema)` to create a new message.\n */\nexport const TestExecScriptResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function, 1);\n\n/**\n * Describes the message tailor.v1.GetFunctionExecutionRequest.\n * Use `create(GetFunctionExecutionRequestSchema)` to create a new message.\n */\nexport const GetFunctionExecutionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function, 2);\n\n/**\n * Describes the message tailor.v1.GetFunctionExecutionResponse.\n * Use `create(GetFunctionExecutionResponseSchema)` to create a new message.\n */\nexport const GetFunctionExecutionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function, 3);\n\n/**\n * Describes the message tailor.v1.ListFunctionExecutionsRequest.\n * Use `create(ListFunctionExecutionsRequestSchema)` to create a new message.\n */\nexport const ListFunctionExecutionsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function, 4);\n\n/**\n * Describes the message tailor.v1.ListFunctionExecutionsResponse.\n * Use `create(ListFunctionExecutionsResponseSchema)` to create a new message.\n */\nexport const ListFunctionExecutionsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function, 5);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/function_registry.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/function_registry.proto.\n */\nexport const file_tailor_v1_function_registry = /*@__PURE__*/\n fileDesc(\"CiF0YWlsb3IvdjEvZnVuY3Rpb25fcmVnaXN0cnkucHJvdG8SCXRhaWxvci52MSLhAQoQRnVuY3Rpb25SZWdpc3RyeRIKCgJpZBgBIAEoCRIUCgx3b3Jrc3BhY2VfaWQYAiABKAkSDAoEbmFtZRgDIAEoCRISCgpzaXplX2J5dGVzGAQgASgDEhQKDGNvbnRlbnRfaGFzaBgFIAEoCRITCgtkZXNjcmlwdGlvbhgGIAEoCRIuCgpjcmVhdGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJyCh1DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBI1CgRpbmZvGAEgASgLMiUudGFpbG9yLnYxLkNyZWF0ZUZ1bmN0aW9uUmVnaXN0cnlJbmZvSAASDwoFY2h1bmsYAiABKAxIAEIJCgdwYXlsb2FkItoBChpDcmVhdGVGdW5jdGlvblJlZ2lzdHJ5SW5mbxIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEjIKBG5hbWUYAiABKAlCJLpIIXIfEAEY/wEyGF5bYS16QS1aXVthLXpBLVowLTlfLV0qJBITCgtkZXNjcmlwdGlvbhgDIAEoCRIgCgpzaXplX2J5dGVzGAQgASgDQgy6SAkiBxiAgIAKIAASMQoMY29udGVudF9oYXNoGAUgASgJQhu6SBhyFjIRXlthLWZBLUYwLTldezY0fSSYAUAiTwoeQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlEi0KCGZ1bmN0aW9uGAEgASgLMhsudGFpbG9yLnYxLkZ1bmN0aW9uUmVnaXN0cnkicgodVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QSNQoEaW5mbxgBIAEoCzIlLnRhaWxvci52MS5VcGRhdGVGdW5jdGlvblJlZ2lzdHJ5SW5mb0gAEg8KBWNodW5rGAIgASgMSABCCQoHcGF5bG9hZCLaAQoaVXBkYXRlRnVuY3Rpb25SZWdpc3RyeUluZm8SHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIyCgRuYW1lGAIgASgJQiS6SCFyHxABGP8BMhheW2EtekEtWl1bYS16QS1aMC05Xy1dKiQSEwoLZGVzY3JpcHRpb24YAyABKAkSIAoKc2l6ZV9ieXRlcxgEIAEoA0IMukgJIgcYgICACiAAEjEKDGNvbnRlbnRfaGFzaBgFIAEoCUIbukgYchYyEV5bYS1mQS1GMC05XXs2NH0kmAFAIk8KHlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnlSZXNwb25zZRItCghmdW5jdGlvbhgBIAEoCzIbLnRhaWxvci52MS5GdW5jdGlvblJlZ2lzdHJ5IlMKGkdldEZ1bmN0aW9uUmVnaXN0cnlSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESFQoEbmFtZRgCIAEoCUIHukgEcgIQASJMChtHZXRGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2USLQoIZnVuY3Rpb24YASABKAsyGy50YWlsb3IudjEuRnVuY3Rpb25SZWdpc3RyeSLMAQodTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARISCgpwYWdlX3Rva2VuGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgEIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEiEKBmZpbHRlchgFIAEoCzIRLnRhaWxvci52MS5GaWx0ZXISDwoHc29ydF9ieRgGIAEoCSJ+Ch5MaXN0RnVuY3Rpb25SZWdpc3RyaWVzUmVzcG9uc2USLgoJZnVuY3Rpb25zGAEgAygLMhsudGFpbG9yLnYxLkZ1bmN0aW9uUmVnaXN0cnkSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIlYKHURlbGV0ZUZ1bmN0aW9uUmVnaXN0cnlSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESFQoEbmFtZRgCIAEoCUIHukgEcgIQASIgCh5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UipwEKJURvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIVCgRuYW1lGAIgASgJQge6SARyAhABEjYKDGNvbnRlbnRfaGFzaBgDIAEoCUIbukgYchYyEV5bYS1mQS1GMC05XXs2NH0kmAFASACIAQFCDwoNX2NvbnRlbnRfaGFzaCKDAQomRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0UmVzcG9uc2USPQoIbWV0YWRhdGEYASABKAsyKS50YWlsb3IudjEuRnVuY3Rpb25SZWdpc3RyeVNjcmlwdE1ldGFkYXRhSAASDwoFY2h1bmsYAiABKAxIAEIJCgdwYXlsb2FkIk8KHkZ1bmN0aW9uUmVnaXN0cnlTY3JpcHRNZXRhZGF0YRItCghmdW5jdGlvbhgBIAEoCzIbLnRhaWxvci52MS5GdW5jdGlvblJlZ2lzdHJ5YgZwcm90bzM\", [file_buf_validate_validate, file_google_protobuf_timestamp, file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.FunctionRegistry.\n * Use `create(FunctionRegistrySchema)` to create a new message.\n */\nexport const FunctionRegistrySchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 0);\n\n/**\n * Describes the message tailor.v1.CreateFunctionRegistryRequest.\n * Use `create(CreateFunctionRegistryRequestSchema)` to create a new message.\n */\nexport const CreateFunctionRegistryRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 1);\n\n/**\n * Describes the message tailor.v1.CreateFunctionRegistryInfo.\n * Use `create(CreateFunctionRegistryInfoSchema)` to create a new message.\n */\nexport const CreateFunctionRegistryInfoSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 2);\n\n/**\n * Describes the message tailor.v1.CreateFunctionRegistryResponse.\n * Use `create(CreateFunctionRegistryResponseSchema)` to create a new message.\n */\nexport const CreateFunctionRegistryResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 3);\n\n/**\n * Describes the message tailor.v1.UpdateFunctionRegistryRequest.\n * Use `create(UpdateFunctionRegistryRequestSchema)` to create a new message.\n */\nexport const UpdateFunctionRegistryRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 4);\n\n/**\n * Describes the message tailor.v1.UpdateFunctionRegistryInfo.\n * Use `create(UpdateFunctionRegistryInfoSchema)` to create a new message.\n */\nexport const UpdateFunctionRegistryInfoSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 5);\n\n/**\n * Describes the message tailor.v1.UpdateFunctionRegistryResponse.\n * Use `create(UpdateFunctionRegistryResponseSchema)` to create a new message.\n */\nexport const UpdateFunctionRegistryResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 6);\n\n/**\n * Describes the message tailor.v1.GetFunctionRegistryRequest.\n * Use `create(GetFunctionRegistryRequestSchema)` to create a new message.\n */\nexport const GetFunctionRegistryRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 7);\n\n/**\n * Describes the message tailor.v1.GetFunctionRegistryResponse.\n * Use `create(GetFunctionRegistryResponseSchema)` to create a new message.\n */\nexport const GetFunctionRegistryResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 8);\n\n/**\n * Describes the message tailor.v1.ListFunctionRegistriesRequest.\n * Use `create(ListFunctionRegistriesRequestSchema)` to create a new message.\n */\nexport const ListFunctionRegistriesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 9);\n\n/**\n * Describes the message tailor.v1.ListFunctionRegistriesResponse.\n * Use `create(ListFunctionRegistriesResponseSchema)` to create a new message.\n */\nexport const ListFunctionRegistriesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 10);\n\n/**\n * Describes the message tailor.v1.DeleteFunctionRegistryRequest.\n * Use `create(DeleteFunctionRegistryRequestSchema)` to create a new message.\n */\nexport const DeleteFunctionRegistryRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 11);\n\n/**\n * Describes the message tailor.v1.DeleteFunctionRegistryResponse.\n * Use `create(DeleteFunctionRegistryResponseSchema)` to create a new message.\n */\nexport const DeleteFunctionRegistryResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 12);\n\n/**\n * Describes the message tailor.v1.DownloadFunctionRegistryScriptRequest.\n * Use `create(DownloadFunctionRegistryScriptRequestSchema)` to create a new message.\n */\nexport const DownloadFunctionRegistryScriptRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 13);\n\n/**\n * Describes the message tailor.v1.DownloadFunctionRegistryScriptResponse.\n * Use `create(DownloadFunctionRegistryScriptResponseSchema)` to create a new message.\n */\nexport const DownloadFunctionRegistryScriptResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 14);\n\n/**\n * Describes the message tailor.v1.FunctionRegistryScriptMetadata.\n * Use `create(FunctionRegistryScriptMetadataSchema)` to create a new message.\n */\nexport const FunctionRegistryScriptMetadataSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_function_registry, 15);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/idp_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_api_field_behavior } from \"../../google/api/field_behavior_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/idp_resource.proto.\n */\nexport const file_tailor_v1_idp_resource = /*@__PURE__*/\n fileDesc(\"Chx0YWlsb3IvdjEvaWRwX3Jlc291cmNlLnByb3RvEgl0YWlsb3IudjEi3gEKCklkUFNlcnZpY2USJwoJbmFtZXNwYWNlGAEgASgLMhQudGFpbG9yLnYxLk5hbWVzcGFjZRIVCg1hdXRob3JpemF0aW9uGAIgASgJEhkKDHByb3ZpZGVyX3VybBgDIAEoCUID4EEDEjYKEHVzZXJfYXV0aF9wb2xpY3kYBCABKAsyHC50YWlsb3IudjEuSWRQVXNlckF1dGhQb2xpY3kSIAoEbGFuZxgFIAEoDjISLnRhaWxvci52MS5JZFBMYW5nEhsKE3B1Ymxpc2hfdXNlcl9ldmVudHMYBiABKAgiTQoJSWRQQ2xpZW50EgwKBG5hbWUYASABKAkSFgoJY2xpZW50X2lkGAIgASgJQgPgQQMSGgoNY2xpZW50X3NlY3JldBgDIAEoCUID4EEDIoYKChFJZFBVc2VyQXV0aFBvbGljeRIgChh1c2Vfbm9uX2VtYWlsX2lkZW50aWZpZXIYASABKAgSIQoZYWxsb3dfc2VsZl9wYXNzd29yZF9yZXNldBgCIAEoCBIiChpwYXNzd29yZF9yZXF1aXJlX3VwcGVyY2FzZRgDIAEoCBIiChpwYXNzd29yZF9yZXF1aXJlX2xvd2VyY2FzZRgEIAEoCBIpCiFwYXNzd29yZF9yZXF1aXJlX25vbl9hbHBoYW51bWVyaWMYBSABKAgSIAoYcGFzc3dvcmRfcmVxdWlyZV9udW1lcmljGAYgASgIEqYBChNwYXNzd29yZF9taW5fbGVuZ3RoGAcgASgFQogBukiEAboBgAEKGXBhc3N3b3JkX21pbl9sZW5ndGhfcmFuZ2USO3Bhc3N3b3JkX21pbl9sZW5ndGggbXVzdCBiZSAwIChkZWZhdWx0KSBvciBiZXR3ZWVuIDYgYW5kIDMwGiZ0aGlzID09IDAgfHwgKHRoaXMgPj0gNiAmJiB0aGlzIDw9IDMwKRKqAQoTcGFzc3dvcmRfbWF4X2xlbmd0aBgIIAEoBUKMAbpIiAG6AYQBChlwYXNzd29yZF9tYXhfbGVuZ3RoX3JhbmdlEj1wYXNzd29yZF9tYXhfbGVuZ3RoIG11c3QgYmUgMCAoZGVmYXVsdCkgb3IgYmV0d2VlbiA2IGFuZCA0MDk2Gih0aGlzID09IDAgfHwgKHRoaXMgPj0gNiAmJiB0aGlzIDw9IDQwOTYpEi8KFWFsbG93ZWRfZW1haWxfZG9tYWlucxgJIAMoCUIQukgNkgEKEGQYASIEcgJoARIaChJhbGxvd19nb29nbGVfb2F1dGgYCiABKAg68wS6SO8EGuoBChtwYXNzd29yZF9sZW5ndGhfY29uc2lzdGVuY3kSRXBhc3N3b3JkX21pbl9sZW5ndGggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGFzc3dvcmRfbWF4X2xlbmd0aBqDASh0aGlzLnBhc3N3b3JkX21pbl9sZW5ndGggPT0gMCA/IDYgOiB0aGlzLnBhc3N3b3JkX21pbl9sZW5ndGgpIDw9ICh0aGlzLnBhc3N3b3JkX21heF9sZW5ndGggPT0gMCA/IDQwOTYgOiB0aGlzLnBhc3N3b3JkX21heF9sZW5ndGgpGsYBCi9hbGxvd2VkX2VtYWlsX2RvbWFpbnNfcmVxdWlyZXNfZW1haWxfaWRlbnRpZmllchJJYWxsb3dlZF9lbWFpbF9kb21haW5zIGNhbm5vdCBiZSBzZXQgd2hlbiB1c2Vfbm9uX2VtYWlsX2lkZW50aWZpZXIgaXMgdHJ1ZRpIdGhpcy5hbGxvd2VkX2VtYWlsX2RvbWFpbnMuc2l6ZSgpID09IDAgfHwgIXRoaXMudXNlX25vbl9lbWFpbF9pZGVudGlmaWVyGrYBCixhbGxvd19nb29nbGVfb2F1dGhfcmVxdWlyZXNfZW1haWxfaWRlbnRpZmllchJKYWxsb3dfZ29vZ2xlX29hdXRoIGNhbm5vdCBiZSBlbmFibGVkIHdoZW4gdXNlX25vbl9lbWFpbF9pZGVudGlmaWVyIGlzIHRydWUaOiF0aGlzLmFsbG93X2dvb2dsZV9vYXV0aCB8fCAhdGhpcy51c2Vfbm9uX2VtYWlsX2lkZW50aWZpZXIqSAoHSWRQTGFuZxIZChVJRF9QX0xBTkdfVU5TUEVDSUZJRUQQABIQCgxJRF9QX0xBTkdfRU4QARIQCgxJRF9QX0xBTkdfSkEQAmIGcHJvdG8z\", [file_buf_validate_validate, file_google_api_field_behavior, file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.IdPService.\n * Use `create(IdPServiceSchema)` to create a new message.\n */\nexport const IdPServiceSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp_resource, 0);\n\n/**\n * Describes the message tailor.v1.IdPClient.\n * Use `create(IdPClientSchema)` to create a new message.\n */\nexport const IdPClientSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp_resource, 1);\n\n/**\n * Describes the message tailor.v1.IdPUserAuthPolicy.\n * Use `create(IdPUserAuthPolicySchema)` to create a new message.\n */\nexport const IdPUserAuthPolicySchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp_resource, 2);\n\n/**\n * Describes the enum tailor.v1.IdPLang.\n */\nexport const IdPLangSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_idp_resource, 0);\n\n/**\n * IdPLang represents the IETF BCP 47 language subtag.\n *\n * @generated from enum tailor.v1.IdPLang\n */\nexport const IdPLang = /*@__PURE__*/\n tsEnum(IdPLangSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/idp.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_tailor_v1_idp_resource } from \"./idp_resource_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/idp.proto.\n */\nexport const file_tailor_v1_idp = /*@__PURE__*/\n fileDesc(\"ChN0YWlsb3IvdjEvaWRwLnByb3RvEgl0YWlsb3IudjEikQEKFkxpc3RJZFBTZXJ2aWNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARISCgpwYWdlX3Rva2VuGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgEIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInQKF0xpc3RJZFBTZXJ2aWNlc1Jlc3BvbnNlEisKDGlkcF9zZXJ2aWNlcxgBIAMoCzIVLnRhaWxvci52MS5JZFBTZXJ2aWNlEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKJAgoXQ3JlYXRlSWRQU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIVCg1hdXRob3JpemF0aW9uGAMgASgJEjYKEHVzZXJfYXV0aF9wb2xpY3kYBCABKAsyHC50YWlsb3IudjEuSWRQVXNlckF1dGhQb2xpY3kSIAoEbGFuZxgFIAEoDjISLnRhaWxvci52MS5JZFBMYW5nEhsKE3B1Ymxpc2hfdXNlcl9ldmVudHMYBiABKAgiRgoYQ3JlYXRlSWRQU2VydmljZVJlc3BvbnNlEioKC2lkcF9zZXJ2aWNlGAEgASgLMhUudGFpbG9yLnYxLklkUFNlcnZpY2UiiQIKF1VwZGF0ZUlkUFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSFQoNYXV0aG9yaXphdGlvbhgDIAEoCRI2ChB1c2VyX2F1dGhfcG9saWN5GAQgASgLMhwudGFpbG9yLnYxLklkUFVzZXJBdXRoUG9saWN5EiAKBGxhbmcYBSABKA4yEi50YWlsb3IudjEuSWRQTGFuZxIbChNwdWJsaXNoX3VzZXJfZXZlbnRzGAYgASgIIkYKGFVwZGF0ZUlkUFNlcnZpY2VSZXNwb25zZRIqCgtpZHBfc2VydmljZRgBIAEoCzIVLnRhaWxvci52MS5JZFBTZXJ2aWNlInsKF0RlbGV0ZUlkUFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiGgoYRGVsZXRlSWRQU2VydmljZVJlc3BvbnNlIngKFEdldElkUFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiQwoVR2V0SWRQU2VydmljZVJlc3BvbnNlEioKC2lkcF9zZXJ2aWNlGAEgASgLMhUudGFpbG9yLnYxLklkUFNlcnZpY2Ui0gEKFUxpc3RJZFBDbGllbnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ibQoWTGlzdElkUENsaWVudHNSZXNwb25zZRIlCgdjbGllbnRzGAEgAygLMhQudGFpbG9yLnYxLklkUENsaWVudBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMioAEKFkNyZWF0ZUlkUENsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIkCgZjbGllbnQYAyABKAsyFC50YWlsb3IudjEuSWRQQ2xpZW50Ij8KF0NyZWF0ZUlkUENsaWVudFJlc3BvbnNlEiQKBmNsaWVudBgBIAEoCzIULnRhaWxvci52MS5JZFBDbGllbnQirwEKE0dldElkUENsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgRuYW1lGAMgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIjwKFEdldElkUENsaWVudFJlc3BvbnNlEiQKBmNsaWVudBgBIAEoCzIULnRhaWxvci52MS5JZFBDbGllbnQisgEKFkRlbGV0ZUlkUENsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgRuYW1lGAMgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIhkKF0RlbGV0ZUlkUENsaWVudFJlc3BvbnNlYgZwcm90bzM\", [file_buf_validate_validate, file_tailor_v1_idp_resource, file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.ListIdPServicesRequest.\n * Use `create(ListIdPServicesRequestSchema)` to create a new message.\n */\nexport const ListIdPServicesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 0);\n\n/**\n * Describes the message tailor.v1.ListIdPServicesResponse.\n * Use `create(ListIdPServicesResponseSchema)` to create a new message.\n */\nexport const ListIdPServicesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 1);\n\n/**\n * Describes the message tailor.v1.CreateIdPServiceRequest.\n * Use `create(CreateIdPServiceRequestSchema)` to create a new message.\n */\nexport const CreateIdPServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 2);\n\n/**\n * Describes the message tailor.v1.CreateIdPServiceResponse.\n * Use `create(CreateIdPServiceResponseSchema)` to create a new message.\n */\nexport const CreateIdPServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 3);\n\n/**\n * Describes the message tailor.v1.UpdateIdPServiceRequest.\n * Use `create(UpdateIdPServiceRequestSchema)` to create a new message.\n */\nexport const UpdateIdPServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 4);\n\n/**\n * Describes the message tailor.v1.UpdateIdPServiceResponse.\n * Use `create(UpdateIdPServiceResponseSchema)` to create a new message.\n */\nexport const UpdateIdPServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 5);\n\n/**\n * Describes the message tailor.v1.DeleteIdPServiceRequest.\n * Use `create(DeleteIdPServiceRequestSchema)` to create a new message.\n */\nexport const DeleteIdPServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 6);\n\n/**\n * Describes the message tailor.v1.DeleteIdPServiceResponse.\n * Use `create(DeleteIdPServiceResponseSchema)` to create a new message.\n */\nexport const DeleteIdPServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 7);\n\n/**\n * Describes the message tailor.v1.GetIdPServiceRequest.\n * Use `create(GetIdPServiceRequestSchema)` to create a new message.\n */\nexport const GetIdPServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 8);\n\n/**\n * Describes the message tailor.v1.GetIdPServiceResponse.\n * Use `create(GetIdPServiceResponseSchema)` to create a new message.\n */\nexport const GetIdPServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 9);\n\n/**\n * Describes the message tailor.v1.ListIdPClientsRequest.\n * Use `create(ListIdPClientsRequestSchema)` to create a new message.\n */\nexport const ListIdPClientsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 10);\n\n/**\n * Describes the message tailor.v1.ListIdPClientsResponse.\n * Use `create(ListIdPClientsResponseSchema)` to create a new message.\n */\nexport const ListIdPClientsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 11);\n\n/**\n * Describes the message tailor.v1.CreateIdPClientRequest.\n * Use `create(CreateIdPClientRequestSchema)` to create a new message.\n */\nexport const CreateIdPClientRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 12);\n\n/**\n * Describes the message tailor.v1.CreateIdPClientResponse.\n * Use `create(CreateIdPClientResponseSchema)` to create a new message.\n */\nexport const CreateIdPClientResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 13);\n\n/**\n * Describes the message tailor.v1.GetIdPClientRequest.\n * Use `create(GetIdPClientRequestSchema)` to create a new message.\n */\nexport const GetIdPClientRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 14);\n\n/**\n * Describes the message tailor.v1.GetIdPClientResponse.\n * Use `create(GetIdPClientResponseSchema)` to create a new message.\n */\nexport const GetIdPClientResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 15);\n\n/**\n * Describes the message tailor.v1.DeleteIdPClientRequest.\n * Use `create(DeleteIdPClientRequestSchema)` to create a new message.\n */\nexport const DeleteIdPClientRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 16);\n\n/**\n * Describes the message tailor.v1.DeleteIdPClientResponse.\n * Use `create(DeleteIdPClientResponseSchema)` to create a new message.\n */\nexport const DeleteIdPClientResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_idp, 17);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/metadata_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\n\n/**\n * Describes the file tailor/v1/metadata_resource.proto.\n */\nexport const file_tailor_v1_metadata_resource = /*@__PURE__*/\n fileDesc(\"CiF0YWlsb3IvdjEvbWV0YWRhdGFfcmVzb3VyY2UucHJvdG8SCXRhaWxvci52MSJqCghNZXRhZGF0YRIvCgZsYWJlbHMYASADKAsyHy50YWlsb3IudjEuTWV0YWRhdGEuTGFiZWxzRW50cnkaLQoLTGFiZWxzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AWIGcHJvdG8z\");\n\n/**\n * Describes the message tailor.v1.Metadata.\n * Use `create(MetadataSchema)` to create a new message.\n */\nexport const MetadataSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_metadata_resource, 0);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/metadata.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_tailor_v1_metadata_resource } from \"./metadata_resource_pb\";\n\n/**\n * Describes the file tailor/v1/metadata.proto.\n */\nexport const file_tailor_v1_metadata = /*@__PURE__*/\n fileDesc(\"Chh0YWlsb3IvdjEvbWV0YWRhdGEucHJvdG8SCXRhaWxvci52MSLMAgoSU2V0TWV0YWRhdGFSZXF1ZXN0EoYBCgN0cm4YASABKAlCebpIdnJ0MnJedHJuOnYxOndvcmtzcGFjZTpbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0oOlthLXpBLVowLTlfOiotXSspPyQSfgoGbGFiZWxzGAIgAygLMikudGFpbG9yLnYxLlNldE1ldGFkYXRhUmVxdWVzdC5MYWJlbHNFbnRyeUJDukhAmgE9IhtyGTIXXlthLXpdW2EtejAtOV8tXXswLDYyfSQqHnIcMhpeJHxeW2Etel1bYS16MC05Xy1dezAsNjJ9JBotCgtMYWJlbHNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIjwKE1NldE1ldGFkYXRhUmVzcG9uc2USJQoIbWV0YWRhdGEYASABKAsyEy50YWlsb3IudjEuTWV0YWRhdGEinQEKEkdldE1ldGFkYXRhUmVxdWVzdBKGAQoDdHJuGAEgASgJQnm6SHZydDJyXnRybjp2MTp3b3Jrc3BhY2U6WzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9KDpbYS16QS1aMC05XzoqLV0rKT8kIjwKE0dldE1ldGFkYXRhUmVzcG9uc2USJQoIbWV0YWRhdGEYASABKAsyEy50YWlsb3IudjEuTWV0YWRhdGFiBnByb3RvMw\", [file_buf_validate_validate, file_tailor_v1_metadata_resource]);\n\n/**\n * Describes the message tailor.v1.SetMetadataRequest.\n * Use `create(SetMetadataRequestSchema)` to create a new message.\n */\nexport const SetMetadataRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_metadata, 0);\n\n/**\n * Describes the message tailor.v1.SetMetadataResponse.\n * Use `create(SetMetadataResponseSchema)` to create a new message.\n */\nexport const SetMetadataResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_metadata, 1);\n\n/**\n * Describes the message tailor.v1.GetMetadataRequest.\n * Use `create(GetMetadataRequestSchema)` to create a new message.\n */\nexport const GetMetadataRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_metadata, 2);\n\n/**\n * Describes the message tailor.v1.GetMetadataResponse.\n * Use `create(GetMetadataResponseSchema)` to create a new message.\n */\nexport const GetMetadataResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_metadata, 3);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/meter.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_protobuf_duration, file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Describes the file tailor/v1/meter.proto.\n */\nexport const file_tailor_v1_meter = /*@__PURE__*/\n fileDesc(\"ChV0YWlsb3IvdjEvbWV0ZXIucHJvdG8SCXRhaWxvci52MSLsAQodTGlzdE1ldGVyUmVxdWVzdENvdW50c1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARI2CgpzdGFydF90aW1lGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIGukgDyAEBEjQKCGVuZF90aW1lGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIGukgDyAEBEj0KBHN0ZXAYBCABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CFLpIEcgBAaoBCyIECICjBTIDCJAcIsUCCh5MaXN0TWV0ZXJSZXF1ZXN0Q291bnRzUmVzcG9uc2USTgoOcmVxdWVzdF9jb3VudHMYASADKAsyNi50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1Jlc3BvbnNlLlJlcXVlc3RDb3VudBppCgxSZXF1ZXN0Q291bnQSGAoQYXBwbGljYXRpb25fbmFtZRgBIAEoCRI/CgZ2YWx1ZXMYAiADKAsyLy50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1Jlc3BvbnNlLlZhbHVlGmgKBVZhbHVlEigKBGZyb20YASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiYKAnRvGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBINCgVjb3VudBgDIAEoAyLuAQofTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEjYKCnN0YXJ0X3RpbWUYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQga6SAPIAQESNAoIZW5kX3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQga6SAPIAQESPQoEc3RlcBgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkIUukgRyAEBqgELIgQIgKMFMgMIkBwizQIKIExpc3RNZXRlckV4ZWN1dGlvbkNvdW50c1Jlc3BvbnNlElQKEGV4ZWN1dGlvbl9jb3VudHMYASADKAsyOi50YWlsb3IudjEuTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzUmVzcG9uc2UuRXhlY3V0aW9uQ291bnQaaQoORXhlY3V0aW9uQ291bnQSFAoMc2VydmljZV9uYW1lGAEgASgJEkEKBnZhbHVlcxgCIAMoCzIxLnRhaWxvci52MS5MaXN0TWV0ZXJFeGVjdXRpb25Db3VudHNSZXNwb25zZS5WYWx1ZRpoCgVWYWx1ZRIoCgRmcm9tGAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBImCgJ0bxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDQoFY291bnQYAyABKAMi6gEKG0xpc3RNZXRlckV2ZW50Q291bnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEjYKCnN0YXJ0X3RpbWUYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQga6SAPIAQESNAoIZW5kX3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQga6SAPIAQESPQoEc3RlcBgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkIUukgRyAEBqgELIgQIgKMFMgMIkBwitQIKHExpc3RNZXRlckV2ZW50Q291bnRzUmVzcG9uc2USSAoMZXZlbnRfY291bnRzGAEgAygLMjIudGFpbG9yLnYxLkxpc3RNZXRlckV2ZW50Q291bnRzUmVzcG9uc2UuRXZlbnRDb3VudBphCgpFdmVudENvdW50EhQKDHNlcnZpY2VfbmFtZRgBIAEoCRI9CgZ2YWx1ZXMYAiADKAsyLS50YWlsb3IudjEuTGlzdE1ldGVyRXZlbnRDb3VudHNSZXNwb25zZS5WYWx1ZRpoCgVWYWx1ZRIoCgRmcm9tGAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBImCgJ0bxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDQoFY291bnQYAyABKANiBnByb3RvMw\", [file_buf_validate_validate, file_google_protobuf_duration, file_google_protobuf_timestamp]);\n\n/**\n * Describes the message tailor.v1.ListMeterRequestCountsRequest.\n * Use `create(ListMeterRequestCountsRequestSchema)` to create a new message.\n */\nexport const ListMeterRequestCountsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 0);\n\n/**\n * Describes the message tailor.v1.ListMeterRequestCountsResponse.\n * Use `create(ListMeterRequestCountsResponseSchema)` to create a new message.\n */\nexport const ListMeterRequestCountsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 1);\n\n/**\n * Describes the message tailor.v1.ListMeterRequestCountsResponse.RequestCount.\n * Use `create(ListMeterRequestCountsResponse_RequestCountSchema)` to create a new message.\n */\nexport const ListMeterRequestCountsResponse_RequestCountSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 1, 0);\n\n/**\n * Describes the message tailor.v1.ListMeterRequestCountsResponse.Value.\n * Use `create(ListMeterRequestCountsResponse_ValueSchema)` to create a new message.\n */\nexport const ListMeterRequestCountsResponse_ValueSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 1, 1);\n\n/**\n * Describes the message tailor.v1.ListMeterExecutionCountsRequest.\n * Use `create(ListMeterExecutionCountsRequestSchema)` to create a new message.\n */\nexport const ListMeterExecutionCountsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 2);\n\n/**\n * Describes the message tailor.v1.ListMeterExecutionCountsResponse.\n * Use `create(ListMeterExecutionCountsResponseSchema)` to create a new message.\n */\nexport const ListMeterExecutionCountsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 3);\n\n/**\n * Describes the message tailor.v1.ListMeterExecutionCountsResponse.ExecutionCount.\n * Use `create(ListMeterExecutionCountsResponse_ExecutionCountSchema)` to create a new message.\n */\nexport const ListMeterExecutionCountsResponse_ExecutionCountSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 3, 0);\n\n/**\n * Describes the message tailor.v1.ListMeterExecutionCountsResponse.Value.\n * Use `create(ListMeterExecutionCountsResponse_ValueSchema)` to create a new message.\n */\nexport const ListMeterExecutionCountsResponse_ValueSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 3, 1);\n\n/**\n * Describes the message tailor.v1.ListMeterEventCountsRequest.\n * Use `create(ListMeterEventCountsRequestSchema)` to create a new message.\n */\nexport const ListMeterEventCountsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 4);\n\n/**\n * Describes the message tailor.v1.ListMeterEventCountsResponse.\n * Use `create(ListMeterEventCountsResponseSchema)` to create a new message.\n */\nexport const ListMeterEventCountsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 5);\n\n/**\n * Describes the message tailor.v1.ListMeterEventCountsResponse.EventCount.\n * Use `create(ListMeterEventCountsResponse_EventCountSchema)` to create a new message.\n */\nexport const ListMeterEventCountsResponse_EventCountSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 5, 0);\n\n/**\n * Describes the message tailor.v1.ListMeterEventCountsResponse.Value.\n * Use `create(ListMeterEventCountsResponse_ValueSchema)` to create a new message.\n */\nexport const ListMeterEventCountsResponse_ValueSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_meter, 5, 1);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/pipeline_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_protobuf_struct, file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_tailor_v1_auth_resource } from \"./auth_resource_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/pipeline_resource.proto.\n */\nexport const file_tailor_v1_pipeline_resource = /*@__PURE__*/\n fileDesc(\"CiF0YWlsb3IvdjEvcGlwZWxpbmVfcmVzb3VyY2UucHJvdG8SCXRhaWxvci52MSJOCg9QaXBlbGluZVNlcnZpY2USJwoJbmFtZXNwYWNlGAEgASgLMhQudGFpbG9yLnYxLk5hbWVzcGFjZRISCgpjb21tb25fc2RsGAIgASgJIsEOChBQaXBlbGluZVJlc29sdmVyEgwKBG5hbWUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSFQoNYXV0aG9yaXphdGlvbhgEIAEoCRIXCgpwcmVfc2NyaXB0GAUgASgJSACIAQESGAoLcG9zdF9zY3JpcHQYBiABKAlIAYgBARI3CglwaXBlbGluZXMYByADKAsyJC50YWlsb3IudjEuUGlwZWxpbmVSZXNvbHZlci5QaXBlbGluZRIVCghvbl9lcnJvchgIIAEoCUgCiAEBEjEKBmlucHV0cxgJIAMoCzIhLnRhaWxvci52MS5QaXBlbGluZVJlc29sdmVyLkZpZWxkEjgKCHJlc3BvbnNlGAogASgLMiEudGFpbG9yLnYxLlBpcGVsaW5lUmVzb2x2ZXIuRmllbGRIA4gBARIbCg5vcGVyYXRpb25fdHlwZRgLIAEoCUgEiAEBEiMKCHByZV9ob29rGAwgASgLMhEudGFpbG9yLnYxLlNjcmlwdBIkCglwb3N0X2hvb2sYDSABKAsyES50YWlsb3IudjEuU2NyaXB0EiAKGHB1Ymxpc2hfZXhlY3V0aW9uX2V2ZW50cxgOIAEoCBILCgNzZGwYDyABKAkavQEKBFR5cGUSDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJEjEKBmZpZWxkcxgEIAMoCzIhLnRhaWxvci52MS5QaXBlbGluZVJlc29sdmVyLkZpZWxkEhAKCHJlcXVpcmVkGAUgASgIEhMKC2Rlc2NyaXB0aW9uGAYgASgJEjkKDmFsbG93ZWRfdmFsdWVzGAcgAygLMiEudGFpbG9yLnYxLlBpcGVsaW5lUmVzb2x2ZXIuVmFsdWVKBAgDEAQaewoFRmllbGQSDAoEbmFtZRgBIAEoCRIuCgR0eXBlGAIgASgLMiAudGFpbG9yLnYxLlBpcGVsaW5lUmVzb2x2ZXIuVHlwZRINCgVhcnJheRgDIAEoCBIQCghyZXF1aXJlZBgEIAEoCBITCgtkZXNjcmlwdGlvbhgFIAEoCRpjCgVWYWx1ZRJFCgV2YWx1ZRgBIAEoCUI2ukgzcjEyHF5bYS16QS1aXVthLXpBLVowLTlfXXswLDYyfSRaBHRydWVaBWZhbHNlWgRudWxsEhMKC2Rlc2NyaXB0aW9uGAIgASgJGo0GCghQaXBlbGluZRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEkEKDm9wZXJhdGlvbl90eXBlGAQgASgOMikudGFpbG9yLnYxLlBpcGVsaW5lUmVzb2x2ZXIuT3BlcmF0aW9uVHlwZRIdChBvcGVyYXRpb25fc291cmNlGAYgASgJSACIAQESHwoXc2tpcF9vcGVyYXRpb25fb25fZXJyb3IYByABKAgSEQoEdGVzdBgIIAEoCUgBiAEBEhsKDnByZV92YWxpZGF0aW9uGAkgASgJSAKIAQESFwoKcHJlX3NjcmlwdBgKIAEoCUgDiAEBEhgKC3Bvc3Rfc2NyaXB0GAsgASgJSASIAQESHAoPcG9zdF92YWxpZGF0aW9uGAwgASgJSAWIAQESGQoMY29udGV4dF9kYXRhGA0gASgJSAaIAQESFQoIZm9yX2VhY2gYDiABKAlIB4gBARIsCgdpbnZva2VyGA8gASgLMhYudGFpbG9yLnYxLkF1dGhJbnZva2VySAiIAQESIwoIcHJlX2hvb2sYECABKAsyES50YWlsb3IudjEuU2NyaXB0EiQKCXBvc3RfaG9vaxgRIAEoCzIRLnRhaWxvci52MS5TY3JpcHQSGwoOb3BlcmF0aW9uX25hbWUYEiABKAlICYgBARIpCg5vcGVyYXRpb25faG9vaxgTIAEoCzIRLnRhaWxvci52MS5TY3JpcHQSIQoUb3BlcmF0aW9uX3NvdXJjZV9yZWYYFCABKAlICogBAUITChFfb3BlcmF0aW9uX3NvdXJjZUIHCgVfdGVzdEIRCg9fcHJlX3ZhbGlkYXRpb25CDQoLX3ByZV9zY3JpcHRCDgoMX3Bvc3Rfc2NyaXB0QhIKEF9wb3N0X3ZhbGlkYXRpb25CDwoNX2NvbnRleHRfZGF0YUILCglfZm9yX2VhY2hCCgoIX2ludm9rZXJCEQoPX29wZXJhdGlvbl9uYW1lQhcKFV9vcGVyYXRpb25fc291cmNlX3JlZkoECAEQAkoECAUQBiJoCg1PcGVyYXRpb25UeXBlEh4KGk9QRVJBVElPTl9UWVBFX1VOU1BFQ0lGSUVEEAASGgoWT1BFUkFUSU9OX1RZUEVfR1JBUEhRTBABEhsKF09QRVJBVElPTl9UWVBFX0ZVTkNUSU9OEAJCDQoLX3ByZV9zY3JpcHRCDgoMX3Bvc3Rfc2NyaXB0QgsKCV9vbl9lcnJvckILCglfcmVzcG9uc2VCEQoPX29wZXJhdGlvbl90eXBlSgQIARACIkMKEVBpcGVsaW5lUmVzb2x2ZXJzEi4KCXJlc29sdmVycxgBIAMoCzIbLnRhaWxvci52MS5QaXBlbGluZVJlc29sdmVyIqgFCh9QaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0EgoKAmlkGAEgASgJEhsKE3NvdXJjZV9leGVjdXRpb25faWQYAiABKAkSFQoNcmVzb2x2ZXJfbmFtZRgDIAEoCRJHCgZzdGF0dXMYBCABKA4yNy50YWlsb3IudjEuUGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdC5SZXN1bHRTdGF0dXMSKAoHY29udGV4dBgFIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QSMAoPaW5pdGlhbF9jb250ZXh0GAYgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdBIaChJsYXN0X3BpcGVsaW5lX25hbWUYByABKAkSHAoUbGFzdF9waXBlbGluZV9hY3Rpb24YCCABKAkSDQoFZXJyb3IYCSABKAkSLgoKc3RhcnRlZF9hdBgKIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoLZmluaXNoZWRfYXQYCyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIpUBCgxSZXN1bHRTdGF0dXMSHQoZUkVTVUxUX1NUQVRVU19VTlNQRUNJRklFRBAAEhYKElJFU1VMVF9TVEFUVVNfRE9ORRABEhgKFFJFU1VMVF9TVEFUVVNfRkFJTEVEEAISGQoVUkVTVUxUX1NUQVRVU19BQk9SVEVEEAMSGQoVUkVTVUxUX1NUQVRVU19SRVRSSUVEEARiBnByb3RvMw\", [file_buf_validate_validate, file_google_protobuf_struct, file_google_protobuf_timestamp, file_tailor_v1_auth_resource, file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.PipelineService.\n * Use `create(PipelineServiceSchema)` to create a new message.\n */\nexport const PipelineServiceSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline_resource, 0);\n\n/**\n * Describes the message tailor.v1.PipelineResolver.\n * Use `create(PipelineResolverSchema)` to create a new message.\n */\nexport const PipelineResolverSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline_resource, 1);\n\n/**\n * Describes the message tailor.v1.PipelineResolver.Type.\n * Use `create(PipelineResolver_TypeSchema)` to create a new message.\n */\nexport const PipelineResolver_TypeSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline_resource, 1, 0);\n\n/**\n * Describes the message tailor.v1.PipelineResolver.Field.\n * Use `create(PipelineResolver_FieldSchema)` to create a new message.\n */\nexport const PipelineResolver_FieldSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline_resource, 1, 1);\n\n/**\n * Describes the message tailor.v1.PipelineResolver.Value.\n * Use `create(PipelineResolver_ValueSchema)` to create a new message.\n */\nexport const PipelineResolver_ValueSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline_resource, 1, 2);\n\n/**\n * Describes the message tailor.v1.PipelineResolver.Pipeline.\n * Use `create(PipelineResolver_PipelineSchema)` to create a new message.\n */\nexport const PipelineResolver_PipelineSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline_resource, 1, 3);\n\n/**\n * Describes the enum tailor.v1.PipelineResolver.OperationType.\n */\nexport const PipelineResolver_OperationTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_pipeline_resource, 1, 0);\n\n/**\n * @generated from enum tailor.v1.PipelineResolver.OperationType\n */\nexport const PipelineResolver_OperationType = /*@__PURE__*/\n tsEnum(PipelineResolver_OperationTypeSchema);\n\n/**\n * Describes the message tailor.v1.PipelineResolvers.\n * Use `create(PipelineResolversSchema)` to create a new message.\n */\nexport const PipelineResolversSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline_resource, 2);\n\n/**\n * Describes the message tailor.v1.PipelineResolverExecutionResult.\n * Use `create(PipelineResolverExecutionResultSchema)` to create a new message.\n */\nexport const PipelineResolverExecutionResultSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline_resource, 3);\n\n/**\n * Describes the enum tailor.v1.PipelineResolverExecutionResult.ResultStatus.\n */\nexport const PipelineResolverExecutionResult_ResultStatusSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_pipeline_resource, 3, 0);\n\n/**\n * @generated from enum tailor.v1.PipelineResolverExecutionResult.ResultStatus\n */\nexport const PipelineResolverExecutionResult_ResultStatus = /*@__PURE__*/\n tsEnum(PipelineResolverExecutionResult_ResultStatusSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/pipeline.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_tailor_v1_pipeline_resource } from \"./pipeline_resource_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/pipeline.proto.\n */\nexport const file_tailor_v1_pipeline = /*@__PURE__*/\n fileDesc(\"Chh0YWlsb3IvdjEvcGlwZWxpbmUucHJvdG8SCXRhaWxvci52MSKUAQocQ3JlYXRlUGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhIKCmNvbW1vbl9zZGwYAyABKAkiVQodQ3JlYXRlUGlwZWxpbmVTZXJ2aWNlUmVzcG9uc2USNAoQcGlwZWxpbmVfc2VydmljZRgBIAEoCzIaLnRhaWxvci52MS5QaXBlbGluZVNlcnZpY2UilAEKHFVwZGF0ZVBpcGVsaW5lU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBISCgpjb21tb25fc2RsGAMgASgJIlUKHVVwZGF0ZVBpcGVsaW5lU2VydmljZVJlc3BvbnNlEjQKEHBpcGVsaW5lX3NlcnZpY2UYASABKAsyGi50YWlsb3IudjEuUGlwZWxpbmVTZXJ2aWNlIoABChxEZWxldGVQaXBlbGluZVNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHwodRGVsZXRlUGlwZWxpbmVTZXJ2aWNlUmVzcG9uc2UifQoZR2V0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIlIKGkdldFBpcGVsaW5lU2VydmljZVJlc3BvbnNlEjQKEHBpcGVsaW5lX3NlcnZpY2UYASABKAsyGi50YWlsb3IudjEuUGlwZWxpbmVTZXJ2aWNlIpYBChtMaXN0UGlwZWxpbmVTZXJ2aWNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARISCgpwYWdlX3Rva2VuGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgEIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIoMBChxMaXN0UGlwZWxpbmVTZXJ2aWNlc1Jlc3BvbnNlEjUKEXBpcGVsaW5lX3NlcnZpY2VzGAEgAygLMhoudGFpbG9yLnYxLlBpcGVsaW5lU2VydmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMiuQEKHUNyZWF0ZVBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoRcGlwZWxpbmVfcmVzb2x2ZXIYAyABKAsyGy50YWlsb3IudjEuUGlwZWxpbmVSZXNvbHZlciJYCh5DcmVhdGVQaXBlbGluZVJlc29sdmVyUmVzcG9uc2USNgoRcGlwZWxpbmVfcmVzb2x2ZXIYASABKAsyGy50YWlsb3IudjEuUGlwZWxpbmVSZXNvbHZlciK5AQodVXBkYXRlUGlwZWxpbmVSZXNvbHZlclJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2ChFwaXBlbGluZV9yZXNvbHZlchgDIAEoCzIbLnRhaWxvci52MS5QaXBlbGluZVJlc29sdmVyIlgKHlVwZGF0ZVBpcGVsaW5lUmVzb2x2ZXJSZXNwb25zZRI2ChFwaXBlbGluZV9yZXNvbHZlchgBIAEoCzIbLnRhaWxvci52MS5QaXBlbGluZVJlc29sdmVyIpgBCh1EZWxldGVQaXBlbGluZVJlc29sdmVyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhUKDXJlc29sdmVyX25hbWUYAyABKAkiIAoeRGVsZXRlUGlwZWxpbmVSZXNvbHZlclJlc3BvbnNlIn0KGUNvbXBvc2VQaXBlbGluZVNETFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIcChpDb21wb3NlUGlwZWxpbmVTRExSZXNwb25zZSKVAQoaR2V0UGlwZWxpbmVSZXNvbHZlclJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIVCg1yZXNvbHZlcl9uYW1lGAMgASgJIlUKG0dldFBpcGVsaW5lUmVzb2x2ZXJSZXNwb25zZRI2ChFwaXBlbGluZV9yZXNvbHZlchgBIAEoCzIbLnRhaWxvci52MS5QaXBlbGluZVJlc29sdmVyIr0CChxMaXN0UGlwZWxpbmVSZXNvbHZlcnNSZXF1ZXN0EhIKCnBhZ2VfdG9rZW4YASABKAkSEQoJcGFnZV9zaXplGAIgASgNEh4KDHdvcmtzcGFjZV9pZBgDIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYBCABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSPwoWcGlwZWxpbmVfcmVzb2x2ZXJfdmlldxgFIAEoDjIfLnRhaWxvci52MS5QaXBlbGluZVJlc29sdmVyVmlldxIhCgZmaWx0ZXIYBiABKAsyES50YWlsb3IudjEuRmlsdGVyEjAKDnBhZ2VfZGlyZWN0aW9uGAcgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ihgEKHUxpc3RQaXBlbGluZVJlc29sdmVyc1Jlc3BvbnNlEhcKD25leHRfcGFnZV90b2tlbhgBIAEoCRI3ChJwaXBlbGluZV9yZXNvbHZlcnMYAiADKAsyGy50YWlsb3IudjEuUGlwZWxpbmVSZXNvbHZlchITCgt0b3RhbF9jb3VudBgDIAEoAyLHAgorTGlzdFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHRzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIeCgx3b3Jrc3BhY2VfaWQYAyABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAQgASgJEhUKDXJlc29sdmVyX25hbWUYBSABKAkSMAoOcGFnZV9kaXJlY3Rpb24YBiABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbhIhCgZmaWx0ZXIYByABKAsyES50YWlsb3IudjEuRmlsdGVyEjwKBHZpZXcYCCABKA4yLi50YWlsb3IudjEuUGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFZpZXcSDwoHc29ydF9ieRgJIAEoCSKZAQosTGlzdFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHRzUmVzcG9uc2USOwoHcmVzdWx0cxgBIAMoCzIqLnRhaWxvci52MS5QaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKqAQopR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIbCglyZXN1bHRfaWQYAiABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAMgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kImgKKkdldFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHRSZXNwb25zZRI6CgZyZXN1bHQYASABKAsyKi50YWlsb3IudjEuUGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdCK6AQoeUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSGwoJcmVzdWx0X2lkGAMgASgJQgi6SAVyA7ABARIZChFzdGFydF9mcm9tX2ZhaWxlZBgEIAEoCCJdCh9SZXN0YXJ0UGlwZWxpbmVSZXNvbHZlclJlc3BvbnNlEjoKBnJlc3VsdBgBIAEoCzIqLnRhaWxvci52MS5QaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0KoEBChRQaXBlbGluZVJlc29sdmVyVmlldxImCiJQSVBFTElORV9SRVNPTFZFUl9WSUVXX1VOU1BFQ0lGSUVEEAASIAocUElQRUxJTkVfUkVTT0xWRVJfVklFV19CQVNJQxABEh8KG1BJUEVMSU5FX1JFU09MVkVSX1ZJRVdfRlVMTBACKsMBCiNQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0VmlldxI3CjNQSVBFTElORV9SRVNPTFZFUl9FWEVDVVRJT05fUkVTVUxUX1ZJRVdfVU5TUEVDSUZJRUQQABIxCi1QSVBFTElORV9SRVNPTFZFUl9FWEVDVVRJT05fUkVTVUxUX1ZJRVdfQkFTSUMQARIwCixQSVBFTElORV9SRVNPTFZFUl9FWEVDVVRJT05fUkVTVUxUX1ZJRVdfRlVMTBACYgZwcm90bzM\", [file_buf_validate_validate, file_tailor_v1_pipeline_resource, file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.CreatePipelineServiceRequest.\n * Use `create(CreatePipelineServiceRequestSchema)` to create a new message.\n */\nexport const CreatePipelineServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 0);\n\n/**\n * Describes the message tailor.v1.CreatePipelineServiceResponse.\n * Use `create(CreatePipelineServiceResponseSchema)` to create a new message.\n */\nexport const CreatePipelineServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 1);\n\n/**\n * Describes the message tailor.v1.UpdatePipelineServiceRequest.\n * Use `create(UpdatePipelineServiceRequestSchema)` to create a new message.\n */\nexport const UpdatePipelineServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 2);\n\n/**\n * Describes the message tailor.v1.UpdatePipelineServiceResponse.\n * Use `create(UpdatePipelineServiceResponseSchema)` to create a new message.\n */\nexport const UpdatePipelineServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 3);\n\n/**\n * Describes the message tailor.v1.DeletePipelineServiceRequest.\n * Use `create(DeletePipelineServiceRequestSchema)` to create a new message.\n */\nexport const DeletePipelineServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 4);\n\n/**\n * Describes the message tailor.v1.DeletePipelineServiceResponse.\n * Use `create(DeletePipelineServiceResponseSchema)` to create a new message.\n */\nexport const DeletePipelineServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 5);\n\n/**\n * Describes the message tailor.v1.GetPipelineServiceRequest.\n * Use `create(GetPipelineServiceRequestSchema)` to create a new message.\n */\nexport const GetPipelineServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 6);\n\n/**\n * Describes the message tailor.v1.GetPipelineServiceResponse.\n * Use `create(GetPipelineServiceResponseSchema)` to create a new message.\n */\nexport const GetPipelineServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 7);\n\n/**\n * Describes the message tailor.v1.ListPipelineServicesRequest.\n * Use `create(ListPipelineServicesRequestSchema)` to create a new message.\n */\nexport const ListPipelineServicesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 8);\n\n/**\n * Describes the message tailor.v1.ListPipelineServicesResponse.\n * Use `create(ListPipelineServicesResponseSchema)` to create a new message.\n */\nexport const ListPipelineServicesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 9);\n\n/**\n * Describes the message tailor.v1.CreatePipelineResolverRequest.\n * Use `create(CreatePipelineResolverRequestSchema)` to create a new message.\n */\nexport const CreatePipelineResolverRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 10);\n\n/**\n * Describes the message tailor.v1.CreatePipelineResolverResponse.\n * Use `create(CreatePipelineResolverResponseSchema)` to create a new message.\n */\nexport const CreatePipelineResolverResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 11);\n\n/**\n * Describes the message tailor.v1.UpdatePipelineResolverRequest.\n * Use `create(UpdatePipelineResolverRequestSchema)` to create a new message.\n */\nexport const UpdatePipelineResolverRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 12);\n\n/**\n * Describes the message tailor.v1.UpdatePipelineResolverResponse.\n * Use `create(UpdatePipelineResolverResponseSchema)` to create a new message.\n */\nexport const UpdatePipelineResolverResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 13);\n\n/**\n * Describes the message tailor.v1.DeletePipelineResolverRequest.\n * Use `create(DeletePipelineResolverRequestSchema)` to create a new message.\n */\nexport const DeletePipelineResolverRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 14);\n\n/**\n * Describes the message tailor.v1.DeletePipelineResolverResponse.\n * Use `create(DeletePipelineResolverResponseSchema)` to create a new message.\n */\nexport const DeletePipelineResolverResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 15);\n\n/**\n * Describes the message tailor.v1.ComposePipelineSDLRequest.\n * Use `create(ComposePipelineSDLRequestSchema)` to create a new message.\n */\nexport const ComposePipelineSDLRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 16);\n\n/**\n * Describes the message tailor.v1.ComposePipelineSDLResponse.\n * Use `create(ComposePipelineSDLResponseSchema)` to create a new message.\n */\nexport const ComposePipelineSDLResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 17);\n\n/**\n * Describes the message tailor.v1.GetPipelineResolverRequest.\n * Use `create(GetPipelineResolverRequestSchema)` to create a new message.\n */\nexport const GetPipelineResolverRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 18);\n\n/**\n * Describes the message tailor.v1.GetPipelineResolverResponse.\n * Use `create(GetPipelineResolverResponseSchema)` to create a new message.\n */\nexport const GetPipelineResolverResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 19);\n\n/**\n * Describes the message tailor.v1.ListPipelineResolversRequest.\n * Use `create(ListPipelineResolversRequestSchema)` to create a new message.\n */\nexport const ListPipelineResolversRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 20);\n\n/**\n * Describes the message tailor.v1.ListPipelineResolversResponse.\n * Use `create(ListPipelineResolversResponseSchema)` to create a new message.\n */\nexport const ListPipelineResolversResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 21);\n\n/**\n * Describes the message tailor.v1.ListPipelineResolverExecutionResultsRequest.\n * Use `create(ListPipelineResolverExecutionResultsRequestSchema)` to create a new message.\n */\nexport const ListPipelineResolverExecutionResultsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 22);\n\n/**\n * Describes the message tailor.v1.ListPipelineResolverExecutionResultsResponse.\n * Use `create(ListPipelineResolverExecutionResultsResponseSchema)` to create a new message.\n */\nexport const ListPipelineResolverExecutionResultsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 23);\n\n/**\n * Describes the message tailor.v1.GetPipelineResolverExecutionResultRequest.\n * Use `create(GetPipelineResolverExecutionResultRequestSchema)` to create a new message.\n */\nexport const GetPipelineResolverExecutionResultRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 24);\n\n/**\n * Describes the message tailor.v1.GetPipelineResolverExecutionResultResponse.\n * Use `create(GetPipelineResolverExecutionResultResponseSchema)` to create a new message.\n */\nexport const GetPipelineResolverExecutionResultResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 25);\n\n/**\n * Describes the message tailor.v1.RestartPipelineResolverRequest.\n * Use `create(RestartPipelineResolverRequestSchema)` to create a new message.\n */\nexport const RestartPipelineResolverRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 26);\n\n/**\n * Describes the message tailor.v1.RestartPipelineResolverResponse.\n * Use `create(RestartPipelineResolverResponseSchema)` to create a new message.\n */\nexport const RestartPipelineResolverResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_pipeline, 27);\n\n/**\n * Describes the enum tailor.v1.PipelineResolverView.\n */\nexport const PipelineResolverViewSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_pipeline, 0);\n\n/**\n * @generated from enum tailor.v1.PipelineResolverView\n */\nexport const PipelineResolverView = /*@__PURE__*/\n tsEnum(PipelineResolverViewSchema);\n\n/**\n * Describes the enum tailor.v1.PipelineResolverExecutionResultView.\n */\nexport const PipelineResolverExecutionResultViewSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_pipeline, 1);\n\n/**\n * @generated from enum tailor.v1.PipelineResolverExecutionResultView\n */\nexport const PipelineResolverExecutionResultView = /*@__PURE__*/\n tsEnum(PipelineResolverExecutionResultViewSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/secret_manager.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\nimport { file_tailor_v1_secret_manager_resource } from \"./secret_manager_resource_pb\";\n\n/**\n * Describes the file tailor/v1/secret_manager.proto.\n */\nexport const file_tailor_v1_secret_manager = /*@__PURE__*/\n fileDesc(\"Ch50YWlsb3IvdjEvc2VjcmV0X21hbmFnZXIucHJvdG8SCXRhaWxvci52MSKNAQofQ3JlYXRlU2VjcmV0TWFuYWdlclZhdWx0UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkoKGHNlY3JldG1hbmFnZXJfdmF1bHRfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJQCiBDcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHRSZXNwb25zZRIsCgV2YXVsdBgBIAEoCzIdLnRhaWxvci52MS5TZWNyZXRNYW5hZ2VyVmF1bHQiigEKHEdldFNlY3JldE1hbmFnZXJWYXVsdFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJKChhzZWNyZXRtYW5hZ2VyX3ZhdWx0X25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiTQodR2V0U2VjcmV0TWFuYWdlclZhdWx0UmVzcG9uc2USLAoFdmF1bHQYASABKAsyHS50YWlsb3IudjEuU2VjcmV0TWFuYWdlclZhdWx0Io0BCh9EZWxldGVTZWNyZXRNYW5hZ2VyVmF1bHRSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESSgoYc2VjcmV0bWFuYWdlcl92YXVsdF9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIiIKIERlbGV0ZVNlY3JldE1hbmFnZXJWYXVsdFJlc3BvbnNlIpkBCh5MaXN0U2VjcmV0TWFuYWdlclZhdWx0c1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARISCgpwYWdlX3Rva2VuGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgEIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIn4KH0xpc3RTZWNyZXRNYW5hZ2VyVmF1bHRzUmVzcG9uc2USLQoGdmF1bHRzGAEgAygLMh0udGFpbG9yLnYxLlNlY3JldE1hbmFnZXJWYXVsdBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMi/wEKIENyZWF0ZVNlY3JldE1hbmFnZXJTZWNyZXRSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESSgoYc2VjcmV0bWFuYWdlcl92YXVsdF9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEksKGXNlY3JldG1hbmFnZXJfc2VjcmV0X25hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIgoac2VjcmV0bWFuYWdlcl9zZWNyZXRfdmFsdWUYBCABKAkiUwohQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlEi4KBnNlY3JldBgBIAEoCzIeLnRhaWxvci52MS5TZWNyZXRNYW5hZ2VyU2VjcmV0Iv8BCiBVcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkoKGHNlY3JldG1hbmFnZXJfdmF1bHRfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJLChlzZWNyZXRtYW5hZ2VyX3NlY3JldF9uYW1lGAMgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEiIKGnNlY3JldG1hbmFnZXJfc2VjcmV0X3ZhbHVlGAQgASgJIlMKIVVwZGF0ZVNlY3JldE1hbmFnZXJTZWNyZXRSZXNwb25zZRIuCgZzZWNyZXQYASABKAsyHi50YWlsb3IudjEuU2VjcmV0TWFuYWdlclNlY3JldCLbAQogRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJKChhzZWNyZXRtYW5hZ2VyX3ZhdWx0X25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSSwoZc2VjcmV0bWFuYWdlcl9zZWNyZXRfbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIjCiFEZWxldGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVzcG9uc2Ui2AEKHUdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESSgoYc2VjcmV0bWFuYWdlcl92YXVsdF9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEksKGXNlY3JldG1hbmFnZXJfc2VjcmV0X25hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUAoeR2V0U2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlEi4KBnNlY3JldBgBIAEoCzIeLnRhaWxvci52MS5TZWNyZXRNYW5hZ2VyU2VjcmV0IuYBCh9MaXN0U2VjcmV0TWFuYWdlclNlY3JldHNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESSgoYc2VjcmV0bWFuYWdlcl92YXVsdF9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24igQEKIExpc3RTZWNyZXRNYW5hZ2VyU2VjcmV0c1Jlc3BvbnNlEi8KB3NlY3JldHMYASADKAsyHi50YWlsb3IudjEuU2VjcmV0TWFuYWdlclNlY3JldBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKANiBnByb3RvMw\", [file_buf_validate_validate, file_tailor_v1_resource, file_tailor_v1_secret_manager_resource]);\n\n/**\n * Describes the message tailor.v1.CreateSecretManagerVaultRequest.\n * Use `create(CreateSecretManagerVaultRequestSchema)` to create a new message.\n */\nexport const CreateSecretManagerVaultRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 0);\n\n/**\n * Describes the message tailor.v1.CreateSecretManagerVaultResponse.\n * Use `create(CreateSecretManagerVaultResponseSchema)` to create a new message.\n */\nexport const CreateSecretManagerVaultResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 1);\n\n/**\n * Describes the message tailor.v1.GetSecretManagerVaultRequest.\n * Use `create(GetSecretManagerVaultRequestSchema)` to create a new message.\n */\nexport const GetSecretManagerVaultRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 2);\n\n/**\n * Describes the message tailor.v1.GetSecretManagerVaultResponse.\n * Use `create(GetSecretManagerVaultResponseSchema)` to create a new message.\n */\nexport const GetSecretManagerVaultResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 3);\n\n/**\n * Describes the message tailor.v1.DeleteSecretManagerVaultRequest.\n * Use `create(DeleteSecretManagerVaultRequestSchema)` to create a new message.\n */\nexport const DeleteSecretManagerVaultRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 4);\n\n/**\n * Describes the message tailor.v1.DeleteSecretManagerVaultResponse.\n * Use `create(DeleteSecretManagerVaultResponseSchema)` to create a new message.\n */\nexport const DeleteSecretManagerVaultResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 5);\n\n/**\n * Describes the message tailor.v1.ListSecretManagerVaultsRequest.\n * Use `create(ListSecretManagerVaultsRequestSchema)` to create a new message.\n */\nexport const ListSecretManagerVaultsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 6);\n\n/**\n * Describes the message tailor.v1.ListSecretManagerVaultsResponse.\n * Use `create(ListSecretManagerVaultsResponseSchema)` to create a new message.\n */\nexport const ListSecretManagerVaultsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 7);\n\n/**\n * Describes the message tailor.v1.CreateSecretManagerSecretRequest.\n * Use `create(CreateSecretManagerSecretRequestSchema)` to create a new message.\n */\nexport const CreateSecretManagerSecretRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 8);\n\n/**\n * Describes the message tailor.v1.CreateSecretManagerSecretResponse.\n * Use `create(CreateSecretManagerSecretResponseSchema)` to create a new message.\n */\nexport const CreateSecretManagerSecretResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 9);\n\n/**\n * Describes the message tailor.v1.UpdateSecretManagerSecretRequest.\n * Use `create(UpdateSecretManagerSecretRequestSchema)` to create a new message.\n */\nexport const UpdateSecretManagerSecretRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 10);\n\n/**\n * Describes the message tailor.v1.UpdateSecretManagerSecretResponse.\n * Use `create(UpdateSecretManagerSecretResponseSchema)` to create a new message.\n */\nexport const UpdateSecretManagerSecretResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 11);\n\n/**\n * Describes the message tailor.v1.DeleteSecretManagerSecretRequest.\n * Use `create(DeleteSecretManagerSecretRequestSchema)` to create a new message.\n */\nexport const DeleteSecretManagerSecretRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 12);\n\n/**\n * Describes the message tailor.v1.DeleteSecretManagerSecretResponse.\n * Use `create(DeleteSecretManagerSecretResponseSchema)` to create a new message.\n */\nexport const DeleteSecretManagerSecretResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 13);\n\n/**\n * Describes the message tailor.v1.GetSecretManagerSecretRequest.\n * Use `create(GetSecretManagerSecretRequestSchema)` to create a new message.\n */\nexport const GetSecretManagerSecretRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 14);\n\n/**\n * Describes the message tailor.v1.GetSecretManagerSecretResponse.\n * Use `create(GetSecretManagerSecretResponseSchema)` to create a new message.\n */\nexport const GetSecretManagerSecretResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 15);\n\n/**\n * Describes the message tailor.v1.ListSecretManagerSecretsRequest.\n * Use `create(ListSecretManagerSecretsRequestSchema)` to create a new message.\n */\nexport const ListSecretManagerSecretsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 16);\n\n/**\n * Describes the message tailor.v1.ListSecretManagerSecretsResponse.\n * Use `create(ListSecretManagerSecretsResponseSchema)` to create a new message.\n */\nexport const ListSecretManagerSecretsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_secret_manager, 17);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/stateflow_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/stateflow_resource.proto.\n */\nexport const file_tailor_v1_stateflow_resource = /*@__PURE__*/\n fileDesc(\"CiJ0YWlsb3IvdjEvc3RhdGVmbG93X3Jlc291cmNlLnByb3RvEgl0YWlsb3IudjEilQEKEFN0YXRlZmxvd1NlcnZpY2USJwoJbmFtZXNwYWNlGAEgASgLMhQudGFpbG9yLnYxLk5hbWVzcGFjZRI6CgthZG1pbl91c2VycxgCIAMoCzIlLnRhaWxvci52MS5TdGF0ZWZsb3dTZXJ2aWNlLkFkbWluVXNlchocCglBZG1pblVzZXISDwoHdXNlcl9pZBgBIAEoCWIGcHJvdG8z\", [file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.StateflowService.\n * Use `create(StateflowServiceSchema)` to create a new message.\n */\nexport const StateflowServiceSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow_resource, 0);\n\n/**\n * Describes the message tailor.v1.StateflowService.AdminUser.\n * Use `create(StateflowService_AdminUserSchema)` to create a new message.\n */\nexport const StateflowService_AdminUserSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow_resource, 0, 0);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/stateflow.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\nimport { file_tailor_v1_stateflow_resource } from \"./stateflow_resource_pb\";\n\n/**\n * Describes the file tailor/v1/stateflow.proto.\n */\nexport const file_tailor_v1_stateflow = /*@__PURE__*/\n fileDesc(\"Chl0YWlsb3IvdjEvc3RhdGVmbG93LnByb3RvEgl0YWlsb3IudjEiqAEKHUNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSJQoOYWRtaW5fdXNlcl9pZHMYAyADKAlCDbpICpIBByIFcgOwAQEiWAoeQ3JlYXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlEjYKEXN0YXRlZmxvd19zZXJ2aWNlGAEgASgLMhsudGFpbG9yLnYxLlN0YXRlZmxvd1NlcnZpY2UiqAEKHVVwZGF0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSJQoOYWRtaW5fdXNlcl9pZHMYAyADKAlCDbpICpIBByIFcgOwAQEiWAoeVXBkYXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlEjYKEXN0YXRlZmxvd19zZXJ2aWNlGAEgASgLMhsudGFpbG9yLnYxLlN0YXRlZmxvd1NlcnZpY2UigQEKHURlbGV0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiIAoeRGVsZXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlIn4KGkdldFN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiVQobR2V0U3RhdGVmbG93U2VydmljZVJlc3BvbnNlEjYKEXN0YXRlZmxvd19zZXJ2aWNlGAEgASgLMhsudGFpbG9yLnYxLlN0YXRlZmxvd1NlcnZpY2UilwEKHExpc3RTdGF0ZWZsb3dTZXJ2aWNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARISCgpwYWdlX3Rva2VuGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgEIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIoYBCh1MaXN0U3RhdGVmbG93U2VydmljZXNSZXNwb25zZRI3ChJzdGF0ZWZsb3dfc2VydmljZXMYASADKAsyGy50YWlsb3IudjEuU3RhdGVmbG93U2VydmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKANiBnByb3RvMw\", [file_buf_validate_validate, file_tailor_v1_resource, file_tailor_v1_stateflow_resource]);\n\n/**\n * Describes the message tailor.v1.CreateStateflowServiceRequest.\n * Use `create(CreateStateflowServiceRequestSchema)` to create a new message.\n */\nexport const CreateStateflowServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow, 0);\n\n/**\n * Describes the message tailor.v1.CreateStateflowServiceResponse.\n * Use `create(CreateStateflowServiceResponseSchema)` to create a new message.\n */\nexport const CreateStateflowServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow, 1);\n\n/**\n * Describes the message tailor.v1.UpdateStateflowServiceRequest.\n * Use `create(UpdateStateflowServiceRequestSchema)` to create a new message.\n */\nexport const UpdateStateflowServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow, 2);\n\n/**\n * Describes the message tailor.v1.UpdateStateflowServiceResponse.\n * Use `create(UpdateStateflowServiceResponseSchema)` to create a new message.\n */\nexport const UpdateStateflowServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow, 3);\n\n/**\n * Describes the message tailor.v1.DeleteStateflowServiceRequest.\n * Use `create(DeleteStateflowServiceRequestSchema)` to create a new message.\n */\nexport const DeleteStateflowServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow, 4);\n\n/**\n * Describes the message tailor.v1.DeleteStateflowServiceResponse.\n * Use `create(DeleteStateflowServiceResponseSchema)` to create a new message.\n */\nexport const DeleteStateflowServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow, 5);\n\n/**\n * Describes the message tailor.v1.GetStateflowServiceRequest.\n * Use `create(GetStateflowServiceRequestSchema)` to create a new message.\n */\nexport const GetStateflowServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow, 6);\n\n/**\n * Describes the message tailor.v1.GetStateflowServiceResponse.\n * Use `create(GetStateflowServiceResponseSchema)` to create a new message.\n */\nexport const GetStateflowServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow, 7);\n\n/**\n * Describes the message tailor.v1.ListStateflowServicesRequest.\n * Use `create(ListStateflowServicesRequestSchema)` to create a new message.\n */\nexport const ListStateflowServicesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow, 8);\n\n/**\n * Describes the message tailor.v1.ListStateflowServicesResponse.\n * Use `create(ListStateflowServicesResponseSchema)` to create a new message.\n */\nexport const ListStateflowServicesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_stateflow, 9);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/staticwebsite_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_api_field_behavior } from \"../../google/api/field_behavior_pb\";\n\n/**\n * Describes the file tailor/v1/staticwebsite_resource.proto.\n */\nexport const file_tailor_v1_staticwebsite_resource = /*@__PURE__*/\n fileDesc(\"CiZ0YWlsb3IvdjEvc3RhdGljd2Vic2l0ZV9yZXNvdXJjZS5wcm90bxIJdGFpbG9yLnYxIowBCg1TdGF0aWNXZWJzaXRlEjYKBG5hbWUYASABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEwoLZGVzY3JpcHRpb24YAiABKAkSHAoUYWxsb3dlZF9pcF9hZGRyZXNzZXMYAyADKAkSEAoDdXJsGAQgASgJQgPgQQNiBnByb3RvMw\", [file_buf_validate_validate, file_google_api_field_behavior]);\n\n/**\n * Describes the message tailor.v1.StaticWebsite.\n * Use `create(StaticWebsiteSchema)` to create a new message.\n */\nexport const StaticWebsiteSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite_resource, 0);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/staticwebsite.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\nimport { file_tailor_v1_staticwebsite_resource } from \"./staticwebsite_resource_pb\";\n\n/**\n * Describes the file tailor/v1/staticwebsite.proto.\n */\nexport const file_tailor_v1_staticwebsite = /*@__PURE__*/\n fileDesc(\"Ch10YWlsb3IvdjEvc3RhdGljd2Vic2l0ZS5wcm90bxIJdGFpbG9yLnYxInUKGkNyZWF0ZVN0YXRpY1dlYnNpdGVSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESNwoNc3RhdGljd2Vic2l0ZRgCIAEoCzIYLnRhaWxvci52MS5TdGF0aWNXZWJzaXRlQga6SAPIAQEiTgobQ3JlYXRlU3RhdGljV2Vic2l0ZVJlc3BvbnNlEi8KDXN0YXRpY3dlYnNpdGUYASABKAsyGC50YWlsb3IudjEuU3RhdGljV2Vic2l0ZSJ1ChpVcGRhdGVTdGF0aWNXZWJzaXRlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEjcKDXN0YXRpY3dlYnNpdGUYAiABKAsyGC50YWlsb3IudjEuU3RhdGljV2Vic2l0ZUIGukgDyAEBIk4KG1VwZGF0ZVN0YXRpY1dlYnNpdGVSZXNwb25zZRIvCg1zdGF0aWN3ZWJzaXRlGAEgASgLMhgudGFpbG9yLnYxLlN0YXRpY1dlYnNpdGUicQoXR2V0U3RhdGljV2Vic2l0ZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARI2CgRuYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIksKGEdldFN0YXRpY1dlYnNpdGVSZXNwb25zZRIvCg1zdGF0aWN3ZWJzaXRlGAEgASgLMhgudGFpbG9yLnYxLlN0YXRpY1dlYnNpdGUidAoaRGVsZXRlU3RhdGljV2Vic2l0ZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARI2CgRuYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIh0KG0RlbGV0ZVN0YXRpY1dlYnNpdGVSZXNwb25zZSKUAQoZTGlzdFN0YXRpY1dlYnNpdGVzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhIKCnBhZ2VfdG9rZW4YAiABKAkSEQoJcGFnZV9zaXplGAMgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAQgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ifAoaTGlzdFN0YXRpY1dlYnNpdGVzUmVzcG9uc2USMAoOc3RhdGljd2Vic2l0ZXMYASADKAsyGC50YWlsb3IudjEuU3RhdGljV2Vic2l0ZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMicQoXQ3JlYXRlRGVwbG95bWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARI2CgRuYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIjsKGENyZWF0ZURlcGxveW1lbnRSZXNwb25zZRIfCg1kZXBsb3ltZW50X2lkGAEgASgJQgi6SAVyA7ABASK9AgoRVXBsb2FkRmlsZVJlcXVlc3QSTgoQaW5pdGlhbF9tZXRhZGF0YRgBIAEoCzIyLnRhaWxvci52MS5VcGxvYWRGaWxlUmVxdWVzdC5Jbml0aWFsVXBsb2FkTWV0YWRhdGFIABIUCgpjaHVua19kYXRhGAIgASgMSAAatgEKFUluaXRpYWxVcGxvYWRNZXRhZGF0YRIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEh8KDWRlcGxveW1lbnRfaWQYAiABKAlCCLpIBXIDsAEBEioKCWZpbGVfcGF0aBgDIAEoCUIXukgUchIyEF5bXi9dKygvW14vXSspKiQSMAoMY29udGVudF90eXBlGAQgASgJQhq6SBdyFTITXlteL10rL1teL10rKDsuKik/JEIJCgdwYXlsb2FkIhQKElVwbG9hZEZpbGVSZXNwb25zZSJbChhQdWJsaXNoRGVwbG95bWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIfCg1kZXBsb3ltZW50X2lkGAIgASgJQgi6SAVyA7ABASIoChlQdWJsaXNoRGVwbG95bWVudFJlc3BvbnNlEgsKA3VybBgBIAEoCWIGcHJvdG8z\", [file_buf_validate_validate, file_tailor_v1_resource, file_tailor_v1_staticwebsite_resource]);\n\n/**\n * Describes the message tailor.v1.CreateStaticWebsiteRequest.\n * Use `create(CreateStaticWebsiteRequestSchema)` to create a new message.\n */\nexport const CreateStaticWebsiteRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 0);\n\n/**\n * Describes the message tailor.v1.CreateStaticWebsiteResponse.\n * Use `create(CreateStaticWebsiteResponseSchema)` to create a new message.\n */\nexport const CreateStaticWebsiteResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 1);\n\n/**\n * Describes the message tailor.v1.UpdateStaticWebsiteRequest.\n * Use `create(UpdateStaticWebsiteRequestSchema)` to create a new message.\n */\nexport const UpdateStaticWebsiteRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 2);\n\n/**\n * Describes the message tailor.v1.UpdateStaticWebsiteResponse.\n * Use `create(UpdateStaticWebsiteResponseSchema)` to create a new message.\n */\nexport const UpdateStaticWebsiteResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 3);\n\n/**\n * Describes the message tailor.v1.GetStaticWebsiteRequest.\n * Use `create(GetStaticWebsiteRequestSchema)` to create a new message.\n */\nexport const GetStaticWebsiteRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 4);\n\n/**\n * Describes the message tailor.v1.GetStaticWebsiteResponse.\n * Use `create(GetStaticWebsiteResponseSchema)` to create a new message.\n */\nexport const GetStaticWebsiteResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 5);\n\n/**\n * Describes the message tailor.v1.DeleteStaticWebsiteRequest.\n * Use `create(DeleteStaticWebsiteRequestSchema)` to create a new message.\n */\nexport const DeleteStaticWebsiteRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 6);\n\n/**\n * Describes the message tailor.v1.DeleteStaticWebsiteResponse.\n * Use `create(DeleteStaticWebsiteResponseSchema)` to create a new message.\n */\nexport const DeleteStaticWebsiteResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 7);\n\n/**\n * Describes the message tailor.v1.ListStaticWebsitesRequest.\n * Use `create(ListStaticWebsitesRequestSchema)` to create a new message.\n */\nexport const ListStaticWebsitesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 8);\n\n/**\n * Describes the message tailor.v1.ListStaticWebsitesResponse.\n * Use `create(ListStaticWebsitesResponseSchema)` to create a new message.\n */\nexport const ListStaticWebsitesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 9);\n\n/**\n * Describes the message tailor.v1.CreateDeploymentRequest.\n * Use `create(CreateDeploymentRequestSchema)` to create a new message.\n */\nexport const CreateDeploymentRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 10);\n\n/**\n * Describes the message tailor.v1.CreateDeploymentResponse.\n * Use `create(CreateDeploymentResponseSchema)` to create a new message.\n */\nexport const CreateDeploymentResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 11);\n\n/**\n * Describes the message tailor.v1.UploadFileRequest.\n * Use `create(UploadFileRequestSchema)` to create a new message.\n */\nexport const UploadFileRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 12);\n\n/**\n * Describes the message tailor.v1.UploadFileRequest.InitialUploadMetadata.\n * Use `create(UploadFileRequest_InitialUploadMetadataSchema)` to create a new message.\n */\nexport const UploadFileRequest_InitialUploadMetadataSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 12, 0);\n\n/**\n * Describes the message tailor.v1.UploadFileResponse.\n * Use `create(UploadFileResponseSchema)` to create a new message.\n */\nexport const UploadFileResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 13);\n\n/**\n * Describes the message tailor.v1.PublishDeploymentRequest.\n * Use `create(PublishDeploymentRequestSchema)` to create a new message.\n */\nexport const PublishDeploymentRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 14);\n\n/**\n * Describes the message tailor.v1.PublishDeploymentResponse.\n * Use `create(PublishDeploymentResponseSchema)` to create a new message.\n */\nexport const PublishDeploymentResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_staticwebsite, 15);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/tailordb_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_api_field_behavior } from \"../../google/api/field_behavior_pb\";\nimport { file_google_protobuf_struct } from \"@bufbuild/protobuf/wkt\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\n\n/**\n * Describes the file tailor/v1/tailordb_resource.proto.\n */\nexport const file_tailor_v1_tailordb_resource = /*@__PURE__*/\n fileDesc(\"CiF0YWlsb3IvdjEvdGFpbG9yZGJfcmVzb3VyY2UucHJvdG8SCXRhaWxvci52MSJUCg9UYWlsb3JEQlNlcnZpY2USJwoJbmFtZXNwYWNlGAEgASgLMhQudGFpbG9yLnYxLk5hbWVzcGFjZRIYChBkZWZhdWx0X3RpbWV6b25lGAIgASgJIpUnCgxUYWlsb3JEQlR5cGUSLQoEbmFtZRgBIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JBIyCgZzY2hlbWEYAiABKAsyIi50YWlsb3IudjEuVGFpbG9yREJUeXBlLlR5cGVDb25maWca3gcKClR5cGVDb25maWcSPgoGZmllbGRzGAEgAygLMi4udGFpbG9yLnYxLlRhaWxvckRCVHlwZS5UeXBlQ29uZmlnLkZpZWxkc0VudHJ5EhMKC2Rlc2NyaXB0aW9uGAIgASgJEjUKCHNldHRpbmdzGAMgASgLMiMudGFpbG9yLnYxLlRhaWxvckRCVHlwZS5UeXBlU2V0dGluZxI/Cg90eXBlX3Blcm1pc3Npb24YBCABKAsyJi50YWlsb3IudjEuVGFpbG9yREJUeXBlLlR5cGVQZXJtaXNzaW9uEg8KB2V4dGVuZHMYBSABKAgSNQoKZGlyZWN0aXZlcxgGIAMoCzIhLnRhaWxvci52MS5UYWlsb3JEQlR5cGUuRGlyZWN0aXZlEkAKB2luZGV4ZXMYByADKAsyLy50YWlsb3IudjEuVGFpbG9yREJUeXBlLlR5cGVDb25maWcuSW5kZXhlc0VudHJ5EkgKEXJlY29yZF9wZXJtaXNzaW9uGAggASgLMigudGFpbG9yLnYxLlRhaWxvckRCVHlwZS5SZWNvcmRQZXJtaXNzaW9uSACIAQESTAoNcmVsYXRpb25zaGlwcxgJIAMoCzI1LnRhaWxvci52MS5UYWlsb3JEQlR5cGUuVHlwZUNvbmZpZy5SZWxhdGlvbnNoaXBzRW50cnkSNgoKcGVybWlzc2lvbhgKIAEoCzIiLnRhaWxvci52MS5UYWlsb3JEQlR5cGUuUGVybWlzc2lvbhI8CgVmaWxlcxgLIAMoCzItLnRhaWxvci52MS5UYWlsb3JEQlR5cGUuVHlwZUNvbmZpZy5GaWxlc0VudHJ5GlIKC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIyCgV2YWx1ZRgCIAEoCzIjLnRhaWxvci52MS5UYWlsb3JEQlR5cGUuRmllbGRDb25maWc6AjgBGk0KDEluZGV4ZXNFbnRyeRILCgNrZXkYASABKAkSLAoFdmFsdWUYAiABKAsyHS50YWlsb3IudjEuVGFpbG9yREJUeXBlLkluZGV4OgI4ARpgChJSZWxhdGlvbnNoaXBzRW50cnkSCwoDa2V5GAEgASgJEjkKBXZhbHVlGAIgASgLMioudGFpbG9yLnYxLlRhaWxvckRCVHlwZS5SZWxhdGlvbnNoaXBDb25maWc6AjgBGlAKCkZpbGVzRW50cnkSCwoDa2V5GAEgASgJEjEKBXZhbHVlGAIgASgLMiIudGFpbG9yLnYxLlRhaWxvckRCVHlwZS5GaWxlQ29uZmlnOgI4AUIUChJfcmVjb3JkX3Blcm1pc3Npb24ahwMKC1R5cGVTZXR0aW5nEhMKC2FnZ3JlZ2F0aW9uGAIgASgIEhMKC2J1bGtfdXBzZXJ0GAMgASgIEiUKGGRlZmF1bHRfcXVlcnlfbGltaXRfc2l6ZRgEIAEoA0gAiAEBEiEKFG1heF9idWxrX3Vwc2VydF9zaXplGAUgASgDSAGIAQESPAoLcGx1cmFsX2Zvcm0YBiABKAlCIrpIH3IdMhteJHxeW2Etel1bYS16QS1aMC05XXswLDYyfSRIAogBARIdChVwdWJsaXNoX3JlY29yZF9ldmVudHMYByABKAgSDQoFZHJhZnQYCCABKAgSTAoWZGlzYWJsZV9ncWxfb3BlcmF0aW9ucxgJIAEoCzIsLnRhaWxvci52MS5UYWlsb3JEQlR5cGUuRGlzYWJsZUdxbE9wZXJhdGlvbnNCGwoZX2RlZmF1bHRfcXVlcnlfbGltaXRfc2l6ZUIXChVfbWF4X2J1bGtfdXBzZXJ0X3NpemVCDgoMX3BsdXJhbF9mb3JtSgQIARACGlQKFERpc2FibGVHcWxPcGVyYXRpb25zEg4KBmNyZWF0ZRgBIAEoCBIOCgZ1cGRhdGUYAiABKAgSDgoGZGVsZXRlGAMgASgIEgwKBHJlYWQYBCABKAgaTQoJRGlyZWN0aXZlEgwKBG5hbWUYASABKAkSMgoEYXJncxgCIAMoCzIkLnRhaWxvci52MS5UYWlsb3JEQlR5cGUuRGlyZWN0aXZlQXJnGisKDERpcmVjdGl2ZUFyZxIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJGiwKBUluZGV4EhMKC2ZpZWxkX25hbWVzGAEgAygJEg4KBnVuaXF1ZRgCIAEoCBqiBQoLRmllbGRDb25maWcSDAoEdHlwZRgBIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIWCglzb3VyY2VfaWQYBCABKAlIAIgBARIQCghyZXF1aXJlZBgFIAEoCBINCgVhcnJheRgGIAEoCBI4Cgh2YWxpZGF0ZRgHIAMoCzImLnRhaWxvci52MS5UYWlsb3JEQlR5cGUuVmFsaWRhdGVDb25maWcSPwoGZmllbGRzGAggAygLMi8udGFpbG9yLnYxLlRhaWxvckRCVHlwZS5GaWVsZENvbmZpZy5GaWVsZHNFbnRyeRINCgVpbmRleBgJIAEoCBIOCgZ1bmlxdWUYCiABKAgSEwoLZm9yZWlnbl9rZXkYCyABKAgSHQoQZm9yZWlnbl9rZXlfdHlwZRgMIAEoCUgBiAEBEh4KEWZvcmVpZ25fa2V5X2ZpZWxkGA0gASgJSAKIAQESNQoFaG9va3MYDiABKAsyIS50YWlsb3IudjEuVGFpbG9yREJUeXBlLkZpZWxkSG9va0gDiAEBEjUKDmFsbG93ZWRfdmFsdWVzGA8gAygLMh0udGFpbG9yLnYxLlRhaWxvckRCVHlwZS5WYWx1ZRIOCgZ2ZWN0b3IYECABKAgSLgoGc2VyaWFsGBEgASgLMh4udGFpbG9yLnYxLlRhaWxvckRCVHlwZS5TZXJpYWwaUgoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEjIKBXZhbHVlGAIgASgLMiMudGFpbG9yLnYxLlRhaWxvckRCVHlwZS5GaWVsZENvbmZpZzoCOAFCDAoKX3NvdXJjZV9pZEITChFfZm9yZWlnbl9rZXlfdHlwZUIUChJfZm9yZWlnbl9rZXlfZmllbGRCCAoGX2hvb2tzSgQIAhADGnAKElJlbGF0aW9uc2hpcENvbmZpZxIQCghyZWZfdHlwZRgBIAEoCRIRCglyZWZfZmllbGQYAiABKAkSEQoJc3JjX2ZpZWxkGAMgASgJEg0KBWFycmF5GAQgASgIEhMKC2Rlc2NyaXB0aW9uGAUgASgJGiEKCkZpbGVDb25maWcSEwoLZGVzY3JpcHRpb24YASABKAkaYwoFVmFsdWUSRQoFdmFsdWUYASABKAlCNrpIM3IxMhxeW2EtekEtWl1bYS16QS1aMC05X117MCw2Mn0kWgR0cnVlWgVmYWxzZVoEbnVsbBITCgtkZXNjcmlwdGlvbhgCIAEoCRqlAQoJRmllbGRIb29rEhgKC2NyZWF0ZV9leHByGAEgASgJSACIAQESGAoLdXBkYXRlX2V4cHIYAiABKAlIAYgBARIhCgZjcmVhdGUYAyABKAsyES50YWlsb3IudjEuU2NyaXB0EiEKBnVwZGF0ZRgEIAEoCzIRLnRhaWxvci52MS5TY3JpcHRCDgoMX2NyZWF0ZV9leHByQg4KDF91cGRhdGVfZXhwchquAQoGU2VyaWFsEhYKBXN0YXJ0GAEgASgDQge6SAQiAiAAEh8KCW1heF92YWx1ZRgCIAEoA0IHukgEIgIgAEgAiAEBElIKBmZvcm1hdBgDIAEoCUI9ukg6cjgYIDI0Xig/Oig/OiUlfFteJV0pKiklKD86WzAtOV0rKT9bZG94WF0oPzooPzolJXxbXiVdKSopJEgBiAEBQgwKCl9tYXhfdmFsdWVCCQoHX2Zvcm1hdBqxAQoOVmFsaWRhdGVDb25maWcSDAoEZXhwchgBIAEoCRJACgZhY3Rpb24YAiABKA4yJC50YWlsb3IudjEuVGFpbG9yREJUeXBlLlBlcm1pdEFjdGlvbkIKukgHggEEEAEgABIaCg1lcnJvcl9tZXNzYWdlGAMgASgJSACIAQESIQoGc2NyaXB0GAQgASgLMhEudGFpbG9yLnYxLlNjcmlwdEIQCg5fZXJyb3JfbWVzc2FnZRqlAgoOVHlwZVBlcm1pc3Npb24SNgoGY3JlYXRlGAEgAygLMiYudGFpbG9yLnYxLlRhaWxvckRCVHlwZS5QZXJtaXNzaW9uSXRlbRI0CgRyZWFkGAIgAygLMiYudGFpbG9yLnYxLlRhaWxvckRCVHlwZS5QZXJtaXNzaW9uSXRlbRI2CgZ1cGRhdGUYAyADKAsyJi50YWlsb3IudjEuVGFpbG9yREJUeXBlLlBlcm1pc3Npb25JdGVtEjYKBmRlbGV0ZRgEIAMoCzImLnRhaWxvci52MS5UYWlsb3JEQlR5cGUuUGVybWlzc2lvbkl0ZW0SNQoFYWRtaW4YBSADKAsyJi50YWlsb3IudjEuVGFpbG9yREJUeXBlLlBlcm1pc3Npb25JdGVtGrgBChBSZWNvcmRQZXJtaXNzaW9uEjQKBHJlYWQYASADKAsyJi50YWlsb3IudjEuVGFpbG9yREJUeXBlLlBlcm1pc3Npb25JdGVtEjYKBnVwZGF0ZRgCIAMoCzImLnRhaWxvci52MS5UYWlsb3JEQlR5cGUuUGVybWlzc2lvbkl0ZW0SNgoGZGVsZXRlGAMgAygLMiYudGFpbG9yLnYxLlRhaWxvckRCVHlwZS5QZXJtaXNzaW9uSXRlbRprCg5QZXJtaXNzaW9uSXRlbRJACgZwZXJtaXQYASABKA4yJC50YWlsb3IudjEuVGFpbG9yREJUeXBlLlBlcm1pdEFjdGlvbkIKukgHggEEEAEgABIKCgJpZBgCIAEoCRILCgNpZHMYAyADKAkavggKClBlcm1pc3Npb24SOQoGY3JlYXRlGAEgAygLMikudGFpbG9yLnYxLlRhaWxvckRCVHlwZS5QZXJtaXNzaW9uLlBvbGljeRI3CgRyZWFkGAIgAygLMikudGFpbG9yLnYxLlRhaWxvckRCVHlwZS5QZXJtaXNzaW9uLlBvbGljeRI5CgZ1cGRhdGUYAyADKAsyKS50YWlsb3IudjEuVGFpbG9yREJUeXBlLlBlcm1pc3Npb24uUG9saWN5EjkKBmRlbGV0ZRgEIAMoCzIpLnRhaWxvci52MS5UYWlsb3JEQlR5cGUuUGVybWlzc2lvbi5Qb2xpY3kauwEKBlBvbGljeRJACgpjb25kaXRpb25zGAEgAygLMiwudGFpbG9yLnYxLlRhaWxvckRCVHlwZS5QZXJtaXNzaW9uLkNvbmRpdGlvbhJFCgZwZXJtaXQYAiABKA4yKS50YWlsb3IudjEuVGFpbG9yREJUeXBlLlBlcm1pc3Npb24uUGVybWl0Qgq6SAeCAQQQASAAEhgKC2Rlc2NyaXB0aW9uGAMgASgJSACIAQFCDgoMX2Rlc2NyaXB0aW9uGtsBCglDb25kaXRpb24SQAoEbGVmdBgBIAEoCzIqLnRhaWxvci52MS5UYWlsb3JEQlR5cGUuUGVybWlzc2lvbi5PcGVyYW5kQga6SAPIAQESSQoIb3BlcmF0b3IYAiABKA4yKy50YWlsb3IudjEuVGFpbG9yREJUeXBlLlBlcm1pc3Npb24uT3BlcmF0b3JCCrpIB4IBBBABIAASQQoFcmlnaHQYAyABKAsyKi50YWlsb3IudjEuVGFpbG9yREJUeXBlLlBlcm1pc3Npb24uT3BlcmFuZEIGukgDyAEBGssBCgdPcGVyYW5kEh0KCnVzZXJfZmllbGQYASABKAlCB7pIBHICEAFIABIfCgxyZWNvcmRfZmllbGQYAiABKAlCB7pIBHICEAFIABIjChBvbGRfcmVjb3JkX2ZpZWxkGAMgASgJQge6SARyAhABSAASIwoQbmV3X3JlY29yZF9maWVsZBgEIAEoCUIHukgEcgIQAUgAEicKBXZhbHVlGAUgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlSABCDQoEa2luZBIFukgCCAEilgEKCE9wZXJhdG9yEhgKFE9QRVJBVE9SX1VOU1BFQ0lGSUVEEAASDwoLT1BFUkFUT1JfRVEQARIPCgtPUEVSQVRPUl9ORRACEg8KC09QRVJBVE9SX0lOEAMSEAoMT1BFUkFUT1JfTklOEAQSFAoQT1BFUkFUT1JfSEFTX0FOWRAFEhUKEU9QRVJBVE9SX05IQVNfQU5ZEAYiQwoGUGVybWl0EhYKElBFUk1JVF9VTlNQRUNJRklFRBAAEhAKDFBFUk1JVF9BTExPVxABEg8KC1BFUk1JVF9ERU5ZEAIiegoMUGVybWl0QWN0aW9uEh0KGVBFUk1JVF9BQ1RJT05fVU5TUEVDSUZJRUQQABIXChNQRVJNSVRfQUNUSU9OX0FMTE9XEAESGgoSUEVSTUlUX0FDVElPTl9TS0lQEAIaAggBEhYKElBFUk1JVF9BQ1RJT05fREVOWRADIq0IChVUYWlsb3JEQkdRTFBlcm1pc3Npb24SDwoCaWQYASABKAlCA+BBAxI5Cghwb2xpY2llcxgCIAMoCzInLnRhaWxvci52MS5UYWlsb3JEQkdRTFBlcm1pc3Npb24uUG9saWN5GoQCCgZQb2xpY3kSPgoKY29uZGl0aW9ucxgBIAMoCzIqLnRhaWxvci52MS5UYWlsb3JEQkdRTFBlcm1pc3Npb24uQ29uZGl0aW9uEksKB2FjdGlvbnMYAiADKA4yJy50YWlsb3IudjEuVGFpbG9yREJHUUxQZXJtaXNzaW9uLkFjdGlvbkIRukgOkgELCAEiB4IBBBABIAASQwoGcGVybWl0GAMgASgOMicudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbi5QZXJtaXRCCrpIB4IBBBABIAASGAoLZGVzY3JpcHRpb24YBCABKAlIAIgBAUIOCgxfZGVzY3JpcHRpb24a1QEKCUNvbmRpdGlvbhI+CgRsZWZ0GAEgASgLMigudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbi5PcGVyYW5kQga6SAPIAQESRwoIb3BlcmF0b3IYAiABKA4yKS50YWlsb3IudjEuVGFpbG9yREJHUUxQZXJtaXNzaW9uLk9wZXJhdG9yQgq6SAeCAQQQASAAEj8KBXJpZ2h0GAMgASgLMigudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbi5PcGVyYW5kQga6SAPIAQEaYAoHT3BlcmFuZBIdCgp1c2VyX2ZpZWxkGAEgASgJQge6SARyAhABSAASJwoFdmFsdWUYBSABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVIAEINCgRraW5kEgW6SAIIASKWAQoIT3BlcmF0b3ISGAoUT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIPCgtPUEVSQVRPUl9FURABEg8KC09QRVJBVE9SX05FEAISDwoLT1BFUkFUT1JfSU4QAxIQCgxPUEVSQVRPUl9OSU4QBBIUChBPUEVSQVRPUl9IQVNfQU5ZEAUSFQoRT1BFUkFUT1JfTkhBU19BTlkQBiKoAQoGQWN0aW9uEhYKEkFDVElPTl9VTlNQRUNJRklFRBAAEg4KCkFDVElPTl9BTEwQARIRCg1BQ1RJT05fQ1JFQVRFEAISDwoLQUNUSU9OX1JFQUQQAxIRCg1BQ1RJT05fVVBEQVRFEAQSEQoNQUNUSU9OX0RFTEVURRAFEhQKEEFDVElPTl9BR0dSRUdBVEUQBhIWChJBQ1RJT05fQlVMS19VUFNFUlQQByJDCgZQZXJtaXQSFgoSUEVSTUlUX1VOU1BFQ0lGSUVEEAASEAoMUEVSTUlUX0FMTE9XEAESDwoLUEVSTUlUX0RFTlkQAmIGcHJvdG8z\", [file_buf_validate_validate, file_google_api_field_behavior, file_google_protobuf_struct, file_tailor_v1_resource]);\n\n/**\n * Describes the message tailor.v1.TailorDBService.\n * Use `create(TailorDBServiceSchema)` to create a new message.\n */\nexport const TailorDBServiceSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 0);\n\n/**\n * Describes the message tailor.v1.TailorDBType.\n * Use `create(TailorDBTypeSchema)` to create a new message.\n */\nexport const TailorDBTypeSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1);\n\n/**\n * Describes the message tailor.v1.TailorDBType.TypeConfig.\n * Use `create(TailorDBType_TypeConfigSchema)` to create a new message.\n */\nexport const TailorDBType_TypeConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 0);\n\n/**\n * Describes the message tailor.v1.TailorDBType.TypeSetting.\n * Use `create(TailorDBType_TypeSettingSchema)` to create a new message.\n */\nexport const TailorDBType_TypeSettingSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 1);\n\n/**\n * Describes the message tailor.v1.TailorDBType.DisableGqlOperations.\n * Use `create(TailorDBType_DisableGqlOperationsSchema)` to create a new message.\n */\nexport const TailorDBType_DisableGqlOperationsSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 2);\n\n/**\n * Describes the message tailor.v1.TailorDBType.Directive.\n * Use `create(TailorDBType_DirectiveSchema)` to create a new message.\n */\nexport const TailorDBType_DirectiveSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 3);\n\n/**\n * Describes the message tailor.v1.TailorDBType.DirectiveArg.\n * Use `create(TailorDBType_DirectiveArgSchema)` to create a new message.\n */\nexport const TailorDBType_DirectiveArgSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 4);\n\n/**\n * Describes the message tailor.v1.TailorDBType.Index.\n * Use `create(TailorDBType_IndexSchema)` to create a new message.\n */\nexport const TailorDBType_IndexSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 5);\n\n/**\n * Describes the message tailor.v1.TailorDBType.FieldConfig.\n * Use `create(TailorDBType_FieldConfigSchema)` to create a new message.\n */\nexport const TailorDBType_FieldConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 6);\n\n/**\n * Describes the message tailor.v1.TailorDBType.RelationshipConfig.\n * Use `create(TailorDBType_RelationshipConfigSchema)` to create a new message.\n */\nexport const TailorDBType_RelationshipConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 7);\n\n/**\n * Describes the message tailor.v1.TailorDBType.FileConfig.\n * Use `create(TailorDBType_FileConfigSchema)` to create a new message.\n */\nexport const TailorDBType_FileConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 8);\n\n/**\n * Describes the message tailor.v1.TailorDBType.Value.\n * Use `create(TailorDBType_ValueSchema)` to create a new message.\n */\nexport const TailorDBType_ValueSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 9);\n\n/**\n * Describes the message tailor.v1.TailorDBType.FieldHook.\n * Use `create(TailorDBType_FieldHookSchema)` to create a new message.\n */\nexport const TailorDBType_FieldHookSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 10);\n\n/**\n * Describes the message tailor.v1.TailorDBType.Serial.\n * Use `create(TailorDBType_SerialSchema)` to create a new message.\n */\nexport const TailorDBType_SerialSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 11);\n\n/**\n * Describes the message tailor.v1.TailorDBType.ValidateConfig.\n * Use `create(TailorDBType_ValidateConfigSchema)` to create a new message.\n */\nexport const TailorDBType_ValidateConfigSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 12);\n\n/**\n * Describes the message tailor.v1.TailorDBType.TypePermission.\n * Use `create(TailorDBType_TypePermissionSchema)` to create a new message.\n */\nexport const TailorDBType_TypePermissionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 13);\n\n/**\n * Describes the message tailor.v1.TailorDBType.RecordPermission.\n * Use `create(TailorDBType_RecordPermissionSchema)` to create a new message.\n */\nexport const TailorDBType_RecordPermissionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 14);\n\n/**\n * Describes the message tailor.v1.TailorDBType.PermissionItem.\n * Use `create(TailorDBType_PermissionItemSchema)` to create a new message.\n */\nexport const TailorDBType_PermissionItemSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 15);\n\n/**\n * Describes the message tailor.v1.TailorDBType.Permission.\n * Use `create(TailorDBType_PermissionSchema)` to create a new message.\n */\nexport const TailorDBType_PermissionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 16);\n\n/**\n * Describes the message tailor.v1.TailorDBType.Permission.Policy.\n * Use `create(TailorDBType_Permission_PolicySchema)` to create a new message.\n */\nexport const TailorDBType_Permission_PolicySchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 16, 0);\n\n/**\n * Describes the message tailor.v1.TailorDBType.Permission.Condition.\n * Use `create(TailorDBType_Permission_ConditionSchema)` to create a new message.\n */\nexport const TailorDBType_Permission_ConditionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 16, 1);\n\n/**\n * Describes the message tailor.v1.TailorDBType.Permission.Operand.\n * Use `create(TailorDBType_Permission_OperandSchema)` to create a new message.\n */\nexport const TailorDBType_Permission_OperandSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 1, 16, 2);\n\n/**\n * Describes the enum tailor.v1.TailorDBType.Permission.Operator.\n */\nexport const TailorDBType_Permission_OperatorSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_tailordb_resource, 1, 16, 0);\n\n/**\n * @generated from enum tailor.v1.TailorDBType.Permission.Operator\n */\nexport const TailorDBType_Permission_Operator = /*@__PURE__*/\n tsEnum(TailorDBType_Permission_OperatorSchema);\n\n/**\n * Describes the enum tailor.v1.TailorDBType.Permission.Permit.\n */\nexport const TailorDBType_Permission_PermitSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_tailordb_resource, 1, 16, 1);\n\n/**\n * @generated from enum tailor.v1.TailorDBType.Permission.Permit\n */\nexport const TailorDBType_Permission_Permit = /*@__PURE__*/\n tsEnum(TailorDBType_Permission_PermitSchema);\n\n/**\n * Describes the enum tailor.v1.TailorDBType.PermitAction.\n */\nexport const TailorDBType_PermitActionSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_tailordb_resource, 1, 0);\n\n/**\n * @generated from enum tailor.v1.TailorDBType.PermitAction\n */\nexport const TailorDBType_PermitAction = /*@__PURE__*/\n tsEnum(TailorDBType_PermitActionSchema);\n\n/**\n * Describes the message tailor.v1.TailorDBGQLPermission.\n * Use `create(TailorDBGQLPermissionSchema)` to create a new message.\n */\nexport const TailorDBGQLPermissionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 2);\n\n/**\n * Describes the message tailor.v1.TailorDBGQLPermission.Policy.\n * Use `create(TailorDBGQLPermission_PolicySchema)` to create a new message.\n */\nexport const TailorDBGQLPermission_PolicySchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 2, 0);\n\n/**\n * Describes the message tailor.v1.TailorDBGQLPermission.Condition.\n * Use `create(TailorDBGQLPermission_ConditionSchema)` to create a new message.\n */\nexport const TailorDBGQLPermission_ConditionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 2, 1);\n\n/**\n * Describes the message tailor.v1.TailorDBGQLPermission.Operand.\n * Use `create(TailorDBGQLPermission_OperandSchema)` to create a new message.\n */\nexport const TailorDBGQLPermission_OperandSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb_resource, 2, 2);\n\n/**\n * Describes the enum tailor.v1.TailorDBGQLPermission.Operator.\n */\nexport const TailorDBGQLPermission_OperatorSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_tailordb_resource, 2, 0);\n\n/**\n * @generated from enum tailor.v1.TailorDBGQLPermission.Operator\n */\nexport const TailorDBGQLPermission_Operator = /*@__PURE__*/\n tsEnum(TailorDBGQLPermission_OperatorSchema);\n\n/**\n * Describes the enum tailor.v1.TailorDBGQLPermission.Action.\n */\nexport const TailorDBGQLPermission_ActionSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_tailordb_resource, 2, 1);\n\n/**\n * @generated from enum tailor.v1.TailorDBGQLPermission.Action\n */\nexport const TailorDBGQLPermission_Action = /*@__PURE__*/\n tsEnum(TailorDBGQLPermission_ActionSchema);\n\n/**\n * Describes the enum tailor.v1.TailorDBGQLPermission.Permit.\n */\nexport const TailorDBGQLPermission_PermitSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_tailordb_resource, 2, 2);\n\n/**\n * @generated from enum tailor.v1.TailorDBGQLPermission.Permit\n */\nexport const TailorDBGQLPermission_Permit = /*@__PURE__*/\n tsEnum(TailorDBGQLPermission_PermitSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/tailordb.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_protobuf_field_mask } from \"@bufbuild/protobuf/wkt\";\nimport { file_tailor_fieldmask_v1_option } from \"../fieldmask/v1/option_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\nimport { file_tailor_v1_tailordb_resource } from \"./tailordb_resource_pb\";\n\n/**\n * Describes the file tailor/v1/tailordb.proto.\n */\nexport const file_tailor_v1_tailordb = /*@__PURE__*/\n fileDesc(\"Chh0YWlsb3IvdjEvdGFpbG9yZGIucHJvdG8SCXRhaWxvci52MSJ9ChlDb21wb3NlVGFpbG9yREJTRExSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHAoaQ29tcG9zZVRhaWxvckRCU0RMUmVzcG9uc2UiowEKHENyZWF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhChBkZWZhdWx0X3RpbWV6b25lGAMgASgJQge6SARyAhggIlUKHUNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlEjQKEHRhaWxvcmRiX3NlcnZpY2UYASABKAsyGi50YWlsb3IudjEuVGFpbG9yREJTZXJ2aWNlIqMBChxVcGRhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIQoQZGVmYXVsdF90aW1lem9uZRgDIAEoCUIHukgEcgIYICJVCh1VcGRhdGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZRI0ChB0YWlsb3JkYl9zZXJ2aWNlGAEgASgLMhoudGFpbG9yLnYxLlRhaWxvckRCU2VydmljZSKAAQocRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIh8KHURlbGV0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIn0KGUdldFRhaWxvckRCU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJSChpHZXRUYWlsb3JEQlNlcnZpY2VSZXNwb25zZRI0ChB0YWlsb3JkYl9zZXJ2aWNlGAEgASgLMhoudGFpbG9yLnYxLlRhaWxvckRCU2VydmljZSKWAQobTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiKDAQocTGlzdFRhaWxvckRCU2VydmljZXNSZXNwb25zZRI1ChF0YWlsb3JkYl9zZXJ2aWNlcxgBIAMoCzIaLnRhaWxvci52MS5UYWlsb3JEQlNlcnZpY2USFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIq0BChlDcmVhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLgoNdGFpbG9yZGJfdHlwZRgDIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUiTAoaQ3JlYXRlVGFpbG9yREJUeXBlUmVzcG9uc2USLgoNdGFpbG9yZGJfdHlwZRgBIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUigAYKGVVwZGF0ZVRhaWxvckRCVHlwZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIuCg10YWlsb3JkYl90eXBlGAMgASgLMhcudGFpbG9yLnYxLlRhaWxvckRCVHlwZRLQBAoLdXBkYXRlX21hc2sYZCABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQp4EivkrBmZpZWxkc4r5Kw1yZWxhdGlvbnNoaXBzivkrBWZpbGVzivkrC2Rlc2NyaXB0aW9uivkrCHNldHRpbmdzivkrFHNldHRpbmdzLmFnZ3JlZ2F0aW9uivkrFHNldHRpbmdzLmJ1bGtfdXBzZXJ0ivkrIXNldHRpbmdzLmRlZmF1bHRfcXVlcnlfbGltaXRfc2l6ZYr5Kx1zZXR0aW5ncy5tYXhfYnVsa191cHNlcnRfc2l6ZYr5KxRzZXR0aW5ncy5wbHVyYWxfZm9ybYr5Kx5zZXR0aW5ncy5wdWJsaXNoX3JlY29yZF9ldmVudHOK+SsOc2V0dGluZ3MuZHJhZnSK+SsPdHlwZV9wZXJtaXNzaW9uivkrFnR5cGVfcGVybWlzc2lvbi5jcmVhdGWK+SsUdHlwZV9wZXJtaXNzaW9uLnJlYWSK+SsWdHlwZV9wZXJtaXNzaW9uLnVwZGF0ZYr5KxZ0eXBlX3Blcm1pc3Npb24uZGVsZXRlivkrFXR5cGVfcGVybWlzc2lvbi5hZG1pbor5KwdleHRlbmRzivkrCmRpcmVjdGl2ZXOK+SsHaW5kZXhlc4r5KxFyZWNvcmRfcGVybWlzc2lvbor5KxZyZWNvcmRfcGVybWlzc2lvbi5yZWFkivkrGHJlY29yZF9wZXJtaXNzaW9uLnVwZGF0ZYr5KxhyZWNvcmRfcGVybWlzc2lvbi5kZWxldGUiTAoaVXBkYXRlVGFpbG9yREJUeXBlUmVzcG9uc2USLgoNdGFpbG9yZGJfdHlwZRgBIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUimQEKGURlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIaChJ0YWlsb3JkYl90eXBlX25hbWUYAyABKAkiHAoaRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UivAEKG1RydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjsKEnRhaWxvcmRiX3R5cGVfbmFtZRgDIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JCIeChxUcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIoABChxUcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHwodVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVzcG9uc2Ui+AEKGExpc3RUYWlsb3JEQlR5cGVzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEiEKBmZpbHRlchgFIAEoCzIRLnRhaWxvci52MS5GaWx0ZXISMAoOcGFnZV9kaXJlY3Rpb24YBiABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ6ChlMaXN0VGFpbG9yREJUeXBlc1Jlc3BvbnNlEi8KDnRhaWxvcmRiX3R5cGVzGAEgAygLMhcudGFpbG9yLnYxLlRhaWxvckRCVHlwZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMitwEKFkdldFRhaWxvckRCVHlwZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI7ChJ0YWlsb3JkYl90eXBlX25hbWUYAyABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQiSQoXR2V0VGFpbG9yREJUeXBlUmVzcG9uc2USLgoNdGFpbG9yZGJfdHlwZRgBIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUi+AEKIkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIyCgl0eXBlX25hbWUYAyABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQSPAoKcGVybWlzc2lvbhgEIAEoCzIgLnRhaWxvci52MS5UYWlsb3JEQkdRTFBlcm1pc3Npb25CBrpIA8gBASJbCiNDcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXNwb25zZRI0CgpwZXJtaXNzaW9uGAEgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbiK3AQofR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKCXR5cGVfbmFtZRgDIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JCJYCiBHZXRUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXNwb25zZRI0CgpwZXJtaXNzaW9uGAEgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbiLeAQohTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiKmAgoiTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZRJkCgtwZXJtaXNzaW9ucxgBIAMoCzJPLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1Jlc3BvbnNlLlRhaWxvckRCR1FMUGVybWlzc2lvbldpdGhUeXBlTmFtZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMabAohVGFpbG9yREJHUUxQZXJtaXNzaW9uV2l0aFR5cGVOYW1lEhEKCXR5cGVfbmFtZRgBIAEoCRI0CgpwZXJtaXNzaW9uGAIgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbiL4AQoiVXBkYXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKCXR5cGVfbmFtZRgDIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JBI8CgpwZXJtaXNzaW9uGAQgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbkIGukgDyAEBIlsKI1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlEjQKCnBlcm1pc3Npb24YASABKAsyIC50YWlsb3IudjEuVGFpbG9yREJHUUxQZXJtaXNzaW9uIroBCiJEZWxldGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSMgoJdHlwZV9uYW1lGAMgASgJQh+6SBxyGjIYXltBLVpdW2EtekEtWjAtOV17MCw2Mn0kIiUKI0RlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlYgZwcm90bzM\", [file_buf_validate_validate, file_google_protobuf_field_mask, file_tailor_fieldmask_v1_option, file_tailor_v1_resource, file_tailor_v1_tailordb_resource]);\n\n/**\n * Describes the message tailor.v1.ComposeTailorDBSDLRequest.\n * Use `create(ComposeTailorDBSDLRequestSchema)` to create a new message.\n */\nexport const ComposeTailorDBSDLRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 0);\n\n/**\n * Describes the message tailor.v1.ComposeTailorDBSDLResponse.\n * Use `create(ComposeTailorDBSDLResponseSchema)` to create a new message.\n */\nexport const ComposeTailorDBSDLResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 1);\n\n/**\n * Describes the message tailor.v1.CreateTailorDBServiceRequest.\n * Use `create(CreateTailorDBServiceRequestSchema)` to create a new message.\n */\nexport const CreateTailorDBServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 2);\n\n/**\n * Describes the message tailor.v1.CreateTailorDBServiceResponse.\n * Use `create(CreateTailorDBServiceResponseSchema)` to create a new message.\n */\nexport const CreateTailorDBServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 3);\n\n/**\n * Describes the message tailor.v1.UpdateTailorDBServiceRequest.\n * Use `create(UpdateTailorDBServiceRequestSchema)` to create a new message.\n */\nexport const UpdateTailorDBServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 4);\n\n/**\n * Describes the message tailor.v1.UpdateTailorDBServiceResponse.\n * Use `create(UpdateTailorDBServiceResponseSchema)` to create a new message.\n */\nexport const UpdateTailorDBServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 5);\n\n/**\n * Describes the message tailor.v1.DeleteTailorDBServiceRequest.\n * Use `create(DeleteTailorDBServiceRequestSchema)` to create a new message.\n */\nexport const DeleteTailorDBServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 6);\n\n/**\n * Describes the message tailor.v1.DeleteTailorDBServiceResponse.\n * Use `create(DeleteTailorDBServiceResponseSchema)` to create a new message.\n */\nexport const DeleteTailorDBServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 7);\n\n/**\n * Describes the message tailor.v1.GetTailorDBServiceRequest.\n * Use `create(GetTailorDBServiceRequestSchema)` to create a new message.\n */\nexport const GetTailorDBServiceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 8);\n\n/**\n * Describes the message tailor.v1.GetTailorDBServiceResponse.\n * Use `create(GetTailorDBServiceResponseSchema)` to create a new message.\n */\nexport const GetTailorDBServiceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 9);\n\n/**\n * Describes the message tailor.v1.ListTailorDBServicesRequest.\n * Use `create(ListTailorDBServicesRequestSchema)` to create a new message.\n */\nexport const ListTailorDBServicesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 10);\n\n/**\n * Describes the message tailor.v1.ListTailorDBServicesResponse.\n * Use `create(ListTailorDBServicesResponseSchema)` to create a new message.\n */\nexport const ListTailorDBServicesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 11);\n\n/**\n * Describes the message tailor.v1.CreateTailorDBTypeRequest.\n * Use `create(CreateTailorDBTypeRequestSchema)` to create a new message.\n */\nexport const CreateTailorDBTypeRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 12);\n\n/**\n * Describes the message tailor.v1.CreateTailorDBTypeResponse.\n * Use `create(CreateTailorDBTypeResponseSchema)` to create a new message.\n */\nexport const CreateTailorDBTypeResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 13);\n\n/**\n * Describes the message tailor.v1.UpdateTailorDBTypeRequest.\n * Use `create(UpdateTailorDBTypeRequestSchema)` to create a new message.\n */\nexport const UpdateTailorDBTypeRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 14);\n\n/**\n * Describes the message tailor.v1.UpdateTailorDBTypeResponse.\n * Use `create(UpdateTailorDBTypeResponseSchema)` to create a new message.\n */\nexport const UpdateTailorDBTypeResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 15);\n\n/**\n * Describes the message tailor.v1.DeleteTailorDBTypeRequest.\n * Use `create(DeleteTailorDBTypeRequestSchema)` to create a new message.\n */\nexport const DeleteTailorDBTypeRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 16);\n\n/**\n * Describes the message tailor.v1.DeleteTailorDBTypeResponse.\n * Use `create(DeleteTailorDBTypeResponseSchema)` to create a new message.\n */\nexport const DeleteTailorDBTypeResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 17);\n\n/**\n * Describes the message tailor.v1.TruncateTailorDBTypeRequest.\n * Use `create(TruncateTailorDBTypeRequestSchema)` to create a new message.\n */\nexport const TruncateTailorDBTypeRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 18);\n\n/**\n * Describes the message tailor.v1.TruncateTailorDBTypeResponse.\n * Use `create(TruncateTailorDBTypeResponseSchema)` to create a new message.\n */\nexport const TruncateTailorDBTypeResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 19);\n\n/**\n * Describes the message tailor.v1.TruncateTailorDBTypesRequest.\n * Use `create(TruncateTailorDBTypesRequestSchema)` to create a new message.\n */\nexport const TruncateTailorDBTypesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 20);\n\n/**\n * Describes the message tailor.v1.TruncateTailorDBTypesResponse.\n * Use `create(TruncateTailorDBTypesResponseSchema)` to create a new message.\n */\nexport const TruncateTailorDBTypesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 21);\n\n/**\n * Describes the message tailor.v1.ListTailorDBTypesRequest.\n * Use `create(ListTailorDBTypesRequestSchema)` to create a new message.\n */\nexport const ListTailorDBTypesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 22);\n\n/**\n * Describes the message tailor.v1.ListTailorDBTypesResponse.\n * Use `create(ListTailorDBTypesResponseSchema)` to create a new message.\n */\nexport const ListTailorDBTypesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 23);\n\n/**\n * Describes the message tailor.v1.GetTailorDBTypeRequest.\n * Use `create(GetTailorDBTypeRequestSchema)` to create a new message.\n */\nexport const GetTailorDBTypeRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 24);\n\n/**\n * Describes the message tailor.v1.GetTailorDBTypeResponse.\n * Use `create(GetTailorDBTypeResponseSchema)` to create a new message.\n */\nexport const GetTailorDBTypeResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 25);\n\n/**\n * Describes the message tailor.v1.CreateTailorDBGQLPermissionRequest.\n * Use `create(CreateTailorDBGQLPermissionRequestSchema)` to create a new message.\n */\nexport const CreateTailorDBGQLPermissionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 26);\n\n/**\n * Describes the message tailor.v1.CreateTailorDBGQLPermissionResponse.\n * Use `create(CreateTailorDBGQLPermissionResponseSchema)` to create a new message.\n */\nexport const CreateTailorDBGQLPermissionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 27);\n\n/**\n * Describes the message tailor.v1.GetTailorDBGQLPermissionRequest.\n * Use `create(GetTailorDBGQLPermissionRequestSchema)` to create a new message.\n */\nexport const GetTailorDBGQLPermissionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 28);\n\n/**\n * Describes the message tailor.v1.GetTailorDBGQLPermissionResponse.\n * Use `create(GetTailorDBGQLPermissionResponseSchema)` to create a new message.\n */\nexport const GetTailorDBGQLPermissionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 29);\n\n/**\n * Describes the message tailor.v1.ListTailorDBGQLPermissionsRequest.\n * Use `create(ListTailorDBGQLPermissionsRequestSchema)` to create a new message.\n */\nexport const ListTailorDBGQLPermissionsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 30);\n\n/**\n * Describes the message tailor.v1.ListTailorDBGQLPermissionsResponse.\n * Use `create(ListTailorDBGQLPermissionsResponseSchema)` to create a new message.\n */\nexport const ListTailorDBGQLPermissionsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 31);\n\n/**\n * Describes the message tailor.v1.ListTailorDBGQLPermissionsResponse.TailorDBGQLPermissionWithTypeName.\n * Use `create(ListTailorDBGQLPermissionsResponse_TailorDBGQLPermissionWithTypeNameSchema)` to create a new message.\n */\nexport const ListTailorDBGQLPermissionsResponse_TailorDBGQLPermissionWithTypeNameSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 31, 0);\n\n/**\n * Describes the message tailor.v1.UpdateTailorDBGQLPermissionRequest.\n * Use `create(UpdateTailorDBGQLPermissionRequestSchema)` to create a new message.\n */\nexport const UpdateTailorDBGQLPermissionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 32);\n\n/**\n * Describes the message tailor.v1.UpdateTailorDBGQLPermissionResponse.\n * Use `create(UpdateTailorDBGQLPermissionResponseSchema)` to create a new message.\n */\nexport const UpdateTailorDBGQLPermissionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 33);\n\n/**\n * Describes the message tailor.v1.DeleteTailorDBGQLPermissionRequest.\n * Use `create(DeleteTailorDBGQLPermissionRequestSchema)` to create a new message.\n */\nexport const DeleteTailorDBGQLPermissionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 34);\n\n/**\n * Describes the message tailor.v1.DeleteTailorDBGQLPermissionResponse.\n * Use `create(DeleteTailorDBGQLPermissionResponseSchema)` to create a new message.\n */\nexport const DeleteTailorDBGQLPermissionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_tailordb, 35);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/workflow_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_google_api_field_behavior } from \"../../google/api/field_behavior_pb\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Describes the file tailor/v1/workflow_resource.proto.\n */\nexport const file_tailor_v1_workflow_resource = /*@__PURE__*/\n fileDesc(\"CiF0YWlsb3IvdjEvd29ya2Zsb3dfcmVzb3VyY2UucHJvdG8SCXRhaWxvci52MSKtAQoTV29ya2Zsb3dKb2JGdW5jdGlvbhIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEg4KBnNjcmlwdBgDIAEoCRIPCgd2ZXJzaW9uGAQgASgDEjMKCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSFwoKc2NyaXB0X3JlZhgGIAEoCUgAiAEBQg0KC19zY3JpcHRfcmVmIqECCghXb3JrZmxvdxIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEh4KFm1haW5fam9iX2Z1bmN0aW9uX25hbWUYAyABKAkSPAoNam9iX2Z1bmN0aW9ucxgEIAMoCzIlLnRhaWxvci52MS5Xb3JrZmxvdy5Kb2JGdW5jdGlvbnNFbnRyeRIzCgpjcmVhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjMKCnVwZGF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMaMwoRSm9iRnVuY3Rpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgDOgI4ASLcAgoUV29ya2Zsb3dKb2JFeGVjdXRpb24SCgoCaWQYASABKAkSGAoQc3RhY2tlZF9qb2JfbmFtZRgCIAEoCRI2CgZzdGF0dXMYAyABKA4yJi50YWlsb3IudjEuV29ya2Zsb3dKb2JFeGVjdXRpb24uU3RhdHVzEhQKDGV4ZWN1dGlvbl9pZBgEIAEoCRIuCgpzdGFydGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgtmaW5pc2hlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAibwoGU3RhdHVzEhYKElNUQVRVU19VTlNQRUNJRklFRBAAEhIKDlNUQVRVU19SVU5OSU5HEAESEgoOU1RBVFVTX1NVU1BFTkQQAhISCg5TVEFUVVNfU1VDQ0VTUxADEhEKDVNUQVRVU19GQUlMRUQQBCKSAwoRV29ya2Zsb3dFeGVjdXRpb24SCgoCaWQYASABKAkSFQoNd29ya2Zsb3dfbmFtZRgCIAEoCRIzCgZzdGF0dXMYAyABKA4yIy50YWlsb3IudjEuV29ya2Zsb3dFeGVjdXRpb24uU3RhdHVzEjcKDmpvYl9leGVjdXRpb25zGAQgAygLMh8udGFpbG9yLnYxLldvcmtmbG93Sm9iRXhlY3V0aW9uEi4KCnN0YXJ0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2ZpbmlzaGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKKAQoGU3RhdHVzEhYKElNUQVRVU19VTlNQRUNJRklFRBAAEhIKDlNUQVRVU19QRU5ESU5HEAESGQoVU1RBVFVTX1BFTkRJTkdfUkVTVU1FEAISEgoOU1RBVFVTX1JVTk5JTkcQAxISCg5TVEFUVVNfU1VDQ0VTUxAEEhEKDVNUQVRVU19GQUlMRUQQBWIGcHJvdG8z\", [file_google_api_field_behavior, file_google_protobuf_timestamp]);\n\n/**\n * Describes the message tailor.v1.WorkflowJobFunction.\n * Use `create(WorkflowJobFunctionSchema)` to create a new message.\n */\nexport const WorkflowJobFunctionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow_resource, 0);\n\n/**\n * Describes the message tailor.v1.Workflow.\n * Use `create(WorkflowSchema)` to create a new message.\n */\nexport const WorkflowSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow_resource, 1);\n\n/**\n * Describes the message tailor.v1.WorkflowJobExecution.\n * Use `create(WorkflowJobExecutionSchema)` to create a new message.\n */\nexport const WorkflowJobExecutionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow_resource, 2);\n\n/**\n * Describes the enum tailor.v1.WorkflowJobExecution.Status.\n */\nexport const WorkflowJobExecution_StatusSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_workflow_resource, 2, 0);\n\n/**\n * @generated from enum tailor.v1.WorkflowJobExecution.Status\n */\nexport const WorkflowJobExecution_Status = /*@__PURE__*/\n tsEnum(WorkflowJobExecution_StatusSchema);\n\n/**\n * Describes the message tailor.v1.WorkflowExecution.\n * Use `create(WorkflowExecutionSchema)` to create a new message.\n */\nexport const WorkflowExecutionSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow_resource, 3);\n\n/**\n * Describes the enum tailor.v1.WorkflowExecution.Status.\n */\nexport const WorkflowExecution_StatusSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_workflow_resource, 3, 0);\n\n/**\n * @generated from enum tailor.v1.WorkflowExecution.Status\n */\nexport const WorkflowExecution_Status = /*@__PURE__*/\n tsEnum(WorkflowExecution_StatusSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/workflow.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_tailor_v1_auth_resource } from \"./auth_resource_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\nimport { file_tailor_v1_workflow_resource } from \"./workflow_resource_pb\";\n\n/**\n * Describes the file tailor/v1/workflow.proto.\n */\nexport const file_tailor_v1_workflow = /*@__PURE__*/\n fileDesc(\"Chh0YWlsb3IvdjEvd29ya2Zsb3cucHJvdG8SCXRhaWxvci52MSLCAgoVQ3JlYXRlV29ya2Zsb3dSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESPwoNd29ya2Zsb3dfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJIChZtYWluX2pvYl9mdW5jdGlvbl9uYW1lGAMgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkkKDWpvYl9mdW5jdGlvbnMYBCADKAsyMi50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dSZXF1ZXN0LkpvYkZ1bmN0aW9uc0VudHJ5GjMKEUpvYkZ1bmN0aW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoAzoCOAEiPwoWQ3JlYXRlV29ya2Zsb3dSZXNwb25zZRIlCgh3b3JrZmxvdxgBIAEoCzITLnRhaWxvci52MS5Xb3JrZmxvdyLCAgoVVXBkYXRlV29ya2Zsb3dSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESPwoNd29ya2Zsb3dfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJIChZtYWluX2pvYl9mdW5jdGlvbl9uYW1lGAMgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkkKDWpvYl9mdW5jdGlvbnMYBCADKAsyMi50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dSZXF1ZXN0LkpvYkZ1bmN0aW9uc0VudHJ5GjMKEUpvYkZ1bmN0aW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoAzoCOAEiPwoWVXBkYXRlV29ya2Zsb3dSZXNwb25zZRIlCgh3b3JrZmxvdxgBIAEoCzITLnRhaWxvci52MS5Xb3JrZmxvdyJWChVEZWxldGVXb3JrZmxvd1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIdCgt3b3JrZmxvd19pZBgCIAEoCUIIukgFcgOwAQEiGAoWRGVsZXRlV29ya2Zsb3dSZXNwb25zZSJTChJHZXRXb3JrZmxvd1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIdCgt3b3JrZmxvd19pZBgCIAEoCUIIukgFcgOwAQEiPAoTR2V0V29ya2Zsb3dSZXNwb25zZRIlCgh3b3JrZmxvdxgBIAEoCzITLnRhaWxvci52MS5Xb3JrZmxvdyJ7ChhHZXRXb3JrZmxvd0J5TmFtZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARI/Cg13b3JrZmxvd19uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIkIKGUdldFdvcmtmbG93QnlOYW1lUmVzcG9uc2USJQoId29ya2Zsb3cYASABKAsyEy50YWlsb3IudjEuV29ya2Zsb3cijwEKFExpc3RXb3JrZmxvd3NSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJtChVMaXN0V29ya2Zsb3dzUmVzcG9uc2USJgoJd29ya2Zsb3dzGAEgAygLMhMudGFpbG9yLnYxLldvcmtmbG93EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyK/AQogQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJDChFqb2JfZnVuY3Rpb25fbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIOCgZzY3JpcHQYAyABKAkSFwoKc2NyaXB0X3JlZhgEIAEoCUgAiAEBQg0KC19zY3JpcHRfcmVmIlkKIUNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb25SZXNwb25zZRI0Cgxqb2JfZnVuY3Rpb24YASABKAsyHi50YWlsb3IudjEuV29ya2Zsb3dKb2JGdW5jdGlvbiK/AQogVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJDChFqb2JfZnVuY3Rpb25fbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIOCgZzY3JpcHQYAyABKAkSFwoKc2NyaXB0X3JlZhgEIAEoCUgAiAEBQg0KC19zY3JpcHRfcmVmIlkKIVVwZGF0ZVdvcmtmbG93Sm9iRnVuY3Rpb25SZXNwb25zZRI0Cgxqb2JfZnVuY3Rpb24YASABKAsyHi50YWlsb3IudjEuV29ya2Zsb3dKb2JGdW5jdGlvbiJiCh1HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEiEKD2pvYl9mdW5jdGlvbl9pZBgCIAEoCUIIukgFcgOwAQEiVgoeR2V0V29ya2Zsb3dKb2JGdW5jdGlvblJlc3BvbnNlEjQKDGpvYl9mdW5jdGlvbhgBIAEoCzIeLnRhaWxvci52MS5Xb3JrZmxvd0pvYkZ1bmN0aW9uIooBCiNHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkMKEWpvYl9mdW5jdGlvbl9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIlwKJEdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXNwb25zZRI0Cgxqb2JfZnVuY3Rpb24YASABKAsyHi50YWlsb3IudjEuV29ya2Zsb3dKb2JGdW5jdGlvbiKaAQofTGlzdFdvcmtmbG93Sm9iRnVuY3Rpb25zUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhIKCnBhZ2VfdG9rZW4YAiABKAkSEQoJcGFnZV9zaXplGAMgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAQgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ihwEKIExpc3RXb3JrZmxvd0pvYkZ1bmN0aW9uc1Jlc3BvbnNlEjUKDWpvYl9mdW5jdGlvbnMYASADKAsyHi50YWlsb3IudjEuV29ya2Zsb3dKb2JGdW5jdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMiXQobR2V0V29ya2Zsb3dFeGVjdXRpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESHgoMZXhlY3V0aW9uX2lkGAIgASgJQgi6SAVyA7ABASJPChxHZXRXb3JrZmxvd0V4ZWN1dGlvblJlc3BvbnNlEi8KCWV4ZWN1dGlvbhgBIAEoCzIcLnRhaWxvci52MS5Xb3JrZmxvd0V4ZWN1dGlvbiL8AQodTGlzdFdvcmtmbG93RXhlY3V0aW9uc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARI/Cg13b3JrZmxvd19uYW1lGAYgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhIKCnBhZ2VfdG9rZW4YAiABKAkSEQoJcGFnZV9zaXplGAMgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAQgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24SIQoGZmlsdGVyGAUgASgLMhEudGFpbG9yLnYxLkZpbHRlciKAAQoeTGlzdFdvcmtmbG93RXhlY3V0aW9uc1Jlc3BvbnNlEjAKCmV4ZWN1dGlvbnMYASADKAsyHC50YWlsb3IudjEuV29ya2Zsb3dFeGVjdXRpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIqEBChhUZXN0U3RhcnRXb3JrZmxvd1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIdCgt3b3JrZmxvd19pZBgCIAEoCUIIukgFcgOwAQESLAoMYXV0aF9pbnZva2VyGAMgASgLMhYudGFpbG9yLnYxLkF1dGhJbnZva2VyEhAKA2FyZxgEIAEoCUgAiAEBQgYKBF9hcmciMQoZVGVzdFN0YXJ0V29ya2Zsb3dSZXNwb25zZRIUCgxleGVjdXRpb25faWQYASABKAkiWwoZVGVzdFJlc3VtZVdvcmtmbG93UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEh4KDGV4ZWN1dGlvbl9pZBgCIAEoCUIIukgFcgOwAQEiMgoaVGVzdFJlc3VtZVdvcmtmbG93UmVzcG9uc2USFAoMZXhlY3V0aW9uX2lkGAEgASgJYgZwcm90bzM\", [file_buf_validate_validate, file_tailor_v1_auth_resource, file_tailor_v1_resource, file_tailor_v1_workflow_resource]);\n\n/**\n * Describes the message tailor.v1.CreateWorkflowRequest.\n * Use `create(CreateWorkflowRequestSchema)` to create a new message.\n */\nexport const CreateWorkflowRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 0);\n\n/**\n * Describes the message tailor.v1.CreateWorkflowResponse.\n * Use `create(CreateWorkflowResponseSchema)` to create a new message.\n */\nexport const CreateWorkflowResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 1);\n\n/**\n * Describes the message tailor.v1.UpdateWorkflowRequest.\n * Use `create(UpdateWorkflowRequestSchema)` to create a new message.\n */\nexport const UpdateWorkflowRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 2);\n\n/**\n * Describes the message tailor.v1.UpdateWorkflowResponse.\n * Use `create(UpdateWorkflowResponseSchema)` to create a new message.\n */\nexport const UpdateWorkflowResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 3);\n\n/**\n * Describes the message tailor.v1.DeleteWorkflowRequest.\n * Use `create(DeleteWorkflowRequestSchema)` to create a new message.\n */\nexport const DeleteWorkflowRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 4);\n\n/**\n * Describes the message tailor.v1.DeleteWorkflowResponse.\n * Use `create(DeleteWorkflowResponseSchema)` to create a new message.\n */\nexport const DeleteWorkflowResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 5);\n\n/**\n * Describes the message tailor.v1.GetWorkflowRequest.\n * Use `create(GetWorkflowRequestSchema)` to create a new message.\n */\nexport const GetWorkflowRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 6);\n\n/**\n * Describes the message tailor.v1.GetWorkflowResponse.\n * Use `create(GetWorkflowResponseSchema)` to create a new message.\n */\nexport const GetWorkflowResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 7);\n\n/**\n * Describes the message tailor.v1.GetWorkflowByNameRequest.\n * Use `create(GetWorkflowByNameRequestSchema)` to create a new message.\n */\nexport const GetWorkflowByNameRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 8);\n\n/**\n * Describes the message tailor.v1.GetWorkflowByNameResponse.\n * Use `create(GetWorkflowByNameResponseSchema)` to create a new message.\n */\nexport const GetWorkflowByNameResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 9);\n\n/**\n * Describes the message tailor.v1.ListWorkflowsRequest.\n * Use `create(ListWorkflowsRequestSchema)` to create a new message.\n */\nexport const ListWorkflowsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 10);\n\n/**\n * Describes the message tailor.v1.ListWorkflowsResponse.\n * Use `create(ListWorkflowsResponseSchema)` to create a new message.\n */\nexport const ListWorkflowsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 11);\n\n/**\n * Describes the message tailor.v1.CreateWorkflowJobFunctionRequest.\n * Use `create(CreateWorkflowJobFunctionRequestSchema)` to create a new message.\n */\nexport const CreateWorkflowJobFunctionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 12);\n\n/**\n * Describes the message tailor.v1.CreateWorkflowJobFunctionResponse.\n * Use `create(CreateWorkflowJobFunctionResponseSchema)` to create a new message.\n */\nexport const CreateWorkflowJobFunctionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 13);\n\n/**\n * Describes the message tailor.v1.UpdateWorkflowJobFunctionRequest.\n * Use `create(UpdateWorkflowJobFunctionRequestSchema)` to create a new message.\n */\nexport const UpdateWorkflowJobFunctionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 14);\n\n/**\n * Describes the message tailor.v1.UpdateWorkflowJobFunctionResponse.\n * Use `create(UpdateWorkflowJobFunctionResponseSchema)` to create a new message.\n */\nexport const UpdateWorkflowJobFunctionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 15);\n\n/**\n * Describes the message tailor.v1.GetWorkflowJobFunctionRequest.\n * Use `create(GetWorkflowJobFunctionRequestSchema)` to create a new message.\n */\nexport const GetWorkflowJobFunctionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 16);\n\n/**\n * Describes the message tailor.v1.GetWorkflowJobFunctionResponse.\n * Use `create(GetWorkflowJobFunctionResponseSchema)` to create a new message.\n */\nexport const GetWorkflowJobFunctionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 17);\n\n/**\n * Describes the message tailor.v1.GetWorkflowJobFunctionByNameRequest.\n * Use `create(GetWorkflowJobFunctionByNameRequestSchema)` to create a new message.\n */\nexport const GetWorkflowJobFunctionByNameRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 18);\n\n/**\n * Describes the message tailor.v1.GetWorkflowJobFunctionByNameResponse.\n * Use `create(GetWorkflowJobFunctionByNameResponseSchema)` to create a new message.\n */\nexport const GetWorkflowJobFunctionByNameResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 19);\n\n/**\n * Describes the message tailor.v1.ListWorkflowJobFunctionsRequest.\n * Use `create(ListWorkflowJobFunctionsRequestSchema)` to create a new message.\n */\nexport const ListWorkflowJobFunctionsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 20);\n\n/**\n * Describes the message tailor.v1.ListWorkflowJobFunctionsResponse.\n * Use `create(ListWorkflowJobFunctionsResponseSchema)` to create a new message.\n */\nexport const ListWorkflowJobFunctionsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 21);\n\n/**\n * Describes the message tailor.v1.GetWorkflowExecutionRequest.\n * Use `create(GetWorkflowExecutionRequestSchema)` to create a new message.\n */\nexport const GetWorkflowExecutionRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 22);\n\n/**\n * Describes the message tailor.v1.GetWorkflowExecutionResponse.\n * Use `create(GetWorkflowExecutionResponseSchema)` to create a new message.\n */\nexport const GetWorkflowExecutionResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 23);\n\n/**\n * Describes the message tailor.v1.ListWorkflowExecutionsRequest.\n * Use `create(ListWorkflowExecutionsRequestSchema)` to create a new message.\n */\nexport const ListWorkflowExecutionsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 24);\n\n/**\n * Describes the message tailor.v1.ListWorkflowExecutionsResponse.\n * Use `create(ListWorkflowExecutionsResponseSchema)` to create a new message.\n */\nexport const ListWorkflowExecutionsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 25);\n\n/**\n * Describes the message tailor.v1.TestStartWorkflowRequest.\n * Use `create(TestStartWorkflowRequestSchema)` to create a new message.\n */\nexport const TestStartWorkflowRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 26);\n\n/**\n * Describes the message tailor.v1.TestStartWorkflowResponse.\n * Use `create(TestStartWorkflowResponseSchema)` to create a new message.\n */\nexport const TestStartWorkflowResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 27);\n\n/**\n * Describes the message tailor.v1.TestResumeWorkflowRequest.\n * Use `create(TestResumeWorkflowRequestSchema)` to create a new message.\n */\nexport const TestResumeWorkflowRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 28);\n\n/**\n * Describes the message tailor.v1.TestResumeWorkflowResponse.\n * Use `create(TestResumeWorkflowResponseSchema)` to create a new message.\n */\nexport const TestResumeWorkflowResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workflow, 29);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/workspace_resource.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_google_api_field_behavior } from \"../../google/api/field_behavior_pb\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Describes the file tailor/v1/workspace_resource.proto.\n */\nexport const file_tailor_v1_workspace_resource = /*@__PURE__*/\n fileDesc(\"CiJ0YWlsb3IvdjEvd29ya3NwYWNlX3Jlc291cmNlLnByb3RvEgl0YWlsb3IudjEilAEKDE9yZ2FuaXphdGlvbhIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEjQKC2NyZWF0ZV90aW1lGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjQKC3VwZGF0ZV90aW1lGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDIpQDChJPcmdhbml6YXRpb25BY2Nlc3MSFwoPb3JnYW5pemF0aW9uX2lkGAEgASgJEikKBHJvbGUYAiABKA4yGy50YWlsb3IudjEuT3JnYW5pemF0aW9uUm9sZRIyCgR0ZWFtGAMgASgLMiIudGFpbG9yLnYxLk9yZ2FuaXphdGlvbkFjY2Vzcy5UZWFtSAASQwoNcGxhdGZvcm1fdXNlchgEIAEoCzIqLnRhaWxvci52MS5Pcmdhbml6YXRpb25BY2Nlc3MuUGxhdGZvcm1Vc2VySAASQQoMbWFjaGluZV91c2VyGAUgASgLMikudGFpbG9yLnYxLk9yZ2FuaXphdGlvbkFjY2Vzcy5NYWNoaW5lVXNlckgAGikKDFBsYXRmb3JtVXNlchIKCgJpZBgBIAEoCRINCgVlbWFpbBgCIAEoCRogCgRUZWFtEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkaJwoLTWFjaGluZVVzZXISCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCUIICgZtZW1iZXIi1wEKBkZvbGRlchIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhcKD29yZ2FuaXphdGlvbl9pZBgDIAEoCRIYChBwYXJlbnRfZm9sZGVyX2lkGAQgASgJEhQKDGhhc19jaGlsZHJlbhgHIAEoCBI0CgtjcmVhdGVfdGltZRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI0Cgt1cGRhdGVfdGltZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAyLwAgoMRm9sZGVyQWNjZXNzEhEKCWZvbGRlcl9pZBgBIAEoCRIjCgRyb2xlGAIgASgOMhUudGFpbG9yLnYxLkZvbGRlclJvbGUSLAoEdGVhbRgDIAEoCzIcLnRhaWxvci52MS5Gb2xkZXJBY2Nlc3MuVGVhbUgAEj0KDXBsYXRmb3JtX3VzZXIYBCABKAsyJC50YWlsb3IudjEuRm9sZGVyQWNjZXNzLlBsYXRmb3JtVXNlckgAEjsKDG1hY2hpbmVfdXNlchgFIAEoCzIjLnRhaWxvci52MS5Gb2xkZXJBY2Nlc3MuTWFjaGluZVVzZXJIABopCgxQbGF0Zm9ybVVzZXISCgoCaWQYASABKAkSDQoFZW1haWwYAiABKAkaIAoEVGVhbRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJGicKC01hY2hpbmVVc2VyEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAlCCAoGbWVtYmVyIqUBCgRUZWFtEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSFwoPb3JnYW5pemF0aW9uX2lkGAMgASgJEjQKC2NyZWF0ZV90aW1lGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjQKC3VwZGF0ZV90aW1lGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDIqsBCgpUZWFtTWVtYmVyEg8KB3RlYW1faWQYASABKAkSOQoNcGxhdGZvcm1fdXNlchgCIAEoCzIiLnRhaWxvci52MS5UZWFtTWVtYmVyLlBsYXRmb3JtVXNlchIhCgRyb2xlGAMgASgOMhMudGFpbG9yLnYxLlRlYW1Sb2xlGi4KDFBsYXRmb3JtVXNlchIPCgd1c2VyX2lkGAEgASgJEg0KBWVtYWlsGAIgASgJIq0CCglXb3Jrc3BhY2USCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIbCg5jcmVhdGVfdXNlcl9pZBgDIAEoCUID4EEDEhsKDnVwZGF0ZV91c2VyX2lkGAQgASgJQgPgQQMSNAoLY3JlYXRlX3RpbWUYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNAoLdXBkYXRlX3RpbWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSEwoGcmVnaW9uGAggASgJQgPgQQMSGQoRZGVsZXRlX3Byb3RlY3Rpb24YCSABKAgSFwoPb3JnYW5pemF0aW9uX2lkGAogASgJEhEKCWZvbGRlcl9pZBgLIAEoCUoECAcQCCLBAQoVV29ya3NwYWNlUGxhdGZvcm1Vc2VyEjIKBHJvbGUYASABKA4yJC50YWlsb3IudjEuV29ya3NwYWNlUGxhdGZvcm1Vc2VyUm9sZRJECg1wbGF0Zm9ybV91c2VyGAIgASgLMi0udGFpbG9yLnYxLldvcmtzcGFjZVBsYXRmb3JtVXNlci5QbGF0Zm9ybVVzZXIaLgoMUGxhdGZvcm1Vc2VyEg8KB3VzZXJfaWQYASABKAkSDQoFZW1haWwYAiABKAkirgIKE1BsYXRmb3JtQWNjb3VudFBsYW4SNQoJcGxhbl90eXBlGAEgASgOMiIudGFpbG9yLnYxLlBsYXRmb3JtQWNjb3VudFBsYW5UeXBlEkgKBXRyaWFsGAIgASgLMjcudGFpbG9yLnYxLlBsYXRmb3JtQWNjb3VudFBsYW4uUGxhdGZvcm1BY2NvdW50UGxhblRyaWFsSAAaiAEKGFBsYXRmb3JtQWNjb3VudFBsYW5UcmlhbBIsCghzdGFydF9hdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASKgoGZW5kX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBISCgppc19leHBpcmVkGAMgASgIQgsKCXBsYW5fbWV0YSqOAQoQT3JnYW5pemF0aW9uUm9sZRIhCh1PUkdBTklaQVRJT05fUk9MRV9VTlNQRUNJRklFRBAAEhsKF09SR0FOSVpBVElPTl9ST0xFX0FETUlOEAESHAoYT1JHQU5JWkFUSU9OX1JPTEVfRURJVE9SEAISHAoYT1JHQU5JWkFUSU9OX1JPTEVfVklFV0VSEAMqcAoKRm9sZGVyUm9sZRIbChdGT0xERVJfUk9MRV9VTlNQRUNJRklFRBAAEhUKEUZPTERFUl9ST0xFX0FETUlOEAESFgoSRk9MREVSX1JPTEVfRURJVE9SEAISFgoSRk9MREVSX1JPTEVfVklFV0VSEAMqZwoIVGVhbVJvbGUSGQoVVEVBTV9ST0xFX1VOU1BFQ0lGSUVEEAASEwoPVEVBTV9ST0xFX0FETUlOEAESFQoRVEVBTV9ST0xFX01BTkFHRVIQAhIUChBURUFNX1JPTEVfTUVNQkVSEAMqwwEKGVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGUSLAooV09SS1NQQUNFX1BMQVRGT1JNX1VTRVJfUk9MRV9VTlNQRUNJRklFRBAAEiYKIldPUktTUEFDRV9QTEFURk9STV9VU0VSX1JPTEVfQURNSU4QARInCiNXT1JLU1BBQ0VfUExBVEZPUk1fVVNFUl9ST0xFX0VESVRPUhACEicKI1dPUktTUEFDRV9QTEFURk9STV9VU0VSX1JPTEVfVklFV0VSEAMqkQEKF1BsYXRmb3JtQWNjb3VudFBsYW5UeXBlEioKJlBMQVRGT1JNX0FDQ09VTlRfUExBTl9UWVBFX1VOU1BFQ0lGSUVEEAASJAogUExBVEZPUk1fQUNDT1VOVF9QTEFOX1RZUEVfVFJJQUwQARIkCiBQTEFURk9STV9BQ0NPVU5UX1BMQU5fVFlQRV9CQVNJQxACYgZwcm90bzM\", [file_google_api_field_behavior, file_google_protobuf_timestamp]);\n\n/**\n * Describes the message tailor.v1.Organization.\n * Use `create(OrganizationSchema)` to create a new message.\n */\nexport const OrganizationSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 0);\n\n/**\n * Describes the message tailor.v1.OrganizationAccess.\n * Use `create(OrganizationAccessSchema)` to create a new message.\n */\nexport const OrganizationAccessSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 1);\n\n/**\n * Describes the message tailor.v1.OrganizationAccess.PlatformUser.\n * Use `create(OrganizationAccess_PlatformUserSchema)` to create a new message.\n */\nexport const OrganizationAccess_PlatformUserSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 1, 0);\n\n/**\n * Describes the message tailor.v1.OrganizationAccess.Team.\n * Use `create(OrganizationAccess_TeamSchema)` to create a new message.\n */\nexport const OrganizationAccess_TeamSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 1, 1);\n\n/**\n * Describes the message tailor.v1.OrganizationAccess.MachineUser.\n * Use `create(OrganizationAccess_MachineUserSchema)` to create a new message.\n */\nexport const OrganizationAccess_MachineUserSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 1, 2);\n\n/**\n * Describes the message tailor.v1.Folder.\n * Use `create(FolderSchema)` to create a new message.\n */\nexport const FolderSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 2);\n\n/**\n * Describes the message tailor.v1.FolderAccess.\n * Use `create(FolderAccessSchema)` to create a new message.\n */\nexport const FolderAccessSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 3);\n\n/**\n * Describes the message tailor.v1.FolderAccess.PlatformUser.\n * Use `create(FolderAccess_PlatformUserSchema)` to create a new message.\n */\nexport const FolderAccess_PlatformUserSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 3, 0);\n\n/**\n * Describes the message tailor.v1.FolderAccess.Team.\n * Use `create(FolderAccess_TeamSchema)` to create a new message.\n */\nexport const FolderAccess_TeamSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 3, 1);\n\n/**\n * Describes the message tailor.v1.FolderAccess.MachineUser.\n * Use `create(FolderAccess_MachineUserSchema)` to create a new message.\n */\nexport const FolderAccess_MachineUserSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 3, 2);\n\n/**\n * Describes the message tailor.v1.Team.\n * Use `create(TeamSchema)` to create a new message.\n */\nexport const TeamSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 4);\n\n/**\n * Describes the message tailor.v1.TeamMember.\n * Use `create(TeamMemberSchema)` to create a new message.\n */\nexport const TeamMemberSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 5);\n\n/**\n * Describes the message tailor.v1.TeamMember.PlatformUser.\n * Use `create(TeamMember_PlatformUserSchema)` to create a new message.\n */\nexport const TeamMember_PlatformUserSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 5, 0);\n\n/**\n * Describes the message tailor.v1.Workspace.\n * Use `create(WorkspaceSchema)` to create a new message.\n */\nexport const WorkspaceSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 6);\n\n/**\n * Describes the message tailor.v1.WorkspacePlatformUser.\n * Use `create(WorkspacePlatformUserSchema)` to create a new message.\n */\nexport const WorkspacePlatformUserSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 7);\n\n/**\n * Describes the message tailor.v1.WorkspacePlatformUser.PlatformUser.\n * Use `create(WorkspacePlatformUser_PlatformUserSchema)` to create a new message.\n */\nexport const WorkspacePlatformUser_PlatformUserSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 7, 0);\n\n/**\n * Describes the message tailor.v1.PlatformAccountPlan.\n * Use `create(PlatformAccountPlanSchema)` to create a new message.\n */\nexport const PlatformAccountPlanSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 8);\n\n/**\n * Describes the message tailor.v1.PlatformAccountPlan.PlatformAccountPlanTrial.\n * Use `create(PlatformAccountPlan_PlatformAccountPlanTrialSchema)` to create a new message.\n */\nexport const PlatformAccountPlan_PlatformAccountPlanTrialSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace_resource, 8, 0);\n\n/**\n * Describes the enum tailor.v1.OrganizationRole.\n */\nexport const OrganizationRoleSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_workspace_resource, 0);\n\n/**\n * @generated from enum tailor.v1.OrganizationRole\n */\nexport const OrganizationRole = /*@__PURE__*/\n tsEnum(OrganizationRoleSchema);\n\n/**\n * Describes the enum tailor.v1.FolderRole.\n */\nexport const FolderRoleSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_workspace_resource, 1);\n\n/**\n * @generated from enum tailor.v1.FolderRole\n */\nexport const FolderRole = /*@__PURE__*/\n tsEnum(FolderRoleSchema);\n\n/**\n * Describes the enum tailor.v1.TeamRole.\n */\nexport const TeamRoleSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_workspace_resource, 2);\n\n/**\n * @generated from enum tailor.v1.TeamRole\n */\nexport const TeamRole = /*@__PURE__*/\n tsEnum(TeamRoleSchema);\n\n/**\n * Describes the enum tailor.v1.WorkspacePlatformUserRole.\n */\nexport const WorkspacePlatformUserRoleSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_workspace_resource, 3);\n\n/**\n * @generated from enum tailor.v1.WorkspacePlatformUserRole\n */\nexport const WorkspacePlatformUserRole = /*@__PURE__*/\n tsEnum(WorkspacePlatformUserRoleSchema);\n\n/**\n * Describes the enum tailor.v1.PlatformAccountPlanType.\n */\nexport const PlatformAccountPlanTypeSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_workspace_resource, 4);\n\n/**\n * @generated from enum tailor.v1.PlatformAccountPlanType\n */\nexport const PlatformAccountPlanType = /*@__PURE__*/\n tsEnum(PlatformAccountPlanTypeSchema);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/workspace.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { enumDesc, fileDesc, messageDesc, tsEnum } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb\";\nimport { file_google_protobuf_field_mask } from \"@bufbuild/protobuf/wkt\";\nimport { file_tailor_fieldmask_v1_option } from \"../fieldmask/v1/option_pb\";\nimport { file_tailor_v1_resource } from \"./resource_pb\";\nimport { file_tailor_v1_workspace_resource } from \"./workspace_resource_pb\";\n\n/**\n * Describes the file tailor/v1/workspace.proto.\n */\nexport const file_tailor_v1_workspace = /*@__PURE__*/\n fileDesc(\"Chl0YWlsb3IvdjEvd29ya3NwYWNlLnByb3RvEgl0YWlsb3IudjEiJgokTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXF1ZXN0IjgKJUxpc3RBdmFpbGFibGVXb3Jrc3BhY2VSZWdpb25zUmVzcG9uc2USDwoHcmVnaW9ucxgBIAMoCSLVAQoWQ3JlYXRlV29ya3NwYWNlUmVxdWVzdBJACg53b3Jrc3BhY2VfbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIYChB3b3Jrc3BhY2VfcmVnaW9uGAIgASgJEiQKD29yZ2FuaXphdGlvbl9pZBgDIAEoCUILukgI2AEBcgOwAQESHgoJZm9sZGVyX2lkGAQgASgJQgu6SAjYAQFyA7ABARIZChFkZWxldGVfcHJvdGVjdGlvbhgFIAEoCCJCChdDcmVhdGVXb3Jrc3BhY2VSZXNwb25zZRInCgl3b3Jrc3BhY2UYASABKAsyFC50YWlsb3IudjEuV29ya3NwYWNlItgCChZVcGRhdGVXb3Jrc3BhY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOd29ya3NwYWNlX25hbWUYAiABKAlCK7pIKNgBAXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSJAoPb3JnYW5pemF0aW9uX2lkGAMgASgJQgu6SAjYAQFyA7ABARIeCglmb2xkZXJfaWQYBCABKAlCC7pICNgBAXIDsAEBEhkKEWRlbGV0ZV9wcm90ZWN0aW9uGAUgASgIEngKC3VwZGF0ZV9tYXNrGGQgASgLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza0JHivkrDndvcmtzcGFjZV9uYW1livkrD29yZ2FuaXphdGlvbl9pZIr5Kwlmb2xkZXJfaWSK+SsRZGVsZXRlX3Byb3RlY3Rpb24iQgoXVXBkYXRlV29ya3NwYWNlUmVzcG9uc2USJwoJd29ya3NwYWNlGAEgASgLMhQudGFpbG9yLnYxLldvcmtzcGFjZSI4ChZEZWxldGVXb3Jrc3BhY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQEiGQoXRGVsZXRlV29ya3NwYWNlUmVzcG9uc2Ui8wEKFUxpc3RXb3Jrc3BhY2VzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEkIKBHZpZXcYBCABKA4yJS50YWlsb3IudjEuTGlzdFdvcmtzcGFjZXNSZXF1ZXN0LlZpZXdCDbpICtgBAYIBBBABIAAiPQoEVmlldxIUChBWSUVXX1VOU1BFQ0lGSUVEEAASDAoIVklFV19BTEwQARIRCg1WSUVXX1BFUlNPTkFMEAIicAoWTGlzdFdvcmtzcGFjZXNSZXNwb25zZRIoCgp3b3Jrc3BhY2VzGAEgAygLMhQudGFpbG9yLnYxLldvcmtzcGFjZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMivwEKIUxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEiEKD29yZ2FuaXphdGlvbl9pZBgEIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAUgASgJQgu6SAjYAQFyA7ABASJ8CiJMaXN0T3JnYW5pemF0aW9uV29ya3NwYWNlc1Jlc3BvbnNlEhcKD25leHRfcGFnZV90b2tlbhgBIAEoCRITCgt0b3RhbF9jb3VudBgCIAEoAxIoCgp3b3Jrc3BhY2VzGAMgAygLMhQudGFpbG9yLnYxLldvcmtzcGFjZSI5ChdSZXN0b3JlV29ya3NwYWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBIhoKGFJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSI1ChNHZXRXb3Jrc3BhY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQEiPwoUR2V0V29ya3NwYWNlUmVzcG9uc2USJwoJd29ya3NwYWNlGAEgASgLMhQudGFpbG9yLnYxLldvcmtzcGFjZSKcAQohTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0EhIKCnBhZ2VfdG9rZW4YASABKAkSEQoJcGFnZV9zaXplGAIgASgNEh4KDHdvcmtzcGFjZV9pZBgDIAEoCUIIukgFcgOwAQESMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiKWAQoiTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXNwb25zZRIXCg9uZXh0X3BhZ2VfdG9rZW4YASABKAkSQgoYd29ya3NwYWNlX3BsYXRmb3JtX3VzZXJzGAIgAygLMiAudGFpbG9yLnYxLldvcmtzcGFjZVBsYXRmb3JtVXNlchITCgt0b3RhbF9jb3VudBgDIAEoAyIwCi5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUm9sZXNSZXF1ZXN0ImYKL0xpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1Jlc3BvbnNlEjMKBXJvbGVzGAEgAygOMiQudGFpbG9yLnYxLldvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGUikAEKIkludml0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCgVlbWFpbBgCIAEoCUIHukgEcgJgARIyCgRyb2xlGAMgASgOMiQudGFpbG9yLnYxLldvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGUiJQojSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiXAoiUmVtb3ZlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKBWVtYWlsGAIgASgJQge6SARyAmABIiUKI1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIpABCiJVcGRhdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESFgoFZW1haWwYAiABKAlCB7pIBHICYAESMgoEcm9sZRgDIAEoDjIkLnRhaWxvci52MS5Xb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlIiUKI1VwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIkEKH0dldFdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABASJlCiBHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZRJBChd3b3Jrc3BhY2VfcGxhdGZvcm1fdXNlchgBIAEoCzIgLnRhaWxvci52MS5Xb3Jrc3BhY2VQbGF0Zm9ybVVzZXIiOQoXR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABASJOChhHZXRXb3Jrc3BhY2VSb2xlUmVzcG9uc2USMgoEcm9sZRgBIAEoDjIkLnRhaWxvci52MS5Xb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlImIKGVVwZGF0ZU9yZ2FuaXphdGlvblJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIiChFvcmdhbml6YXRpb25fbmFtZRgCIAEoCUIHukgEcgIQASJLChpVcGRhdGVPcmdhbml6YXRpb25SZXNwb25zZRItCgxvcmdhbml6YXRpb24YASABKAsyFy50YWlsb3IudjEuT3JnYW5pemF0aW9uIjsKFkdldE9yZ2FuaXphdGlvblJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABASJIChdHZXRPcmdhbml6YXRpb25SZXNwb25zZRItCgxvcmdhbml6YXRpb24YASABKAsyFy50YWlsb3IudjEuT3JnYW5pemF0aW9uInMKGExpc3RPcmdhbml6YXRpb25zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInkKGUxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2USLgoNb3JnYW5pemF0aW9ucxgBIAMoCzIXLnRhaWxvci52MS5Pcmdhbml6YXRpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIh4KHExpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QihwIKHUxpc3RVc2VyT3JnYW5pemF0aW9uc1Jlc3BvbnNlElUKEnVzZXJfb3JnYW5pemF0aW9ucxgBIAMoCzI5LnRhaWxvci52MS5MaXN0VXNlck9yZ2FuaXphdGlvbnNSZXNwb25zZS5Vc2VyT3JnYW5pemF0aW9uGo4BChBVc2VyT3JnYW5pemF0aW9uEhcKD29yZ2FuaXphdGlvbl9pZBgBIAEoCRIZChFvcmdhbml6YXRpb25fbmFtZRgCIAEoCRIWCg5yb290X2ZvbGRlcl9pZBgDIAEoCRIYChByb290X2ZvbGRlcl9uYW1lGAQgASgJEhQKDGRpc3BsYXlfbmFtZRgFIAEoCSLnAQoeR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESNQoEcm9sZRgCIAEoDjIbLnRhaWxvci52MS5Pcmdhbml6YXRpb25Sb2xlQgq6SAeCAQQQASAAEhsKB3RlYW1faWQYAyABKAlCCLpIBXIDsAEBSAASGAoFZW1haWwYBCABKAlCB7pIBHICYAFIABIjCg9tYWNoaW5lX3VzZXJfaWQYBSABKAlCCLpIBXIDsAEBSABCDwoGbWVtYmVyEgW6SAIIASIhCh9HcmFudE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIugBCh9VcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESNQoEcm9sZRgCIAEoDjIbLnRhaWxvci52MS5Pcmdhbml6YXRpb25Sb2xlQgq6SAeCAQQQASAAEhsKB3RlYW1faWQYAyABKAlCCLpIBXIDsAEBSAASGAoFZW1haWwYBCABKAlCB7pIBHICYAFIABIjCg9tYWNoaW5lX3VzZXJfaWQYBSABKAlCCLpIBXIDsAEBSABCDwoGbWVtYmVyEgW6SAIIASIiCiBVcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSKxAQofUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKB3RlYW1faWQYAiABKAlCCLpIBXIDsAEBSAASGAoFZW1haWwYAyABKAlCB7pIBHICYAFIABIjCg9tYWNoaW5lX3VzZXJfaWQYBCABKAlCCLpIBXIDsAEBSABCDwoGbWVtYmVyEgW6SAIIASIiCiBSZXZva2VPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSKdAQofTGlzdE9yZ2FuaXphdGlvbkFjY2Vzc2VzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEiEKD29yZ2FuaXphdGlvbl9pZBgEIAEoCUIIukgFcgOwAQEijgEKIExpc3RPcmdhbml6YXRpb25BY2Nlc3Nlc1Jlc3BvbnNlEjwKFW9yZ2FuaXphdGlvbl9hY2Nlc3NlcxgBIAMoCzIdLnRhaWxvci52MS5Pcmdhbml6YXRpb25BY2Nlc3MSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIq4BChxHZXRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGwoHdGVhbV9pZBgCIAEoCUIIukgFcgOwAQFIABIYCgVlbWFpbBgDIAEoCUIHukgEcgJgAUgAEiMKD21hY2hpbmVfdXNlcl9pZBgEIAEoCUIIukgFcgOwAQFIAEIPCgZtZW1iZXISBbpIAggBIlsKHUdldE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlEjoKE29yZ2FuaXphdGlvbl9hY2Nlc3MYASABKAsyHS50YWlsb3IudjEuT3JnYW5pemF0aW9uQWNjZXNzIokBCh9DcmVhdGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESJQoQcGFyZW50X2ZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESHAoLZm9sZGVyX25hbWUYAyABKAlCB7pIBHICEAEiRQogQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2USIQoGZm9sZGVyGAEgASgLMhEudGFpbG9yLnYxLkZvbGRlciKmAQofVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKCWZvbGRlcl9pZBgCIAEoCUIIukgFcgOwAQESJQoQcGFyZW50X2ZvbGRlcl9pZBgDIAEoCUILukgI2AEBcgOwAQESHAoLZm9sZGVyX25hbWUYBCABKAlCB7pIBHICEAEiRQogVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2USIQoGZm9sZGVyGAEgASgLMhEudGFpbG9yLnYxLkZvbGRlciJhCh9EZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGwoJZm9sZGVyX2lkGAIgASgJQgi6SAVyA7ABASIiCiBEZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZSJeChxHZXRPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGwoJZm9sZGVyX2lkGAIgASgJQgi6SAVyA7ABASJCCh1HZXRPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZRIhCgZmb2xkZXIYASABKAsyES50YWlsb3IudjEuRm9sZGVyIsMBCh5MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1JlcXVlc3QSEgoKcGFnZV90b2tlbhgBIAEoCRIRCglwYWdlX3NpemUYAiABKA0SMAoOcGFnZV9kaXJlY3Rpb24YAyABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbhIhCg9vcmdhbml6YXRpb25faWQYBCABKAlCCLpIBXIDsAEBEiUKEHBhcmVudF9mb2xkZXJfaWQYBSABKAlCC7pICNgBAXIDsAEBInMKH0xpc3RPcmdhbml6YXRpb25Gb2xkZXJzUmVzcG9uc2USFwoPbmV4dF9wYWdlX3Rva2VuGAEgASgJEhMKC3RvdGFsX2NvdW50GAIgASgDEiIKB2ZvbGRlcnMYAyADKAsyES50YWlsb3IudjEuRm9sZGVyIoQCCiRHcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIbCglmb2xkZXJfaWQYAiABKAlCCLpIBXIDsAEBEi8KBHJvbGUYAyABKA4yFS50YWlsb3IudjEuRm9sZGVyUm9sZUIKukgHggEEEAEgABIbCgd0ZWFtX2lkGAQgASgJQgi6SAVyA7ABAUgAEhgKBWVtYWlsGAUgASgJQge6SARyAmABSAASIwoPbWFjaGluZV91c2VyX2lkGAYgASgJQgi6SAVyA7ABAUgAQg8KBm1lbWJlchIFukgCCAEiJwolR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSKFAgolVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKCWZvbGRlcl9pZBgCIAEoCUIIukgFcgOwAQESLwoEcm9sZRgDIAEoDjIVLnRhaWxvci52MS5Gb2xkZXJSb2xlQgq6SAeCAQQQASAAEhsKB3RlYW1faWQYBCABKAlCCLpIBXIDsAEBSAASGAoFZW1haWwYBSABKAlCB7pIBHICYAFIABIjCg9tYWNoaW5lX3VzZXJfaWQYBiABKAlCCLpIBXIDsAEBSABCDwoGbWVtYmVyEgW6SAIIASIoCiZVcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSLUAQolUmV2b2tlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKCWZvbGRlcl9pZBgCIAEoCUIIukgFcgOwAQESGwoHdGVhbV9pZBgDIAEoCUIIukgFcgOwAQFIABIYCgVlbWFpbBgEIAEoCUIHukgEcgJgAUgAEiMKD21hY2hpbmVfdXNlcl9pZBgFIAEoCUIIukgFcgOwAQFIAEIPCgZtZW1iZXISBbpIAggBIigKJlJldm9rZU9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1Jlc3BvbnNlIsABCiVMaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXF1ZXN0EhIKCnBhZ2VfdG9rZW4YASABKAkSEQoJcGFnZV9zaXplGAIgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAMgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24SIQoPb3JnYW5pemF0aW9uX2lkGAQgASgJQgi6SAVyA7ABARIbCglmb2xkZXJfaWQYBSABKAlCCLpIBXIDsAEBIogBCiZMaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXNwb25zZRIwCg9mb2xkZXJfYWNjZXNzZXMYASADKAsyFy50YWlsb3IudjEuRm9sZGVyQWNjZXNzEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLRAQoiR2V0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKCWZvbGRlcl9pZBgCIAEoCUIIukgFcgOwAQESGwoHdGVhbV9pZBgDIAEoCUIIukgFcgOwAQFIABIYCgVlbWFpbBgEIAEoCUIHukgEcgJgAUgAEiMKD21hY2hpbmVfdXNlcl9pZBgFIAEoCUIIukgFcgOwAQFIAEIPCgZtZW1iZXISBbpIAggBIlUKI0dldE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1Jlc3BvbnNlEi4KDWZvbGRlcl9hY2Nlc3MYASABKAsyFy50YWlsb3IudjEuRm9sZGVyQWNjZXNzIl4KHUNyZWF0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGgoJdGVhbV9uYW1lGAIgASgJQge6SARyAhABIj8KHkNyZWF0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZRIdCgR0ZWFtGAEgASgLMg8udGFpbG9yLnYxLlRlYW0ieQodVXBkYXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIZCgd0ZWFtX2lkGAIgASgJQgi6SAVyA7ABARIaCgl0ZWFtX25hbWUYAyABKAlCB7pIBHICEAEiPwoeVXBkYXRlT3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlEh0KBHRlYW0YASABKAsyDy50YWlsb3IudjEuVGVhbSJdCh1EZWxldGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhkKB3RlYW1faWQYAiABKAlCCLpIBXIDsAEBIiAKHkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZSKaAQocTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEiEKD29yZ2FuaXphdGlvbl9pZBgEIAEoCUIIukgFcgOwAQEibQodTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVzcG9uc2USHgoFdGVhbXMYASADKAsyDy50YWlsb3IudjEuVGVhbRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMiWgoaR2V0T3JnYW5pemF0aW9uVGVhbVJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIZCgd0ZWFtX2lkGAIgASgJQgi6SAVyA7ABASI8ChtHZXRPcmdhbml6YXRpb25UZWFtUmVzcG9uc2USHQoEdGVhbRgBIAEoCzIPLnRhaWxvci52MS5UZWFtIqcBCiBBZGRPcmdhbml6YXRpb25UZWFtTWVtYmVyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhkKB3RlYW1faWQYAiABKAlCCLpIBXIDsAEBEhYKBWVtYWlsGAMgASgJQge6SARyAmABEi0KBHJvbGUYBCABKA4yEy50YWlsb3IudjEuVGVhbVJvbGVCCrpIB4IBBBABIAAiIwohQWRkT3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIqoBCiNVcGRhdGVPcmdhbml6YXRpb25UZWFtTWVtYmVyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhkKB3RlYW1faWQYAiABKAlCCLpIBXIDsAEBEhYKBWVtYWlsGAMgASgJQge6SARyAmABEi0KBHJvbGUYBCABKA4yEy50YWlsb3IudjEuVGVhbVJvbGVCCrpIB4IBBBABIAAiJgokVXBkYXRlT3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlInsKI1JlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGQoHdGVhbV9pZBgCIAEoCUIIukgFcgOwAQESFgoFZW1haWwYAyABKAlCB7pIBHICYAEiJgokUmVtb3ZlT3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIrsBCiJMaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnNSZXF1ZXN0EhIKCnBhZ2VfdG9rZW4YASABKAkSEQoJcGFnZV9zaXplGAIgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAMgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24SIQoPb3JnYW5pemF0aW9uX2lkGAQgASgJQgi6SAVyA7ABARIZCgd0ZWFtX2lkGAUgASgJQgi6SAVyA7ABASKAAQojTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVzcG9uc2USKwoMdGVhbV9tZW1iZXJzGAEgAygLMhUudGFpbG9yLnYxLlRlYW1NZW1iZXISFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIngKIEdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGQoHdGVhbV9pZBgCIAEoCUIIukgFcgOwAQESFgoFZW1haWwYAyABKAlCB7pIBHICYAEiTwohR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlEioKC3RlYW1fbWVtYmVyGAEgASgLMhUudGFpbG9yLnYxLlRlYW1NZW1iZXIiHwodR2V0UGxhdGZvcm1BY2NvdW50UGxhblJlcXVlc3QiVgoeR2V0UGxhdGZvcm1BY2NvdW50UGxhblJlc3BvbnNlEjQKDGN1cnJlbnRfcGxhbhgBIAEoCzIeLnRhaWxvci52MS5QbGF0Zm9ybUFjY291bnRQbGFuYgZwcm90bzM\", [file_buf_validate_validate, file_google_protobuf_field_mask, file_tailor_fieldmask_v1_option, file_tailor_v1_resource, file_tailor_v1_workspace_resource]);\n\n/**\n * Describes the message tailor.v1.ListAvailableWorkspaceRegionsRequest.\n * Use `create(ListAvailableWorkspaceRegionsRequestSchema)` to create a new message.\n */\nexport const ListAvailableWorkspaceRegionsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 0);\n\n/**\n * Describes the message tailor.v1.ListAvailableWorkspaceRegionsResponse.\n * Use `create(ListAvailableWorkspaceRegionsResponseSchema)` to create a new message.\n */\nexport const ListAvailableWorkspaceRegionsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 1);\n\n/**\n * Describes the message tailor.v1.CreateWorkspaceRequest.\n * Use `create(CreateWorkspaceRequestSchema)` to create a new message.\n */\nexport const CreateWorkspaceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 2);\n\n/**\n * Describes the message tailor.v1.CreateWorkspaceResponse.\n * Use `create(CreateWorkspaceResponseSchema)` to create a new message.\n */\nexport const CreateWorkspaceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 3);\n\n/**\n * Describes the message tailor.v1.UpdateWorkspaceRequest.\n * Use `create(UpdateWorkspaceRequestSchema)` to create a new message.\n */\nexport const UpdateWorkspaceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 4);\n\n/**\n * Describes the message tailor.v1.UpdateWorkspaceResponse.\n * Use `create(UpdateWorkspaceResponseSchema)` to create a new message.\n */\nexport const UpdateWorkspaceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 5);\n\n/**\n * Describes the message tailor.v1.DeleteWorkspaceRequest.\n * Use `create(DeleteWorkspaceRequestSchema)` to create a new message.\n */\nexport const DeleteWorkspaceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 6);\n\n/**\n * Describes the message tailor.v1.DeleteWorkspaceResponse.\n * Use `create(DeleteWorkspaceResponseSchema)` to create a new message.\n */\nexport const DeleteWorkspaceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 7);\n\n/**\n * Describes the message tailor.v1.ListWorkspacesRequest.\n * Use `create(ListWorkspacesRequestSchema)` to create a new message.\n */\nexport const ListWorkspacesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 8);\n\n/**\n * Describes the enum tailor.v1.ListWorkspacesRequest.View.\n */\nexport const ListWorkspacesRequest_ViewSchema = /*@__PURE__*/\n enumDesc(file_tailor_v1_workspace, 8, 0);\n\n/**\n * @generated from enum tailor.v1.ListWorkspacesRequest.View\n */\nexport const ListWorkspacesRequest_View = /*@__PURE__*/\n tsEnum(ListWorkspacesRequest_ViewSchema);\n\n/**\n * Describes the message tailor.v1.ListWorkspacesResponse.\n * Use `create(ListWorkspacesResponseSchema)` to create a new message.\n */\nexport const ListWorkspacesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 9);\n\n/**\n * Describes the message tailor.v1.ListOrganizationWorkspacesRequest.\n * Use `create(ListOrganizationWorkspacesRequestSchema)` to create a new message.\n */\nexport const ListOrganizationWorkspacesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 10);\n\n/**\n * Describes the message tailor.v1.ListOrganizationWorkspacesResponse.\n * Use `create(ListOrganizationWorkspacesResponseSchema)` to create a new message.\n */\nexport const ListOrganizationWorkspacesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 11);\n\n/**\n * Describes the message tailor.v1.RestoreWorkspaceRequest.\n * Use `create(RestoreWorkspaceRequestSchema)` to create a new message.\n */\nexport const RestoreWorkspaceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 12);\n\n/**\n * Describes the message tailor.v1.RestoreWorkspaceResponse.\n * Use `create(RestoreWorkspaceResponseSchema)` to create a new message.\n */\nexport const RestoreWorkspaceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 13);\n\n/**\n * Describes the message tailor.v1.GetWorkspaceRequest.\n * Use `create(GetWorkspaceRequestSchema)` to create a new message.\n */\nexport const GetWorkspaceRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 14);\n\n/**\n * Describes the message tailor.v1.GetWorkspaceResponse.\n * Use `create(GetWorkspaceResponseSchema)` to create a new message.\n */\nexport const GetWorkspaceResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 15);\n\n/**\n * Describes the message tailor.v1.ListWorkspacePlatformUsersRequest.\n * Use `create(ListWorkspacePlatformUsersRequestSchema)` to create a new message.\n */\nexport const ListWorkspacePlatformUsersRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 16);\n\n/**\n * Describes the message tailor.v1.ListWorkspacePlatformUsersResponse.\n * Use `create(ListWorkspacePlatformUsersResponseSchema)` to create a new message.\n */\nexport const ListWorkspacePlatformUsersResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 17);\n\n/**\n * Describes the message tailor.v1.ListAvailableWorkspacePlatformUserRolesRequest.\n * Use `create(ListAvailableWorkspacePlatformUserRolesRequestSchema)` to create a new message.\n */\nexport const ListAvailableWorkspacePlatformUserRolesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 18);\n\n/**\n * Describes the message tailor.v1.ListAvailableWorkspacePlatformUserRolesResponse.\n * Use `create(ListAvailableWorkspacePlatformUserRolesResponseSchema)` to create a new message.\n */\nexport const ListAvailableWorkspacePlatformUserRolesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 19);\n\n/**\n * Describes the message tailor.v1.InviteWorkspacePlatformUserRequest.\n * Use `create(InviteWorkspacePlatformUserRequestSchema)` to create a new message.\n */\nexport const InviteWorkspacePlatformUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 20);\n\n/**\n * Describes the message tailor.v1.InviteWorkspacePlatformUserResponse.\n * Use `create(InviteWorkspacePlatformUserResponseSchema)` to create a new message.\n */\nexport const InviteWorkspacePlatformUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 21);\n\n/**\n * Describes the message tailor.v1.RemoveWorkspacePlatformUserRequest.\n * Use `create(RemoveWorkspacePlatformUserRequestSchema)` to create a new message.\n */\nexport const RemoveWorkspacePlatformUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 22);\n\n/**\n * Describes the message tailor.v1.RemoveWorkspacePlatformUserResponse.\n * Use `create(RemoveWorkspacePlatformUserResponseSchema)` to create a new message.\n */\nexport const RemoveWorkspacePlatformUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 23);\n\n/**\n * Describes the message tailor.v1.UpdateWorkspacePlatformUserRequest.\n * Use `create(UpdateWorkspacePlatformUserRequestSchema)` to create a new message.\n */\nexport const UpdateWorkspacePlatformUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 24);\n\n/**\n * Describes the message tailor.v1.UpdateWorkspacePlatformUserResponse.\n * Use `create(UpdateWorkspacePlatformUserResponseSchema)` to create a new message.\n */\nexport const UpdateWorkspacePlatformUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 25);\n\n/**\n * Describes the message tailor.v1.GetWorkspacePlatformUserRequest.\n * Use `create(GetWorkspacePlatformUserRequestSchema)` to create a new message.\n */\nexport const GetWorkspacePlatformUserRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 26);\n\n/**\n * Describes the message tailor.v1.GetWorkspacePlatformUserResponse.\n * Use `create(GetWorkspacePlatformUserResponseSchema)` to create a new message.\n */\nexport const GetWorkspacePlatformUserResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 27);\n\n/**\n * Describes the message tailor.v1.GetWorkspaceRoleRequest.\n * Use `create(GetWorkspaceRoleRequestSchema)` to create a new message.\n */\nexport const GetWorkspaceRoleRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 28);\n\n/**\n * Describes the message tailor.v1.GetWorkspaceRoleResponse.\n * Use `create(GetWorkspaceRoleResponseSchema)` to create a new message.\n */\nexport const GetWorkspaceRoleResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 29);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationRequest.\n * Use `create(UpdateOrganizationRequestSchema)` to create a new message.\n */\nexport const UpdateOrganizationRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 30);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationResponse.\n * Use `create(UpdateOrganizationResponseSchema)` to create a new message.\n */\nexport const UpdateOrganizationResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 31);\n\n/**\n * Describes the message tailor.v1.GetOrganizationRequest.\n * Use `create(GetOrganizationRequestSchema)` to create a new message.\n */\nexport const GetOrganizationRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 32);\n\n/**\n * Describes the message tailor.v1.GetOrganizationResponse.\n * Use `create(GetOrganizationResponseSchema)` to create a new message.\n */\nexport const GetOrganizationResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 33);\n\n/**\n * Describes the message tailor.v1.ListOrganizationsRequest.\n * Use `create(ListOrganizationsRequestSchema)` to create a new message.\n */\nexport const ListOrganizationsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 34);\n\n/**\n * Describes the message tailor.v1.ListOrganizationsResponse.\n * Use `create(ListOrganizationsResponseSchema)` to create a new message.\n */\nexport const ListOrganizationsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 35);\n\n/**\n * Describes the message tailor.v1.ListUserOrganizationsRequest.\n * Use `create(ListUserOrganizationsRequestSchema)` to create a new message.\n */\nexport const ListUserOrganizationsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 36);\n\n/**\n * Describes the message tailor.v1.ListUserOrganizationsResponse.\n * Use `create(ListUserOrganizationsResponseSchema)` to create a new message.\n */\nexport const ListUserOrganizationsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 37);\n\n/**\n * Describes the message tailor.v1.ListUserOrganizationsResponse.UserOrganization.\n * Use `create(ListUserOrganizationsResponse_UserOrganizationSchema)` to create a new message.\n */\nexport const ListUserOrganizationsResponse_UserOrganizationSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 37, 0);\n\n/**\n * Describes the message tailor.v1.GrantOrganizationAccessRequest.\n * Use `create(GrantOrganizationAccessRequestSchema)` to create a new message.\n */\nexport const GrantOrganizationAccessRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 38);\n\n/**\n * Describes the message tailor.v1.GrantOrganizationAccessResponse.\n * Use `create(GrantOrganizationAccessResponseSchema)` to create a new message.\n */\nexport const GrantOrganizationAccessResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 39);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationAccessRequest.\n * Use `create(UpdateOrganizationAccessRequestSchema)` to create a new message.\n */\nexport const UpdateOrganizationAccessRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 40);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationAccessResponse.\n * Use `create(UpdateOrganizationAccessResponseSchema)` to create a new message.\n */\nexport const UpdateOrganizationAccessResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 41);\n\n/**\n * Describes the message tailor.v1.RevokeOrganizationAccessRequest.\n * Use `create(RevokeOrganizationAccessRequestSchema)` to create a new message.\n */\nexport const RevokeOrganizationAccessRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 42);\n\n/**\n * Describes the message tailor.v1.RevokeOrganizationAccessResponse.\n * Use `create(RevokeOrganizationAccessResponseSchema)` to create a new message.\n */\nexport const RevokeOrganizationAccessResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 43);\n\n/**\n * Describes the message tailor.v1.ListOrganizationAccessesRequest.\n * Use `create(ListOrganizationAccessesRequestSchema)` to create a new message.\n */\nexport const ListOrganizationAccessesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 44);\n\n/**\n * Describes the message tailor.v1.ListOrganizationAccessesResponse.\n * Use `create(ListOrganizationAccessesResponseSchema)` to create a new message.\n */\nexport const ListOrganizationAccessesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 45);\n\n/**\n * Describes the message tailor.v1.GetOrganizationAccessRequest.\n * Use `create(GetOrganizationAccessRequestSchema)` to create a new message.\n */\nexport const GetOrganizationAccessRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 46);\n\n/**\n * Describes the message tailor.v1.GetOrganizationAccessResponse.\n * Use `create(GetOrganizationAccessResponseSchema)` to create a new message.\n */\nexport const GetOrganizationAccessResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 47);\n\n/**\n * Describes the message tailor.v1.CreateOrganizationFolderRequest.\n * Use `create(CreateOrganizationFolderRequestSchema)` to create a new message.\n */\nexport const CreateOrganizationFolderRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 48);\n\n/**\n * Describes the message tailor.v1.CreateOrganizationFolderResponse.\n * Use `create(CreateOrganizationFolderResponseSchema)` to create a new message.\n */\nexport const CreateOrganizationFolderResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 49);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationFolderRequest.\n * Use `create(UpdateOrganizationFolderRequestSchema)` to create a new message.\n */\nexport const UpdateOrganizationFolderRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 50);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationFolderResponse.\n * Use `create(UpdateOrganizationFolderResponseSchema)` to create a new message.\n */\nexport const UpdateOrganizationFolderResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 51);\n\n/**\n * Describes the message tailor.v1.DeleteOrganizationFolderRequest.\n * Use `create(DeleteOrganizationFolderRequestSchema)` to create a new message.\n */\nexport const DeleteOrganizationFolderRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 52);\n\n/**\n * Describes the message tailor.v1.DeleteOrganizationFolderResponse.\n * Use `create(DeleteOrganizationFolderResponseSchema)` to create a new message.\n */\nexport const DeleteOrganizationFolderResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 53);\n\n/**\n * Describes the message tailor.v1.GetOrganizationFolderRequest.\n * Use `create(GetOrganizationFolderRequestSchema)` to create a new message.\n */\nexport const GetOrganizationFolderRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 54);\n\n/**\n * Describes the message tailor.v1.GetOrganizationFolderResponse.\n * Use `create(GetOrganizationFolderResponseSchema)` to create a new message.\n */\nexport const GetOrganizationFolderResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 55);\n\n/**\n * Describes the message tailor.v1.ListOrganizationFoldersRequest.\n * Use `create(ListOrganizationFoldersRequestSchema)` to create a new message.\n */\nexport const ListOrganizationFoldersRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 56);\n\n/**\n * Describes the message tailor.v1.ListOrganizationFoldersResponse.\n * Use `create(ListOrganizationFoldersResponseSchema)` to create a new message.\n */\nexport const ListOrganizationFoldersResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 57);\n\n/**\n * Describes the message tailor.v1.GrantOrganizationFolderAccessRequest.\n * Use `create(GrantOrganizationFolderAccessRequestSchema)` to create a new message.\n */\nexport const GrantOrganizationFolderAccessRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 58);\n\n/**\n * Describes the message tailor.v1.GrantOrganizationFolderAccessResponse.\n * Use `create(GrantOrganizationFolderAccessResponseSchema)` to create a new message.\n */\nexport const GrantOrganizationFolderAccessResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 59);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationFolderAccessRequest.\n * Use `create(UpdateOrganizationFolderAccessRequestSchema)` to create a new message.\n */\nexport const UpdateOrganizationFolderAccessRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 60);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationFolderAccessResponse.\n * Use `create(UpdateOrganizationFolderAccessResponseSchema)` to create a new message.\n */\nexport const UpdateOrganizationFolderAccessResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 61);\n\n/**\n * Describes the message tailor.v1.RevokeOrganizationFolderAccessRequest.\n * Use `create(RevokeOrganizationFolderAccessRequestSchema)` to create a new message.\n */\nexport const RevokeOrganizationFolderAccessRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 62);\n\n/**\n * Describes the message tailor.v1.RevokeOrganizationFolderAccessResponse.\n * Use `create(RevokeOrganizationFolderAccessResponseSchema)` to create a new message.\n */\nexport const RevokeOrganizationFolderAccessResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 63);\n\n/**\n * Describes the message tailor.v1.ListOrganizationFolderAccessesRequest.\n * Use `create(ListOrganizationFolderAccessesRequestSchema)` to create a new message.\n */\nexport const ListOrganizationFolderAccessesRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 64);\n\n/**\n * Describes the message tailor.v1.ListOrganizationFolderAccessesResponse.\n * Use `create(ListOrganizationFolderAccessesResponseSchema)` to create a new message.\n */\nexport const ListOrganizationFolderAccessesResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 65);\n\n/**\n * Describes the message tailor.v1.GetOrganizationFolderAccessRequest.\n * Use `create(GetOrganizationFolderAccessRequestSchema)` to create a new message.\n */\nexport const GetOrganizationFolderAccessRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 66);\n\n/**\n * Describes the message tailor.v1.GetOrganizationFolderAccessResponse.\n * Use `create(GetOrganizationFolderAccessResponseSchema)` to create a new message.\n */\nexport const GetOrganizationFolderAccessResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 67);\n\n/**\n * Describes the message tailor.v1.CreateOrganizationTeamRequest.\n * Use `create(CreateOrganizationTeamRequestSchema)` to create a new message.\n */\nexport const CreateOrganizationTeamRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 68);\n\n/**\n * Describes the message tailor.v1.CreateOrganizationTeamResponse.\n * Use `create(CreateOrganizationTeamResponseSchema)` to create a new message.\n */\nexport const CreateOrganizationTeamResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 69);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationTeamRequest.\n * Use `create(UpdateOrganizationTeamRequestSchema)` to create a new message.\n */\nexport const UpdateOrganizationTeamRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 70);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationTeamResponse.\n * Use `create(UpdateOrganizationTeamResponseSchema)` to create a new message.\n */\nexport const UpdateOrganizationTeamResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 71);\n\n/**\n * Describes the message tailor.v1.DeleteOrganizationTeamRequest.\n * Use `create(DeleteOrganizationTeamRequestSchema)` to create a new message.\n */\nexport const DeleteOrganizationTeamRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 72);\n\n/**\n * Describes the message tailor.v1.DeleteOrganizationTeamResponse.\n * Use `create(DeleteOrganizationTeamResponseSchema)` to create a new message.\n */\nexport const DeleteOrganizationTeamResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 73);\n\n/**\n * Describes the message tailor.v1.ListOrganizationTeamsRequest.\n * Use `create(ListOrganizationTeamsRequestSchema)` to create a new message.\n */\nexport const ListOrganizationTeamsRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 74);\n\n/**\n * Describes the message tailor.v1.ListOrganizationTeamsResponse.\n * Use `create(ListOrganizationTeamsResponseSchema)` to create a new message.\n */\nexport const ListOrganizationTeamsResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 75);\n\n/**\n * Describes the message tailor.v1.GetOrganizationTeamRequest.\n * Use `create(GetOrganizationTeamRequestSchema)` to create a new message.\n */\nexport const GetOrganizationTeamRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 76);\n\n/**\n * Describes the message tailor.v1.GetOrganizationTeamResponse.\n * Use `create(GetOrganizationTeamResponseSchema)` to create a new message.\n */\nexport const GetOrganizationTeamResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 77);\n\n/**\n * Describes the message tailor.v1.AddOrganizationTeamMemberRequest.\n * Use `create(AddOrganizationTeamMemberRequestSchema)` to create a new message.\n */\nexport const AddOrganizationTeamMemberRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 78);\n\n/**\n * Describes the message tailor.v1.AddOrganizationTeamMemberResponse.\n * Use `create(AddOrganizationTeamMemberResponseSchema)` to create a new message.\n */\nexport const AddOrganizationTeamMemberResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 79);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationTeamMemberRequest.\n * Use `create(UpdateOrganizationTeamMemberRequestSchema)` to create a new message.\n */\nexport const UpdateOrganizationTeamMemberRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 80);\n\n/**\n * Describes the message tailor.v1.UpdateOrganizationTeamMemberResponse.\n * Use `create(UpdateOrganizationTeamMemberResponseSchema)` to create a new message.\n */\nexport const UpdateOrganizationTeamMemberResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 81);\n\n/**\n * Describes the message tailor.v1.RemoveOrganizationTeamMemberRequest.\n * Use `create(RemoveOrganizationTeamMemberRequestSchema)` to create a new message.\n */\nexport const RemoveOrganizationTeamMemberRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 82);\n\n/**\n * Describes the message tailor.v1.RemoveOrganizationTeamMemberResponse.\n * Use `create(RemoveOrganizationTeamMemberResponseSchema)` to create a new message.\n */\nexport const RemoveOrganizationTeamMemberResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 83);\n\n/**\n * Describes the message tailor.v1.ListOrganizationTeamMembersRequest.\n * Use `create(ListOrganizationTeamMembersRequestSchema)` to create a new message.\n */\nexport const ListOrganizationTeamMembersRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 84);\n\n/**\n * Describes the message tailor.v1.ListOrganizationTeamMembersResponse.\n * Use `create(ListOrganizationTeamMembersResponseSchema)` to create a new message.\n */\nexport const ListOrganizationTeamMembersResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 85);\n\n/**\n * Describes the message tailor.v1.GetOrganizationTeamMemberRequest.\n * Use `create(GetOrganizationTeamMemberRequestSchema)` to create a new message.\n */\nexport const GetOrganizationTeamMemberRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 86);\n\n/**\n * Describes the message tailor.v1.GetOrganizationTeamMemberResponse.\n * Use `create(GetOrganizationTeamMemberResponseSchema)` to create a new message.\n */\nexport const GetOrganizationTeamMemberResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 87);\n\n/**\n * Describes the message tailor.v1.GetPlatformAccountPlanRequest.\n * Use `create(GetPlatformAccountPlanRequestSchema)` to create a new message.\n */\nexport const GetPlatformAccountPlanRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 88);\n\n/**\n * Describes the message tailor.v1.GetPlatformAccountPlanResponse.\n * Use `create(GetPlatformAccountPlanResponseSchema)` to create a new message.\n */\nexport const GetPlatformAccountPlanResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_workspace, 89);\n\n","// @generated by protoc-gen-es v2.6.3\n// @generated from file tailor/v1/service.proto (package tailor.v1, syntax proto3)\n/* eslint-disable */\n\nimport { fileDesc, messageDesc, serviceDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_tailor_v1_application } from \"./application_pb\";\nimport { file_tailor_v1_auth } from \"./auth_pb\";\nimport { file_tailor_v1_events } from \"./events_pb\";\nimport { file_tailor_v1_executor } from \"./executor_pb\";\nimport { file_tailor_v1_function } from \"./function_pb\";\nimport { file_tailor_v1_function_registry } from \"./function_registry_pb\";\nimport { file_tailor_v1_idp } from \"./idp_pb\";\nimport { file_tailor_v1_metadata } from \"./metadata_pb\";\nimport { file_tailor_v1_meter } from \"./meter_pb\";\nimport { file_tailor_v1_pipeline } from \"./pipeline_pb\";\nimport { file_tailor_v1_secret_manager } from \"./secret_manager_pb\";\nimport { file_tailor_v1_stateflow } from \"./stateflow_pb\";\nimport { file_tailor_v1_staticwebsite } from \"./staticwebsite_pb\";\nimport { file_tailor_v1_tailordb } from \"./tailordb_pb\";\nimport { file_tailor_v1_workflow } from \"./workflow_pb\";\nimport { file_tailor_v1_workspace } from \"./workspace_pb\";\n\n/**\n * Describes the file tailor/v1/service.proto.\n */\nexport const file_tailor_v1_service = /*@__PURE__*/\n fileDesc(\"Chd0YWlsb3IvdjEvc2VydmljZS5wcm90bxIJdGFpbG9yLnYxIg0KC1BpbmdSZXF1ZXN0Ig4KDFBpbmdSZXNwb25zZTKVtQEKD09wZXJhdG9yU2VydmljZRI5CgRQaW5nEhYudGFpbG9yLnYxLlBpbmdSZXF1ZXN0GhcudGFpbG9yLnYxLlBpbmdSZXNwb25zZSIAEocBCh1MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9ucxIvLnRhaWxvci52MS5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9uc1JlcXVlc3QaMC50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZVdvcmtzcGFjZRIhLnRhaWxvci52MS5DcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZVdvcmtzcGFjZVJlc3BvbnNlIgASWgoPVXBkYXRlV29ya3NwYWNlEiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVJlcXVlc3QaIi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUmVzcG9uc2UiABJaCg9EZWxldGVXb3Jrc3BhY2USIS50YWlsb3IudjEuRGVsZXRlV29ya3NwYWNlUmVxdWVzdBoiLnRhaWxvci52MS5EZWxldGVXb3Jrc3BhY2VSZXNwb25zZSIAEloKDkxpc3RXb3Jrc3BhY2VzEiAudGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdBohLnRhaWxvci52MS5MaXN0V29ya3NwYWNlc1Jlc3BvbnNlIgOQAgESfgoaTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXMSLC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVzcG9uc2UiA5ACARJdChBSZXN0b3JlV29ya3NwYWNlEiIudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSIAElQKDEdldFdvcmtzcGFjZRIeLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gh8udGFpbG9yLnYxLkdldFdvcmtzcGFjZVJlc3BvbnNlIgOQAgESfgoaTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnMSLC50YWlsb3IudjEuTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJzUmVzcG9uc2UiA5ACARKlAQonTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzEjkudGFpbG9yLnYxLkxpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1JlcXVlc3QaOi50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzUmVzcG9uc2UiA5ACARJ+ChtJbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISLS50YWlsb3IudjEuSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBouLnRhaWxvci52MS5JbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIAEn4KG1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlchItLnRhaWxvci52MS5SZW1vdmVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Gi4udGFpbG9yLnYxLlJlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIgASfgobVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyEi0udGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QaLi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiABJ4ChhHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISKi50YWlsb3IudjEuR2V0V29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBorLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIDkAIBEmAKEEdldFdvcmtzcGFjZVJvbGUSIi50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlc3BvbnNlIgOQAgESYwoSVXBkYXRlT3JnYW5pemF0aW9uEiQudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblJlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiABJdCg9HZXRPcmdhbml6YXRpb24SIS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdBoiLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25SZXNwb25zZSIDkAIBEmMKEUxpc3RPcmdhbml6YXRpb25zEiMudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdBokLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlIgOQAgESbwoVTGlzdFVzZXJPcmdhbml6YXRpb25zEicudGFpbG9yLnYxLkxpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdFVzZXJPcmdhbml6YXRpb25zUmVzcG9uc2UiA5ACARJyChdHcmFudE9yZ2FuaXphdGlvbkFjY2VzcxIpLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKi50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSIAEnUKGFVwZGF0ZU9yZ2FuaXphdGlvbkFjY2VzcxIqLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GisudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgASdQoYUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzEioudGFpbG9yLnYxLlJldm9rZU9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKy50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVzcG9uc2UiABJ4ChhMaXN0T3JnYW5pemF0aW9uQWNjZXNzZXMSKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkFjY2Vzc2VzUmVxdWVzdBorLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uQWNjZXNzZXNSZXNwb25zZSIDkAIBEm8KFUdldE9yZ2FuaXphdGlvbkFjY2VzcxInLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GigudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgOQAgESdQoYQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyEioudGFpbG9yLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKy50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiABJ1ChhVcGRhdGVPcmdhbml6YXRpb25Gb2xkZXISKi50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBorLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZSIAEnUKGERlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlchIqLnRhaWxvci52MS5EZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0GisudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlclJlc3BvbnNlIgASbwoVR2V0T3JnYW5pemF0aW9uRm9sZGVyEicudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiA5ACARJ1ChdMaXN0T3JnYW5pemF0aW9uRm9sZGVycxIpLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlcnNSZXNwb25zZSIDkAIBEoQBCh1HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2VzcxIvLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QaMC50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEooBCh5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXMSMC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc2VzUmVxdWVzdBoxLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXNwb25zZSIDkAIBEoEBChtHZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSLS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBouLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZU9yZ2FuaXphdGlvblRlYW0SKC50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgASbwoWVXBkYXRlT3JnYW5pemF0aW9uVGVhbRIoLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVzcG9uc2UiABJvChZEZWxldGVPcmdhbml6YXRpb25UZWFtEigudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZSIAEmkKE0dldE9yZ2FuaXphdGlvblRlYW0SJS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaJi50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgOQAgESbwoVTGlzdE9yZ2FuaXphdGlvblRlYW1zEicudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25UZWFtc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVzcG9uc2UiA5ACARJ4ChlBZGRPcmdhbml6YXRpb25UZWFtTWVtYmVyEisudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0GiwudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxVcGRhdGVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxSZW1vdmVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChtMaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnMSLS50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVxdWVzdBouLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnNSZXNwb25zZSIDkAIBEnsKGUdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXISKy50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlcXVlc3QaLC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIgOQAgEScgoWR2V0UGxhdGZvcm1BY2NvdW50UGxhbhIoLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVxdWVzdBopLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBcHBsaWNhdGlvbhIjLnRhaWxvci52MS5DcmVhdGVBcHBsaWNhdGlvblJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXBwbGljYXRpb25SZXNwb25zZSIAEmAKEVVwZGF0ZUFwcGxpY2F0aW9uEiMudGFpbG9yLnYxLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBcHBsaWNhdGlvblJlc3BvbnNlIgASYAoRRGVsZXRlQXBwbGljYXRpb24SIy50YWlsb3IudjEuRGVsZXRlQXBwbGljYXRpb25SZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUFwcGxpY2F0aW9uUmVzcG9uc2UiABJgChBMaXN0QXBwbGljYXRpb25zEiIudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25zZSIDkAIBEloKDkdldEFwcGxpY2F0aW9uEiAudGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uUmVxdWVzdBohLnRhaWxvci52MS5HZXRBcHBsaWNhdGlvblJlc3BvbnNlIgOQAgESfgoaR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGgSLC50YWlsb3IudjEuR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uU2NoZW1hSGVhbHRoUmVzcG9uc2UiA5ACARJjChJDb21wb3NlVGFpbG9yREJTREwSJC50YWlsb3IudjEuQ29tcG9zZVRhaWxvckRCU0RMUmVxdWVzdBolLnRhaWxvci52MS5Db21wb3NlVGFpbG9yREJTRExSZXNwb25zZSIAEmwKFUNyZWF0ZVRhaWxvckRCU2VydmljZRInLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIgASbAoVVXBkYXRlVGFpbG9yREJTZXJ2aWNlEicudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuVXBkYXRlVGFpbG9yREJTZXJ2aWNlUmVzcG9uc2UiABJsChVEZWxldGVUYWlsb3JEQlNlcnZpY2USJy50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5EZWxldGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZSIAEmYKEkdldFRhaWxvckRCU2VydmljZRIkLnRhaWxvci52MS5HZXRUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GiUudGFpbG9yLnYxLkdldFRhaWxvckRCU2VydmljZVJlc3BvbnNlIgOQAgESbAoUTGlzdFRhaWxvckRCU2VydmljZXMSJi50YWlsb3IudjEuTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlNlcnZpY2VzUmVzcG9uc2UiA5ACARJjChJDcmVhdGVUYWlsb3JEQlR5cGUSJC50YWlsb3IudjEuQ3JlYXRlVGFpbG9yREJUeXBlUmVxdWVzdBolLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlR5cGVSZXNwb25zZSIAEmMKElVwZGF0ZVRhaWxvckRCVHlwZRIkLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0GiUudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoSRGVsZXRlVGFpbG9yREJUeXBlEiQudGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QaJS50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UiABJsChVUcnVuY2F0ZVRhaWxvckRCVHlwZXMSJy50YWlsb3IudjEuVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVxdWVzdBooLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXNwb25zZSIAEmkKFFRydW5jYXRlVGFpbG9yREJUeXBlEiYudGFpbG9yLnYxLlRydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBonLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoRTGlzdFRhaWxvckRCVHlwZXMSIy50YWlsb3IudjEuTGlzdFRhaWxvckRCVHlwZXNSZXF1ZXN0GiQudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlR5cGVzUmVzcG9uc2UiA5ACARJdCg9HZXRUYWlsb3JEQlR5cGUSIS50YWlsb3IudjEuR2V0VGFpbG9yREJUeXBlUmVxdWVzdBoiLnRhaWxvci52MS5HZXRUYWlsb3JEQlR5cGVSZXNwb25zZSIDkAIBEn4KG0NyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASeAoYR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uEioudGFpbG9yLnYxLkdldFRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaKy50YWlsb3IudjEuR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiA5ACARJ+ChpMaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9ucxIsLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1JlcXVlc3QaLS50YWlsb3IudjEuTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZSIDkAIBEn4KG1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASfgobRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uEi0udGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaLi50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiABJsChVDcmVhdGVQaXBlbGluZVNlcnZpY2USJy50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIAEmwKFVVwZGF0ZVBpcGVsaW5lU2VydmljZRInLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZVBpcGVsaW5lU2VydmljZVJlc3BvbnNlIgASbAoVRGVsZXRlUGlwZWxpbmVTZXJ2aWNlEicudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlUGlwZWxpbmVTZXJ2aWNlUmVzcG9uc2UiABJmChJHZXRQaXBlbGluZVNlcnZpY2USJC50YWlsb3IudjEuR2V0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBolLnRhaWxvci52MS5HZXRQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIDkAIBEmwKFExpc3RQaXBlbGluZVNlcnZpY2VzEiYudGFpbG9yLnYxLkxpc3RQaXBlbGluZVNlcnZpY2VzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0UGlwZWxpbmVTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESaQoTR2V0UGlwZWxpbmVSZXNvbHZlchIlLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVxdWVzdBomLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiA5ACARJvChVMaXN0UGlwZWxpbmVSZXNvbHZlcnMSJy50YWlsb3IudjEuTGlzdFBpcGVsaW5lUmVzb2x2ZXJzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlcnNSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZVBpcGVsaW5lUmVzb2x2ZXISKC50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlc3BvbnNlIgASbwoWVXBkYXRlUGlwZWxpbmVSZXNvbHZlchIoLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZEZWxldGVQaXBlbGluZVJlc29sdmVyEigudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXNwb25zZSIAEmMKEkNvbXBvc2VQaXBlbGluZVNETBIkLnRhaWxvci52MS5Db21wb3NlUGlwZWxpbmVTRExSZXF1ZXN0GiUudGFpbG9yLnYxLkNvbXBvc2VQaXBlbGluZVNETFJlc3BvbnNlIgASnAEKJExpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0cxI2LnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdHNSZXF1ZXN0GjcudGFpbG9yLnYxLkxpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0c1Jlc3BvbnNlIgOQAgESlgEKIkdldFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHQSNC50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlcXVlc3QaNS50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlc3BvbnNlIgOQAgEScgoXUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXISKS50YWlsb3IudjEuUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GioudGFpbG9yLnYxLlJlc3RhcnRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZDcmVhdGVTdGF0ZWZsb3dTZXJ2aWNlEigudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIAEm8KFlVwZGF0ZVN0YXRlZmxvd1NlcnZpY2USKC50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlIgASbwoWRGVsZXRlU3RhdGVmbG93U2VydmljZRIoLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVzcG9uc2UiABJpChNHZXRTdGF0ZWZsb3dTZXJ2aWNlEiUudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIDkAIBEm8KFUxpc3RTdGF0ZWZsb3dTZXJ2aWNlcxInLnRhaWxvci52MS5MaXN0U3RhdGVmbG93U2VydmljZXNSZXF1ZXN0GigudGFpbG9yLnYxLkxpc3RTdGF0ZWZsb3dTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChZVcGRhdGVFeGVjdXRvckV4ZWN1dG9yEigudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXNwb25zZSIAEmkKE0dldEV4ZWN1dG9yRXhlY3V0b3ISJS50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlcXVlc3QaJi50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlc3BvbnNlIgOQAgESbwoWRGVsZXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChVMaXN0RXhlY3V0b3JFeGVjdXRvcnMSJy50YWlsb3IudjEuTGlzdEV4ZWN1dG9yRXhlY3V0b3JzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0RXhlY3V0b3JFeGVjdXRvcnNSZXNwb25zZSIDkAIBEloKDkdldEV4ZWN1dG9ySm9iEiAudGFpbG9yLnYxLkdldEV4ZWN1dG9ySm9iUmVxdWVzdBohLnRhaWxvci52MS5HZXRFeGVjdXRvckpvYlJlc3BvbnNlIgOQAgESYAoQTGlzdEV4ZWN1dG9ySm9icxIiLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVxdWVzdBojLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVzcG9uc2UiA5ACARJ1ChdMaXN0RXhlY3V0b3JKb2JBdHRlbXB0cxIpLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JBdHRlbXB0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdEV4ZWN1dG9ySm9iQXR0ZW1wdHNSZXNwb25zZSIDkAIBEoQBChxMaXN0RXhlY3V0b3JJbmNvbWluZ1dlYmhvb2tzEi4udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXNwb25zZSIDkAIBEn4KGkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rEiwudGFpbG9yLnYxLkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rUmVxdWVzdBotLnRhaWxvci52MS5HZXRFeGVjdXRvckluY29taW5nV2ViaG9va1Jlc3BvbnNlIgOQAgESWgoPVHJpZ2dlckV4ZWN1dG9yEiEudGFpbG9yLnYxLlRyaWdnZXJFeGVjdXRvclJlcXVlc3QaIi50YWlsb3IudjEuVHJpZ2dlckV4ZWN1dG9yUmVzcG9uc2UiABJ1ChhDcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHQSKi50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclZhdWx0UmVxdWVzdBorLnRhaWxvci52MS5DcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHRSZXNwb25zZSIAEm8KFUdldFNlY3JldE1hbmFnZXJWYXVsdBInLnRhaWxvci52MS5HZXRTZWNyZXRNYW5hZ2VyVmF1bHRSZXF1ZXN0GigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJWYXVsdFJlc3BvbnNlIgOQAgESdQoYRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0EioudGFpbG9yLnYxLkRlbGV0ZVNlY3JldE1hbmFnZXJWYXVsdFJlcXVlc3QaKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0UmVzcG9uc2UiABJ1ChdMaXN0U2VjcmV0TWFuYWdlclZhdWx0cxIpLnRhaWxvci52MS5MaXN0U2VjcmV0TWFuYWdlclZhdWx0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJWYXVsdHNSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoZVXBkYXRlU2VjcmV0TWFuYWdlclNlY3JldBIrLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVzcG9uc2UiABJyChZHZXRTZWNyZXRNYW5hZ2VyU2VjcmV0EigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXF1ZXN0GikudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXNwb25zZSIDkAIBEngKGURlbGV0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoYTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzEioudGFpbG9yLnYxLkxpc3RTZWNyZXRNYW5hZ2VyU2VjcmV0c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBdXRoU2VydmljZRIjLnRhaWxvci52MS5DcmVhdGVBdXRoU2VydmljZVJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXV0aFNlcnZpY2VSZXNwb25zZSIAEmAKEVVwZGF0ZUF1dGhTZXJ2aWNlEiMudGFpbG9yLnYxLlVwZGF0ZUF1dGhTZXJ2aWNlUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBdXRoU2VydmljZVJlc3BvbnNlIgASYAoRRGVsZXRlQXV0aFNlcnZpY2USIy50YWlsb3IudjEuRGVsZXRlQXV0aFNlcnZpY2VSZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UiABJaCg5HZXRBdXRoU2VydmljZRIgLnRhaWxvci52MS5HZXRBdXRoU2VydmljZVJlcXVlc3QaIS50YWlsb3IudjEuR2V0QXV0aFNlcnZpY2VSZXNwb25zZSIDkAIBEmAKEExpc3RBdXRoU2VydmljZXMSIi50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1JlcXVlc3QaIy50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESZgoTQ3JlYXRlQXV0aElEUENvbmZpZxIlLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVxdWVzdBomLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiABJmChNVcGRhdGVBdXRoSURQQ29uZmlnEiUudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0GiYudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZSIAEmYKE0RlbGV0ZUF1dGhJRFBDb25maWcSJS50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1JlcXVlc3QaJi50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1Jlc3BvbnNlIgASYAoQR2V0QXV0aElEUENvbmZpZxIiLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVxdWVzdBojLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVzcG9uc2UiA5ACARJmChJMaXN0QXV0aElEUENvbmZpZ3MSJC50YWlsb3IudjEuTGlzdEF1dGhJRFBDb25maWdzUmVxdWVzdBolLnRhaWxvci52MS5MaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZSIDkAIBEnIKF0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnEikudGFpbG9yLnYxLkNyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBoqLnRhaWxvci52MS5DcmVhdGVVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgAScgoXVXBkYXRlVXNlclByb2ZpbGVDb25maWcSKS50YWlsb3IudjEuVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0GioudGFpbG9yLnYxLlVwZGF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UiABJyChdEZWxldGVVc2VyUHJvZmlsZUNvbmZpZxIpLnRhaWxvci52MS5EZWxldGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaKi50YWlsb3IudjEuRGVsZXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIAEmwKFEdldFVzZXJQcm9maWxlQ29uZmlnEiYudGFpbG9yLnYxLkdldFVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5HZXRVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgOQAgESYwoSQ3JlYXRlVGVuYW50Q29uZmlnEiQudGFpbG9yLnYxLkNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QaJS50YWlsb3IudjEuQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2UiABJjChJVcGRhdGVUZW5hbnRDb25maWcSJC50YWlsb3IudjEuVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBolLnRhaWxvci52MS5VcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZSIAEmMKEkRlbGV0ZVRlbmFudENvbmZpZxIkLnRhaWxvci52MS5EZWxldGVUZW5hbnRDb25maWdSZXF1ZXN0GiUudGFpbG9yLnYxLkRlbGV0ZVRlbmFudENvbmZpZ1Jlc3BvbnNlIgASXQoPR2V0VGVuYW50Q29uZmlnEiEudGFpbG9yLnYxLkdldFRlbmFudENvbmZpZ1JlcXVlc3QaIi50YWlsb3IudjEuR2V0VGVuYW50Q29uZmlnUmVzcG9uc2UiA5ACARJ4ChlDcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuEisudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXF1ZXN0GiwudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZSIAEngKGURlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW4SKy50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlc3BvbnNlIgASeAoYTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zEioudGFpbG9yLnYxLkxpc3RQZXJzb25hbEFjY2Vzc1Rva2Vuc1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVzcG9uc2UiA5ACARJsChVDcmVhdGVBdXRoTWFjaGluZVVzZXISJy50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIAEmwKFVVwZGF0ZUF1dGhNYWNoaW5lVXNlchInLnRhaWxvci52MS5VcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZUF1dGhNYWNoaW5lVXNlclJlc3BvbnNlIgASbAoVRGVsZXRlQXV0aE1hY2hpbmVVc2VyEicudGFpbG9yLnYxLkRlbGV0ZUF1dGhNYWNoaW5lVXNlclJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiABJmChJHZXRBdXRoTWFjaGluZVVzZXISJC50YWlsb3IudjEuR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBolLnRhaWxvci52MS5HZXRBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIDkAIBEmwKFExpc3RBdXRoTWFjaGluZVVzZXJzEiYudGFpbG9yLnYxLkxpc3RBdXRoTWFjaGluZVVzZXJzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0QXV0aE1hY2hpbmVVc2Vyc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aFNDSU1Db25maWcSJi50YWlsb3IudjEuQ3JlYXRlQXV0aFNDSU1Db25maWdSZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiABJpChRVcGRhdGVBdXRoU0NJTUNvbmZpZxImLnRhaWxvci52MS5VcGRhdGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1Db25maWdSZXNwb25zZSIAEmkKFERlbGV0ZUF1dGhTQ0lNQ29uZmlnEiYudGFpbG9yLnYxLkRlbGV0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgASYwoRR2V0QXV0aFNDSU1Db25maWcSIy50YWlsb3IudjEuR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0GiQudGFpbG9yLnYxLkdldEF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiA5ACARJvChZDcmVhdGVBdXRoU0NJTVJlc291cmNlEigudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIAEm8KFlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2USKC50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIgASbwoWRGVsZXRlQXV0aFNDSU1SZXNvdXJjZRIoLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiABJpChNHZXRBdXRoU0NJTVJlc291cmNlEiUudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIDkAIBEmwKFEdldEF1dGhTQ0lNUmVzb3VyY2VzEiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VzUmVxdWVzdBonLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aENvbm5lY3Rpb24SJi50YWlsb3IudjEuQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UiABJpChNMaXN0QXV0aENvbm5lY3Rpb25zEiUudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0GiYudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXNwb25zZSIDkAIBEmkKFFJldm9rZUF1dGhDb25uZWN0aW9uEiYudGFpbG9yLnYxLlJldm9rZUF1dGhDb25uZWN0aW9uUmVxdWVzdBonLnRhaWxvci52MS5SZXZva2VBdXRoQ29ubmVjdGlvblJlc3BvbnNlIgAShAEKHVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uEi8udGFpbG9yLnYxLlJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVxdWVzdBowLnRhaWxvci52MS5SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvblJlc3BvbnNlIgASogEKJ0V4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZRI5LnRhaWxvci52MS5FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0GjoudGFpbG9yLnYxLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlc3BvbnNlIgASbwoWQ3JlYXRlQXV0aE9BdXRoMkNsaWVudBIoLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiABJvChZVcGRhdGVBdXRoT0F1dGgyQ2xpZW50EigudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXNwb25zZSIAEm8KFkRlbGV0ZUF1dGhPQXV0aDJDbGllbnQSKC50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgASaQoTR2V0QXV0aE9BdXRoMkNsaWVudBIlLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBomLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiA5ACARJvChVMaXN0QXV0aE9BdXRoMkNsaWVudHMSJy50YWlsb3IudjEuTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0QXV0aE9BdXRoMkNsaWVudHNSZXNwb25zZSIDkAIBEmkKE0xpc3REYXRhcGxhbmVFdmVudHMSJS50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1JlcXVlc3QaJi50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1Jlc3BvbnNlIgOQAgEShAEKHExpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3MSLi50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1JlcXVlc3QaLy50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1Jlc3BvbnNlIgOQAgESVwoOVGVzdEV4ZWNTY3JpcHQSIC50YWlsb3IudjEuVGVzdEV4ZWNTY3JpcHRSZXF1ZXN0GiEudGFpbG9yLnYxLlRlc3RFeGVjU2NyaXB0UmVzcG9uc2UiABJsChRHZXRGdW5jdGlvbkV4ZWN1dGlvbhImLnRhaWxvci52MS5HZXRGdW5jdGlvbkV4ZWN1dGlvblJlcXVlc3QaJy50YWlsb3IudjEuR2V0RnVuY3Rpb25FeGVjdXRpb25SZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1Jlc3BvbnNlIgOQAgEScQoWQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiACgBEnEKFlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgAoARJpChNHZXRGdW5jdGlvblJlZ2lzdHJ5EiUudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvblJlZ2lzdHJpZXMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1Jlc3BvbnNlIgOQAgESbwoWRGVsZXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiABKMAQoeRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0EjAudGFpbG9yLnYxLkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdFJlcXVlc3QaMS50YWlsb3IudjEuRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0UmVzcG9uc2UiA5ACATABEnIKFkxpc3RNZXRlclJlcXVlc3RDb3VudHMSKC50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1Jlc3BvbnNlIgOQAgESeAoYTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzEioudGFpbG9yLnYxLkxpc3RNZXRlckV4ZWN1dGlvbkNvdW50c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzUmVzcG9uc2UiA5ACARJsChRMaXN0TWV0ZXJFdmVudENvdW50cxImLnRhaWxvci52MS5MaXN0TWV0ZXJFdmVudENvdW50c1JlcXVlc3QaJy50YWlsb3IudjEuTGlzdE1ldGVyRXZlbnRDb3VudHNSZXNwb25zZSIDkAIBEl0KD0xpc3RJZFBTZXJ2aWNlcxIhLnRhaWxvci52MS5MaXN0SWRQU2VydmljZXNSZXF1ZXN0GiIudGFpbG9yLnYxLkxpc3RJZFBTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESXQoQQ3JlYXRlSWRQU2VydmljZRIiLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVxdWVzdBojLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVzcG9uc2UiABJdChBVcGRhdGVJZFBTZXJ2aWNlEiIudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXNwb25zZSIAEl0KEERlbGV0ZUlkUFNlcnZpY2USIi50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlcXVlc3QaIy50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlc3BvbnNlIgASVwoNR2V0SWRQU2VydmljZRIfLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVxdWVzdBogLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVzcG9uc2UiA5ACARJaCg5MaXN0SWRQQ2xpZW50cxIgLnRhaWxvci52MS5MaXN0SWRQQ2xpZW50c1JlcXVlc3QaIS50YWlsb3IudjEuTGlzdElkUENsaWVudHNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZUlkUENsaWVudBIhLnRhaWxvci52MS5DcmVhdGVJZFBDbGllbnRSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZUlkUENsaWVudFJlc3BvbnNlIgASWgoPRGVsZXRlSWRQQ2xpZW50EiEudGFpbG9yLnYxLkRlbGV0ZUlkUENsaWVudFJlcXVlc3QaIi50YWlsb3IudjEuRGVsZXRlSWRQQ2xpZW50UmVzcG9uc2UiABJUCgxHZXRJZFBDbGllbnQSHi50YWlsb3IudjEuR2V0SWRQQ2xpZW50UmVxdWVzdBofLnRhaWxvci52MS5HZXRJZFBDbGllbnRSZXNwb25zZSIDkAIBEmYKE0NyZWF0ZVN0YXRpY1dlYnNpdGUSJS50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlcXVlc3QaJi50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlc3BvbnNlIgASZgoTVXBkYXRlU3RhdGljV2Vic2l0ZRIlLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVxdWVzdBomLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVzcG9uc2UiABJmChNEZWxldGVTdGF0aWNXZWJzaXRlEiUudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXF1ZXN0GiYudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXNwb25zZSIAEmAKEEdldFN0YXRpY1dlYnNpdGUSIi50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlc3BvbnNlIgOQAgESZgoSTGlzdFN0YXRpY1dlYnNpdGVzEiQudGFpbG9yLnYxLkxpc3RTdGF0aWNXZWJzaXRlc1JlcXVlc3QaJS50YWlsb3IudjEuTGlzdFN0YXRpY1dlYnNpdGVzUmVzcG9uc2UiA5ACARJdChBDcmVhdGVEZXBsb3ltZW50EiIudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXF1ZXN0GiMudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXNwb25zZSIAEk0KClVwbG9hZEZpbGUSHC50YWlsb3IudjEuVXBsb2FkRmlsZVJlcXVlc3QaHS50YWlsb3IudjEuVXBsb2FkRmlsZVJlc3BvbnNlIgAoARJgChFQdWJsaXNoRGVwbG95bWVudBIjLnRhaWxvci52MS5QdWJsaXNoRGVwbG95bWVudFJlcXVlc3QaJC50YWlsb3IudjEuUHVibGlzaERlcGxveW1lbnRSZXNwb25zZSIAElcKDkNyZWF0ZVdvcmtmbG93EiAudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93UmVxdWVzdBohLnRhaWxvci52MS5DcmVhdGVXb3JrZmxvd1Jlc3BvbnNlIgASVwoOVXBkYXRlV29ya2Zsb3cSIC50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dSZXF1ZXN0GiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtmbG93UmVzcG9uc2UiABJXCg5EZWxldGVXb3JrZmxvdxIgLnRhaWxvci52MS5EZWxldGVXb3JrZmxvd1JlcXVlc3QaIS50YWlsb3IudjEuRGVsZXRlV29ya2Zsb3dSZXNwb25zZSIAElEKC0dldFdvcmtmbG93Eh0udGFpbG9yLnYxLkdldFdvcmtmbG93UmVxdWVzdBoeLnRhaWxvci52MS5HZXRXb3JrZmxvd1Jlc3BvbnNlIgOQAgESYwoRR2V0V29ya2Zsb3dCeU5hbWUSIy50YWlsb3IudjEuR2V0V29ya2Zsb3dCeU5hbWVSZXF1ZXN0GiQudGFpbG9yLnYxLkdldFdvcmtmbG93QnlOYW1lUmVzcG9uc2UiA5ACARJXCg1MaXN0V29ya2Zsb3dzEh8udGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXF1ZXN0GiAudGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb24SKy50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlc3BvbnNlIgASeAoZVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvbhIrLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVzcG9uc2UiABJyChZHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uEigudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXF1ZXN0GikudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXNwb25zZSIDkAIBEoQBChxHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lEi4udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXF1ZXN0Gi8udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXNwb25zZSIDkAIBEngKGExpc3RXb3JrZmxvd0pvYkZ1bmN0aW9ucxIqLnRhaWxvci52MS5MaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0pvYkZ1bmN0aW9uc1Jlc3BvbnNlIgOQAgESbAoUR2V0V29ya2Zsb3dFeGVjdXRpb24SJi50YWlsb3IudjEuR2V0V29ya2Zsb3dFeGVjdXRpb25SZXF1ZXN0GicudGFpbG9yLnYxLkdldFdvcmtmbG93RXhlY3V0aW9uUmVzcG9uc2UiA5ACARJyChZMaXN0V29ya2Zsb3dFeGVjdXRpb25zEigudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXNwb25zZSIDkAIBEmAKEVRlc3RTdGFydFdvcmtmbG93EiMudGFpbG9yLnYxLlRlc3RTdGFydFdvcmtmbG93UmVxdWVzdBokLnRhaWxvci52MS5UZXN0U3RhcnRXb3JrZmxvd1Jlc3BvbnNlIgASYwoSVGVzdFJlc3VtZVdvcmtmbG93EiQudGFpbG9yLnYxLlRlc3RSZXN1bWVXb3JrZmxvd1JlcXVlc3QaJS50YWlsb3IudjEuVGVzdFJlc3VtZVdvcmtmbG93UmVzcG9uc2UiABJOCgtTZXRNZXRhZGF0YRIdLnRhaWxvci52MS5TZXRNZXRhZGF0YVJlcXVlc3QaHi50YWlsb3IudjEuU2V0TWV0YWRhdGFSZXNwb25zZSIAElEKC0dldE1ldGFkYXRhEh0udGFpbG9yLnYxLkdldE1ldGFkYXRhUmVxdWVzdBoeLnRhaWxvci52MS5HZXRNZXRhZGF0YVJlc3BvbnNlIgOQAgEShAEKHUNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLkNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgAShAEKHVVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLlVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgASfgoaR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXISLC50YWlsb3IudjEuR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiA5ACARKQAQogR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJCeU5hbWUSMi50YWlsb3IudjEuR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJCeU5hbWVSZXF1ZXN0GjMudGFpbG9yLnYxLkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyQnlOYW1lUmVzcG9uc2UiA5ACARKEAQocTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2VycxIuLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVxdWVzdBovLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVzcG9uc2UiA5ACARKEAQodRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXISLy50YWlsb3IudjEuRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0GjAudGFpbG9yLnYxLkRlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiAGIGcHJvdG8z\", [file_tailor_v1_application, file_tailor_v1_auth, file_tailor_v1_events, file_tailor_v1_executor, file_tailor_v1_function, file_tailor_v1_function_registry, file_tailor_v1_idp, file_tailor_v1_metadata, file_tailor_v1_meter, file_tailor_v1_pipeline, file_tailor_v1_secret_manager, file_tailor_v1_stateflow, file_tailor_v1_staticwebsite, file_tailor_v1_tailordb, file_tailor_v1_workflow, file_tailor_v1_workspace]);\n\n/**\n * Describes the message tailor.v1.PingRequest.\n * Use `create(PingRequestSchema)` to create a new message.\n */\nexport const PingRequestSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_service, 0);\n\n/**\n * Describes the message tailor.v1.PingResponse.\n * Use `create(PingResponseSchema)` to create a new message.\n */\nexport const PingResponseSchema = /*@__PURE__*/\n messageDesc(file_tailor_v1_service, 1);\n\n/**\n * @generated from service tailor.v1.OperatorService\n */\nexport const OperatorService = /*@__PURE__*/\n serviceDesc(file_tailor_v1_service, 0);\n\n","import { readPackageJSON, type PackageJson } from \"pkg-types\";\n\nlet packageJson: PackageJson | null = null;\n\n/**\n * Read and cache the package.json of the SDK package.\n * @returns Parsed package.json contents\n */\nexport async function readPackageJson() {\n if (packageJson) {\n return packageJson;\n }\n packageJson = await readPackageJSON(import.meta.url);\n return packageJson;\n}\n","import { OAuth2Client } from \"@badgateway/oauth2-client\";\nimport { MethodOptions_IdempotencyLevel } from \"@bufbuild/protobuf/wkt\";\nimport {\n type Client,\n Code,\n ConnectError,\n createClient,\n type Interceptor,\n} from \"@connectrpc/connect\";\nimport { createConnectTransport } from \"@connectrpc/connect-node\";\nimport { OperatorService } from \"@tailor-proto/tailor/v1/service_pb\";\nimport { z } from \"zod\";\nimport { logger } from \"./utils/logger\";\nimport { readPackageJson } from \"./utils/package-json\";\n\nexport const platformBaseUrl = process.env.PLATFORM_URL ?? \"https://api.tailor.tech\";\n\nconst oauth2ClientId =\n process.env.PLATFORM_OAUTH2_CLIENT_ID ?? \"cpoc_0Iudir72fqSpqC6GQ58ri1cLAqcq5vJl\";\nconst oauth2DiscoveryEndpoint = \"/.well-known/oauth-authorization-server/oauth2/platform\";\n\n/**\n * Initialize an OAuth2 client for Tailor Platform.\n * @returns Configured OAuth2 client\n */\nexport function initOAuth2Client() {\n return new OAuth2Client({\n clientId: oauth2ClientId,\n server: platformBaseUrl,\n discoveryEndpoint: oauth2DiscoveryEndpoint,\n });\n}\n\nexport type OperatorClient = Client<typeof OperatorService>;\n\n/**\n * Initialize an Operator client with the given access token.\n * @param accessToken - Access token for authentication\n * @returns Configured Operator client\n */\nexport async function initOperatorClient(accessToken: string) {\n const transport = createConnectTransport({\n httpVersion: \"2\",\n baseUrl: platformBaseUrl,\n interceptors: [\n await userAgentInterceptor(),\n await bearerTokenInterceptor(accessToken),\n retryInterceptor(),\n errorHandlingInterceptor(),\n ],\n });\n return createClient(OperatorService, transport);\n}\n\n/**\n * Create an interceptor that sets a User-Agent header.\n * @returns User-Agent interceptor\n */\nasync function userAgentInterceptor(): Promise<Interceptor> {\n const ua = await userAgent();\n return (next) => async (req) => {\n req.header.set(\"User-Agent\", ua);\n return await next(req);\n };\n}\n\n/**\n * Build the User-Agent string for CLI requests.\n * @returns User-Agent header value\n */\nexport async function userAgent() {\n const packageJson = await readPackageJson();\n return `tailor-sdk/${packageJson.version ?? \"unknown\"}`;\n}\n\n/**\n * Create an interceptor that sets the Authorization bearer token.\n * @param accessToken - Access token to use\n * @returns Bearer token interceptor\n */\nasync function bearerTokenInterceptor(accessToken: string): Promise<Interceptor> {\n return (next) => async (req) => {\n req.header.set(\"Authorization\", `Bearer ${accessToken}`);\n return await next(req);\n };\n}\n\n/**\n * Create an interceptor that retries idempotent requests with backoff.\n * @returns Retry interceptor\n */\nfunction retryInterceptor(): Interceptor {\n return (next) => async (req) => {\n if (req.stream) {\n return await next(req);\n }\n\n let lastError: unknown;\n for (let i = 0; i < 3; i++) {\n if (i > 0) {\n await waitRetryBackoff(i);\n }\n\n try {\n return await next(req);\n } catch (error) {\n if (isRetirable(error, req.method.idempotency)) {\n lastError = error;\n continue;\n }\n throw error;\n }\n }\n throw lastError;\n };\n}\n\n/**\n * Wait for an exponential backoff delay with jitter.\n * @param attempt - Current retry attempt number (1-based)\n * @returns Promise that resolves after the delay\n */\nfunction waitRetryBackoff(attempt: number) {\n const base = 50 * 2 ** (attempt - 1);\n const jitter = 0.1 * (Math.random() * 2 - 1);\n const backoff = base * (1 + jitter);\n return new Promise((resolve) => setTimeout(resolve, backoff));\n}\n\n/**\n * Determine whether the given error is retriable for the method idempotency.\n * @param error - Error thrown by the request\n * @param idempotency - Method idempotency level\n * @returns True if the error should be retried\n */\nfunction isRetirable(error: unknown, idempotency: MethodOptions_IdempotencyLevel) {\n if (!(error instanceof ConnectError)) {\n return false;\n }\n\n switch (error.code) {\n case Code.ResourceExhausted:\n case Code.Unavailable:\n return true;\n case Code.Internal:\n return (\n idempotency === MethodOptions_IdempotencyLevel.NO_SIDE_EFFECTS ||\n idempotency === MethodOptions_IdempotencyLevel.IDEMPOTENT\n );\n default:\n return false;\n }\n}\n\n/**\n * Create an interceptor that enhances error messages from the Operator API.\n * @returns Error handling interceptor\n */\nfunction errorHandlingInterceptor(): Interceptor {\n return (next) => async (req) => {\n try {\n return await next(req);\n } catch (error) {\n if (error instanceof ConnectError) {\n const { operation, resourceType } = parseMethodName(req.method.name);\n const requestParams = formatRequestParams(req.message);\n\n // Re-throw as ConnectError with enhanced message to avoid re-wrapping\n // Use rawMessage to avoid duplicating the error code prefix\n throw new ConnectError(\n `Failed to ${operation} ${resourceType}: ${error.rawMessage}\\nRequest: ${requestParams}`,\n error.code,\n error.metadata,\n );\n }\n throw error;\n }\n };\n}\n\n/**\n * @internal\n * @param methodName - RPC method name (e.g., \"CreateWorkspace\")\n * @returns Parsed operation and resource type\n */\nexport function parseMethodName(methodName: string): {\n operation: string;\n resourceType: string;\n} {\n const match = methodName.match(/^(Create|Update|Delete|Set|List|Get)(.+)$/);\n if (!match) {\n return { operation: \"perform\", resourceType: \"resource\" };\n }\n\n const [, action, resource] = match;\n return { operation: action.toLowerCase(), resourceType: resource };\n}\n\n/**\n * JSON.stringify replacer that converts BigInt values to strings.\n * @param _key - Object key (unused)\n * @param value - Value to serialize\n * @returns Serializable value\n */\nfunction bigIntReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n\n/**\n * @internal\n * @param message - Request message to format\n * @returns Pretty-printed JSON or error placeholder\n */\nexport function formatRequestParams(message: unknown): string {\n try {\n if (message && typeof message === \"object\" && \"toJson\" in message) {\n return JSON.stringify((message as { toJson: () => unknown }).toJson(), bigIntReplacer, 2);\n }\n return JSON.stringify(message, bigIntReplacer, 2);\n } catch {\n return \"(unable to serialize request)\";\n }\n}\n\n/**\n * Fetch all paginated resources by repeatedly calling the given function.\n * @template T\n * @param fn - Page fetcher returning items and next page token\n * @returns All fetched items\n */\nexport async function fetchAll<T>(fn: (pageToken: string) => Promise<[T[], string]>) {\n const items: T[] = [];\n let pageToken = \"\";\n\n while (true) {\n const [batch, nextPageToken] = await fn(pageToken);\n items.push(...batch);\n if (!nextPageToken) break;\n pageToken = nextPageToken;\n }\n return items;\n}\n\n/**\n * Fetch user info from the Tailor Platform userinfo endpoint.\n * @param accessToken - Access token for the current user\n * @returns Parsed user info\n */\nexport async function fetchUserInfo(accessToken: string) {\n const userInfoUrl = new URL(\"/auth/platform/userinfo\", platformBaseUrl).href;\n const resp = await fetch(userInfoUrl, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"User-Agent\": await userAgent(),\n },\n });\n if (!resp.ok) {\n throw new Error(`Failed to fetch user info: ${resp.statusText}`);\n }\n\n const rawJson = await resp.json();\n const schema = z.object({\n email: z.string(),\n });\n return schema.parse(rawJson);\n}\n\n// Converting \"name:url\" patterns to actual Static Website URLs\n/**\n * Resolve \"name:url\" patterns to actual Static Website URLs.\n * @param client - Operator client instance\n * @param workspaceId - Workspace ID\n * @param urls - URLs or name:url patterns\n * @param context - Logging context (e.g., \"CORS\", \"OAuth2 redirect URIs\")\n * @returns Resolved URLs\n */\nexport async function resolveStaticWebsiteUrls(\n client: OperatorClient,\n workspaceId: string,\n urls: string[] | undefined,\n context: string, // for logging context (e.g., \"CORS\", \"OAuth2 redirect URIs\")\n): Promise<string[]> {\n if (!urls) {\n return [];\n }\n\n const results = await Promise.all(\n urls.map(async (url) => {\n const urlPattern = /:url(\\/.*)?$/;\n const match = url.match(urlPattern);\n\n if (match && match.index !== undefined) {\n const siteName = url.substring(0, match.index);\n const pathSuffix = match[1] || \"\";\n\n try {\n const response = await client.getStaticWebsite({\n workspaceId,\n name: siteName,\n });\n\n if (response.staticwebsite?.url) {\n return [response.staticwebsite.url + pathSuffix];\n } else {\n logger.warn(\n `Static website \"${siteName}\" has no URL assigned yet. Excluding from ${context}.`,\n );\n return [];\n }\n } catch {\n logger.warn(\n `Static website \"${siteName}\" not found for ${context} configuration. Excluding from ${context}.`,\n );\n return [];\n }\n }\n return [url];\n }),\n );\n\n return results.flat();\n}\n\n/**\n * Fetch an OAuth2 access token for a machine user.\n * @param url - OAuth2 server base URL\n * @param clientId - Client ID for the machine user\n * @param clientSecret - Client secret for the machine user\n * @returns Access token\n */\nexport async function fetchMachineUserToken(url: string, clientId: string, clientSecret: string) {\n const tokenEndpoint = new URL(\"/oauth2/token\", url).href;\n const formData = new URLSearchParams();\n formData.append(\"grant_type\", \"client_credentials\");\n formData.append(\"client_id\", clientId);\n formData.append(\"client_secret\", clientSecret);\n\n const resp = await fetch(tokenEndpoint, {\n method: \"POST\",\n headers: {\n \"User-Agent\": await userAgent(),\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: formData,\n });\n if (!resp.ok) {\n throw new Error(\"Failed to fetch machine user token\");\n }\n const rawJson = await resp.json();\n\n const schema = z.object({\n token_type: z.string(),\n access_token: z.string(),\n expires_in: z.number(),\n });\n return schema.parse(rawJson);\n}\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport { parseYAML, stringifyYAML, parseTOML } from \"confbox\";\nimport { findUpSync } from \"find-up-simple\";\nimport ml from \"multiline-ts\";\nimport * as path from \"pathe\";\nimport { xdgConfig } from \"xdg-basedir\";\nimport { z } from \"zod\";\nimport { initOAuth2Client } from \"./client\";\nimport { logger } from \"./utils/logger\";\n\nconst pfConfigSchema = z.object({\n version: z.literal(1),\n users: z.partialRecord(\n z.string(),\n z.object({\n access_token: z.string(),\n refresh_token: z.string(),\n token_expires_at: z.string(),\n }),\n ),\n profiles: z.partialRecord(\n z.string(),\n z.object({\n user: z.string(),\n workspace_id: z.string(),\n }),\n ),\n // null if no user is currently selected\n current_user: z.string().nullable(),\n});\n\ntype PfConfig = z.output<typeof pfConfigSchema>;\ntype LoadWorkspaceIdOptions = {\n workspaceId?: string;\n profile?: string;\n};\ntype LoadAccessTokenOptions = {\n useProfile?: boolean;\n profile?: string;\n};\n\nfunction platformConfigPath() {\n if (!xdgConfig) {\n throw new Error(\"User home directory not found\");\n }\n return path.join(xdgConfig, \"tailor-platform\", \"config.yaml\");\n}\n\n/**\n * Read Tailor Platform CLI configuration, migrating from tailorctl if necessary.\n * @returns Parsed platform configuration\n */\nexport function readPlatformConfig(): PfConfig {\n const configPath = platformConfigPath();\n\n // If platform config doesn't exist, try to read tailorctl config and migrate\n if (!fs.existsSync(configPath)) {\n logger.warn(`Config not found at ${configPath}, migrating from tailorctl config...`);\n const tcConfig = readTailorctlConfig();\n const pfConfig = tcConfig\n ? fromTailorctlConfig(tcConfig)\n : ({ version: 1, users: {}, profiles: {}, current_user: null } as const);\n writePlatformConfig(pfConfig);\n return pfConfig;\n }\n const rawConfig = parseYAML(fs.readFileSync(configPath, \"utf-8\"));\n return pfConfigSchema.parse(rawConfig);\n}\n\n/**\n * Write Tailor Platform CLI configuration to disk.\n * @param config - Platform configuration to write\n */\nexport function writePlatformConfig(config: PfConfig) {\n const configPath = platformConfigPath();\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n fs.writeFileSync(configPath, stringifyYAML(config));\n}\n\nconst tcContextConfigSchema = z.object({\n username: z.string().optional(),\n controlplaneaccesstoken: z.string().optional(),\n controlplanerefreshtoken: z.string().optional(),\n controlplanetokenexpiresat: z.string().optional(),\n workspaceid: z.string().optional(),\n});\n\nconst tcConfigSchema = z\n .object({\n global: z\n .object({\n context: z.string().optional(),\n })\n .optional(),\n })\n .catchall(tcContextConfigSchema.optional());\n\ntype TcConfig = z.output<typeof tcConfigSchema>;\ntype TcContextConfig = z.output<typeof tcContextConfigSchema>;\n\nfunction readTailorctlConfig(): TcConfig | undefined {\n const configPath = path.join(os.homedir(), \".tailorctl\", \"config\");\n if (!fs.existsSync(configPath)) {\n return;\n }\n const rawConfig = parseTOML(fs.readFileSync(configPath, \"utf-8\"));\n return tcConfigSchema.parse(rawConfig);\n}\n\nfunction fromTailorctlConfig(config: TcConfig): PfConfig {\n const users: PfConfig[\"users\"] = {};\n const profiles: PfConfig[\"profiles\"] = {};\n let currentUser: PfConfig[\"current_user\"] = null;\n\n const currentContext = config.global?.context || \"default\";\n for (const [key, val] of Object.entries(config)) {\n if (key === \"global\") {\n continue;\n }\n const context = val as TcContextConfig;\n if (\n !context.username ||\n !context.controlplaneaccesstoken ||\n !context.controlplanerefreshtoken ||\n !context.controlplanetokenexpiresat ||\n !context.workspaceid\n ) {\n continue;\n }\n if (key === currentContext) {\n currentUser = context.username;\n }\n profiles[key] = {\n user: context.username,\n workspace_id: context.workspaceid,\n };\n const user = users[context.username];\n if (!user || new Date(user.token_expires_at) < new Date(context.controlplanetokenexpiresat)) {\n users[context.username] = {\n access_token: context.controlplaneaccesstoken,\n refresh_token: context.controlplanerefreshtoken,\n token_expires_at: context.controlplanetokenexpiresat,\n };\n }\n }\n return { version: 1, users, profiles, current_user: currentUser };\n}\n\nfunction validateUUID(value: string, source: string): string {\n const result = z.uuid().safeParse(value);\n if (!result.success) {\n throw new Error(`Invalid value from ${source}: must be a valid UUID`);\n }\n return result.data;\n}\n\n/**\n * Load workspace ID from command options, environment variables, or platform config.\n * Priority: opts/workspaceId > env/workspaceId > opts/profile > env/profile > error\n * @param opts - Workspace and profile options\n * @returns Resolved workspace ID\n */\nexport function loadWorkspaceId(opts?: LoadWorkspaceIdOptions): string {\n // opts/workspaceId\n if (opts?.workspaceId) {\n return validateUUID(opts.workspaceId, \"--workspace-id option\");\n }\n\n // env/workspaceId\n if (process.env.TAILOR_PLATFORM_WORKSPACE_ID) {\n return validateUUID(\n process.env.TAILOR_PLATFORM_WORKSPACE_ID,\n \"TAILOR_PLATFORM_WORKSPACE_ID environment variable\",\n );\n }\n\n // opts/profile > env/profile\n const profile = opts?.profile || process.env.TAILOR_PLATFORM_PROFILE;\n if (profile) {\n const pfConfig = readPlatformConfig();\n const wsId = pfConfig.profiles[profile]?.workspace_id;\n if (!wsId) {\n throw new Error(`Profile \"${profile}\" not found`);\n }\n return validateUUID(wsId, `profile \"${profile}\"`);\n }\n\n // error\n throw new Error(ml`\n Workspace ID not found.\n Please specify workspace ID via --workspace-id option or TAILOR_PLATFORM_WORKSPACE_ID environment variable.\n `);\n}\n\n/**\n * Load access token from command options, environment variables, or platform config.\n * Priority: env/TAILOR_PLATFORM_TOKEN > env/TAILOR_TOKEN (deprecated) > opts/profile > env/profile > config/currentUser > error\n * @param opts - Profile options\n * @returns Resolved access token\n */\nexport async function loadAccessToken(opts?: LoadAccessTokenOptions) {\n // env/pat - TAILOR_PLATFORM_TOKEN takes precedence\n if (process.env.TAILOR_PLATFORM_TOKEN) {\n return process.env.TAILOR_PLATFORM_TOKEN;\n }\n // TAILOR_TOKEN is deprecated\n if (process.env.TAILOR_TOKEN) {\n logger.warn(\"TAILOR_TOKEN is deprecated. Please use TAILOR_PLATFORM_TOKEN instead.\");\n return process.env.TAILOR_TOKEN;\n }\n\n const pfConfig = readPlatformConfig();\n let user;\n // opts/profile > env/profile\n const profile = opts?.useProfile\n ? opts.profile || process.env.TAILOR_PLATFORM_PROFILE\n : undefined;\n if (profile) {\n const u = pfConfig.profiles[profile]?.user;\n if (!u) {\n throw new Error(`Profile \"${profile}\" not found`);\n }\n user = u;\n } else {\n // config/currentUser\n const u = pfConfig.current_user;\n if (!u) {\n // error\n throw new Error(ml`\n Tailor Platform token not found.\n Please specify token via TAILOR_PLATFORM_TOKEN environment variable or login using 'tailor-sdk login' command.\n `);\n }\n user = u;\n }\n\n return await fetchLatestToken(pfConfig, user);\n}\n\n/**\n * Fetch the latest access token, refreshing if necessary.\n * @param config - Platform config\n * @param user - User name\n * @returns Latest access token\n */\nexport async function fetchLatestToken(config: PfConfig, user: string): Promise<string> {\n const tokens = config.users[user];\n if (!tokens) {\n throw new Error(ml`\n User \"${user}\" not found.\n Please verify your user name and login using 'tailor-sdk login' command.\n `);\n }\n if (new Date(tokens.token_expires_at) > new Date()) {\n return tokens.access_token;\n }\n\n const client = initOAuth2Client();\n let resp;\n try {\n resp = await client.refreshToken({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n expiresAt: Date.parse(tokens.token_expires_at),\n });\n } catch {\n throw new Error(ml`\n Failed to refresh token. Your session may have expired.\n Please run 'tailor-sdk login' and try again.\n `);\n }\n config.users[user] = {\n access_token: resp.accessToken,\n refresh_token: resp.refreshToken!,\n token_expires_at: new Date(resp.expiresAt!).toISOString(),\n };\n writePlatformConfig(config);\n return resp.accessToken;\n}\n\nconst DEFAULT_CONFIG_FILENAME = \"tailor.config.ts\";\n\n/**\n * Load config path from command options or environment variables.\n * Priority: opts/config > env/config > search parent directories\n * @param configPath - Optional explicit config path\n * @returns Resolved config path or undefined\n */\nexport function loadConfigPath(configPath?: string): string | undefined {\n if (configPath) {\n return configPath;\n }\n if (process.env.TAILOR_PLATFORM_SDK_CONFIG_PATH) {\n return process.env.TAILOR_PLATFORM_SDK_CONFIG_PATH;\n }\n\n // Search for config file in current directory and parent directories\n return findUpSync(DEFAULT_CONFIG_FILENAME);\n}\n\n/**\n * Load organization ID from command options or environment variables.\n * Priority: opts/organizationId > env/organizationId > undefined (optional)\n * @param organizationId - Organization ID override\n * @returns Resolved organization ID or undefined\n */\nexport function loadOrganizationId(organizationId?: string): string | undefined {\n if (organizationId) {\n return validateUUID(organizationId, \"--organization-id option\");\n }\n if (process.env.TAILOR_PLATFORM_ORGANIZATION_ID) {\n return validateUUID(\n process.env.TAILOR_PLATFORM_ORGANIZATION_ID,\n \"TAILOR_PLATFORM_ORGANIZATION_ID environment variable\",\n );\n }\n return undefined;\n}\n\n/**\n * Load folder ID from command options or environment variables.\n * Priority: opts/folderId > env/folderId > undefined (optional)\n * @param folderId - Folder ID override\n * @returns Resolved folder ID or undefined\n */\nexport function loadFolderId(folderId?: string): string | undefined {\n if (folderId) {\n return validateUUID(folderId, \"--folder-id option\");\n }\n if (process.env.TAILOR_PLATFORM_FOLDER_ID) {\n return validateUUID(\n process.env.TAILOR_PLATFORM_FOLDER_ID,\n \"TAILOR_PLATFORM_FOLDER_ID environment variable\",\n );\n }\n return undefined;\n}\n","import { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, withCommonArgs, workspaceArgs } from \"./args\";\nimport { platformBaseUrl, userAgent } from \"./client\";\nimport { loadAccessToken } from \"./context\";\nimport { logger } from \"./utils/logger\";\n\nexport interface ApiCallOptions {\n profile?: string;\n endpoint: string;\n body?: string;\n}\n\nexport interface ApiCallResult {\n status: number;\n data: unknown;\n}\n\n/**\n * Call Tailor Platform API endpoints directly.\n * If the endpoint doesn't contain \"/\", it defaults to `tailor.v1.OperatorService/{endpoint}`.\n * @param options - API call options (profile, endpoint, body)\n * @returns Response status and data\n */\nexport async function apiCall(options: ApiCallOptions): Promise<ApiCallResult> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n\n // Determine the endpoint path\n let endpointPath: string;\n if (options.endpoint.includes(\"/\")) {\n endpointPath = options.endpoint;\n } else {\n // Default to OperatorService if no \"/\" in endpoint\n endpointPath = `tailor.v1.OperatorService/${options.endpoint}`;\n }\n\n // Build the full URL\n const url = new URL(endpointPath, platformBaseUrl);\n\n // Make the request\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${accessToken}`,\n \"User-Agent\": await userAgent(),\n },\n body: options.body ?? \"{}\",\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(`API call failed (${response.status}): ${JSON.stringify(data)}`);\n }\n\n return {\n status: response.status,\n data,\n };\n}\n\nexport const apiCommand = defineCommand({\n name: \"api\",\n description: \"Call Tailor Platform API endpoints directly.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n body: arg(z.string().default(\"{}\"), {\n alias: \"b\",\n description: \"Request body as JSON\",\n }),\n endpoint: arg(z.string(), {\n positional: true,\n description:\n \"API endpoint to call (e.g., 'GetApplication' or 'tailor.v1.OperatorService/GetApplication')\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n const result = await apiCall({\n profile: args.profile,\n endpoint: args.endpoint as string,\n body: args.body,\n });\n\n if (args.json) {\n logger.log(JSON.stringify(result.data, null, 2));\n } else {\n logger.log(JSON.stringify(result.data, null, 2));\n }\n }),\n});\n","import { pathToFileURL } from \"node:url\";\nimport * as path from \"pathe\";\nimport { loadFilesWithIgnores } from \"@/cli/application/file-loader\";\nimport { logger, styles } from \"@/cli/utils/logger\";\nimport {\n type Workflow,\n type WorkflowServiceConfig,\n WorkflowJobSchema,\n WorkflowSchema,\n} from \"@/parser/service/workflow\";\n\nexport interface CollectedJob {\n name: string;\n exportName: string;\n sourceFile: string;\n}\n\nexport interface WorkflowLoadResult {\n workflows: Record<string, Workflow>;\n workflowSources: Array<{ workflow: Workflow; sourceFile: string }>;\n jobs: CollectedJob[];\n fileCount: number;\n}\n\n/**\n * Load workflow files and collect all jobs in a single pass.\n * Dependencies are detected at bundle time via AST analysis.\n * @param config - Workflow service configuration\n * @returns Loaded workflows and collected jobs\n */\nexport async function loadAndCollectJobs(\n config: WorkflowServiceConfig,\n): Promise<WorkflowLoadResult> {\n const workflows: Record<string, Workflow> = {};\n const workflowSources: Array<{ workflow: Workflow; sourceFile: string }> = [];\n const collectedJobs: CollectedJob[] = [];\n\n if (!config.files || config.files.length === 0) {\n return {\n workflows,\n workflowSources,\n jobs: collectedJobs,\n fileCount: 0,\n };\n }\n\n const workflowFiles = loadFilesWithIgnores(config);\n const fileCount = workflowFiles.length;\n\n // Maps for collecting data\n const allJobsMap = new Map<string, { name: string; exportName: string; sourceFile: string }>();\n\n // Load all files in parallel and collect jobs and workflows\n const loadResults = await Promise.all(\n workflowFiles.map(async (workflowFile) => {\n const { jobs, workflow } = await loadFileContent(workflowFile);\n return { workflowFile, jobs, workflow };\n }),\n );\n\n for (const { workflowFile, jobs, workflow } of loadResults) {\n if (workflow) {\n workflowSources.push({ workflow, sourceFile: workflowFile });\n workflows[workflowFile] = workflow;\n }\n\n for (const job of jobs) {\n const existing = allJobsMap.get(job.name);\n if (existing) {\n throw new Error(\n `Duplicate job name \"${job.name}\" found:\\n` +\n ` - ${existing.sourceFile} (export: ${existing.exportName})\\n` +\n ` - ${job.sourceFile} (export: ${job.exportName})\\n` +\n `Each job must have a unique name.`,\n );\n }\n allJobsMap.set(job.name, job);\n collectedJobs.push(job);\n }\n }\n\n return {\n workflows,\n workflowSources,\n jobs: collectedJobs,\n fileCount,\n };\n}\n\n/**\n * Print workflow loading logs.\n * @param result - Workflow load result to print\n */\nexport function printLoadedWorkflows(result: WorkflowLoadResult): void {\n if (result.fileCount === 0) {\n return;\n }\n\n logger.newline();\n logger.log(`Found ${styles.highlight(result.fileCount.toString())} workflow files`);\n\n for (const { workflow, sourceFile } of result.workflowSources) {\n const relativePath = path.relative(process.cwd(), sourceFile);\n logger.log(\n `Workflow: ${styles.successBright(`\"${workflow.name}\"`)} loaded from ${styles.path(relativePath)}`,\n );\n }\n}\n\n/**\n * Load a single file and extract jobs and workflow\n * @param filePath - Path to the workflow file\n * @returns Extracted jobs and workflow\n */\nasync function loadFileContent(filePath: string): Promise<{\n jobs: Array<{ name: string; exportName: string; sourceFile: string }>;\n workflow: Workflow | null;\n}> {\n const jobs: Array<{\n name: string;\n exportName: string;\n sourceFile: string;\n }> = [];\n let workflow: Workflow | null = null;\n\n try {\n const module = await import(pathToFileURL(filePath).href);\n\n for (const [exportName, exportValue] of Object.entries(module)) {\n // Check if it's a workflow (default export)\n if (exportName === \"default\") {\n const workflowResult = WorkflowSchema.safeParse(exportValue);\n if (workflowResult.success) {\n workflow = workflowResult.data;\n }\n continue;\n }\n\n const jobResult = WorkflowJobSchema.safeParse(exportValue);\n if (jobResult.success) {\n jobs.push({\n name: jobResult.data.name,\n exportName,\n sourceFile: filePath,\n });\n }\n }\n } catch (error) {\n const relativePath = path.relative(process.cwd(), filePath);\n logger.error(\n `${styles.error(\"Failed to load workflow from\")} ${styles.errorBright(relativePath)}`,\n );\n logger.error(String(error));\n throw error;\n }\n\n return { jobs, workflow };\n}\n","// NOTE(haru): Enable inline sourcemaps to preserve original source locations in error stack traces for bundled functions\n// This flag will become unnecessary once function registry is implemented, which will resolve script size issues\nexport const enableInlineSourcemap: boolean = process.env.TAILOR_ENABLE_INLINE_SOURCEMAP === \"true\";\n","let distPath: string | null = null;\n\nexport const getDistDir = (): string => {\n const configured = process.env.TAILOR_SDK_OUTPUT_DIR;\n if (configured && configured !== distPath) {\n distPath = configured;\n } else if (distPath === null) {\n distPath = configured || \".tailor-sdk\";\n }\n return distPath;\n};\n","import type {\n Expression,\n AwaitExpression,\n ImportExpression,\n CallExpression,\n ObjectPropertyKind,\n ObjectProperty,\n ArrowFunctionExpression,\n Function as FunctionExpression,\n} from \"@oxc-project/types\";\n\n/** A generic AST node for walking purposes */\nexport type ASTNode = Record<string, unknown>;\n\nexport interface Replacement {\n start: number;\n end: number;\n text: string;\n}\n\nexport interface FoundProperty {\n key: ObjectProperty[\"key\"];\n value: Expression;\n start: number;\n end: number;\n}\n\n/**\n * Check if a module source is from the Tailor SDK package (including subpaths)\n * @param source - Module source string\n * @returns True if the source is from the Tailor SDK package\n */\nexport function isTailorSdkSource(source: string): boolean {\n return /^@tailor-platform\\/sdk(\\/|$)/.test(source);\n}\n\n/**\n * Get the source string from a dynamic import or require call\n * @param node - AST node to inspect\n * @returns Resolved import/require source string or null\n */\nexport function getImportSource(node: Expression | null | undefined): string | null {\n if (!node) return null;\n // await import(\"@tailor-platform/sdk\")\n if (node.type === \"ImportExpression\") {\n const importExpr = node as ImportExpression;\n const source = importExpr.source;\n if (source.type === \"Literal\" && typeof source.value === \"string\") {\n return source.value;\n }\n }\n // require(\"@tailor-platform/sdk\")\n if (node.type === \"CallExpression\") {\n const callExpr = node as CallExpression;\n if (callExpr.callee.type === \"Identifier\" && callExpr.callee.name === \"require\") {\n const arg = callExpr.arguments[0];\n if (\n arg &&\n \"type\" in arg &&\n arg.type === \"Literal\" &&\n \"value\" in arg &&\n typeof arg.value === \"string\"\n ) {\n return arg.value;\n }\n }\n }\n return null;\n}\n\n/**\n * Unwrap AwaitExpression to get the inner expression\n * @param node - AST expression node\n * @returns Inner expression if node is an AwaitExpression\n */\nexport function unwrapAwait(node: Expression | null | undefined): Expression | null | undefined {\n if (node?.type === \"AwaitExpression\") {\n return (node as AwaitExpression).argument;\n }\n return node;\n}\n\n/**\n * Check if a node is a string literal\n * @param node - AST expression node\n * @returns True if node is a string literal\n */\nexport function isStringLiteral(\n node: Expression | null | undefined,\n): node is Expression & { type: \"Literal\"; value: string } {\n // Note: oxc uses \"Literal\" for all literals, distinguishing by value type\n return node?.type === \"Literal\" && typeof (node as { value?: unknown }).value === \"string\";\n}\n\n/**\n * Check if a node is a function expression (arrow or regular)\n * @param node - AST expression node\n * @returns True if node is a function expression\n */\nexport function isFunctionExpression(\n node: Expression | null | undefined,\n): node is ArrowFunctionExpression | FunctionExpression {\n return node?.type === \"ArrowFunctionExpression\" || node?.type === \"FunctionExpression\";\n}\n\n/**\n * Find a property in an object expression\n * @param properties - Object properties to search\n * @param name - Property name to find\n * @returns Found property info or null\n */\nexport function findProperty(properties: ObjectPropertyKind[], name: string): FoundProperty | null {\n for (const prop of properties) {\n // Note: oxc uses \"Property\" for object properties\n if (prop.type === \"Property\") {\n const objProp = prop as ObjectProperty;\n const keyName =\n objProp.key.type === \"Identifier\"\n ? objProp.key.name\n : objProp.key.type === \"Literal\"\n ? (objProp.key as { value?: string }).value\n : null;\n if (keyName === name) {\n return {\n key: objProp.key,\n value: objProp.value,\n start: objProp.start,\n end: objProp.end,\n };\n }\n }\n }\n return null;\n}\n\n/**\n * Apply string replacements to source code\n * Replacements are applied from end to start to maintain positions\n * @param source - Original source code\n * @param replacements - Replacements to apply\n * @returns Transformed source code\n */\nexport function applyReplacements(source: string, replacements: Replacement[]): string {\n const sorted = [...replacements].sort((a, b) => b.start - a.start);\n let result = source;\n for (const r of sorted) {\n result = result.slice(0, r.start) + r.text + result.slice(r.end);\n }\n return result;\n}\n\n/**\n * Find the end of a statement including any trailing newline\n * @param source - Source code\n * @param position - Start position of the statement\n * @returns Index of the end of the statement including trailing newline\n */\nexport function findStatementEnd(source: string, position: number): number {\n let i = position;\n // Skip any trailing semicolons and whitespace on the same line\n while (i < source.length && (source[i] === \";\" || source[i] === \" \" || source[i] === \"\\t\")) {\n i++;\n }\n // Include the newline if present\n if (i < source.length && source[i] === \"\\n\") {\n i++;\n }\n return i;\n}\n\n/**\n * Resolve a relative path from a base directory\n * Simple implementation that handles ./ and ../ prefixes\n * @param baseDir - Base directory\n * @param relativePath - Relative path to resolve\n * @returns Resolved absolute path\n */\nexport function resolvePath(baseDir: string, relativePath: string): string {\n // Normalize separators to forward slash\n const normalized = relativePath.replace(/\\\\/g, \"/\");\n\n // Split into parts\n const parts = normalized.split(\"/\");\n const baseParts = baseDir.replace(/\\\\/g, \"/\").split(\"/\");\n\n for (const part of parts) {\n if (part === \".\") {\n // Current directory, do nothing\n } else if (part === \"..\") {\n // Go up one directory\n baseParts.pop();\n } else {\n // Add the part\n baseParts.push(part);\n }\n }\n\n return baseParts.join(\"/\");\n}\n","import { type ASTNode, isTailorSdkSource, getImportSource, unwrapAwait } from \"./ast-utils\";\nimport type {\n Program,\n ImportDeclaration,\n VariableDeclaration,\n ImportSpecifier,\n ImportDefaultSpecifier,\n ImportNamespaceSpecifier,\n ObjectPattern,\n BindingProperty,\n CallExpression,\n StaticMemberExpression,\n IdentifierReference,\n} from \"@oxc-project/types\";\n\n/**\n * Collect all import bindings for a specific function from the Tailor SDK package\n * Returns a Set of local names that refer to the function\n * @param program - Parsed TypeScript program\n * @param functionName - Function name to collect bindings for\n * @returns Set of local names bound to the SDK function\n */\nexport function collectSdkBindings(program: Program, functionName: string): Set<string> {\n const bindings = new Set<string>();\n\n function walk(node: ASTNode | null | undefined): void {\n if (!node || typeof node !== \"object\") return;\n\n const nodeType = node.type as string | undefined;\n\n // Static imports: import { createWorkflowJob } from \"@tailor-platform/sdk\"\n if (nodeType === \"ImportDeclaration\") {\n const importDecl = node as unknown as ImportDeclaration;\n const source = importDecl.source?.value;\n if (typeof source === \"string\" && isTailorSdkSource(source)) {\n for (const specifier of importDecl.specifiers || []) {\n // import { createWorkflowJob } from \"@tailor-platform/sdk\"\n // import { createWorkflowJob as create } from \"@tailor-platform/sdk\"\n if (specifier.type === \"ImportSpecifier\") {\n const importSpec = specifier as ImportSpecifier;\n const imported =\n importSpec.imported.type === \"Identifier\"\n ? importSpec.imported.name\n : (importSpec.imported as { value?: string }).value;\n if (imported === functionName) {\n bindings.add(importSpec.local?.name || imported);\n }\n }\n // import sdk from \"@tailor-platform/sdk\" → sdk.createWorkflowJob\n // import * as sdk from \"@tailor-platform/sdk\" → sdk.createWorkflowJob\n else if (\n specifier.type === \"ImportDefaultSpecifier\" ||\n specifier.type === \"ImportNamespaceSpecifier\"\n ) {\n const spec = specifier as ImportDefaultSpecifier | ImportNamespaceSpecifier;\n // Store namespace/default with special prefix to track member access\n bindings.add(`__namespace__:${spec.local?.name}`);\n }\n }\n }\n }\n\n // Dynamic imports and require:\n // const sdk = await import(\"@tailor-platform/sdk\")\n // const sdk = require(\"@tailor-platform/sdk\")\n // const { createWorkflowJob } = await import(\"@tailor-platform/sdk\")\n // const { createWorkflowJob } = require(\"@tailor-platform/sdk\")\n if (nodeType === \"VariableDeclaration\") {\n const varDecl = node as unknown as VariableDeclaration;\n for (const decl of varDecl.declarations || []) {\n const init = unwrapAwait(decl.init);\n const source = getImportSource(init);\n\n if (source && isTailorSdkSource(source)) {\n const id = decl.id;\n\n // const sdk = await import(...) / const sdk = require(...)\n if (id?.type === \"Identifier\") {\n bindings.add(`__namespace__:${id.name}`);\n }\n // const { createWorkflowJob } = await import(...) / require(...)\n // const { createWorkflowJob: create } = await import(...) / require(...)\n else if (id?.type === \"ObjectPattern\") {\n const objPattern = id as unknown as ObjectPattern;\n for (const prop of objPattern.properties || []) {\n if (prop.type === \"Property\") {\n const bindingProp = prop as BindingProperty;\n const keyName =\n bindingProp.key.type === \"Identifier\"\n ? bindingProp.key.name\n : (bindingProp.key as { value?: string }).value;\n if (keyName === functionName) {\n const localName =\n bindingProp.value.type === \"Identifier\" ? bindingProp.value.name : keyName;\n bindings.add(localName ?? \"\");\n }\n }\n }\n }\n }\n }\n }\n\n for (const key of Object.keys(node)) {\n const child = node[key] as unknown;\n if (Array.isArray(child)) {\n child.forEach((c: unknown) => walk(c as ASTNode | null));\n } else if (child && typeof child === \"object\") {\n walk(child as ASTNode);\n }\n }\n }\n\n walk(program as unknown as ASTNode);\n return bindings;\n}\n\n/**\n * Check if a CallExpression is a call to a specific SDK function\n * @param node - AST node to inspect\n * @param bindings - Collected SDK bindings\n * @param functionName - SDK function name\n * @returns True if node is a call to the SDK function\n */\nexport function isSdkFunctionCall(\n node: ASTNode,\n bindings: Set<string>,\n functionName: string,\n): node is ASTNode & { type: \"CallExpression\" } {\n if (node.type !== \"CallExpression\") return false;\n\n const callExpr = node as unknown as CallExpression;\n const callee = callExpr.callee;\n\n // Direct call: createWorkflowJob(...) or create(...)\n if (callee.type === \"Identifier\") {\n const identifier = callee as IdentifierReference;\n return bindings.has(identifier.name);\n }\n\n // Member access: sdk.createWorkflowJob(...)\n // Note: oxc uses MemberExpression with computed: false for static member access\n if (callee.type === \"MemberExpression\") {\n const memberExpr = callee as unknown as StaticMemberExpression;\n if (!memberExpr.computed) {\n const object = memberExpr.object;\n const property = memberExpr.property;\n if (\n object.type === \"Identifier\" &&\n bindings.has(`__namespace__:${(object as IdentifierReference).name}`) &&\n property.name === functionName\n ) {\n return true;\n }\n }\n }\n\n return false;\n}\n","import { type ASTNode, isStringLiteral, isFunctionExpression, findProperty } from \"./ast-utils\";\nimport { collectSdkBindings, isSdkFunctionCall } from \"./sdk-binding-collector\";\nimport type {\n Program,\n CallExpression,\n ObjectExpression,\n StaticMemberExpression,\n IdentifierReference,\n AwaitExpression,\n} from \"@oxc-project/types\";\n\nexport interface JobLocation {\n name: string;\n exportName?: string;\n nameRange: { start: number; end: number };\n bodyValueRange: { start: number; end: number };\n // Range of the entire variable declaration statement (for removal)\n statementRange?: { start: number; end: number };\n}\n\nexport interface TriggerCall {\n identifierName: string;\n callRange: { start: number; end: number };\n argsText: string;\n // If true, the call is wrapped in an await expression\n hasAwait: boolean;\n // The range including the await keyword (if present)\n fullRange: { start: number; end: number };\n}\n\n/**\n * Find all workflow jobs by detecting createWorkflowJob calls from `@tailor-platform/sdk`\n * @param program - Parsed TypeScript program\n * @param _sourceText - Source code text (currently unused)\n * @returns Detected job locations\n */\nexport function findAllJobs(program: Program, _sourceText: string): JobLocation[] {\n const jobs: JobLocation[] = [];\n const bindings = collectSdkBindings(program, \"createWorkflowJob\");\n\n function walk(node: ASTNode | null | undefined, parents: ASTNode[] = []): void {\n if (!node || typeof node !== \"object\") return;\n\n // Detect createWorkflowJob(...) calls\n if (isSdkFunctionCall(node, bindings, \"createWorkflowJob\")) {\n const callExpr = node as unknown as CallExpression;\n const args = callExpr.arguments;\n if (args?.length >= 1 && args[0]?.type === \"ObjectExpression\") {\n const configObj = args[0] as ObjectExpression;\n const nameProp = findProperty(configObj.properties, \"name\");\n const bodyProp = findProperty(configObj.properties, \"body\");\n\n if (\n nameProp &&\n isStringLiteral(nameProp.value) &&\n bodyProp &&\n isFunctionExpression(bodyProp.value)\n ) {\n // Find the outermost enclosing statement and export name\n // Iterate from closest parent (end of array) to farthest (start of array)\n let statementRange: { start: number; end: number } | undefined;\n let exportName: string | undefined;\n for (let i = parents.length - 1; i >= 0; i--) {\n const parent = parents[i];\n if (parent.type === \"VariableDeclarator\") {\n const declarator = parent as unknown as {\n id?: { type?: string; name?: string };\n };\n if (declarator.id?.type === \"Identifier\") {\n exportName = declarator.id.name;\n }\n }\n // Keep track of the outermost statement (ExportNamedDeclaration > VariableDeclaration)\n if (parent.type === \"ExportNamedDeclaration\" || parent.type === \"VariableDeclaration\") {\n statementRange = {\n start: parent.start as number,\n end: parent.end as number,\n };\n // Don't break - continue to find ExportNamedDeclaration if it exists\n }\n }\n\n jobs.push({\n name: nameProp.value.value,\n exportName,\n nameRange: { start: nameProp.start, end: nameProp.end },\n bodyValueRange: {\n start: bodyProp.value.start,\n end: bodyProp.value.end,\n },\n statementRange,\n });\n }\n }\n }\n\n const newParents = [...parents, node];\n for (const key of Object.keys(node)) {\n const child = node[key] as unknown;\n if (Array.isArray(child)) {\n child.forEach((c: unknown) => walk(c as ASTNode | null, newParents));\n } else if (child && typeof child === \"object\") {\n walk(child as ASTNode, newParents);\n }\n }\n }\n\n walk(program as unknown as ASTNode);\n return jobs;\n}\n\n/**\n * Build a map from export name to job name from detected jobs\n * @param jobs - Detected job locations\n * @returns Map from export name to job name\n */\nexport function buildJobNameMap(jobs: JobLocation[]): Map<string, string> {\n const map = new Map<string, string>();\n for (const job of jobs) {\n if (job.exportName) {\n map.set(job.exportName, job.name);\n }\n }\n return map;\n}\n\n/**\n * Detect all .trigger() calls in the source code\n * Returns information about each trigger call for transformation\n * @param program - Parsed TypeScript program\n * @param sourceText - Source code text\n * @returns Detected trigger calls\n */\nexport function detectTriggerCalls(program: Program, sourceText: string): TriggerCall[] {\n const calls: TriggerCall[] = [];\n\n function walk(node: ASTNode | null | undefined, parent: ASTNode | null = null): void {\n if (!node || typeof node !== \"object\") return;\n\n // Detect pattern: identifier.trigger(args)\n if (node.type === \"CallExpression\") {\n const callExpr = node as unknown as CallExpression;\n const callee = callExpr.callee;\n\n if (callee.type === \"MemberExpression\") {\n const memberExpr = callee as unknown as StaticMemberExpression;\n if (\n !memberExpr.computed &&\n memberExpr.object.type === \"Identifier\" &&\n memberExpr.property.name === \"trigger\"\n ) {\n const identifierName = (memberExpr.object as IdentifierReference).name;\n\n // Extract arguments text\n let argsText = \"\";\n if (callExpr.arguments.length > 0) {\n const firstArg = callExpr.arguments[0];\n const lastArg = callExpr.arguments[callExpr.arguments.length - 1];\n if (firstArg && lastArg && \"start\" in firstArg && \"end\" in lastArg) {\n argsText = sourceText.slice(firstArg.start as number, lastArg.end as number);\n }\n }\n\n // Check if this call is wrapped in an await expression\n // triggerJobFunction is synchronous, so we need to remove await\n const hasAwait = parent?.type === \"AwaitExpression\";\n const awaitExpr = hasAwait ? (parent as unknown as AwaitExpression) : null;\n\n const callRange = { start: callExpr.start, end: callExpr.end };\n const fullRange = awaitExpr ? { start: awaitExpr.start, end: awaitExpr.end } : callRange;\n\n calls.push({\n identifierName,\n callRange,\n argsText,\n hasAwait,\n fullRange,\n });\n }\n }\n }\n\n for (const key of Object.keys(node)) {\n const child = node[key] as unknown;\n if (Array.isArray(child)) {\n child.forEach((c: unknown) => walk(c as ASTNode | null, node));\n } else if (child && typeof child === \"object\") {\n walk(child as ASTNode, node);\n }\n }\n }\n\n walk(program as unknown as ASTNode);\n return calls;\n}\n","import { type ASTNode, isStringLiteral, findProperty } from \"./ast-utils\";\nimport { collectSdkBindings, isSdkFunctionCall } from \"./sdk-binding-collector\";\nimport type {\n Program,\n CallExpression,\n ObjectExpression,\n ImportDeclaration,\n ImportDefaultSpecifier,\n} from \"@oxc-project/types\";\n\nexport interface WorkflowLocation {\n name: string;\n exportName?: string;\n isDefaultExport?: boolean;\n}\n\n/**\n * Find all workflows by detecting createWorkflow calls from `@tailor-platform/sdk`\n * @param program - Parsed TypeScript program\n * @param _sourceText - Source code text (currently unused)\n * @returns Detected workflows\n */\nexport function findAllWorkflows(program: Program, _sourceText: string): WorkflowLocation[] {\n const workflows: WorkflowLocation[] = [];\n const bindings = collectSdkBindings(program, \"createWorkflow\");\n\n function walk(node: ASTNode | null | undefined, parents: ASTNode[] = []): void {\n if (!node || typeof node !== \"object\") return;\n\n // Detect createWorkflow(...) calls\n if (isSdkFunctionCall(node, bindings, \"createWorkflow\")) {\n const callExpr = node as unknown as CallExpression;\n const args = callExpr.arguments;\n if (args?.length >= 1 && args[0]?.type === \"ObjectExpression\") {\n const configObj = args[0] as ObjectExpression;\n const nameProp = findProperty(configObj.properties, \"name\");\n\n if (nameProp && isStringLiteral(nameProp.value)) {\n // Find export name from parent declarations\n let exportName: string | undefined;\n let isDefaultExport = false;\n for (let i = parents.length - 1; i >= 0; i--) {\n const parent = parents[i];\n if (parent.type === \"VariableDeclarator\") {\n const declarator = parent as unknown as {\n id?: { type?: string; name?: string };\n };\n if (declarator.id?.type === \"Identifier\") {\n exportName = declarator.id.name;\n break;\n }\n }\n // Check for export default createWorkflow(...)\n if (parent.type === \"ExportDefaultDeclaration\") {\n isDefaultExport = true;\n }\n }\n\n workflows.push({\n name: nameProp.value.value,\n exportName,\n isDefaultExport,\n });\n }\n }\n }\n\n const newParents = [...parents, node];\n for (const key of Object.keys(node)) {\n const child = node[key] as unknown;\n if (Array.isArray(child)) {\n child.forEach((c: unknown) => walk(c as ASTNode | null, newParents));\n } else if (child && typeof child === \"object\") {\n walk(child as ASTNode, newParents);\n }\n }\n }\n\n walk(program as unknown as ASTNode);\n return workflows;\n}\n\n/**\n * Build a map from export name to workflow name from detected workflows\n * @param workflows - Detected workflows\n * @returns Map from export name to workflow name\n */\nexport function buildWorkflowNameMap(workflows: WorkflowLocation[]): Map<string, string> {\n const map = new Map<string, string>();\n for (const workflow of workflows) {\n if (workflow.exportName) {\n map.set(workflow.exportName, workflow.name);\n }\n }\n return map;\n}\n\n/**\n * Detect default imports in a source file and return a map from local name to import source\n * @param program - Parsed TypeScript program\n * @returns Map from local name to import source\n */\nexport function detectDefaultImports(program: Program): Map<string, string> {\n const imports = new Map<string, string>();\n\n function walk(node: ASTNode | null | undefined): void {\n if (!node || typeof node !== \"object\") return;\n\n const nodeType = node.type as string | undefined;\n\n if (nodeType === \"ImportDeclaration\") {\n const importDecl = node as unknown as ImportDeclaration;\n const source = importDecl.source?.value;\n\n if (typeof source === \"string\") {\n for (const specifier of importDecl.specifiers || []) {\n // import foo from \"module\"\n if (specifier.type === \"ImportDefaultSpecifier\") {\n const spec = specifier as ImportDefaultSpecifier;\n if (spec.local?.name) {\n imports.set(spec.local.name, source);\n }\n }\n }\n }\n }\n\n for (const key of Object.keys(node)) {\n const child = node[key] as unknown;\n if (Array.isArray(child)) {\n child.forEach((c: unknown) => walk(c as ASTNode | null));\n } else if (child && typeof child === \"object\") {\n walk(child as ASTNode);\n }\n }\n }\n\n walk(program as unknown as ASTNode);\n return imports;\n}\n","import { parseSync } from \"oxc-parser\";\nimport { type ASTNode, type Replacement, applyReplacements, resolvePath } from \"./ast-utils\";\nimport { detectDefaultImports } from \"./workflow-detector\";\nimport type {\n Program,\n CallExpression,\n ObjectExpression,\n ObjectProperty,\n StaticMemberExpression,\n IdentifierReference,\n AwaitExpression,\n} from \"@oxc-project/types\";\n\ninterface AuthInvokerInfo {\n isShorthand: boolean;\n valueText: string;\n}\n\ninterface ExtendedTriggerCall {\n kind: \"job\" | \"workflow\";\n identifierName: string;\n callRange: { start: number; end: number };\n argsText: string;\n // For workflow triggers, extracted authInvoker info from config\n authInvoker?: AuthInvokerInfo;\n // If true, the call is wrapped in an await expression that should be removed\n hasAwait?: boolean;\n // The range including the await keyword (if present)\n fullRange?: { start: number; end: number };\n}\n\n/**\n * Extract authInvoker info from a config object expression\n * Returns the authInvoker value text and whether it's a shorthand property\n * @param configArg - Config argument node\n * @param sourceText - Source code text\n * @returns Extracted authInvoker info, if any\n */\nfunction extractAuthInvokerInfo(\n configArg: unknown,\n sourceText: string,\n): AuthInvokerInfo | undefined {\n if (!configArg || typeof configArg !== \"object\") return undefined;\n\n const arg = configArg as { type?: string };\n if (arg.type !== \"ObjectExpression\") return undefined;\n\n const objExpr = configArg as ObjectExpression;\n\n // Find authInvoker property\n for (const prop of objExpr.properties) {\n if (prop.type !== \"Property\") continue;\n\n const objProp = prop as ObjectProperty;\n const keyName =\n objProp.key.type === \"Identifier\"\n ? objProp.key.name\n : objProp.key.type === \"Literal\"\n ? (objProp.key as { value?: string }).value\n : null;\n\n if (keyName === \"authInvoker\") {\n if (objProp.shorthand) {\n return { isShorthand: true, valueText: \"authInvoker\" };\n }\n // Extract value text directly from source\n const valueText = sourceText.slice(objProp.value.start, objProp.value.end);\n return { isShorthand: false, valueText };\n }\n }\n\n return undefined;\n}\n\n/**\n * Detect .trigger() calls for known workflows and jobs\n * Only detects calls where the identifier is in workflowNames or jobNames\n * @param program - The parsed AST program\n * @param sourceText - The source code text\n * @param workflowNames - Set of known workflow identifier names\n * @param jobNames - Set of known job identifier names\n * @returns Detected trigger call metadata\n */\nfunction detectExtendedTriggerCalls(\n program: Program,\n sourceText: string,\n workflowNames: Set<string>,\n jobNames: Set<string>,\n): ExtendedTriggerCall[] {\n const calls: ExtendedTriggerCall[] = [];\n\n function walk(node: ASTNode | null | undefined, parent: ASTNode | null = null): void {\n if (!node || typeof node !== \"object\") return;\n\n // Detect pattern: identifier.trigger(args) or identifier.trigger(args, config)\n if (node.type === \"CallExpression\") {\n const callExpr = node as unknown as CallExpression;\n const callee = callExpr.callee;\n\n if (callee.type === \"MemberExpression\") {\n const memberExpr = callee as unknown as StaticMemberExpression;\n if (\n !memberExpr.computed &&\n memberExpr.object.type === \"Identifier\" &&\n memberExpr.property.name === \"trigger\"\n ) {\n const identifierName = (memberExpr.object as IdentifierReference).name;\n\n // Only process if this is a known workflow or job\n const isWorkflow = workflowNames.has(identifierName);\n const isJob = jobNames.has(identifierName);\n if (!isWorkflow && !isJob) {\n // Skip unknown identifiers to prevent false positives\n return;\n }\n\n const argCount = callExpr.arguments.length;\n\n // Extract first argument text\n let argsText = \"\";\n if (argCount > 0) {\n const firstArg = callExpr.arguments[0];\n if (firstArg && \"start\" in firstArg && \"end\" in firstArg) {\n argsText = sourceText.slice(firstArg.start as number, firstArg.end as number);\n }\n }\n\n // Check if this call is wrapped in an await expression\n // For job triggers, we need to remove the await since triggerJobFunction is synchronous\n const hasAwait = parent?.type === \"AwaitExpression\";\n const awaitExpr = hasAwait ? (parent as unknown as AwaitExpression) : null;\n\n // Determine kind based on known identifier type\n if (isWorkflow && argCount >= 2) {\n // Workflow trigger requires 2 arguments (args, config)\n const secondArg = callExpr.arguments[1];\n // Extract authInvoker directly from the config object\n const authInvoker = extractAuthInvokerInfo(secondArg, sourceText);\n if (authInvoker) {\n calls.push({\n kind: \"workflow\",\n identifierName,\n callRange: { start: callExpr.start, end: callExpr.end },\n argsText,\n authInvoker,\n // workflow.trigger uses async triggerWorkflow, so keep await\n hasAwait: false,\n });\n }\n } else if (isJob) {\n // Job trigger (0-1 arguments)\n // triggerJobFunction is synchronous, so we need to remove await\n calls.push({\n kind: \"job\",\n identifierName,\n callRange: { start: callExpr.start, end: callExpr.end },\n argsText,\n hasAwait,\n fullRange: awaitExpr ? { start: awaitExpr.start, end: awaitExpr.end } : undefined,\n });\n }\n }\n }\n }\n\n for (const key of Object.keys(node)) {\n const child = node[key] as unknown;\n if (Array.isArray(child)) {\n child.forEach((c: unknown) => walk(c as ASTNode | null, node));\n } else if (child && typeof child === \"object\") {\n walk(child as ASTNode, node);\n }\n }\n }\n\n walk(program as unknown as ASTNode);\n return calls;\n}\n\n/**\n * Transform trigger calls for resolver/executor/workflow functions\n * Handles both job.trigger() and workflow.trigger() calls\n * @param source - The source code to transform\n * @param workflowNameMap - Map from variable name to workflow name\n * @param jobNameMap - Map from variable name to job name\n * @param workflowFileMap - Map from file path (without extension) to workflow name for default exports\n * @param currentFilePath - Path of the current file being transformed (for resolving relative imports)\n * @returns Transformed source code with trigger calls rewritten\n */\nexport function transformFunctionTriggers(\n source: string,\n workflowNameMap: Map<string, string>,\n jobNameMap: Map<string, string>,\n workflowFileMap?: Map<string, string>,\n currentFilePath?: string,\n): string {\n const { program } = parseSync(\"input.ts\", source);\n\n // Build a map from local identifier name to workflow name\n // This includes both named exports (from workflowNameMap) and default imports (resolved via workflowFileMap)\n const localWorkflowNameMap = new Map(workflowNameMap);\n\n if (workflowFileMap && currentFilePath) {\n // Detect default imports and resolve them to workflow names\n const defaultImports = detectDefaultImports(program);\n const currentDir = currentFilePath.replace(/[/\\\\][^/\\\\]+$/, \"\");\n\n for (const [localName, importSource] of defaultImports) {\n // Skip non-relative imports\n if (!importSource.startsWith(\".\")) continue;\n\n // Resolve the import path relative to the current file\n const resolvedPath = resolvePath(currentDir, importSource);\n const workflowName = workflowFileMap.get(resolvedPath);\n if (workflowName) {\n localWorkflowNameMap.set(localName, workflowName);\n }\n }\n }\n\n // Build sets of known workflow and job identifier names for filtering\n const workflowNames = new Set(localWorkflowNameMap.keys());\n const jobNames = new Set(jobNameMap.keys());\n\n // Detect trigger calls only for known workflows and jobs\n const triggerCalls = detectExtendedTriggerCalls(program, source, workflowNames, jobNames);\n\n const replacements: Replacement[] = [];\n\n for (const call of triggerCalls) {\n if (call.kind === \"workflow\" && call.authInvoker) {\n // Workflow trigger - get workflow name from map\n const workflowName = localWorkflowNameMap.get(call.identifierName);\n if (workflowName) {\n // Use authInvoker info extracted during detection\n const authInvokerExpr = call.authInvoker.isShorthand\n ? \"authInvoker\"\n : call.authInvoker.valueText;\n // Transform to tailor.workflow.triggerWorkflow\n const transformedCall = `tailor.workflow.triggerWorkflow(\"${workflowName}\", ${call.argsText || \"undefined\"}, { authInvoker: ${authInvokerExpr} })`;\n replacements.push({\n start: call.callRange.start,\n end: call.callRange.end,\n text: transformedCall,\n });\n }\n } else if (call.kind === \"job\") {\n // Job trigger - get job name from map\n const jobName = jobNameMap.get(call.identifierName);\n if (jobName) {\n // Transform to tailor.workflow.triggerJobFunction\n // triggerJobFunction is synchronous, so we remove await if present\n const transformedCall = `tailor.workflow.triggerJobFunction(\"${jobName}\", ${call.argsText || \"undefined\"})`;\n\n // If the call was wrapped in await, replace the entire await expression\n // Otherwise just replace the call\n const range = call.hasAwait && call.fullRange ? call.fullRange : call.callRange;\n replacements.push({\n start: range.start,\n end: range.end,\n text: transformedCall,\n });\n }\n }\n }\n\n return applyReplacements(source, replacements);\n}\n","import * as fs from \"node:fs\";\nimport { parseSync } from \"oxc-parser\";\nimport * as path from \"pathe\";\nimport { loadFilesWithIgnores, type FileLoadConfig } from \"@/cli/application/file-loader\";\nimport { logger } from \"@/cli/utils/logger\";\nimport { findAllJobs, buildJobNameMap } from \"./workflow/job-detector\";\nimport { transformFunctionTriggers } from \"./workflow/trigger-transformer\";\nimport { findAllWorkflows, buildWorkflowNameMap } from \"./workflow/workflow-detector\";\nimport type { Plugin } from \"rolldown\";\n\n/**\n * Context for trigger transformation\n * Maps variable names to workflow/job names\n */\nexport interface TriggerContext {\n workflowNameMap: Map<string, string>;\n jobNameMap: Map<string, string>;\n /** Maps file path (without extension) to workflow name for default exports */\n workflowFileMap: Map<string, string>;\n}\n\n/**\n * Normalize a file path by removing extension and resolving to absolute path\n * @param filePath - File path to normalize\n * @returns Normalized absolute path without extension\n */\nfunction normalizeFilePath(filePath: string): string {\n const absolutePath = path.resolve(filePath);\n const ext = path.extname(absolutePath);\n return absolutePath.slice(0, -ext.length);\n}\n\n/**\n * Build trigger context from workflow configuration\n * Scans workflow files to collect workflow and job mappings\n * @param workflowConfig - Workflow file loading configuration\n * @returns Trigger context built from workflow sources\n */\nexport async function buildTriggerContext(\n workflowConfig: FileLoadConfig | undefined,\n): Promise<TriggerContext> {\n const workflowNameMap = new Map<string, string>();\n const jobNameMap = new Map<string, string>();\n const workflowFileMap = new Map<string, string>();\n\n if (!workflowConfig) {\n return { workflowNameMap, jobNameMap, workflowFileMap };\n }\n\n const workflowFiles = loadFilesWithIgnores(workflowConfig);\n\n for (const file of workflowFiles) {\n try {\n const source = await fs.promises.readFile(file, \"utf-8\");\n const { program } = parseSync(\"input.ts\", source);\n\n // Detect workflows\n const workflows = findAllWorkflows(program, source);\n const workflowMap = buildWorkflowNameMap(workflows);\n for (const [exportName, workflowName] of workflowMap) {\n workflowNameMap.set(exportName, workflowName);\n }\n\n // Also track default exported workflows by file path\n for (const workflow of workflows) {\n if (workflow.isDefaultExport) {\n const normalizedPath = normalizeFilePath(file);\n workflowFileMap.set(normalizedPath, workflow.name);\n }\n }\n\n // Detect jobs\n const jobs = findAllJobs(program, source);\n const jobMap = buildJobNameMap(jobs);\n for (const [exportName, jobName] of jobMap) {\n jobNameMap.set(exportName, jobName);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(`Failed to process workflow file ${file}: ${errorMessage}`, {\n mode: \"stream\",\n });\n continue;\n }\n }\n\n return { workflowNameMap, jobNameMap, workflowFileMap };\n}\n\n/**\n * Create a rolldown plugin for transforming trigger calls\n * Returns undefined if no trigger context is provided\n * @param triggerContext - Trigger context to use for transformations\n * @returns Rolldown plugin or undefined when no context\n */\nexport function createTriggerTransformPlugin(\n triggerContext: TriggerContext | undefined,\n): Plugin | undefined {\n if (!triggerContext) {\n return undefined;\n }\n\n return {\n name: \"trigger-transform\",\n transform: {\n filter: {\n id: {\n include: [/\\.ts$/, /\\.js$/],\n },\n },\n handler(code, id) {\n // Only transform source files that contain trigger calls\n if (!code.includes(\".trigger(\")) {\n return null;\n }\n const transformed = transformFunctionTriggers(\n code,\n triggerContext.workflowNameMap,\n triggerContext.jobNameMap,\n triggerContext.workflowFileMap,\n id,\n );\n return { code: transformed };\n },\n },\n };\n}\n","import { pathToFileURL } from \"node:url\";\nimport { ExecutorSchema, type Executor } from \"@/parser/service/executor\";\n\n/**\n * Load and validate an executor definition from a file.\n * @param executorFilePath - Path to the executor file\n * @returns Parsed executor or null if invalid\n */\nexport async function loadExecutor(executorFilePath: string): Promise<Executor | null> {\n const executorModule = await import(pathToFileURL(executorFilePath).href);\n const executor = executorModule.default;\n\n const parseResult = ExecutorSchema.safeParse(executor);\n if (!parseResult.success) {\n return null;\n }\n\n return parseResult.data;\n}\n","import * as fs from \"node:fs\";\nimport ml from \"multiline-ts\";\nimport * as path from \"pathe\";\nimport { resolveTSConfig } from \"pkg-types\";\nimport * as rolldown from \"rolldown\";\nimport { loadFilesWithIgnores, type FileLoadConfig } from \"@/cli/application/file-loader\";\nimport { enableInlineSourcemap } from \"@/cli/bundler/inline-sourcemap\";\nimport { getDistDir } from \"@/cli/utils/dist-dir\";\nimport { logger, styles } from \"@/cli/utils/logger\";\nimport { createTriggerTransformPlugin, type TriggerContext } from \"../trigger-context\";\nimport { loadExecutor } from \"./loader\";\n\ninterface ExecutorInfo {\n name: string;\n sourceFile: string;\n}\n\n/**\n * Options for bundling executors\n */\nexport interface BundleExecutorsOptions {\n /** Executor file loading configuration */\n config: FileLoadConfig;\n /** Trigger context for workflow/job transformations */\n triggerContext?: TriggerContext;\n /** Additional files to bundle (e.g., plugin-generated executors) */\n additionalFiles?: string[];\n}\n\n/**\n * Bundle executors from the specified configuration\n *\n * This function:\n * 1. Creates entry file that extracts operation.body\n * 2. Bundles in a single step with tree-shaking\n * @param options - Bundle executor options\n * @returns Promise that resolves when bundling completes\n */\nexport async function bundleExecutors(options: BundleExecutorsOptions): Promise<void> {\n const { config, triggerContext, additionalFiles = [] } = options;\n const configFiles = loadFilesWithIgnores(config);\n const files = [...configFiles, ...additionalFiles];\n if (files.length === 0) {\n logger.warn(`No executor files found for patterns: ${config.files?.join(\", \") ?? \"(none)\"}`);\n return;\n }\n\n logger.newline();\n logger.log(\n `Bundling ${styles.highlight(files.length.toString())} files for ${styles.info('\"executor\"')}`,\n );\n\n // Load all executors and filter to function/jobFunction only\n const executors: ExecutorInfo[] = [];\n for (const file of files) {\n const executor = await loadExecutor(file);\n if (!executor) {\n logger.debug(` Skipping: ${file} (could not be loaded)`);\n continue;\n }\n\n // Only bundle function and jobFunction executors\n if (![\"function\", \"jobFunction\"].includes(executor.operation.kind)) {\n logger.debug(` Skipping: ${executor.name} (not a function executor)`);\n continue;\n }\n\n executors.push({\n name: executor.name,\n sourceFile: file,\n });\n }\n\n if (executors.length === 0) {\n logger.debug(\" No function executors to bundle\");\n return;\n }\n\n const outputDir = path.resolve(getDistDir(), \"executors\");\n\n fs.mkdirSync(outputDir, { recursive: true });\n\n let tsconfig: string | undefined;\n try {\n tsconfig = await resolveTSConfig();\n } catch {\n tsconfig = undefined;\n }\n\n // Process each executor\n await Promise.all(\n executors.map((executor) =>\n bundleSingleExecutor(executor, outputDir, tsconfig, triggerContext),\n ),\n );\n\n logger.log(`${styles.success(\"Bundled\")} ${styles.info('\"executor\"')}`);\n}\n\nasync function bundleSingleExecutor(\n executor: ExecutorInfo,\n outputDir: string,\n tsconfig: string | undefined,\n triggerContext?: TriggerContext,\n): Promise<void> {\n // Step 1: Create entry file that imports and extracts operation.body\n const entryPath = path.join(outputDir, `${executor.name}.entry.js`);\n const absoluteSourcePath = path.resolve(executor.sourceFile);\n\n const entryContent = ml /* js */ `\n import _internalExecutor from \"${absoluteSourcePath}\";\n\n const __executor_function = _internalExecutor.operation.body;\n\n export { __executor_function as main };\n `;\n fs.writeFileSync(entryPath, entryContent);\n\n // Step 2: Bundle with tree-shaking\n const outputPath = path.join(outputDir, `${executor.name}.js`);\n\n const triggerPlugin = createTriggerTransformPlugin(triggerContext);\n const plugins: rolldown.Plugin[] = triggerPlugin ? [triggerPlugin] : [];\n\n await rolldown.build(\n rolldown.defineConfig({\n input: entryPath,\n output: {\n file: outputPath,\n format: \"esm\",\n sourcemap: enableInlineSourcemap ? \"inline\" : true,\n minify: enableInlineSourcemap\n ? {\n mangle: {\n keepNames: true,\n },\n }\n : true,\n inlineDynamicImports: true,\n },\n tsconfig,\n plugins,\n treeshake: {\n moduleSideEffects: false,\n annotations: true,\n unknownGlobalSideEffects: false,\n },\n logLevel: \"silent\",\n }) as rolldown.BuildOptions,\n );\n}\n","import { pathToFileURL } from \"node:url\";\nimport { type Resolver, ResolverSchema } from \"@/parser/service/resolver\";\n\n/**\n * Load and validate a resolver definition from a file.\n * @param resolverFilePath - Path to the resolver file\n * @returns Parsed resolver or null if invalid\n */\nexport async function loadResolver(resolverFilePath: string): Promise<Resolver | null> {\n const resolverModule = await import(pathToFileURL(resolverFilePath).href);\n const resolver = resolverModule.default;\n\n const parseResult = ResolverSchema.safeParse(resolver);\n if (!parseResult.success) {\n return null;\n }\n\n return parseResult.data;\n}\n","import * as fs from \"node:fs\";\nimport ml from \"multiline-ts\";\nimport * as path from \"pathe\";\nimport { resolveTSConfig } from \"pkg-types\";\nimport * as rolldown from \"rolldown\";\nimport { loadFilesWithIgnores, type FileLoadConfig } from \"@/cli/application/file-loader\";\nimport { enableInlineSourcemap } from \"@/cli/bundler/inline-sourcemap\";\nimport { getDistDir } from \"@/cli/utils/dist-dir\";\nimport { logger, styles } from \"@/cli/utils/logger\";\nimport { createTriggerTransformPlugin, type TriggerContext } from \"../trigger-context\";\nimport { loadResolver } from \"./loader\";\n\ninterface ResolverInfo {\n name: string;\n sourceFile: string;\n}\n\n/**\n * Bundle resolvers for the specified namespace\n *\n * This function:\n * 1. Uses a transform plugin to add validation wrapper during bundling\n * 2. Creates entry file\n * 3. Bundles in a single step with tree-shaking\n * @param namespace - Resolver namespace name\n * @param config - Resolver file loading configuration\n * @param triggerContext - Trigger context for workflow/job transformations\n * @returns Promise that resolves when bundling completes\n */\nexport async function bundleResolvers(\n namespace: string,\n config: FileLoadConfig,\n triggerContext?: TriggerContext,\n): Promise<void> {\n const files = loadFilesWithIgnores(config);\n if (files.length === 0) {\n logger.warn(`No resolver files found for patterns: ${config.files?.join(\", \") ?? \"(none)\"}`);\n return;\n }\n\n logger.newline();\n logger.log(\n `Bundling ${styles.highlight(files.length.toString())} files for ${styles.info(`\"${namespace}\"`)}`,\n );\n\n // Load all resolvers to get their names\n const resolvers: ResolverInfo[] = [];\n for (const file of files) {\n const resolver = await loadResolver(file);\n if (!resolver) {\n logger.debug(` Skipping: ${file} (could not be loaded)`);\n continue;\n }\n resolvers.push({\n name: resolver.name,\n sourceFile: file,\n });\n }\n\n const outputDir = path.resolve(getDistDir(), \"resolvers\");\n\n fs.mkdirSync(outputDir, { recursive: true });\n\n let tsconfig: string | undefined;\n try {\n tsconfig = await resolveTSConfig();\n } catch {\n tsconfig = undefined;\n }\n\n // Process each resolver\n await Promise.all(\n resolvers.map((resolver) =>\n bundleSingleResolver(resolver, outputDir, tsconfig, triggerContext),\n ),\n );\n\n logger.log(`${styles.success(\"Bundled\")} ${styles.info(`\"${namespace}\"`)}`);\n}\n\nasync function bundleSingleResolver(\n resolver: ResolverInfo,\n outputDir: string,\n tsconfig: string | undefined,\n triggerContext?: TriggerContext,\n): Promise<void> {\n // Step 1: Create entry file that imports from the original source\n const entryPath = path.join(outputDir, `${resolver.name}.entry.js`);\n const absoluteSourcePath = path.resolve(resolver.sourceFile);\n\n const entryContent = ml /* js */ `\n import _internalResolver from \"${absoluteSourcePath}\";\n import { t } from \"@tailor-platform/sdk\";\n\n const $tailor_resolver_body = async (context) => {\n if (_internalResolver.input) {\n const result = t.object(_internalResolver.input).parse({\n value: context.input,\n data: context.input,\n user: context.user,\n });\n\n if (result.issues) {\n const errorMessages = result.issues\n .map(issue => {\n const path = issue.path ? issue.path.join('.') : '';\n return path ? \\` \\${path}: \\${issue.message}\\` : issue.message;\n })\n .join('\\\\n');\n throw new Error(\\`Failed to input validation:\\\\n\\${errorMessages}\\`);\n }\n }\n\n return _internalResolver.body(context);\n };\n\n export { $tailor_resolver_body as main };\n `;\n fs.writeFileSync(entryPath, entryContent);\n\n // Step 2: Bundle with tree-shaking\n const outputPath = path.join(outputDir, `${resolver.name}.js`);\n\n const triggerPlugin = createTriggerTransformPlugin(triggerContext);\n const plugins: rolldown.Plugin[] = triggerPlugin ? [triggerPlugin] : [];\n\n await rolldown.build(\n rolldown.defineConfig({\n input: entryPath,\n output: {\n file: outputPath,\n format: \"esm\",\n sourcemap: enableInlineSourcemap ? \"inline\" : true,\n minify: enableInlineSourcemap\n ? {\n mangle: {\n keepNames: true,\n },\n }\n : true,\n inlineDynamicImports: true,\n },\n tsconfig,\n plugins,\n treeshake: {\n moduleSideEffects: false,\n annotations: true,\n unknownGlobalSideEffects: false,\n },\n logLevel: \"silent\",\n }) as rolldown.BuildOptions,\n );\n}\n","import { parseSync } from \"oxc-parser\";\nimport { type ASTNode, type Replacement, applyReplacements, findStatementEnd } from \"./ast-utils\";\nimport { findAllJobs, buildJobNameMap, detectTriggerCalls } from \"./job-detector\";\nimport { collectSdkBindings, isSdkFunctionCall } from \"./sdk-binding-collector\";\nimport type {\n Program,\n VariableDeclaration,\n ExportNamedDeclaration,\n ExportDefaultDeclaration,\n} from \"@oxc-project/types\";\n\n/**\n * Find variable declarations by export names\n * Returns a map of export name to statement range\n * @param program - Parsed TypeScript program\n * @returns Map of export name to statement range\n */\nfunction findVariableDeclarationsByName(\n program: Program,\n): Map<string, { start: number; end: number }> {\n const declarations = new Map<string, { start: number; end: number }>();\n\n function walk(node: ASTNode | null | undefined): void {\n if (!node || typeof node !== \"object\") return;\n\n const nodeType = node.type as string | undefined;\n\n // Handle variable declarations: const job1 = ...\n // Only set if not already set (ExportNamedDeclaration is processed first and sets the outer range)\n if (nodeType === \"VariableDeclaration\") {\n const varDecl = node as unknown as VariableDeclaration;\n for (const decl of varDecl.declarations || []) {\n if (decl.id?.type === \"Identifier\" && decl.id.name) {\n if (!declarations.has(decl.id.name)) {\n declarations.set(decl.id.name, {\n start: varDecl.start,\n end: varDecl.end,\n });\n }\n }\n }\n }\n\n // Handle export declarations: export const job1 = ...\n if (nodeType === \"ExportNamedDeclaration\") {\n const exportDecl = node as unknown as ExportNamedDeclaration;\n const declaration = exportDecl.declaration;\n if (declaration?.type === \"VariableDeclaration\") {\n const varDecl = declaration as VariableDeclaration;\n for (const decl of varDecl.declarations || []) {\n if (decl.id?.type === \"Identifier\" && decl.id.name) {\n declarations.set(decl.id.name, {\n start: exportDecl.start,\n end: exportDecl.end,\n });\n }\n }\n }\n }\n\n for (const key of Object.keys(node)) {\n const child = node[key] as unknown;\n if (Array.isArray(child)) {\n child.forEach((c: unknown) => walk(c as ASTNode | null));\n } else if (child && typeof child === \"object\") {\n walk(child as ASTNode);\n }\n }\n }\n\n walk(program as unknown as ASTNode);\n return declarations;\n}\n\n/**\n * Find createWorkflow default export declarations\n * Returns the range of the export statement to remove\n * @param program - Parsed TypeScript program\n * @returns Range of the default export statement or null\n */\nfunction findWorkflowDefaultExport(program: Program): { start: number; end: number } | null {\n const bindings = collectSdkBindings(program, \"createWorkflow\");\n\n for (const statement of program.body) {\n if (statement.type === \"ExportDefaultDeclaration\") {\n const exportDecl = statement as ExportDefaultDeclaration;\n const declaration = exportDecl.declaration;\n\n // Check for direct createWorkflow call: export default createWorkflow({...})\n if (isSdkFunctionCall(declaration as unknown as ASTNode, bindings, \"createWorkflow\")) {\n return { start: exportDecl.start, end: exportDecl.end };\n }\n\n // Check for variable reference that was assigned from createWorkflow\n // This handles: const wf = createWorkflow({...}); export default wf;\n if (declaration.type === \"Identifier\") {\n return { start: exportDecl.start, end: exportDecl.end };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Transform workflow source code\n * - Transform .trigger() calls to tailor.workflow.triggerJobFunction()\n * - Other jobs: remove entire variable declaration\n * @param source - The source code to transform\n * @param targetJobName - The name of the target job (from job config)\n * @param targetJobExportName - The export name of the target job (optional, for enhanced detection)\n * @param otherJobExportNames - Export names of other jobs to remove (optional, for enhanced detection)\n * @param allJobsMap - Map from export name to job name for trigger transformation (optional)\n * @returns Transformed workflow source code\n */\nexport function transformWorkflowSource(\n source: string,\n targetJobName: string,\n targetJobExportName?: string,\n otherJobExportNames?: string[],\n allJobsMap?: Map<string, string>,\n): string {\n // Use .ts extension to properly parse TypeScript code\n const { program } = parseSync(\"input.ts\", source);\n\n // Find all jobs using AST detection\n const detectedJobs = findAllJobs(program, source);\n\n // Build job name map from detected jobs if not provided\n const jobNameMap = allJobsMap ?? buildJobNameMap(detectedJobs);\n\n // Find all variable declarations for export name-based removal\n const allDeclarations = findVariableDeclarationsByName(program);\n\n // Detect all .trigger() calls\n const triggerCalls = detectTriggerCalls(program, source);\n\n const replacements: Replacement[] = [];\n const removedRanges: Array<{ start: number; end: number }> = [];\n\n // Helper to check if a position is inside any removed range\n const isInsideRemovedRange = (pos: number) => {\n return removedRanges.some((r) => pos >= r.start && pos < r.end);\n };\n\n // Helper to track removed ranges (avoid duplicate/overlapping removals)\n // Use start position only for comparison since end position may vary due to findStatementEnd\n const isAlreadyMarkedForRemoval = (start: number) => {\n return removedRanges.some((r) => r.start === start);\n };\n\n // Step 1: First, collect all ranges that will be removed (other job declarations)\n // This must happen before trigger transformation to know which trigger calls to skip\n for (const job of detectedJobs) {\n if (job.name === targetJobName) {\n continue;\n }\n\n if (job.statementRange && !isAlreadyMarkedForRemoval(job.statementRange.start)) {\n const endPos = findStatementEnd(source, job.statementRange.end);\n removedRanges.push({ start: job.statementRange.start, end: endPos });\n replacements.push({\n start: job.statementRange.start,\n end: endPos,\n text: \"\",\n });\n } else if (!job.statementRange) {\n // Fallback: replace body with empty function if we can't find the statement\n replacements.push({\n start: job.bodyValueRange.start,\n end: job.bodyValueRange.end,\n text: \"() => {}\",\n });\n }\n }\n\n // Step 2: Remove other jobs by export name (catches jobs missed by AST detection)\n if (otherJobExportNames) {\n for (const exportName of otherJobExportNames) {\n if (exportName === targetJobExportName) continue;\n\n const declRange = allDeclarations.get(exportName);\n if (declRange && !isAlreadyMarkedForRemoval(declRange.start)) {\n const endPos = findStatementEnd(source, declRange.end);\n removedRanges.push({ start: declRange.start, end: endPos });\n replacements.push({\n start: declRange.start,\n end: endPos,\n text: \"\",\n });\n }\n }\n }\n\n // Step 3: Remove createWorkflow default export (not needed in job bundles)\n const workflowExport = findWorkflowDefaultExport(program);\n if (workflowExport && !isAlreadyMarkedForRemoval(workflowExport.start)) {\n const endPos = findStatementEnd(source, workflowExport.end);\n removedRanges.push({ start: workflowExport.start, end: endPos });\n replacements.push({\n start: workflowExport.start,\n end: endPos,\n text: \"\",\n });\n }\n\n // Step 4: Transform .trigger() calls to tailor.workflow.triggerJobFunction()\n // Only transform trigger calls that are NOT inside ranges being removed\n // Also remove await keyword since triggerJobFunction is synchronous\n for (const call of triggerCalls) {\n // Skip trigger calls inside removed job declarations\n if (isInsideRemovedRange(call.callRange.start)) {\n continue;\n }\n\n const jobName = jobNameMap.get(call.identifierName);\n if (jobName) {\n // Transform to tailor.workflow.triggerJobFunction\n // triggerJobFunction is synchronous, so we use fullRange to remove await if present\n const transformedCall = `tailor.workflow.triggerJobFunction(\"${jobName}\", ${call.argsText || \"undefined\"})`;\n replacements.push({\n start: call.fullRange.start,\n end: call.fullRange.end,\n text: transformedCall,\n });\n }\n }\n\n return applyReplacements(source, replacements);\n}\n","import * as fs from \"node:fs\";\nimport ml from \"multiline-ts\";\nimport { parseSync } from \"oxc-parser\";\nimport * as path from \"pathe\";\nimport { resolveTSConfig } from \"pkg-types\";\nimport * as rolldown from \"rolldown\";\nimport { enableInlineSourcemap } from \"@/cli/bundler/inline-sourcemap\";\nimport { getDistDir } from \"@/cli/utils/dist-dir\";\nimport { logger, styles } from \"@/cli/utils/logger\";\nimport { detectTriggerCalls, findAllJobs } from \"./job-detector\";\nimport { transformWorkflowSource } from \"./source-transformer\";\nimport { transformFunctionTriggers } from \"./trigger-transformer\";\nimport type { TriggerContext } from \"../trigger-context\";\n\ninterface JobInfo {\n name: string;\n exportName: string;\n sourceFile: string;\n}\n\nexport interface BundleWorkflowJobsResult {\n /** Maps mainJobName -> list of all job names it depends on (including itself) */\n mainJobDeps: Record<string, string[]>;\n}\n\n/**\n * Bundle workflow jobs\n *\n * This function:\n * 1. Detects which jobs are actually used (mainJobs + their dependencies)\n * 2. Uses a transform plugin to transform trigger calls during bundling\n * 3. Creates entry file and bundles with tree-shaking\n *\n * Returns metadata about which jobs each workflow uses.\n * @param allJobs - All available job infos\n * @param mainJobNames - Names of main jobs\n * @param env - Environment variables to inject\n * @param triggerContext - Trigger context for transformations\n * @returns Workflow job bundling result\n */\nexport async function bundleWorkflowJobs(\n allJobs: JobInfo[],\n mainJobNames: string[],\n env: Record<string, string | number | boolean> = {},\n triggerContext?: TriggerContext,\n): Promise<BundleWorkflowJobsResult> {\n if (allJobs.length === 0) {\n logger.warn(\"No workflow jobs to bundle\");\n return { mainJobDeps: {} };\n }\n\n // Filter to only used jobs and get per-mainJob dependencies\n const { usedJobs, mainJobDeps } = await filterUsedJobs(allJobs, mainJobNames);\n\n logger.newline();\n logger.log(\n `Bundling ${styles.highlight(usedJobs.length.toString())} files for ${styles.info('\"workflow-job\"')}`,\n );\n\n const outputDir = path.resolve(getDistDir(), \"workflow-jobs\");\n\n // Clean up output directory before bundling to remove stale files\n if (fs.existsSync(outputDir)) {\n fs.rmSync(outputDir, { recursive: true });\n }\n fs.mkdirSync(outputDir, { recursive: true });\n\n let tsconfig: string | undefined;\n try {\n tsconfig = await resolveTSConfig();\n } catch {\n tsconfig = undefined;\n }\n\n // Process each job\n await Promise.all(\n usedJobs.map((job) => bundleSingleJob(job, usedJobs, outputDir, tsconfig, env, triggerContext)),\n );\n\n logger.log(`${styles.success(\"Bundled\")} ${styles.info('\"workflow-job\"')}`);\n\n return { mainJobDeps };\n}\n\ninterface FilterUsedJobsResult {\n usedJobs: JobInfo[];\n mainJobDeps: Record<string, string[]>;\n}\n\n/**\n * Filter jobs to only include those that are actually used.\n * A job is \"used\" if:\n * - It's a mainJob of a workflow\n * - It's called via .trigger() from another used job (transitively)\n *\n * Also returns a map of mainJob -> all jobs it depends on (for metadata).\n * @param allJobs - All available job infos\n * @param mainJobNames - Names of main jobs\n * @returns Used jobs and main job dependency map\n */\nasync function filterUsedJobs(\n allJobs: JobInfo[],\n mainJobNames: string[],\n): Promise<FilterUsedJobsResult> {\n if (allJobs.length === 0 || mainJobNames.length === 0) {\n return { usedJobs: [], mainJobDeps: {} };\n }\n\n // Build maps for lookups\n const jobsBySourceFile = new Map<string, JobInfo[]>();\n for (const job of allJobs) {\n const existing = jobsBySourceFile.get(job.sourceFile) || [];\n existing.push(job);\n jobsBySourceFile.set(job.sourceFile, existing);\n }\n\n // Build export name -> job name map for all jobs\n const exportNameToJobName = new Map<string, string>();\n for (const job of allJobs) {\n exportNameToJobName.set(job.exportName, job.name);\n }\n\n // Detect trigger calls and build dependency graph\n // Maps job name -> set of job names it triggers\n const dependencies = new Map<string, Set<string>>();\n\n // Process all source files in parallel\n const fileResults = await Promise.all(\n Array.from(jobsBySourceFile.entries()).map(async ([sourceFile, jobs]) => {\n try {\n const source = await fs.promises.readFile(sourceFile, \"utf-8\");\n const { program } = parseSync(\"input.ts\", source);\n\n // Find all jobs in this file to get body ranges\n const detectedJobs = findAllJobs(program, source);\n const localExportNameToJobName = new Map<string, string>();\n for (const detected of detectedJobs) {\n if (detected.exportName) {\n localExportNameToJobName.set(detected.exportName, detected.name);\n }\n }\n\n // Detect trigger calls\n const triggerCalls = detectTriggerCalls(program, source);\n\n // For each job in this file, find which triggers are inside its body\n const jobDependencies: Array<{ jobName: string; deps: Set<string> }> = [];\n\n for (const job of jobs) {\n const detectedJob = detectedJobs.find((d) => d.name === job.name);\n if (!detectedJob) continue;\n\n const jobDeps = new Set<string>();\n\n for (const call of triggerCalls) {\n // Check if this trigger call is inside the job's body\n if (\n detectedJob.bodyValueRange &&\n call.callRange.start >= detectedJob.bodyValueRange.start &&\n call.callRange.end <= detectedJob.bodyValueRange.end\n ) {\n // Look up the job name from the identifier\n const triggeredJobName =\n localExportNameToJobName.get(call.identifierName) ||\n exportNameToJobName.get(call.identifierName);\n if (triggeredJobName) {\n jobDeps.add(triggeredJobName);\n }\n }\n }\n\n if (jobDeps.size > 0) {\n jobDependencies.push({ jobName: job.name, deps: jobDeps });\n }\n }\n\n return jobDependencies;\n } catch {\n // If we can't parse a file, assume no dependencies from it\n return [];\n }\n }),\n );\n\n // Merge results into dependencies map\n for (const jobDependencies of fileResults) {\n for (const { jobName, deps } of jobDependencies) {\n dependencies.set(jobName, deps);\n }\n }\n\n // Collect all used jobs and per-mainJob dependencies\n const usedJobNames = new Set<string>();\n const mainJobDeps: Record<string, string[]> = {};\n\n function collectDeps(jobName: string, collected: Set<string>) {\n if (collected.has(jobName)) return;\n collected.add(jobName);\n\n // Recursively collect dependencies\n const deps = dependencies.get(jobName);\n if (deps) {\n for (const dep of deps) {\n collectDeps(dep, collected);\n }\n }\n }\n\n // For each mainJob, collect all its dependencies\n for (const mainJobName of mainJobNames) {\n const depsForMainJob = new Set<string>();\n collectDeps(mainJobName, depsForMainJob);\n mainJobDeps[mainJobName] = Array.from(depsForMainJob);\n\n // Add to global used jobs\n for (const dep of depsForMainJob) {\n usedJobNames.add(dep);\n }\n }\n\n // Filter to only used jobs\n const usedJobs = allJobs.filter((job) => usedJobNames.has(job.name));\n return { usedJobs, mainJobDeps };\n}\n\nasync function bundleSingleJob(\n job: JobInfo,\n allJobs: JobInfo[],\n outputDir: string,\n tsconfig: string | undefined,\n env: Record<string, string | number | boolean>,\n triggerContext?: TriggerContext,\n): Promise<void> {\n // Step 1: Create entry file that imports job by named export\n const entryPath = path.join(outputDir, `${job.name}.entry.js`);\n const absoluteSourcePath = path.resolve(job.sourceFile);\n\n const entryContent = ml /* js */ `\n import { ${job.exportName} } from \"${absoluteSourcePath}\";\n\n const env = ${JSON.stringify(env)};\n\n export async function main(input) {\n return await ${job.exportName}.body(input, { env });\n }\n `;\n fs.writeFileSync(entryPath, entryContent);\n\n // Step 2: Bundle with a transform plugin that transforms trigger calls\n const outputPath = path.join(outputDir, `${job.name}.js`);\n\n // Collect export names for enhanced AST removal (catches jobs missed by AST detection)\n const otherJobExportNames = allJobs.filter((j) => j.name !== job.name).map((j) => j.exportName);\n\n // Build a map from export name to job name for trigger transformation\n const allJobsMap = new Map<string, string>();\n for (const j of allJobs) {\n allJobsMap.set(j.exportName, j.name);\n }\n\n // Create transform plugin to transform trigger calls and remove other job declarations\n const transformPlugin: rolldown.Plugin = {\n name: \"workflow-transform\",\n transform: {\n filter: {\n id: {\n include: [/\\.ts$/, /\\.js$/],\n },\n },\n handler(code, id) {\n // Only transform source files that contain workflow jobs or trigger calls\n if (\n !code.includes(\"createWorkflowJob\") &&\n !code.includes(\"createWorkflow\") &&\n !code.includes(\".trigger(\")\n ) {\n return null;\n }\n\n // First, apply existing workflow source transformation (removes other jobs, transforms job.trigger)\n let transformed = transformWorkflowSource(\n code,\n job.name,\n job.exportName,\n otherJobExportNames,\n allJobsMap,\n );\n\n // Then, apply workflow.trigger transformation if context is provided\n if (triggerContext && transformed.includes(\".trigger(\")) {\n transformed = transformFunctionTriggers(\n transformed,\n triggerContext.workflowNameMap,\n triggerContext.jobNameMap,\n triggerContext.workflowFileMap,\n id,\n );\n }\n\n return { code: transformed };\n },\n },\n };\n\n await rolldown.build(\n rolldown.defineConfig({\n input: entryPath,\n output: {\n file: outputPath,\n format: \"esm\",\n sourcemap: enableInlineSourcemap ? \"inline\" : true,\n minify: enableInlineSourcemap\n ? {\n mangle: {\n keepNames: true,\n },\n }\n : true,\n inlineDynamicImports: true,\n },\n tsconfig,\n plugins: [transformPlugin],\n treeshake: {\n moduleSideEffects: false,\n annotations: true,\n unknownGlobalSideEffects: false,\n },\n logLevel: \"silent\",\n }) as rolldown.BuildOptions,\n );\n}\n","import { z } from \"zod\";\nimport type { CodeGeneratorBase } from \"./types\";\n\n// Dependency kind enum for generators\nconst DependencyKindSchema = z.enum([\"tailordb\", \"resolver\", \"executor\"]);\nexport type DependencyKind = z.infer<typeof DependencyKindSchema>;\n\n// Literal-based schemas for each generator\nconst KyselyTypeConfigSchema = z.tuple([\n z.literal(\"@tailor-platform/kysely-type\"),\n z.object({ distPath: z.string() }),\n]);\n\nconst SeedConfigSchema = z.tuple([\n z.literal(\"@tailor-platform/seed\"),\n z.object({ distPath: z.string(), machineUserName: z.string().optional() }),\n]);\n\nconst EnumConstantsConfigSchema = z.tuple([\n z.literal(\"@tailor-platform/enum-constants\"),\n z.object({ distPath: z.string() }),\n]);\n\nconst FileUtilsConfigSchema = z.tuple([\n z.literal(\"@tailor-platform/file-utils\"),\n z.object({ distPath: z.string() }),\n]);\n\n// Custom generator schema with dependencies\nexport const CodeGeneratorSchema = z.object({\n id: z.string(),\n description: z.string(),\n dependencies: z.array(DependencyKindSchema),\n processType: z.function().optional(),\n processResolver: z.function().optional(),\n processExecutor: z.function().optional(),\n processTailorDBNamespace: z.function().optional(),\n processResolverNamespace: z.function().optional(),\n aggregate: z.function({ output: z.any() }),\n});\n\n// Base schema for generator config (before transformation to actual Generator instances)\nexport const BaseGeneratorConfigSchema = z.union([\n KyselyTypeConfigSchema,\n SeedConfigSchema,\n EnumConstantsConfigSchema,\n FileUtilsConfigSchema,\n CodeGeneratorSchema,\n]);\n\nexport type * from \"./types\";\n\n/**\n * Creates a GeneratorConfigSchema with built-in generator support\n * @param builtinGenerators - Map of generator IDs to their constructor functions\n * @returns Generator config schema\n */\nexport function createGeneratorConfigSchema(\n builtinGenerators: Map<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (options: any) => CodeGeneratorBase\n >,\n) {\n return z\n .union([\n KyselyTypeConfigSchema,\n SeedConfigSchema,\n EnumConstantsConfigSchema,\n FileUtilsConfigSchema,\n CodeGeneratorSchema,\n ])\n .transform((gen) => {\n if (Array.isArray(gen)) {\n const [id, options] = gen;\n const constructor = builtinGenerators.get(id);\n if (constructor) {\n return constructor(options);\n }\n throw new Error(`Unknown generator ID: ${id}`);\n }\n return gen as CodeGeneratorBase;\n })\n .brand(\"CodeGenerator\");\n}\n\nexport type GeneratorConfigSchemaType = ReturnType<typeof createGeneratorConfigSchema>;\nexport type Generator = z.output<GeneratorConfigSchemaType>;\n","import { z } from \"zod\";\nimport { functionSchema } from \"@/parser/service/common\";\nimport type { Plugin } from \"./types\";\n\n// Custom plugin schema (object form)\n// Using passthrough() to preserve additional properties on Plugin instances\nconst CustomPluginSchema = z\n .object({\n id: z.string(),\n description: z.string(),\n importPath: z.string(),\n pluginConfig: z.unknown().optional(),\n processType: functionSchema.optional(),\n processNamespace: functionSchema.optional(),\n typeConfigRequired: z.union([z.boolean(), functionSchema]).optional(),\n })\n .passthrough();\n\n/**\n * Creates a PluginConfigSchema for custom plugins\n * @returns Plugin config schema that validates and transforms Plugin instances\n */\nexport function createPluginConfigSchema() {\n return CustomPluginSchema.transform((plugin) => plugin as Plugin).brand(\"Plugin\");\n}\n","import { type Executor } from \"@/parser/service/executor\";\nimport { type Resolver } from \"@/parser/service/resolver\";\nimport type { PluginAttachment } from \"@/parser/plugin-config/types\";\nimport type { IdProviderConfig, OAuth2ClientInput } from \"@/parser/service/auth/types\";\nimport type { TailorDBType, TypeSourceInfoEntry } from \"@/parser/service/tailordb/types\";\n\nexport type { PluginAttachment } from \"@/parser/plugin-config/types\";\n\n// ========================================\n// Basic types\n// ========================================\n\ninterface GeneratedFile {\n path: string;\n content: string;\n skipIfExists?: boolean; // default: false\n executable?: boolean; // default: false - if true, sets chmod +x\n}\n\nexport interface GeneratorResult {\n files: GeneratedFile[];\n errors?: string[];\n}\n\n// Namespace results for TailorDB\nexport interface TailorDBNamespaceResult<T> {\n namespace: string;\n types: T;\n}\n\n// Namespace results for Resolver\nexport interface ResolverNamespaceResult<R> {\n namespace: string;\n resolvers: R;\n}\n\n// Auth configuration for generators\nexport interface GeneratorAuthInput {\n name: string;\n userProfile?: {\n typeName: string;\n namespace: string;\n usernameField: string;\n };\n machineUsers?: Record<string, { attributes: Record<string, unknown> }>;\n oauth2Clients?: Record<string, OAuth2ClientInput>;\n idProvider?: IdProviderConfig;\n}\n\n// ========================================\n// Dependency types\n// ========================================\n\nexport type DependencyKind = \"tailordb\" | \"resolver\" | \"executor\";\n\n// Check if array includes a specific element\ntype ArrayIncludes<T extends readonly unknown[], U> = T extends readonly [\n infer First,\n ...infer Rest,\n]\n ? First extends U\n ? true\n : ArrayIncludes<Rest, U>\n : false;\n\n// Check if dependencies array includes a specific dependency\nexport type HasDependency<\n Deps extends readonly DependencyKind[],\n D extends DependencyKind,\n> = ArrayIncludes<Deps, D>;\n\n// ========================================\n// Source info type for TailorDB types\n// Re-exported from parser module\n// ========================================\n\nexport type {\n UserDefinedTypeSource,\n PluginGeneratedTypeSource,\n TypeSourceInfoEntry,\n} from \"@/parser/service/tailordb/types\";\nexport { isPluginGeneratedType } from \"@/parser/service/tailordb/types\";\n\n// ========================================\n// Method interfaces for each dependency\n// ========================================\n\nexport interface TailorDBProcessMethods<T, Ts> {\n processType(args: {\n type: TailorDBType;\n namespace: string;\n source: TypeSourceInfoEntry;\n /** Plugin attachments configured on this type via .plugin() method */\n plugins: readonly PluginAttachment[];\n }): T | Promise<T>;\n\n processTailorDBNamespace?(args: {\n namespace: string;\n types: Record<string, T>;\n }): Ts | Promise<Ts>;\n}\n\nexport interface ResolverProcessMethods<R, Rs> {\n processResolver(args: { resolver: Resolver; namespace: string }): R | Promise<R>;\n\n processResolverNamespace?(args: {\n namespace: string;\n resolvers: Record<string, R>;\n }): Rs | Promise<Rs>;\n}\n\nexport interface ExecutorProcessMethods<E> {\n processExecutor(executor: Executor): E | Promise<E>;\n}\n\n// ========================================\n// Conditional method selection\n// ========================================\n\ntype SelectMethods<Deps extends readonly DependencyKind[], T, R, E, Ts, Rs> = (HasDependency<\n Deps,\n \"tailordb\"\n> extends true\n ? TailorDBProcessMethods<T, Ts>\n : object) &\n (HasDependency<Deps, \"resolver\"> extends true ? ResolverProcessMethods<R, Rs> : object) &\n (HasDependency<Deps, \"executor\"> extends true ? ExecutorProcessMethods<E> : object);\n\n// ========================================\n// Conditional input selection for aggregate\n// ========================================\n\ninterface TailorDBInputPart<Ts> {\n tailordb: TailorDBNamespaceResult<Ts>[];\n}\n\ninterface ResolverInputPart<Rs> {\n resolver: ResolverNamespaceResult<Rs>[];\n}\n\ninterface ExecutorInputPart<E> {\n executor: E[];\n}\n\n// Auth is always available (resolved after TailorDB, before generators)\ninterface AuthPart {\n auth?: GeneratorAuthInput;\n}\n\ntype SelectInput<Deps extends readonly DependencyKind[], Ts, Rs, E> = (HasDependency<\n Deps,\n \"tailordb\"\n> extends true\n ? TailorDBInputPart<Ts>\n : object) &\n (HasDependency<Deps, \"resolver\"> extends true ? ResolverInputPart<Rs> : object) &\n (HasDependency<Deps, \"executor\"> extends true ? ExecutorInputPart<E> : object) &\n AuthPart;\n\n/** Input type for TailorDB-only generators */\nexport type TailorDBInput<Ts> = TailorDBInputPart<Ts> & AuthPart;\n\n/** Input type for Resolver-only generators */\nexport type ResolverInput<Rs> = ResolverInputPart<Rs> & AuthPart;\n\n/** Input type for Executor-only generators */\nexport type ExecutorInput<E> = ExecutorInputPart<E> & AuthPart;\n\n/** Input type for full generators (TailorDB + Resolver + Executor) */\nexport type FullInput<Ts, Rs, E> = TailorDBInputPart<Ts> &\n ResolverInputPart<Rs> &\n ExecutorInputPart<E> &\n AuthPart;\n\n/** Arguments type for aggregate method */\nexport interface AggregateArgs<Input> {\n input: Input;\n baseDir: string;\n configPath: string;\n}\n\n// ========================================\n// CodeGenerator type definition\n// ========================================\n\ninterface CodeGeneratorCore {\n readonly id: string;\n readonly description: string;\n}\n\n/**\n * Generator interface with dependencies-based conditional methods.\n * @template Deps - Dependencies array (e.g., ['tailordb'], ['tailordb', 'resolver'])\n * @template T - Return type of processType\n * @template R - Return type of processResolver\n * @template E - Return type of processExecutor\n * @template Ts - Return type of processTailorDBNamespace (default: Record<string, T>)\n * @template Rs - Return type of processResolverNamespace (default: Record<string, R>)\n */\nexport type CodeGenerator<\n Deps extends readonly DependencyKind[],\n T = unknown,\n R = unknown,\n E = unknown,\n Ts = Record<string, T>,\n Rs = Record<string, R>,\n> = CodeGeneratorCore &\n SelectMethods<Deps, T, R, E, Ts, Rs> & {\n readonly dependencies: Deps;\n\n aggregate(args: {\n input: SelectInput<Deps, Ts, Rs, E>;\n baseDir: string;\n configPath: string;\n }): GeneratorResult | Promise<GeneratorResult>;\n };\n\n// ========================================\n// Helper types for common generator patterns\n// ========================================\n\n/** TailorDB-only generator */\nexport type TailorDBGenerator<T = unknown, Ts = Record<string, T>> = CodeGenerator<\n readonly [\"tailordb\"],\n T,\n never,\n never,\n Ts,\n never\n>;\n\n/** Resolver-only generator */\nexport type ResolverGenerator<R = unknown, Rs = Record<string, R>> = CodeGenerator<\n readonly [\"resolver\"],\n never,\n R,\n never,\n never,\n Rs\n>;\n\n/** Executor-only generator */\nexport type ExecutorGenerator<E = unknown> = CodeGenerator<\n readonly [\"executor\"],\n never,\n never,\n E,\n never,\n never\n>;\n\n/** TailorDB + Resolver generator */\nexport type TailorDBResolverGenerator<\n T = unknown,\n R = unknown,\n Ts = Record<string, T>,\n Rs = Record<string, R>,\n> = CodeGenerator<readonly [\"tailordb\", \"resolver\"], T, R, never, Ts, Rs>;\n\n/** Full generator (all dependencies) */\nexport type FullCodeGenerator<\n T = unknown,\n R = unknown,\n E = unknown,\n Ts = Record<string, T>,\n Rs = Record<string, R>,\n> = CodeGenerator<readonly [\"tailordb\", \"resolver\", \"executor\"], T, R, E, Ts, Rs>;\n\n// ========================================\n// Runtime utility\n// ========================================\n\ninterface DependencyCarrier {\n dependencies: readonly DependencyKind[];\n}\n\n/**\n * Type guard to check if a generator has a specific dependency.\n * @template D\n * @param generator - Code generator instance\n * @param dependency - Dependency kind to check\n * @returns True if the generator has the dependency\n */\nexport function hasDependency<D extends DependencyKind>(\n generator: DependencyCarrier,\n dependency: D,\n): boolean {\n return generator.dependencies.includes(dependency);\n}\n\n// Type for any generator (used in GenerationManager)\n// This is a more permissive type that includes all possible methods\nexport interface AnyCodeGenerator {\n readonly id: string;\n readonly description: string;\n readonly dependencies: readonly DependencyKind[];\n\n processType?(args: {\n type: TailorDBType;\n namespace: string;\n source: TypeSourceInfoEntry;\n plugins: readonly PluginAttachment[];\n }): unknown | Promise<unknown>;\n\n processTailorDBNamespace?(args: {\n namespace: string;\n types: Record<string, unknown>;\n }): unknown | Promise<unknown>;\n\n processResolver?(args: { resolver: Resolver; namespace: string }): unknown | Promise<unknown>;\n\n processResolverNamespace?(args: {\n namespace: string;\n resolvers: Record<string, unknown>;\n }): unknown | Promise<unknown>;\n\n processExecutor?(executor: Executor): unknown | Promise<unknown>;\n\n aggregate(args: {\n input: Record<string, unknown>;\n baseDir: string;\n configPath: string;\n }): GeneratorResult | Promise<GeneratorResult>;\n}\n","import type { EnumDefinition } from \"./types\";\n\n/**\n * Generate enum constant definitions from collected metadata.\n * @param allEnums - All collected enum definitions\n * @returns Generated enum constant definitions\n */\nexport function generateUnifiedEnumConstants(allEnums: EnumDefinition[]): string {\n if (allEnums.length === 0) {\n return \"\";\n }\n\n const enumMap = new Map<string, EnumDefinition>();\n for (const enumDef of allEnums) {\n enumMap.set(enumDef.name, enumDef);\n }\n\n const enumDefs = Array.from(enumMap.values())\n .map((e) => {\n const members = e.values\n .map((v) => {\n const key = v.value.replace(/[-\\s]/g, \"_\");\n return ` \"${key}\": \"${v.value}\"`;\n })\n .join(\",\\n\");\n\n const hasDescriptions = e.values.some((v) => v.description);\n let jsDoc = \"\";\n if (e.fieldDescription || hasDescriptions) {\n const lines: string[] = [];\n\n if (e.fieldDescription) {\n lines.push(` * ${e.fieldDescription}`);\n if (hasDescriptions) {\n lines.push(\" *\");\n }\n }\n\n if (hasDescriptions) {\n const propertyDocs = e.values.map((v) => {\n const key = v.value.replace(/[-\\s]/g, \"_\");\n return ` * @property ${[key, v.description].filter(Boolean).join(\" - \")}`;\n });\n lines.push(...propertyDocs);\n }\n\n if (lines.length > 0) {\n jsDoc = `/**\\n${lines.join(\"\\n\")}\\n */\\n`;\n }\n }\n\n const constDef = `${jsDoc}export const ${e.name} = {\\n${members}\\n} as const;`;\n const typeDef = `export type ${e.name} = (typeof ${e.name})[keyof typeof ${e.name}];`;\n return `${constDef}\\n${typeDef}`;\n })\n .join(\"\\n\\n\");\n\n if (!enumDefs) {\n return \"\";\n }\n\n return enumDefs + \"\\n\";\n}\n","import type { EnumConstantMetadata } from \"./types\";\nimport type { TailorDBType } from \"@/parser/service/tailordb/types\";\n\nfunction capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction collectEnums(type: TailorDBType): EnumConstantMetadata[\"enums\"] {\n const enums: EnumConstantMetadata[\"enums\"] = [];\n\n for (const [fieldName, parsedField] of Object.entries(type.fields)) {\n if (parsedField.config.type === \"enum\" && parsedField.config.allowedValues) {\n const enumTypeName = `${type.name}${capitalizeFirst(fieldName)}`;\n enums.push({\n name: enumTypeName,\n values: parsedField.config.allowedValues,\n fieldDescription: parsedField.config.description,\n });\n }\n\n // Process nested fields\n if (parsedField.config.type === \"nested\" && parsedField.config.fields) {\n for (const [nestedFieldName, nestedFieldConfig] of Object.entries(\n parsedField.config.fields,\n )) {\n if (nestedFieldConfig.type === \"enum\" && nestedFieldConfig.allowedValues) {\n const fullFieldName = `${fieldName}${capitalizeFirst(nestedFieldName)}`;\n const enumTypeName = `${type.name}${capitalizeFirst(fullFieldName)}`;\n enums.push({\n name: enumTypeName,\n values: nestedFieldConfig.allowedValues,\n fieldDescription: nestedFieldConfig.description,\n });\n }\n }\n }\n }\n\n return enums;\n}\n\n/**\n * Process a TailorDB type and extract enum metadata.\n * @param type - The parsed TailorDB type to process\n * @returns Enum constant metadata for the type\n */\nexport async function processEnumType(type: TailorDBType): Promise<EnumConstantMetadata> {\n const enums = collectEnums(type);\n\n return {\n name: type.name,\n enums,\n };\n}\n","import {\n type TailorDBGenerator,\n type TailorDBInput,\n type AggregateArgs,\n type GeneratorResult,\n} from \"@/cli/generator/types\";\nimport { generateUnifiedEnumConstants } from \"./generate-enum-constants\";\nimport { processEnumType } from \"./process-enum-type\";\nimport {\n type EnumConstantMetadata,\n type EnumDefinition,\n type EnumNamespaceMetadata,\n} from \"./types\";\nimport type { TailorDBType } from \"@/parser/service/tailordb/types\";\n\nexport const EnumConstantsGeneratorID = \"@tailor-platform/enum-constants\";\n\ntype EnumConstantsGeneratorOptions = {\n distPath: string;\n};\n\n/**\n * Create an enum constants generator from TailorDB type definitions.\n * @param options - Generator options\n * @param options.distPath - Output file path\n * @returns TailorDB generator instance\n */\nexport function createEnumConstantsGenerator(options: EnumConstantsGeneratorOptions) {\n return {\n id: EnumConstantsGeneratorID,\n description: \"Generates enum constants from TailorDB type definitions\",\n dependencies: [\"tailordb\"] as const,\n\n async processType(args: {\n type: TailorDBType;\n namespace: string;\n }): Promise<EnumConstantMetadata> {\n return await processEnumType(args.type);\n },\n\n async processTailorDBNamespace(args: {\n namespace: string;\n types: Record<string, EnumConstantMetadata>;\n }): Promise<EnumNamespaceMetadata> {\n const allEnums: EnumDefinition[] = [];\n for (const enumConstantMetadata of Object.values(args.types)) {\n allEnums.push(...enumConstantMetadata.enums);\n }\n\n return {\n namespace: args.namespace,\n enums: allEnums,\n };\n },\n\n aggregate(args: AggregateArgs<TailorDBInput<EnumNamespaceMetadata>>): GeneratorResult {\n const files: GeneratorResult[\"files\"] = [];\n\n const allEnums: EnumDefinition[] = [];\n\n for (const nsResult of args.input.tailordb) {\n if (nsResult.types && nsResult.types.enums.length > 0) {\n allEnums.push(...nsResult.types.enums);\n }\n }\n\n if (allEnums.length > 0) {\n const content = generateUnifiedEnumConstants(allEnums);\n files.push({\n path: options.distPath,\n content,\n });\n }\n\n return { files };\n },\n } satisfies TailorDBGenerator<EnumConstantMetadata, EnumNamespaceMetadata>;\n}\n","import multiline from \"multiline-ts\";\nimport type { FileUtilMetadata } from \"./types\";\n\n/**\n * Generate unified file utility functions from collected metadata.\n * @param namespaceData - Namespace data with file utility metadata\n * @returns Generated file utility code\n */\nexport function generateUnifiedFileUtils(\n namespaceData: { namespace: string; types: FileUtilMetadata[] }[],\n): string {\n if (namespaceData.length === 0) {\n return \"\";\n }\n\n // Collect all types with their namespace\n const typeNamespaceMap = new Map<string, string>();\n const typeFieldsMap = new Map<string, string[]>();\n\n for (const { namespace, types } of namespaceData) {\n for (const type of types) {\n typeNamespaceMap.set(type.name, namespace);\n typeFieldsMap.set(type.name, type.fileFields);\n }\n }\n\n if (typeNamespaceMap.size === 0) {\n return \"\";\n }\n\n // Generate interface fields\n const interfaceFields = Array.from(typeFieldsMap.entries())\n .map(([typeName, fields]) => {\n const fieldNamesUnion = fields.map((field) => `\"${field}\"`).join(\" | \");\n return ` ${typeName}: {\\n fields: ${fieldNamesUnion};\\n };`;\n })\n .join(\"\\n\");\n\n const interfaceDefinition =\n multiline /* ts */ `\n export interface TypeWithFiles {\n ${interfaceFields}\n }\n ` + \"\\n\";\n\n // Generate namespaces object\n const namespaceEntries = Array.from(typeNamespaceMap.entries())\n .map(([typeName, namespace]) => ` ${typeName}: \"${namespace}\"`)\n .join(\",\\n\");\n\n const namespacesDefinition =\n multiline /* ts */ `\n const namespaces: Record<keyof TypeWithFiles, string> = {\n ${namespaceEntries},\n };\n ` + \"\\n\";\n\n // Generate downloadFile helper function\n const downloadFunction =\n multiline /* ts */ `\n export async function downloadFile<T extends keyof TypeWithFiles>(\n type: T,\n field: TypeWithFiles[T][\"fields\"],\n recordId: string,\n ) {\n return await tailordb.file.download(namespaces[type], type, field, recordId);\n }\n ` + \"\\n\";\n\n // Generate uploadFile helper function\n const uploadFunction =\n multiline /* ts */ `\n export async function uploadFile<T extends keyof TypeWithFiles>(\n type: T,\n field: TypeWithFiles[T][\"fields\"],\n recordId: string,\n data: string | ArrayBuffer | Uint8Array<ArrayBufferLike> | number[],\n options?: FileUploadOptions,\n ): Promise<FileUploadResponse> {\n return await tailordb.file.upload(namespaces[type], type, field, recordId, data, options);\n }\n ` + \"\\n\";\n\n // Generate deleteFile helper function\n const deleteFunction =\n multiline /* ts */ `\n export async function deleteFile<T extends keyof TypeWithFiles>(\n type: T,\n field: TypeWithFiles[T][\"fields\"],\n recordId: string,\n ): Promise<void> {\n return await tailordb.file.delete(namespaces[type], type, field, recordId);\n }\n ` + \"\\n\";\n\n // Generate getFileMetadata helper function\n const getMetadataFunction =\n multiline /* ts */ `\n export async function getFileMetadata<T extends keyof TypeWithFiles>(\n type: T,\n field: TypeWithFiles[T][\"fields\"],\n recordId: string,\n ): Promise<FileMetadata> {\n return await tailordb.file.getMetadata(namespaces[type], type, field, recordId);\n }\n ` + \"\\n\";\n\n // Generate openFileDownloadStream helper function\n const openDownloadStreamFunction =\n multiline /* ts */ `\n export async function openFileDownloadStream<T extends keyof TypeWithFiles>(\n type: T,\n field: TypeWithFiles[T][\"fields\"],\n recordId: string,\n ): Promise<FileStreamIterator> {\n return await tailordb.file.openDownloadStream(namespaces[type], type, field, recordId);\n }\n ` + \"\\n\";\n\n return [\n interfaceDefinition,\n namespacesDefinition,\n downloadFunction,\n uploadFunction,\n deleteFunction,\n getMetadataFunction,\n openDownloadStreamFunction,\n ].join(\"\\n\");\n}\n","import type { FileUtilMetadata } from \"./types\";\nimport type { TailorDBType } from \"@/parser/service/tailordb/types\";\n\n/**\n * Process a TailorDB type and extract file field metadata.\n * @param type - The parsed TailorDB type to process\n * @returns File utility metadata for the type\n */\nexport async function processFileType(type: TailorDBType): Promise<FileUtilMetadata> {\n const fileFields: string[] = [];\n\n if (type.files) {\n for (const fileFieldName of Object.keys(type.files)) {\n fileFields.push(fileFieldName);\n }\n }\n\n return {\n name: type.name,\n fileFields,\n };\n}\n","import {\n type TailorDBGenerator,\n type TailorDBInput,\n type AggregateArgs,\n type GeneratorResult,\n} from \"@/cli/generator/types\";\nimport { generateUnifiedFileUtils } from \"./generate-file-utils\";\nimport { processFileType } from \"./process-file-type\";\nimport { type FileUtilMetadata } from \"./types\";\nimport type { TailorDBType } from \"@/parser/service/tailordb/types\";\n\nexport const FileUtilsGeneratorID = \"@tailor-platform/file-utils\";\n\ntype FileUtilsGeneratorOptions = {\n distPath: string;\n};\n\n/**\n * Create a file utilities generator from TailorDB type definitions.\n * @param options - Generator options\n * @param options.distPath - Output file path\n * @returns TailorDB generator instance\n */\nexport function createFileUtilsGenerator(options: FileUtilsGeneratorOptions) {\n return {\n id: FileUtilsGeneratorID,\n description: \"Generates TypeWithFiles interface from TailorDB type definitions\",\n dependencies: [\"tailordb\"] as const,\n\n async processType(args: { type: TailorDBType; namespace: string }): Promise<FileUtilMetadata> {\n return await processFileType(args.type);\n },\n\n async processTailorDBNamespace(args: {\n namespace: string;\n types: Record<string, FileUtilMetadata>;\n }): Promise<string> {\n // Return empty string for now - actual generation happens in aggregate\n const typesWithFiles = Object.values(args.types).filter((t) => t.fileFields.length > 0);\n if (typesWithFiles.length === 0) {\n return \"\";\n }\n // Store namespace info as JSON to be parsed in aggregate\n return JSON.stringify({\n namespace: args.namespace,\n types: typesWithFiles,\n });\n },\n\n aggregate(args: AggregateArgs<TailorDBInput<string>>): GeneratorResult {\n const files: GeneratorResult[\"files\"] = [];\n\n // Collect all namespace metadata\n const allNamespaceData: { namespace: string; types: FileUtilMetadata[] }[] = [];\n\n for (const nsResult of args.input.tailordb) {\n if (nsResult.types) {\n try {\n const parsed = JSON.parse(nsResult.types);\n if (parsed.namespace && parsed.types) {\n allNamespaceData.push(parsed);\n }\n } catch {\n // Ignore invalid JSON (should not happen)\n }\n }\n }\n\n // If there are any types with files, generate the unified output\n if (allNamespaceData.length > 0) {\n const content = generateUnifiedFileUtils(allNamespaceData);\n if (content) {\n files.push({\n path: options.distPath,\n content,\n });\n }\n }\n\n return { files };\n },\n } satisfies TailorDBGenerator<FileUtilMetadata, string>;\n}\n","import multiline from \"multiline-ts\";\nimport { type KyselyNamespaceMetadata, type KyselyTypeMetadata } from \"./types\";\nimport type { OperatorFieldConfig, TailorDBType } from \"@/parser/service/tailordb/types\";\n\ntype UsedUtilityTypes = { Timestamp: boolean; Serial: boolean };\n\ntype FieldTypeResult = {\n type: string;\n usedUtilityTypes: UsedUtilityTypes;\n};\n\n/**\n * Get the enum type definition.\n * @param fieldConfig - The field configuration\n * @returns The enum type as a string union\n */\nfunction getEnumType(fieldConfig: OperatorFieldConfig): string {\n const allowedValues = fieldConfig.allowedValues;\n\n if (allowedValues && Array.isArray(allowedValues)) {\n return allowedValues\n .map((v: string | { value: string }) => {\n const value = typeof v === \"string\" ? v : v.value;\n return `\"${value}\"`;\n })\n .join(\" | \");\n }\n return \"string\";\n}\n\n/**\n * Get the nested object type definition.\n * @param fieldConfig - The field configuration\n * @returns The nested type with used utility types\n */\nfunction getNestedType(fieldConfig: OperatorFieldConfig): FieldTypeResult {\n const fields = fieldConfig.fields;\n if (!fields || typeof fields !== \"object\") {\n return {\n type: \"string\",\n usedUtilityTypes: { Timestamp: false, Serial: false },\n };\n }\n\n const fieldResults = Object.entries(fields).map(([fieldName, nestedOperatorFieldConfig]) => ({\n fieldName,\n ...generateFieldType(nestedOperatorFieldConfig),\n }));\n\n const fieldTypes = fieldResults.map((result) => `${result.fieldName}: ${result.type}`);\n\n const aggregatedUtilityTypes = fieldResults.reduce(\n (acc, result) => ({\n Timestamp: acc.Timestamp || result.usedUtilityTypes.Timestamp,\n Serial: acc.Serial || result.usedUtilityTypes.Serial,\n }),\n { Timestamp: false, Serial: false },\n );\n\n const type = `{\\n ${fieldTypes.join(\";\\n \")}${fieldTypes.length > 0 ? \";\" : \"\"}\\n}`;\n return { type, usedUtilityTypes: aggregatedUtilityTypes };\n}\n\n/**\n * Get the base Kysely type for a field (without array/null modifiers).\n * @param fieldConfig - The field configuration\n * @returns The base type with used utility types\n */\nfunction getBaseType(fieldConfig: OperatorFieldConfig): FieldTypeResult {\n const fieldType = fieldConfig.type;\n const usedUtilityTypes = { Timestamp: false, Serial: false };\n\n let type: string;\n switch (fieldType) {\n case \"uuid\":\n case \"string\":\n type = \"string\";\n break;\n case \"integer\":\n case \"float\":\n type = \"number\";\n break;\n case \"date\":\n case \"datetime\":\n usedUtilityTypes.Timestamp = true;\n type = \"Timestamp\";\n break;\n case \"bool\":\n case \"boolean\":\n type = \"boolean\";\n break;\n case \"enum\":\n type = getEnumType(fieldConfig);\n break;\n case \"nested\": {\n const nestedResult = getNestedType(fieldConfig);\n return nestedResult;\n }\n default:\n type = \"string\";\n break;\n }\n\n return { type, usedUtilityTypes };\n}\n\n/**\n * Generate the complete field type including array and null modifiers.\n * @param fieldConfig - The field configuration\n * @returns The complete field type with used utility types\n */\nfunction generateFieldType(fieldConfig: OperatorFieldConfig): FieldTypeResult {\n const baseTypeResult = getBaseType(fieldConfig);\n const usedUtilityTypes = { ...baseTypeResult.usedUtilityTypes };\n\n const isArray = fieldConfig.array === true;\n const isNullable = fieldConfig.required !== true;\n\n let finalType = baseTypeResult.type;\n if (isArray) {\n // Wrap enum types in parentheses before adding array suffix\n const needsParens = fieldConfig.type === \"enum\";\n finalType = needsParens ? `(${baseTypeResult.type})[]` : `${baseTypeResult.type}[]`;\n }\n if (isNullable) {\n finalType = `${finalType} | null`;\n }\n\n if (fieldConfig.serial) {\n usedUtilityTypes.Serial = true;\n finalType = `Serial<${finalType}>`;\n }\n if (fieldConfig.hooks?.create) {\n finalType = `Generated<${finalType}>`;\n }\n\n return { type: finalType, usedUtilityTypes };\n}\n\n/**\n * Generate the table interface.\n * @param type - The parsed TailorDB type\n * @returns The type definition and used utility types\n */\nfunction generateTableInterface(type: TailorDBType): {\n typeDef: string;\n usedUtilityTypes: UsedUtilityTypes;\n} {\n const fieldEntries = Object.entries(type.fields).filter(([fieldName]) => fieldName !== \"id\");\n\n const fieldResults = fieldEntries.map(([fieldName, parsedField]) => ({\n fieldName,\n ...generateFieldType(parsedField.config),\n }));\n\n const fields = [\n \"id: Generated<string>;\",\n ...fieldResults.map((result) => `${result.fieldName}: ${result.type};`),\n ];\n\n const aggregatedUtilityTypes = fieldResults.reduce(\n (acc, result) => ({\n Timestamp: acc.Timestamp || result.usedUtilityTypes.Timestamp,\n Serial: acc.Serial || result.usedUtilityTypes.Serial,\n }),\n { Timestamp: false, Serial: false },\n );\n\n const typeDef = multiline /* ts */ `\n ${type.name}: {\n ${fields.join(\"\\n\")}\n }\n `;\n\n return { typeDef, usedUtilityTypes: aggregatedUtilityTypes };\n}\n\n/**\n * Convert a TailorDBType into KyselyTypeMetadata.\n * @param type - Parsed TailorDB type\n * @returns Generated Kysely type metadata\n */\nexport async function processKyselyType(type: TailorDBType): Promise<KyselyTypeMetadata> {\n const result = generateTableInterface(type);\n\n return {\n name: type.name,\n typeDef: result.typeDef,\n usedUtilityTypes: result.usedUtilityTypes,\n };\n}\n\n/**\n * Generate unified types file from multiple namespaces.\n * @param namespaceData - Namespace metadata\n * @returns Generated types file contents\n */\nexport function generateUnifiedKyselyTypes(namespaceData: KyselyNamespaceMetadata[]): string {\n if (namespaceData.length === 0) {\n return \"\";\n }\n\n // Aggregate used utility types from all namespaces\n const globalUsedUtilityTypes = namespaceData.reduce(\n (acc, ns) => ({\n Timestamp: acc.Timestamp || ns.usedUtilityTypes.Timestamp,\n Serial: acc.Serial || ns.usedUtilityTypes.Serial,\n }),\n { Timestamp: false, Serial: false },\n );\n\n const utilityTypeImports: string[] = [\"type Generated\"];\n if (globalUsedUtilityTypes.Timestamp) {\n utilityTypeImports.push(\"type Timestamp\");\n }\n if (globalUsedUtilityTypes.Serial) {\n utilityTypeImports.push(\"type Serial\");\n }\n\n const importsSection = multiline /* ts */ `\n import {\n createGetDB,\n ${utilityTypeImports.join(\",\\n\")},\n type NamespaceDB,\n type NamespaceInsertable,\n type NamespaceSelectable,\n type NamespaceTable,\n type NamespaceTableName,\n type NamespaceTransaction,\n type NamespaceUpdateable,\n } from \"@tailor-platform/sdk/kysely\";\n `;\n\n // Generate Namespace interface with multiple namespaces\n const namespaceInterfaces = namespaceData\n .map(({ namespace, types }) => {\n const typeDefsWithIndent = types\n .map((type) => {\n return type.typeDef\n .split(\"\\n\")\n .map((line) => (line.trim() ? ` ${line}` : \"\"))\n .join(\"\\n\");\n })\n .join(\"\\n\\n\");\n\n return ` \"${namespace}\": {\\n${typeDefsWithIndent}\\n }`;\n })\n .join(\",\\n\");\n\n const namespaceInterface = `export interface Namespace {\\n${namespaceInterfaces}\\n}`;\n\n const getDBFunction = multiline /* ts */ `\n export const getDB = createGetDB<Namespace>();\n\n export type DB<N extends keyof Namespace = keyof Namespace> = NamespaceDB<Namespace, N>;\n `;\n\n const utilityTypeExports = multiline /* ts */ `\n export type Transaction<K extends keyof Namespace | DB = keyof Namespace> =\n NamespaceTransaction<Namespace, K>;\n\n type TableName = NamespaceTableName<Namespace>;\n export type Table<T extends TableName> = NamespaceTable<Namespace, T>;\n\n export type Insertable<T extends TableName> = NamespaceInsertable<Namespace, T>;\n export type Selectable<T extends TableName> = NamespaceSelectable<Namespace, T>;\n export type Updateable<T extends TableName> = NamespaceUpdateable<Namespace, T>;\n `;\n\n return (\n [importsSection, namespaceInterface, getDBFunction, utilityTypeExports].join(\"\\n\\n\") + \"\\n\"\n );\n}\n","import {\n type TailorDBGenerator,\n type TailorDBInput,\n type AggregateArgs,\n type GeneratorResult,\n} from \"@/cli/generator/types\";\nimport { processKyselyType, generateUnifiedKyselyTypes } from \"./type-processor\";\nimport { type KyselyTypeMetadata, type KyselyNamespaceMetadata } from \"./types\";\nimport type { TailorDBType } from \"@/parser/service/tailordb/types\";\n\nexport const KyselyGeneratorID = \"@tailor-platform/kysely-type\";\n\ntype KyselyGeneratorOptions = {\n distPath: string;\n};\n\n/**\n * Create a Kysely type generator for TailorDB types.\n * @param options - Generator options\n * @param options.distPath - Output file path\n * @returns TailorDB generator instance\n */\nexport function createKyselyGenerator(options: KyselyGeneratorOptions) {\n return {\n id: KyselyGeneratorID,\n description: \"Generates Kysely type definitions for TailorDB types\",\n dependencies: [\"tailordb\"] as const,\n\n async processType(args: {\n type: TailorDBType;\n namespace: string;\n }): Promise<KyselyTypeMetadata> {\n return await processKyselyType(args.type);\n },\n\n async processTailorDBNamespace(args: {\n namespace: string;\n types: Record<string, KyselyTypeMetadata>;\n }): Promise<KyselyNamespaceMetadata> {\n const typesList = Object.values(args.types);\n\n const usedUtilityTypes = typesList.reduce(\n (acc, type) => ({\n Timestamp: acc.Timestamp || type.usedUtilityTypes.Timestamp,\n Serial: acc.Serial || type.usedUtilityTypes.Serial,\n }),\n { Timestamp: false, Serial: false },\n );\n\n return {\n namespace: args.namespace,\n types: typesList,\n usedUtilityTypes,\n };\n },\n\n aggregate(args: AggregateArgs<TailorDBInput<KyselyNamespaceMetadata>>): GeneratorResult {\n const files: GeneratorResult[\"files\"] = [];\n\n const allNamespaceData: KyselyNamespaceMetadata[] = [];\n\n for (const nsResult of args.input.tailordb) {\n if (nsResult.types && nsResult.types.types.length > 0) {\n allNamespaceData.push(nsResult.types);\n }\n }\n\n if (allNamespaceData.length > 0) {\n const content = generateUnifiedKyselyTypes(allNamespaceData);\n files.push({\n path: options.distPath,\n content,\n });\n }\n\n return { files };\n },\n } satisfies TailorDBGenerator<KyselyTypeMetadata, KyselyNamespaceMetadata>;\n}\n","import ml from \"multiline-ts\";\nimport type { GeneratorAuthInput } from \"@/cli/generator/types\";\n\nexport interface IdpUserMetadata {\n name: \"_User\";\n dependencies: string[];\n dataFile: string;\n idpNamespace: string;\n schema: {\n usernameField: string;\n userTypeName: string;\n };\n}\n\n/**\n * Processes auth configuration to generate IdP user seed metadata\n * @param auth - Auth configuration from generator\n * @returns IdP user metadata or undefined if not applicable\n */\nexport function processIdpUser(auth: GeneratorAuthInput): IdpUserMetadata | undefined {\n // Only process if idProvider is BuiltInIdP and userProfile is defined\n if (auth.idProvider?.kind !== \"BuiltInIdP\" || !auth.userProfile) {\n return undefined;\n }\n\n const { typeName, usernameField } = auth.userProfile;\n\n return {\n name: \"_User\",\n dependencies: [typeName],\n dataFile: \"data/_User.jsonl\",\n idpNamespace: auth.idProvider.namespace,\n schema: {\n usernameField,\n userTypeName: typeName,\n },\n };\n}\n\n/**\n * Generates the server-side IDP seed script code for testExecScript execution.\n * Uses the global tailor.idp.Client - no bundling required.\n * @param idpNamespace - The IDP namespace name\n * @returns Script code string\n */\nexport function generateIdpSeedScriptCode(idpNamespace: string): string {\n return ml /* ts */ `\n export async function main(input) {\n const client = new tailor.idp.Client({ namespace: \"${idpNamespace}\" });\n const errors = [];\n let processed = 0;\n\n for (let i = 0; i < input.users.length; i++) {\n try {\n await client.createUser(input.users[i]);\n processed++;\n console.log(\\`[_User] \\${i + 1}/\\${input.users.length}: \\${input.users[i].name}\\`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push(\\`Row \\${i} (\\${input.users[i].name}): \\${message}\\`);\n console.error(\\`[_User] Row \\${i} failed: \\${message}\\`);\n }\n }\n\n return {\n success: errors.length === 0,\n processed,\n errors,\n };\n }\n `;\n}\n\n/**\n * Generates the server-side IDP truncation script code for testExecScript execution.\n * Lists all users with pagination and deletes each one.\n * @param idpNamespace - The IDP namespace name\n * @returns Script code string\n */\nexport function generateIdpTruncateScriptCode(idpNamespace: string): string {\n return ml /* ts */ `\n export async function main() {\n const client = new tailor.idp.Client({ namespace: \"${idpNamespace}\" });\n const errors = [];\n let deleted = 0;\n\n // List all users with pagination\n let nextToken = undefined;\n const allUsers = [];\n do {\n const response = await client.users(nextToken ? { nextToken } : undefined);\n allUsers.push(...(response.users || []));\n nextToken = response.nextToken;\n } while (nextToken);\n\n console.log(\\`Found \\${allUsers.length} IDP users to delete\\`);\n\n for (const user of allUsers) {\n try {\n await client.deleteUser(user.id);\n deleted++;\n console.log(\\`[_User] Deleted \\${deleted}/\\${allUsers.length}: \\${user.name}\\`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push(\\`User \\${user.id} (\\${user.name}): \\${message}\\`);\n console.error(\\`[_User] Delete failed for \\${user.name}: \\${message}\\`);\n }\n }\n\n return {\n success: errors.length === 0,\n deleted,\n total: allUsers.length,\n errors,\n };\n }\n `;\n}\n\n/**\n * Generates the schema file content for IdP users with foreign key\n * @param usernameField - Username field name\n * @param userTypeName - TailorDB user type name\n * @returns Schema file contents\n */\nexport function generateIdpUserSchemaFile(usernameField: string, userTypeName: string): string {\n return ml /* ts */ `\n import { t } from \"@tailor-platform/sdk\";\n import { createStandardSchema } from \"@tailor-platform/sdk/test\";\n import { defineSchema } from \"@toiroakr/lines-db\";\n\n const schemaType = t.object({\n name: t.string(),\n password: t.string(),\n });\n\n // Simple identity hook for _User (no TailorDB backing type)\n const hook = <T>(data: unknown) => data as T;\n\n export const schema = defineSchema(\n createStandardSchema(schemaType, hook),\n {\n primaryKey: \"name\",\n indexes: [\n { name: \"_user_name_unique_idx\", columns: [\"name\"], unique: true },\n ],\n foreignKeys: [\n {\n column: \"name\",\n references: {\n table: \"${userTypeName}\",\n column: \"${usernameField}\",\n },\n },\n ],\n }\n );\n\n `;\n}\n","import ml from \"multiline-ts\";\nimport {\n isPluginGeneratedType,\n type PluginGeneratedTypeSource,\n type TypeSourceInfoEntry,\n} from \"@/cli/generator/types\";\nimport type { LinesDbMetadata } from \"./types\";\nimport type { TailorDBType } from \"@/parser/service/tailordb/types\";\nimport type { ForeignKeyDefinition, IndexDefinition } from \"@toiroakr/lines-db\";\n\n/**\n * Processes TailorDB types to generate lines-db metadata\n * @param type - Parsed TailorDB type\n * @param source - Source file info\n * @returns Generated lines-db metadata\n */\nexport function processLinesDb(type: TailorDBType, source: TypeSourceInfoEntry): LinesDbMetadata {\n if (isPluginGeneratedType(source)) {\n // Plugin-generated type\n return processLinesDbForPluginType(type, source);\n }\n\n // User-defined type\n if (!source.filePath) {\n throw new Error(`Missing source info for type ${type.name}`);\n }\n if (!source.exportName) {\n throw new Error(`Missing export name for type ${type.name}`);\n }\n\n const { optionalFields, omitFields, indexes, foreignKeys } = extractFieldMetadata(type);\n\n return {\n typeName: type.name,\n exportName: source.exportName,\n importPath: source.filePath,\n optionalFields,\n omitFields,\n foreignKeys,\n indexes,\n };\n}\n\n/**\n * Process lines-db metadata for plugin-generated types\n * @param type - Parsed TailorDB type\n * @param source - Plugin-generated type source info\n * @returns Generated lines-db metadata with plugin source\n */\nfunction processLinesDbForPluginType(\n type: TailorDBType,\n source: PluginGeneratedTypeSource,\n): LinesDbMetadata {\n const { optionalFields, omitFields, indexes, foreignKeys } = extractFieldMetadata(type);\n\n return {\n typeName: type.name,\n exportName: source.exportName,\n importPath: \"\",\n optionalFields,\n omitFields,\n foreignKeys,\n indexes,\n pluginSource: source,\n };\n}\n\n/**\n * Extract field metadata from TailorDB type\n * @param type - Parsed TailorDB type\n * @returns Field metadata including optional fields, omit fields, indexes, and foreign keys\n */\nfunction extractFieldMetadata(type: TailorDBType): {\n optionalFields: string[];\n omitFields: string[];\n indexes: IndexDefinition[];\n foreignKeys: ForeignKeyDefinition[];\n} {\n const optionalFields = [\"id\"]; // id is always optional\n const omitFields: string[] = [];\n const indexes: IndexDefinition[] = [];\n const foreignKeys: ForeignKeyDefinition[] = [];\n\n // Find fields with hooks.create or serial\n for (const [fieldName, field] of Object.entries(type.fields)) {\n if (field.config.hooks?.create) {\n optionalFields.push(fieldName);\n }\n // Serial fields are auto-generated, so they should be optional in seed data\n if (field.config.serial) {\n omitFields.push(fieldName);\n }\n if (field.config.unique) {\n indexes.push({\n name: `${type.name.toLowerCase()}_${fieldName}_unique_idx`,\n columns: [fieldName],\n unique: true,\n });\n }\n }\n\n // Extract indexes\n if (type.indexes) {\n for (const [indexName, indexDef] of Object.entries(type.indexes)) {\n indexes.push({\n name: indexName,\n columns: indexDef.fields,\n unique: indexDef.unique,\n });\n }\n }\n\n // Extract foreign keys from relations\n for (const [fieldName, field] of Object.entries(type.fields)) {\n if (field.relation) {\n foreignKeys.push({\n column: fieldName,\n references: {\n table: field.relation.targetType,\n column: field.relation.key,\n },\n });\n }\n }\n\n return { optionalFields, omitFields, indexes, foreignKeys };\n}\n\n/**\n * Generate schema options code for lines-db\n * @param foreignKeys - Foreign key definitions\n * @param indexes - Index definitions\n * @returns Schema options code string\n */\nfunction generateSchemaOptions(\n foreignKeys: ForeignKeyDefinition[],\n indexes: IndexDefinition[],\n): string {\n const schemaOptions: string[] = [];\n\n if (foreignKeys.length > 0) {\n schemaOptions.push(`foreignKeys: [`);\n foreignKeys.forEach((fk) => {\n schemaOptions.push(` ${JSON.stringify(fk)},`);\n });\n schemaOptions.push(`],`);\n }\n\n if (indexes.length > 0) {\n schemaOptions.push(`indexes: [`);\n indexes.forEach((index) => {\n schemaOptions.push(` ${JSON.stringify(index)},`);\n });\n schemaOptions.push(\"],\");\n }\n\n return schemaOptions.length > 0\n ? [\"\\n {\", ...schemaOptions.map((option) => ` ${option}`), \" }\"].join(\"\\n\")\n : \"\";\n}\n\n/**\n * Generates the schema file content for lines-db (for user-defined types with import)\n * @param metadata - lines-db metadata\n * @param importPath - Import path for the TailorDB type\n * @returns Schema file contents\n */\nexport function generateLinesDbSchemaFile(metadata: LinesDbMetadata, importPath: string): string {\n const { exportName, optionalFields, omitFields, foreignKeys, indexes } = metadata;\n\n const schemaTypeCode = ml /* ts */ `\n const schemaType = t.object({\n ...${exportName}.pickFields(${JSON.stringify(optionalFields)}, { optional: true }),\n ...${exportName}.omitFields(${JSON.stringify([...optionalFields, ...omitFields])}),\n });\n `;\n\n const schemaOptionsCode = generateSchemaOptions(foreignKeys, indexes);\n\n return ml /* ts */ `\n import { t } from \"@tailor-platform/sdk\";\n import { createTailorDBHook, createStandardSchema } from \"@tailor-platform/sdk/test\";\n import { defineSchema } from \"@toiroakr/lines-db\";\n import { ${exportName} } from \"${importPath}\";\n\n ${schemaTypeCode}\n\n const hook = createTailorDBHook(${exportName});\n\n export const schema = defineSchema(\n createStandardSchema(schemaType, hook),${schemaOptionsCode}\n );\n\n `;\n}\n\n/**\n * Parameters for generating plugin-type schema file\n */\nexport interface PluginSchemaParams {\n /** Relative path from schema output to tailor.config.ts */\n configImportPath: string;\n /** Relative import path to the original type file (for type-attached plugins) */\n originalImportPath?: string;\n}\n\n/**\n * Generates the schema file content using getGeneratedType API\n * (for plugin-generated types)\n * @param metadata - lines-db metadata (must have pluginSource)\n * @param params - Plugin import paths\n * @returns Schema file contents\n */\nexport function generateLinesDbSchemaFileWithPluginAPI(\n metadata: LinesDbMetadata,\n params: PluginSchemaParams,\n): string {\n const { typeName, exportName, optionalFields, omitFields, foreignKeys, indexes, pluginSource } =\n metadata;\n\n if (!pluginSource) {\n throw new Error(`pluginSource is required for plugin-generated type \"${typeName}\"`);\n }\n\n const { configImportPath, originalImportPath } = params;\n\n const schemaTypeCode = ml /* ts */ `\n const schemaType = t.object({\n ...${exportName}.pickFields(${JSON.stringify(optionalFields)}, { optional: true }),\n ...${exportName}.omitFields(${JSON.stringify([...optionalFields, ...omitFields])}),\n });\n `;\n\n const schemaOptionsCode = generateSchemaOptions(foreignKeys, indexes);\n\n // Type-attached plugin (e.g., changeset): import original type and use getGeneratedType(configPath, pluginId, type, kind)\n if (pluginSource.originalExportName && originalImportPath && pluginSource.generatedTypeKind) {\n return ml /* ts */ `\n import { join } from \"node:path\";\n import { t } from \"@tailor-platform/sdk\";\n import { getGeneratedType } from \"@tailor-platform/sdk/plugin\";\n import { createTailorDBHook, createStandardSchema } from \"@tailor-platform/sdk/test\";\n import { defineSchema } from \"@toiroakr/lines-db\";\n import { ${pluginSource.originalExportName} } from \"${originalImportPath}\";\n\n const configPath = join(import.meta.dirname, \"${configImportPath}\");\n const ${exportName} = await getGeneratedType(configPath, \"${pluginSource.pluginId}\", ${pluginSource.originalExportName}, \"${pluginSource.generatedTypeKind}\");\n\n ${schemaTypeCode}\n\n const hook = createTailorDBHook(${exportName});\n\n export const schema = defineSchema(\n createStandardSchema(schemaType, hook),${schemaOptionsCode}\n );\n\n `;\n }\n\n // Namespace plugin (e.g., audit-log): use getGeneratedType(configPath, pluginId, null, kind)\n // For namespace plugins, generatedTypeKind is required\n if (!pluginSource.generatedTypeKind) {\n throw new Error(\n `Namespace plugin \"${pluginSource.pluginId}\" must provide generatedTypeKind for type \"${typeName}\"`,\n );\n }\n\n return ml /* ts */ `\n import { join } from \"node:path\";\n import { t } from \"@tailor-platform/sdk\";\n import { getGeneratedType } from \"@tailor-platform/sdk/plugin\";\n import { createTailorDBHook, createStandardSchema } from \"@tailor-platform/sdk/test\";\n import { defineSchema } from \"@toiroakr/lines-db\";\n\n const configPath = join(import.meta.dirname, \"${configImportPath}\");\n const ${exportName} = await getGeneratedType(configPath, \"${pluginSource.pluginId}\", null, \"${pluginSource.generatedTypeKind}\");\n\n ${schemaTypeCode}\n\n const hook = createTailorDBHook(${exportName});\n\n export const schema = defineSchema(\n createStandardSchema(schemaType, hook),${schemaOptionsCode}\n );\n\n `;\n}\n","import type { SeedTypeInfo } from \"./types\";\nimport type { TailorDBType } from \"@/parser/service/tailordb/types\";\n\n/**\n * Processes TailorDB types to extract seed type information\n * @param type - Parsed TailorDB type\n * @param namespace - Namespace of the type\n * @returns Seed type information\n */\nexport function processSeedTypeInfo(type: TailorDBType, namespace: string): SeedTypeInfo {\n // Extract dependencies from relations (including keyOnly which only sets foreignKeyType)\n const dependencies = Array.from(\n Object.values(type.fields).reduce<Set<string>>((set, field) => {\n const targetType = field.relation?.targetType ?? field.config.foreignKeyType;\n if (targetType && targetType !== type.name) {\n set.add(targetType);\n }\n return set;\n }, new Set<string>()),\n );\n\n return {\n name: type.name,\n namespace,\n dependencies,\n dataFile: `data/${type.name}.jsonl`,\n };\n}\n","import ml from \"multiline-ts\";\nimport * as path from \"pathe\";\nimport {\n type TailorDBGenerator,\n type TailorDBInput,\n type AggregateArgs,\n type GeneratorResult,\n} from \"@/cli/generator/types\";\nimport {\n processIdpUser,\n generateIdpUserSchemaFile,\n generateIdpSeedScriptCode,\n generateIdpTruncateScriptCode,\n} from \"./idp-user-processor\";\nimport {\n processLinesDb,\n generateLinesDbSchemaFile,\n generateLinesDbSchemaFileWithPluginAPI,\n type PluginSchemaParams,\n} from \"./lines-db-processor\";\nimport { processSeedTypeInfo } from \"./seed-type-processor\";\nimport type { SeedTypeMetadata } from \"./types\";\n\nexport const SeedGeneratorID = \"@tailor-platform/seed\";\n\ntype SeedGeneratorOptions = {\n distPath: string;\n machineUserName?: string;\n};\n\ntype NamespaceConfig = {\n namespace: string;\n types: string[];\n dependencies: Record<string, string[]>;\n};\n\n/**\n * Generate the IdP user seed function code using tailor.idp.Client via testExecScript\n * @param hasIdpUser - Whether IdP user is included\n * @param idpNamespace - The IDP namespace name\n * @returns JavaScript code for IdP user seeding function\n */\nfunction generateIdpUserSeedFunction(hasIdpUser: boolean, idpNamespace: string | null): string {\n if (!hasIdpUser || !idpNamespace) return \"\";\n\n const scriptCode = generateIdpSeedScriptCode(idpNamespace);\n\n return ml`\n // Seed _User via tailor.idp.Client (server-side)\n const seedIdpUser = async () => {\n console.log(styleText(\"cyan\", \" Seeding _User via tailor.idp.Client...\"));\n const dataDir = join(configDir, \"data\");\n const data = loadSeedData(dataDir, [\"_User\"]);\n const rows = data[\"_User\"] || [];\n if (rows.length === 0) {\n console.log(styleText(\"dim\", \" No _User data to seed\"));\n return { success: true };\n }\n console.log(styleText(\"dim\", \\` Processing \\${rows.length} _User records...\\`));\n\n const idpSeedCode = \\/* js *\\/\\`${scriptCode.replace(/`/g, \"\\\\`\").replace(/\\$/g, \"\\\\$\")}\\`;\n\n const result = await executeScript({\n client: operatorClient,\n workspaceId,\n name: \"seed-idp-user.ts\",\n code: idpSeedCode,\n arg: JSON.stringify({ users: rows }),\n invoker: {\n namespace: authNamespace,\n machineUserName,\n },\n });\n\n if (result.logs) {\n for (const line of result.logs.split(\"\\\\n\").filter(Boolean)) {\n console.log(styleText(\"dim\", \\` \\${line}\\`));\n }\n }\n\n if (result.success) {\n let parsed;\n try {\n parsed = JSON.parse(result.result || \"{}\");\n } catch (e) {\n console.error(styleText(\"red\", \\` ✗ Failed to parse seed result: \\${e.message}\\`));\n return { success: false };\n }\n\n if (parsed.processed) {\n console.log(styleText(\"green\", \\` ✓ _User: \\${parsed.processed} rows processed\\`));\n }\n\n if (!parsed.success) {\n const errors = Array.isArray(parsed.errors) ? parsed.errors : [];\n for (const err of errors) {\n console.error(styleText(\"red\", \\` ✗ \\${err}\\`));\n }\n return { success: false };\n }\n\n return { success: true };\n } else {\n console.error(styleText(\"red\", \\` ✗ Seed failed: \\${result.error}\\`));\n return { success: false };\n }\n };\n `;\n}\n\n/**\n * Generate the IdP user seed call code\n * @param hasIdpUser - Whether IdP user is included\n * @returns JavaScript code for calling IdP user seeding\n */\nfunction generateIdpUserSeedCall(hasIdpUser: boolean): string {\n if (!hasIdpUser) return \"\";\n\n return ml`\n // Seed _User if included and not skipped\n const shouldSeedUser = !skipIdp && (!entitiesToProcess || entitiesToProcess.includes(\"_User\"));\n if (hasIdpUser && shouldSeedUser) {\n const result = await seedIdpUser();\n if (!result.success) {\n allSuccess = false;\n }\n }\n `;\n}\n\n/**\n * Generate the IdP user truncation function code using tailor.idp.Client via testExecScript\n * @param hasIdpUser - Whether IdP user is included\n * @param idpNamespace - The IDP namespace name\n * @returns JavaScript code for IdP user truncation function\n */\nfunction generateIdpUserTruncateFunction(hasIdpUser: boolean, idpNamespace: string | null): string {\n if (!hasIdpUser || !idpNamespace) return \"\";\n\n const scriptCode = generateIdpTruncateScriptCode(idpNamespace);\n\n return ml`\n // Truncate _User via tailor.idp.Client (server-side)\n const truncateIdpUser = async () => {\n console.log(styleText(\"cyan\", \"Truncating _User via tailor.idp.Client...\"));\n\n const idpTruncateCode = \\/* js *\\/\\`${scriptCode.replace(/`/g, \"\\\\`\").replace(/\\$/g, \"\\\\$\")}\\`;\n\n const result = await executeScript({\n client: operatorClient,\n workspaceId,\n name: \"truncate-idp-user.ts\",\n code: idpTruncateCode,\n arg: JSON.stringify({}),\n invoker: {\n namespace: authNamespace,\n machineUserName,\n },\n });\n\n if (result.logs) {\n for (const line of result.logs.split(\"\\\\n\").filter(Boolean)) {\n console.log(styleText(\"dim\", \\` \\${line}\\`));\n }\n }\n\n if (result.success) {\n let parsed;\n try {\n parsed = JSON.parse(result.result || \"{}\");\n } catch (e) {\n console.error(styleText(\"red\", \\` ✗ Failed to parse truncation result: \\${e.message}\\`));\n return { success: false };\n }\n\n if (parsed.deleted !== undefined) {\n console.log(styleText(\"green\", \\` ✓ _User: \\${parsed.deleted} users deleted\\`));\n }\n\n if (!parsed.success) {\n const errors = Array.isArray(parsed.errors) ? parsed.errors : [];\n for (const err of errors) {\n console.error(styleText(\"red\", \\` ✗ \\${err}\\`));\n }\n return { success: false };\n }\n\n return { success: true };\n } else {\n console.error(styleText(\"red\", \\` ✗ Truncation failed: \\${result.error}\\`));\n return { success: false };\n }\n };\n `;\n}\n\n/**\n * Generate the IdP user truncation call code within the truncate block\n * @param hasIdpUser - Whether IdP user is included\n * @returns JavaScript code for calling IdP user truncation\n */\nfunction generateIdpUserTruncateCall(hasIdpUser: boolean): string {\n if (!hasIdpUser) return \"\";\n\n return ml`\n // Truncate _User if applicable\n const shouldTruncateUser = !skipIdp && !hasNamespace && (!hasTypes || entitiesToProcess.includes(\"_User\"));\n if (hasIdpUser && shouldTruncateUser) {\n const truncResult = await truncateIdpUser();\n if (!truncResult.success) {\n console.error(styleText(\"red\", \"IDP user truncation failed.\"));\n process.exit(1);\n }\n }\n `;\n}\n\n/**\n * Generates the exec.mjs script content using testExecScript API for TailorDB types\n * and tailor.idp.Client for _User (IdP managed)\n * @param defaultMachineUserName - Default machine user name from generator config (can be overridden at runtime)\n * @param relativeConfigPath - Config path relative to exec script\n * @param namespaceConfigs - Namespace configurations with types and dependencies\n * @param hasIdpUser - Whether _User is included\n * @param idpNamespace - The IDP namespace name, or null if not applicable\n * @returns exec.mjs file contents\n */\nfunction generateExecScript(\n defaultMachineUserName: string | undefined,\n relativeConfigPath: string,\n namespaceConfigs: NamespaceConfig[],\n hasIdpUser: boolean,\n idpNamespace: string | null,\n): string {\n // Generate namespaceEntities object\n const namespaceEntitiesEntries = namespaceConfigs\n .map(({ namespace, types }) => {\n const entitiesFormatted = types.map((e) => ` \"${e}\",`).join(\"\\n\");\n return ` \"${namespace}\": [\\n${entitiesFormatted}\\n ]`;\n })\n .join(\",\\n\");\n\n // Generate dependency map for each namespace\n const namespaceDepsEntries = namespaceConfigs\n .map(({ namespace, dependencies }) => {\n const depsObj = Object.entries(dependencies)\n .map(([type, deps]) => ` \"${type}\": [${deps.map((d) => `\"${d}\"`).join(\", \")}]`)\n .join(\",\\n\");\n return ` \"${namespace}\": {\\n${depsObj}\\n }`;\n })\n .join(\",\\n\");\n\n return ml /* js */ `\n import { readFileSync } from \"node:fs\";\n import { join } from \"node:path\";\n import { parseArgs, styleText } from \"node:util\";\n import { createInterface } from \"node:readline\";\n import {\n show,\n truncate,\n bundleSeedScript,\n chunkSeedData,\n executeScript,\n initOperatorClient,\n loadAccessToken,\n loadWorkspaceId,\n } from \"@tailor-platform/sdk/cli\";\n\n // Parse command-line arguments\n const { values, positionals } = parseArgs({\n options: {\n \"machine-user\": { type: \"string\", short: \"m\" },\n namespace: { type: \"string\", short: \"n\" },\n \"skip-idp\": { type: \"boolean\", default: false },\n truncate: { type: \"boolean\", default: false },\n yes: { type: \"boolean\", default: false },\n profile: { type: \"string\", short: \"p\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n allowPositionals: true,\n });\n\n if (values.help) {\n console.log(\\`\n Usage: node exec.mjs [options] [types...]\n\n Options:\n -m, --machine-user <name> Machine user name for authentication (required if not configured)\n -n, --namespace <ns> Process all types in specified namespace (excludes _User)\n --skip-idp Skip IdP user (_User) entity\n --truncate Truncate tables before seeding\n --yes Skip confirmation prompts (for truncate)\n -p, --profile <name> Workspace profile name\n -h, --help Show help\n\n Examples:\n node exec.mjs -m admin # Process all types with machine user\n node exec.mjs --namespace <namespace> # Process tailordb namespace only (no _User)\n node exec.mjs User Order # Process specific types only\n node exec.mjs --skip-idp # Process all except _User\n node exec.mjs --truncate # Truncate all tables, then seed all\n node exec.mjs --truncate --yes # Truncate all tables without confirmation, then seed all\n node exec.mjs --truncate --namespace <namespace> # Truncate tailordb, then seed tailordb\n node exec.mjs --truncate User Order # Truncate User and Order, then seed them\n \\`);\n process.exit(0);\n }\n\n // Helper function to prompt for y/n confirmation\n const promptConfirmation = (question) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(styleText(\"yellow\", question), (answer) => {\n rl.close();\n resolve(answer.toLowerCase().trim());\n });\n });\n };\n\n const configDir = import.meta.dirname;\n const configPath = join(configDir, \"${relativeConfigPath}\");\n\n // Determine machine user name (CLI argument takes precedence over config default)\n const defaultMachineUser = ${defaultMachineUserName ? `\"${defaultMachineUserName}\"` : \"undefined\"};\n const machineUserName = values[\"machine-user\"] || defaultMachineUser;\n\n if (!machineUserName) {\n console.error(styleText(\"red\", \"Error: Machine user name is required.\"));\n console.error(styleText(\"yellow\", \"Specify --machine-user <name> or configure machineUserName in generator options.\"));\n process.exit(1);\n }\n\n // Entity configuration\n const namespaceEntities = {\n${namespaceEntitiesEntries}\n };\n const namespaceDeps = {\n${namespaceDepsEntries}\n };\n const entities = Object.values(namespaceEntities).flat();\n const hasIdpUser = ${String(hasIdpUser)};\n\n // Determine which entities to process\n let entitiesToProcess = null;\n\n const hasNamespace = !!values.namespace;\n const hasTypes = positionals.length > 0;\n const skipIdp = values[\"skip-idp\"];\n\n // Validate mutually exclusive options\n const optionCount = [hasNamespace, hasTypes].filter(Boolean).length;\n if (optionCount > 1) {\n console.error(styleText(\"red\", \"Error: Options --namespace and type names are mutually exclusive.\"));\n process.exit(1);\n }\n\n // --skip-idp and --namespace are redundant (namespace already excludes _User)\n if (skipIdp && hasNamespace) {\n console.warn(styleText(\"yellow\", \"Warning: --skip-idp is redundant with --namespace (namespace filtering already excludes _User).\"));\n }\n\n // Filter by namespace (automatically excludes _User as it has no namespace)\n if (hasNamespace) {\n const namespace = values.namespace;\n entitiesToProcess = namespaceEntities[namespace];\n\n if (!entitiesToProcess || entitiesToProcess.length === 0) {\n console.error(styleText(\"red\", \\`Error: No entities found in namespace \"\\${namespace}\"\\`));\n console.error(styleText(\"yellow\", \\`Available namespaces: \\${Object.keys(namespaceEntities).join(\", \")}\\`));\n process.exit(1);\n }\n\n console.log(styleText(\"cyan\", \\`Filtering by namespace: \\${namespace}\\`));\n console.log(styleText(\"dim\", \\`Entities: \\${entitiesToProcess.join(\", \")}\\`));\n }\n\n // Filter by specific types\n if (hasTypes) {\n const requestedTypes = positionals;\n const notFoundTypes = [];\n const allTypes = hasIdpUser ? [...entities, \"_User\"] : entities;\n\n entitiesToProcess = requestedTypes.filter((type) => {\n if (!allTypes.includes(type)) {\n notFoundTypes.push(type);\n return false;\n }\n return true;\n });\n\n if (notFoundTypes.length > 0) {\n console.error(styleText(\"red\", \\`Error: The following types were not found: \\${notFoundTypes.join(\", \")}\\`));\n console.error(styleText(\"yellow\", \\`Available types: \\${allTypes.join(\", \")}\\`));\n process.exit(1);\n }\n\n console.log(styleText(\"cyan\", \\`Filtering by types: \\${entitiesToProcess.join(\", \")}\\`));\n }\n\n // Apply --skip-idp filter\n if (skipIdp) {\n if (entitiesToProcess) {\n entitiesToProcess = entitiesToProcess.filter((entity) => entity !== \"_User\");\n } else {\n entitiesToProcess = entities.filter((entity) => entity !== \"_User\");\n }\n }\n\n // Get application info\n const appInfo = await show({ configPath, profile: values.profile });\n const authNamespace = appInfo.auth;\n\n // Initialize operator client (once for all namespaces)\n const accessToken = await loadAccessToken({ profile: values.profile, useProfile: true });\n const workspaceId = await loadWorkspaceId({ profile: values.profile });\n const operatorClient = await initOperatorClient(accessToken);\n\n ${generateIdpUserTruncateFunction(hasIdpUser, idpNamespace)}\n\n // Truncate tables if requested\n if (values.truncate) {\n const answer = values.yes ? \"y\" : await promptConfirmation(\"Are you sure you want to truncate? (y/n): \");\n if (answer !== \"y\") {\n console.log(styleText(\"yellow\", \"Truncate cancelled.\"));\n process.exit(0);\n }\n\n console.log(styleText(\"cyan\", \"Truncating tables...\"));\n\n try {\n if (hasNamespace) {\n await truncate({\n configPath,\n profile: values.profile,\n namespace: values.namespace,\n });\n } else if (hasTypes) {\n const typesToTruncate = entitiesToProcess.filter((t) => t !== \"_User\");\n if (typesToTruncate.length > 0) {\n await truncate({\n configPath,\n profile: values.profile,\n types: typesToTruncate,\n });\n } else {\n console.log(styleText(\"dim\", \"No TailorDB types to truncate (only _User was specified).\"));\n }\n } else {\n await truncate({\n configPath,\n profile: values.profile,\n all: true,\n });\n }\n } catch (error) {\n console.error(styleText(\"red\", \\`Truncate failed: \\${error.message}\\`));\n process.exit(1);\n }\n\n ${generateIdpUserTruncateCall(hasIdpUser)}\n\n console.log(styleText(\"green\", \"Truncate completed.\"));\n }\n\n console.log(styleText(\"cyan\", \"\\\\nStarting seed data generation...\"));\n if (skipIdp) {\n console.log(styleText(\"dim\", \\` Skipping IdP user (_User)\\`));\n }\n\n // Load seed data from JSONL files\n const loadSeedData = (dataDir, typeNames) => {\n const data = {};\n for (const typeName of typeNames) {\n const jsonlPath = join(dataDir, \\`\\${typeName}.jsonl\\`);\n try {\n const content = readFileSync(jsonlPath, \"utf-8\").trim();\n if (content) {\n data[typeName] = content.split(\"\\\\n\").map((line) => JSON.parse(line));\n } else {\n data[typeName] = [];\n }\n } catch (error) {\n if (error.code === \"ENOENT\") {\n data[typeName] = [];\n } else {\n throw error;\n }\n }\n }\n return data;\n };\n\n // Topological sort for dependency order\n const topologicalSort = (types, deps) => {\n const visited = new Set();\n const result = [];\n\n const visit = (type) => {\n if (visited.has(type)) return;\n visited.add(type);\n const typeDeps = deps[type] || [];\n for (const dep of typeDeps) {\n if (types.includes(dep)) {\n visit(dep);\n }\n }\n result.push(type);\n };\n\n for (const type of types) {\n visit(type);\n }\n return result;\n };\n\n // Seed TailorDB types via testExecScript\n const seedViaTestExecScript = async (namespace, typesToSeed, deps) => {\n const dataDir = join(configDir, \"data\");\n const sortedTypes = topologicalSort(typesToSeed, deps);\n const data = loadSeedData(dataDir, sortedTypes);\n\n // Skip if no data\n const typesWithData = sortedTypes.filter((t) => data[t] && data[t].length > 0);\n if (typesWithData.length === 0) {\n console.log(styleText(\"dim\", \\` [\\${namespace}] No data to seed\\`));\n return { success: true, processed: {} };\n }\n\n console.log(styleText(\"cyan\", \\` [\\${namespace}] Seeding \\${typesWithData.length} types via Kysely batch insert...\\`));\n\n // Bundle seed script\n const bundled = await bundleSeedScript(namespace, typesWithData);\n\n // Chunk seed data to fit within gRPC message size limits\n const chunks = chunkSeedData({\n data,\n order: sortedTypes,\n codeByteSize: new TextEncoder().encode(bundled.bundledCode).length,\n });\n\n if (chunks.length === 0) {\n console.log(styleText(\"dim\", \\` [\\${namespace}] No data to seed\\`));\n return { success: true, processed: {} };\n }\n\n if (chunks.length > 1) {\n console.log(styleText(\"dim\", \\` Split into \\${chunks.length} chunks\\`));\n }\n\n const allProcessed = {};\n let hasError = false;\n const allErrors = [];\n\n for (const chunk of chunks) {\n if (chunks.length > 1) {\n console.log(styleText(\"dim\", \\` Chunk \\${chunk.index + 1}/\\${chunk.total}: \\${chunk.order.join(\", \")}\\`));\n }\n\n // Execute seed script for this chunk\n const result = await executeScript({\n client: operatorClient,\n workspaceId,\n name: \\`seed-\\${namespace}.ts\\`,\n code: bundled.bundledCode,\n arg: JSON.stringify({ data: chunk.data, order: chunk.order }),\n invoker: {\n namespace: authNamespace,\n machineUserName,\n },\n });\n\n // Parse result and display logs\n if (result.logs) {\n for (const line of result.logs.split(\"\\\\n\").filter(Boolean)) {\n console.log(styleText(\"dim\", \\` \\${line}\\`));\n }\n }\n\n if (result.success) {\n let parsed;\n try {\n const parsedResult = JSON.parse(result.result || \"{}\");\n parsed = parsedResult && typeof parsedResult === \"object\" ? parsedResult : {};\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(styleText(\"red\", \\` ✗ Failed to parse seed result: \\${message}\\`));\n hasError = true;\n allErrors.push(message);\n continue;\n }\n\n const processed = parsed.processed || {};\n for (const [type, count] of Object.entries(processed)) {\n allProcessed[type] = (allProcessed[type] || 0) + count;\n console.log(styleText(\"green\", \\` ✓ \\${type}: \\${count} rows inserted\\`));\n }\n\n if (!parsed.success) {\n const errors = Array.isArray(parsed.errors) ? parsed.errors : [];\n const errorMessage =\n errors.length > 0 ? errors.join(\"\\\\n \") : \"Seed script reported failure\";\n console.error(styleText(\"red\", \\` ✗ Seed failed:\\\\n \\${errorMessage}\\`));\n hasError = true;\n allErrors.push(errorMessage);\n }\n } else {\n console.error(styleText(\"red\", \\` ✗ Seed failed: \\${result.error}\\`));\n hasError = true;\n allErrors.push(result.error);\n }\n }\n\n if (hasError) {\n return { success: false, error: allErrors.join(\"\\\\n\") };\n }\n return { success: true, processed: allProcessed };\n };\n\n ${generateIdpUserSeedFunction(hasIdpUser, idpNamespace)}\n\n // Main execution\n try {\n let allSuccess = true;\n\n // Determine which namespaces and types to process\n const namespacesToProcess = hasNamespace\n ? [values.namespace]\n : Object.keys(namespaceEntities);\n\n for (const namespace of namespacesToProcess) {\n const nsTypes = namespaceEntities[namespace] || [];\n const nsDeps = namespaceDeps[namespace] || {};\n\n // Filter types if specific types requested\n let typesToSeed = entitiesToProcess\n ? nsTypes.filter((t) => entitiesToProcess.includes(t))\n : nsTypes;\n\n if (typesToSeed.length === 0) continue;\n\n const result = await seedViaTestExecScript(namespace, typesToSeed, nsDeps);\n if (!result.success) {\n allSuccess = false;\n }\n }\n\n ${generateIdpUserSeedCall(hasIdpUser)}\n\n if (allSuccess) {\n console.log(styleText(\"green\", \"\\\\n✓ Seed data generation completed successfully\"));\n } else {\n console.error(styleText(\"red\", \"\\\\n✗ Seed data generation completed with errors\"));\n process.exit(1);\n }\n } catch (error) {\n console.error(styleText(\"red\", \\`\\\\n✗ Seed data generation failed: \\${error.message}\\`));\n process.exit(1);\n }\n\n `;\n}\n\n/**\n * Factory function to create a Seed generator.\n * Combines Kysely batch insert and lines-db schema generation.\n * @param options - Seed generator options\n * @returns Seed generator\n */\nexport function createSeedGenerator(\n options: SeedGeneratorOptions,\n): TailorDBGenerator<SeedTypeMetadata, Record<string, SeedTypeMetadata>> {\n return {\n id: SeedGeneratorID,\n description: \"Generates seed data files (Kysely batch insert + tailor.idp.Client for _User)\",\n dependencies: [\"tailordb\"] as const,\n\n processType: ({ type, source, namespace }) => {\n const typeInfo = processSeedTypeInfo(type, namespace);\n const linesDb = processLinesDb(type, source);\n return { typeInfo, linesDb };\n },\n\n processTailorDBNamespace: ({ types }) => types,\n\n aggregate: ({\n input,\n configPath,\n }: AggregateArgs<TailorDBInput<Record<string, SeedTypeMetadata>>>) => {\n const files: GeneratorResult[\"files\"] = [];\n\n // Collect namespace configurations\n const namespaceConfigs: NamespaceConfig[] = [];\n for (const nsResult of input.tailordb) {\n if (!nsResult.types) continue;\n\n const outputBaseDir = options.distPath;\n const types: string[] = [];\n const dependencies: Record<string, string[]> = {};\n\n for (const [_typeName, metadata] of Object.entries(nsResult.types)) {\n const { typeInfo, linesDb } = metadata;\n\n types.push(typeInfo.name);\n dependencies[typeInfo.name] = typeInfo.dependencies;\n\n // Generate empty JSONL data file\n files.push({\n path: path.join(outputBaseDir, typeInfo.dataFile),\n content: \"\",\n skipIfExists: true,\n });\n\n const schemaOutputPath = path.join(\n outputBaseDir,\n \"data\",\n `${linesDb.typeName}.schema.ts`,\n );\n\n // Plugin-generated type: use getGeneratedType API\n if (linesDb.pluginSource && linesDb.pluginSource.pluginImportPath) {\n // Build original type import path\n let originalImportPath: string | undefined;\n if (linesDb.pluginSource.originalFilePath && linesDb.pluginSource.originalExportName) {\n const relativePath = path.relative(\n path.dirname(schemaOutputPath),\n linesDb.pluginSource.originalFilePath,\n );\n originalImportPath = relativePath.replace(/\\.ts$/, \"\").startsWith(\".\")\n ? relativePath.replace(/\\.ts$/, \"\")\n : `./${relativePath.replace(/\\.ts$/, \"\")}`;\n }\n\n // Compute relative path from schema output to config file\n const configImportPath = path.relative(path.dirname(schemaOutputPath), configPath);\n\n const params: PluginSchemaParams = {\n configImportPath,\n originalImportPath,\n };\n\n const schemaContent = generateLinesDbSchemaFileWithPluginAPI(linesDb, params);\n\n files.push({\n path: schemaOutputPath,\n content: schemaContent,\n });\n } else {\n // User-defined type: import from source file\n const relativePath = path.relative(path.dirname(schemaOutputPath), linesDb.importPath);\n const typeImportPath = relativePath.replace(/\\.ts$/, \"\").startsWith(\".\")\n ? relativePath.replace(/\\.ts$/, \"\")\n : `./${relativePath.replace(/\\.ts$/, \"\")}`;\n const schemaContent = generateLinesDbSchemaFile(linesDb, typeImportPath);\n\n files.push({\n path: schemaOutputPath,\n content: schemaContent,\n });\n }\n }\n\n namespaceConfigs.push({\n namespace: nsResult.namespace,\n types,\n dependencies,\n });\n }\n\n // Process IdP user if configured\n const idpUser = input.auth ? processIdpUser(input.auth) : null;\n const hasIdpUser = idpUser !== null;\n\n if (idpUser) {\n const outputBaseDir = options.distPath;\n\n // Generate empty JSONL data file\n files.push({\n path: path.join(outputBaseDir, idpUser.dataFile),\n content: \"\",\n skipIfExists: true,\n });\n\n // Generate schema file with foreign key\n files.push({\n path: path.join(outputBaseDir, \"data\", `${idpUser.name}.schema.ts`),\n content: generateIdpUserSchemaFile(\n idpUser.schema.usernameField,\n idpUser.schema.userTypeName,\n ),\n });\n }\n\n // Generate exec.mjs (machineUserName can be provided at runtime if not configured)\n const relativeConfigPath = path.relative(options.distPath, configPath);\n files.push({\n path: path.join(options.distPath, \"exec.mjs\"),\n content: generateExecScript(\n options.machineUserName,\n relativeConfigPath,\n namespaceConfigs,\n hasIdpUser,\n idpUser?.idpNamespace ?? null,\n ),\n });\n\n return { files };\n },\n };\n}\n","// Mock tailordb Client for CLI environment\n(\n globalThis as unknown as {\n tailordb: {\n Client: typeof tailordb.Client;\n };\n }\n).tailordb = {\n Client: class {\n constructor(_config: { namespace: string }) {}\n async connect(): Promise<void> {}\n async end(): Promise<void> {}\n async queryObject<O>(): Promise<Tailordb.QueryResult<O>> {\n return {} as Promise<Tailordb.QueryResult<O>>;\n }\n },\n};\n","import * as fs from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport * as path from \"pathe\";\nimport {\n createGeneratorConfigSchema,\n type CodeGeneratorBase,\n type Generator,\n} from \"@/parser/generator-config\";\nimport { createPluginConfigSchema, type Plugin } from \"@/parser/plugin-config\";\nimport { loadConfigPath } from \"./context\";\nimport {\n createEnumConstantsGenerator,\n EnumConstantsGeneratorID,\n} from \"./generator/builtin/enum-constants\";\nimport { createFileUtilsGenerator, FileUtilsGeneratorID } from \"./generator/builtin/file-utils\";\nimport { createKyselyGenerator, KyselyGeneratorID } from \"./generator/builtin/kysely-type\";\nimport { createSeedGenerator, SeedGeneratorID } from \"./generator/builtin/seed\";\nimport type { AppConfig } from \"@/parser/app-config\";\nimport \"./mock\";\n\n/**\n * Loaded configuration with resolved path\n */\nexport type LoadedConfig = AppConfig & { path: string };\n\n// Register built-in generators with their constructor functions\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst builtinGenerators = new Map<string, (options: any) => CodeGeneratorBase>([\n [KyselyGeneratorID, (options: { distPath: string }) => createKyselyGenerator(options)],\n [SeedGeneratorID, (options: { distPath: string }) => createSeedGenerator(options)],\n [\n EnumConstantsGeneratorID,\n (options: { distPath: string }) => createEnumConstantsGenerator(options),\n ],\n [FileUtilsGeneratorID, (options: { distPath: string }) => createFileUtilsGenerator(options)],\n]);\n\nexport const GeneratorConfigSchema = createGeneratorConfigSchema(builtinGenerators);\n\nconst PluginConfigSchema = createPluginConfigSchema();\n\n/**\n * Load Tailor configuration file and associated generators and plugins.\n * @param configPath - Optional explicit config path\n * @returns Loaded config, generators, plugins, and config path\n */\nexport async function loadConfig(\n configPath?: string,\n): Promise<{ config: LoadedConfig; generators: Generator[]; plugins: Plugin[] }> {\n const foundPath = loadConfigPath(configPath);\n if (!foundPath) {\n throw new Error(\n \"Configuration file not found: tailor.config.ts not found in current or parent directories\",\n );\n }\n const resolvedPath = path.resolve(process.cwd(), foundPath);\n\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`Configuration file not found: ${configPath}`);\n }\n\n const configModule = await import(pathToFileURL(resolvedPath).href);\n if (!configModule || !configModule.default) {\n throw new Error(\"Invalid Tailor config module: default export not found\");\n }\n\n // Collect all generator exports (generators, generators2, etc.)\n const allGenerators: Generator[] = [];\n // Collect all plugin exports (plugins, plugins2, etc.)\n const allPlugins: Plugin[] = [];\n\n for (const value of Object.values(configModule)) {\n if (Array.isArray(value)) {\n // Try to parse as generators\n const generatorParsed = value.reduce(\n (acc, item) => {\n if (!acc.success) return acc;\n\n const result = GeneratorConfigSchema.safeParse(item);\n if (result.success) {\n acc.items.push(result.data);\n } else {\n acc.success = false;\n }\n return acc;\n },\n { success: true, items: [] as Generator[] },\n );\n if (generatorParsed.success && generatorParsed.items.length > 0) {\n allGenerators.push(...generatorParsed.items);\n continue;\n }\n\n // Try to parse as plugins\n const pluginParsed = value.reduce(\n (acc, item) => {\n if (!acc.success) return acc;\n\n const result = PluginConfigSchema.safeParse(item);\n if (result.success) {\n acc.items.push(result.data);\n } else {\n acc.success = false;\n }\n return acc;\n },\n { success: true, items: [] as Plugin[] },\n );\n if (pluginParsed.success && pluginParsed.items.length > 0) {\n allPlugins.push(...pluginParsed.items);\n }\n }\n }\n\n return {\n config: { ...configModule.default, path: resolvedPath } as LoadedConfig,\n generators: allGenerators,\n plugins: allPlugins,\n };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\n\n/**\n * Collect base directories for resolving plugin import paths.\n * @param configPath - Path to tailor.config.ts\n * @returns Ordered list of base directories\n */\nexport function getPluginImportBaseDirs(configPath?: string): string[] {\n if (configPath) {\n return [path.dirname(configPath)];\n }\n\n return [process.cwd()];\n}\n\n/**\n * Resolve a relative plugin import path against candidate base directories.\n * @param pluginImportPath - Relative plugin import path\n * @param baseDirs - Candidate base directories\n * @returns Absolute path if found, otherwise null\n */\nexport function resolveRelativePluginImportPath(\n pluginImportPath: string,\n baseDirs: string[],\n): string | null {\n if (!pluginImportPath.startsWith(\".\")) {\n return null;\n }\n\n for (const baseDir of baseDirs) {\n const absolutePath = path.resolve(baseDir, pluginImportPath);\n if (fs.existsSync(absolutePath)) {\n return absolutePath;\n }\n }\n\n return null;\n}\n","import type { TailorAnyDBField, TailorAnyDBType } from \"@/configure/services/tailordb\";\n\nexport type TypeConfigRequired<PluginConfig = unknown> =\n | boolean\n | ((pluginConfig: PluginConfig | undefined) => boolean);\n\n/**\n * Interface for plugin configuration mapping.\n * Extend this interface via declaration merging to add typed plugin configs.\n *\n * The `Fields` type parameter provides field names from the type being configured,\n * enabling type-safe field references in plugin configs.\n * @example\n * ```typescript\n * // In your plugin package or types file:\n * declare module \"@tailor-platform/sdk\" {\n * interface PluginConfigs<Fields extends string> {\n * \"@my-company/i18n\": {\n * labels: Partial<Record<Fields, { ja: string; en: string }>>;\n * };\n * }\n * }\n * ```\n */\n// Fields parameter is used by declaration merging in user-defined.d.ts\n// oxlint-disable-next-line no-unused-vars, no-empty-object-type\nexport interface PluginConfigs<Fields extends string = string> {\n // Extend this interface via declaration merging to add typed plugin configs\n}\n\n/**\n * Plugin attachment stored on TailorAnyDBType instances.\n * This is the configuration passed via `.plugin()` method.\n */\nexport interface PluginAttachment {\n pluginId: string;\n config: unknown;\n}\n\n/**\n * Context passed to plugin's process method\n */\nexport interface PluginProcessContext<TypeConfig = unknown, PluginConfig = unknown> {\n /** The raw TailorDB type being processed */\n type: TailorAnyDBType;\n /** Per-type configuration passed via .plugin() method */\n typeConfig: TypeConfig;\n /** Plugin-level configuration passed via definePlugins() */\n pluginConfig: PluginConfig;\n /** Namespace of the TailorDB type */\n namespace: string;\n}\n\n/**\n * Context passed to plugin's processNamespace method.\n * Used for plugins that operate on a namespace without requiring a source type.\n */\nexport interface PluginNamespaceProcessContext<PluginConfig = unknown> {\n /** Plugin-level configuration passed via definePlugins() */\n pluginConfig: PluginConfig;\n /** Target namespace for generated types */\n namespace: string;\n}\n\n/**\n * Interface representing a TailorDB type for plugin output.\n * This interface is satisfied by db.type() instances.\n */\nexport interface TailorDBTypeForPlugin {\n /** The name of the type */\n readonly name: string;\n /** The field definitions */\n readonly fields: Record<string, unknown>;\n}\n\n/**\n * Type generated by a plugin - use db.type() to create these.\n */\nexport type PluginGeneratedType = TailorDBTypeForPlugin;\n\n/**\n * Map of generated types keyed by kind identifier.\n * The kind is used to generate distinct TypeScript type files for each generated type.\n * @example\n * ```typescript\n * {\n * request: changeRequest,\n * step: changeStep,\n * approval: changeApproval,\n * }\n * ```\n */\nexport type PluginGeneratedTypes = Record<string, PluginGeneratedType>;\n\n/**\n * Resolver definition generated by a plugin.\n * Fields can be TailorDB field instances or raw field definitions.\n */\nexport interface PluginGeneratedResolver {\n name: string;\n operation: \"query\" | \"mutation\";\n inputFields?: Record<string, unknown>;\n outputFields: Record<string, unknown>;\n /** Function body code as string */\n body: string;\n}\n\n/**\n * Record trigger configuration for plugin-generated executors\n */\nexport interface PluginRecordTriggerConfig {\n kind: \"recordCreated\" | \"recordUpdated\" | \"recordDeleted\";\n /** TailorDB type name for record triggers */\n typeName: string;\n}\n\n/**\n * Schedule trigger configuration for plugin-generated executors\n */\nexport interface PluginScheduleTriggerConfig {\n kind: \"schedule\";\n /** Cron expression */\n cron: string;\n /** Timezone (defaults to UTC) */\n timezone?: string;\n}\n\n/**\n * Incoming webhook trigger configuration for plugin-generated executors\n */\nexport interface PluginIncomingWebhookTriggerConfig {\n kind: \"incomingWebhook\";\n}\n\n/**\n * Trigger configuration for plugin-generated executors\n */\nexport type PluginTriggerConfig =\n | PluginRecordTriggerConfig\n | PluginScheduleTriggerConfig\n | PluginIncomingWebhookTriggerConfig;\n\n/**\n * Inject value types supported for plugin executor injection.\n * These values are serialized as const declarations in the generated file.\n */\nexport type PluginInjectValue = string | number | boolean | null;\n\n/**\n * Inject map for plugin executor.\n * Keys become const variable names in the generated file.\n */\nexport type PluginInjectMap = Record<string, PluginInjectValue>;\n\n/**\n * Function operation configuration for plugin-generated executors\n */\nexport interface PluginFunctionOperationConfig {\n kind: \"function\";\n /** Function body code as string */\n body: string;\n /**\n * Variables to inject into the generated file scope.\n * These become const declarations at the top of the generated file,\n * allowing the function body to reference them.\n * @example { namespace: \"tailordb\", historyTypeName: \"CustomerHistory\" }\n */\n inject?: PluginInjectMap;\n}\n\n/**\n * GraphQL operation configuration for plugin-generated executors\n */\nexport interface PluginGraphQLOperationConfig {\n kind: \"graphql\";\n /** GraphQL query string */\n query: string;\n /** App name for the GraphQL endpoint */\n appName?: string;\n /**\n * Variables expression as a string function.\n * Receives the executor args object and returns the variables object.\n * @example \"(args) => ({ input: { recordId: args.newRecord.id } })\"\n */\n variables?: string;\n}\n\n/**\n * Webhook operation configuration for plugin-generated executors\n */\nexport interface PluginWebhookOperationConfig {\n kind: \"webhook\";\n /** Webhook URL */\n url: string;\n}\n\n/**\n * Workflow operation configuration for plugin-generated executors\n */\nexport interface PluginWorkflowOperationConfig {\n kind: \"workflow\";\n /** Workflow name */\n workflowName: string;\n}\n\n/**\n * Operation configuration for plugin-generated executors\n */\nexport type PluginOperationConfig =\n | PluginFunctionOperationConfig\n | PluginGraphQLOperationConfig\n | PluginWebhookOperationConfig\n | PluginWorkflowOperationConfig;\n\n/**\n * Context value types for plugin executor context.\n * Supports primitive values and type references.\n */\nexport type PluginExecutorContextValue =\n | TailorAnyDBType\n | string\n | number\n | boolean\n | null\n | undefined;\n\n/**\n * Base executor context that can include type references and other values.\n * Type objects (TailorAnyDBType) will be handled specially by the generator\n * to create appropriate import statements.\n *\n * Plugin authors should extend this interface for their specific context needs.\n */\nexport interface PluginExecutorContextBase {\n /** Source type that the plugin is attached to. Null for namespace executors. */\n sourceType: TailorAnyDBType | null;\n /** TailorDB namespace for data operations */\n namespace: string;\n}\n\n/**\n * Flexible executor context type that allows additional properties.\n * Used as the context type in PluginGeneratedExecutorWithFile.\n */\nexport type PluginExecutorContext = PluginExecutorContextBase & {\n [key: string]: PluginExecutorContextValue;\n};\n\n/**\n * Module shape returned by plugin executor resolve().\n * The concrete context type is intentionally erased at this boundary.\n */\nexport interface PluginExecutorModule {\n default: unknown;\n}\n\n/**\n * Executor definition with dynamic import reference (new format).\n * Used with withPluginContext for type-safe executor definitions in separate files.\n */\nexport interface PluginGeneratedExecutorWithFile<Ctx = PluginExecutorContext> {\n /** Executor name (used for generated file name) */\n name: string;\n /**\n * Resolver function for the executor module.\n * Should return a dynamic import to the executor file.\n * Relative import specifiers are resolved from the plugin's importPath base.\n * @example `async () => await import(\"./executors/on-create\")`\n */\n resolve: () => Promise<PluginExecutorModule>;\n /**\n * Context to pass to the executor factory.\n * Can include TailorAnyDBType objects - these will be handled specially\n * by the generator to create appropriate import statements.\n */\n context: Ctx;\n}\n\n/**\n * Executor definition generated by a plugin (legacy format).\n * @deprecated Use PluginGeneratedExecutorWithFile with withPluginContext instead.\n */\nexport interface PluginGeneratedExecutorLegacy {\n name: string;\n description?: string;\n trigger: PluginTriggerConfig;\n operation: PluginOperationConfig;\n}\n\n/**\n * Executor definition generated by a plugin.\n * Supports both legacy format (inline trigger/operation) and new format (executorFile/context).\n */\nexport type PluginGeneratedExecutor =\n | PluginGeneratedExecutorWithFile\n | PluginGeneratedExecutorLegacy;\n\n/**\n * Type guard to check if executor uses the new dynamic import format.\n * @param executor - Executor definition to check\n * @returns True if executor uses dynamic import format\n */\nexport function isPluginExecutorWithFile(\n executor: PluginGeneratedExecutor,\n): executor is PluginGeneratedExecutorWithFile {\n return \"resolve\" in executor && \"context\" in executor;\n}\n\n/**\n * Extension options for modifying the source type\n */\nexport interface PluginExtends {\n /**\n * Fields to add to the source type.\n * These fields will be merged into the original type's fields.\n * Existing fields (from original definition or earlier plugins) take precedence.\n */\n fields?: Record<string, TailorAnyDBField>;\n}\n\n/**\n * Base output returned by a plugin's process method.\n * Used by both processType and processNamespace.\n */\nexport interface PluginOutput {\n /**\n * Additional TailorDB types to generate, keyed by kind identifier.\n * The kind is used to generate distinct TypeScript type files.\n * @example { request: changeRequest, step: changeStep }\n */\n types?: PluginGeneratedTypes;\n /** Additional resolvers to generate */\n resolvers?: PluginGeneratedResolver[];\n /** Additional executors to generate */\n executors?: PluginGeneratedExecutor[];\n}\n\n/**\n * Output returned by a plugin's processType method.\n * Extends PluginOutput with the ability to add fields to the source type.\n */\nexport interface TypePluginOutput extends PluginOutput {\n /** Extensions to apply to the source type */\n extends?: PluginExtends;\n}\n\n/**\n * Output returned by a plugin's processNamespace method.\n * Alias for PluginOutput (namespace plugins cannot extend a source type).\n */\nexport type NamespacePluginOutput = PluginOutput;\n\n/**\n * Plugin interface that all plugins must implement.\n * @template TypeConfig - Type for per-type configuration passed via .plugin() method\n * @template PluginConfig - Type for plugin-level configuration passed via definePlugins()\n */\nexport interface Plugin<TypeConfig = unknown, PluginConfig = unknown> {\n /** Unique identifier for the plugin */\n readonly id: string;\n /** Human-readable description of the plugin */\n readonly description: string;\n /**\n * Import path for this plugin's public API.\n * Used by code generators to create correct import statements\n * (e.g., plugin executors and seed schema generation).\n */\n readonly importPath: string;\n\n /**\n * Controls whether per-type plugin config is required when attaching via .plugin().\n * If a function is provided, it receives pluginConfig from definePlugins().\n * Default is optional when not provided.\n */\n readonly typeConfigRequired?: TypeConfigRequired<PluginConfig>;\n\n /**\n * Plugin-level configuration passed via definePlugins().\n * This config is stored when the plugin is registered and made available\n * to both processType() and processNamespace() methods.\n */\n readonly pluginConfig?: PluginConfig;\n\n /**\n * Process a single TailorDB type and generate outputs.\n * This method is called for each type that has this plugin attached via .plugin().\n * @param context - Context containing the type, config, pluginConfig, and namespace\n * @returns Plugin output with generated types, resolvers, and executors\n */\n processType?(\n context: PluginProcessContext<TypeConfig, PluginConfig>,\n ): TypePluginOutput | Promise<TypePluginOutput>;\n\n /**\n * Process plugin for a namespace without requiring a source type.\n * This method is called once per namespace for plugins configured via definePlugins().\n * Use this for plugins that generate types independently of user-defined types.\n * @param context - Context containing the plugin config, namespace, and types\n * @returns Plugin output with generated types, resolvers, and executors\n */\n processNamespace?(\n context: PluginNamespaceProcessContext<PluginConfig>,\n ): NamespacePluginOutput | Promise<NamespacePluginOutput>;\n}\n","/**\n * Plugin Executor Generator\n *\n * Generates TypeScript files for plugin-generated executors.\n * Supports both legacy format (inline trigger/operation) and new format (executorFile/context).\n */\n\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport ml from \"multiline-ts\";\nimport * as path from \"pathe\";\nimport { logger, styles } from \"@/cli/utils/logger\";\nimport {\n getPluginImportBaseDirs,\n resolveRelativePluginImportPath,\n} from \"@/cli/utils/plugin-import\";\nimport {\n isPluginExecutorWithFile,\n type PluginGeneratedExecutorLegacy,\n type PluginGeneratedExecutorWithFile,\n type PluginTriggerConfig,\n type PluginOperationConfig,\n type PluginInjectMap,\n type PluginExecutorContext,\n} from \"@/parser/plugin-config/types\";\nimport type { PluginTypeGenerationResult } from \"./plugin-type-generator\";\nimport type { PluginExecutorInfoExtended } from \"@/plugin/manager\";\n\n/**\n * Information needed for type import resolution.\n */\ninterface TypeImportInfo {\n /** Variable name to use in generated code */\n variableName: string;\n /** Import path for the type */\n importPath: string;\n /** Whether this is a generated type (vs user-defined) */\n isGeneratedType: boolean;\n}\n\n/**\n * Source info for user-defined types.\n */\ntype SourceTypeInfo = {\n filePath: string;\n exportName: string;\n};\n\n/**\n * Generate TypeScript files for plugin-generated executors.\n * These files will be processed by the standard executor bundler.\n * @param executors - Array of plugin executor information\n * @param outputDir - Base output directory (e.g., .tailor-sdk)\n * @param typeGenerationResult - Result from plugin type generation (for import resolution)\n * @param sourceTypeInfoMap - Map of source type names to their source info\n * @param configPath - Path to tailor.config.ts (used for resolving plugin import paths)\n * @returns Array of generated file paths\n */\nexport function generatePluginExecutorFiles(\n executors: ReadonlyArray<PluginExecutorInfoExtended>,\n outputDir: string,\n typeGenerationResult?: PluginTypeGenerationResult,\n sourceTypeInfoMap?: Map<string, SourceTypeInfo>,\n configPath?: string,\n): string[] {\n if (executors.length === 0) {\n return [];\n }\n\n const generatedFiles: string[] = [];\n const baseDirs = getPluginImportBaseDirs(configPath);\n\n for (const info of executors) {\n const filePath = generateSingleExecutorFile(\n info,\n outputDir,\n typeGenerationResult,\n sourceTypeInfoMap,\n baseDirs,\n );\n generatedFiles.push(filePath);\n\n const relativePath = path.relative(process.cwd(), filePath);\n logger.log(\n ` Plugin Executor File: ${styles.success(relativePath)} from plugin ${styles.info(info.pluginId)}`,\n );\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate a single executor file.\n * @param info - Plugin executor metadata and definition\n * @param outputDir - Base output directory (e.g., .tailor-sdk)\n * @param typeGenerationResult - Result from plugin type generation\n * @param sourceTypeInfoMap - Map of source type names to their source info\n * @param baseDirs - Base directories for resolving plugin import paths\n * @returns Absolute path to the generated file\n */\nfunction generateSingleExecutorFile(\n info: PluginExecutorInfoExtended,\n outputDir: string,\n typeGenerationResult?: PluginTypeGenerationResult,\n sourceTypeInfoMap?: Map<string, SourceTypeInfo>,\n baseDirs: string[] = [],\n): string {\n const pluginDir = sanitizePluginId(info.pluginId);\n const executorOutputDir = path.join(outputDir, pluginDir, \"executors\");\n fs.mkdirSync(executorOutputDir, { recursive: true });\n\n const fileName = sanitizeExecutorFileName(info.executor.name);\n const filePath = path.join(executorOutputDir, `${fileName}.ts`);\n\n let content: string;\n if (isPluginExecutorWithFile(info.executor)) {\n content = generateExecutorFileContentNew(\n info,\n info.executor,\n outputDir,\n typeGenerationResult,\n sourceTypeInfoMap,\n baseDirs,\n );\n } else {\n content = generateExecutorFileContentLegacy(info.executor);\n }\n\n fs.writeFileSync(filePath, content);\n return filePath;\n}\n\n/**\n * Generate TypeScript file content for new format executor (dynamic import).\n * Uses the executor's resolve function to dynamically import the module.\n * @param info - Plugin executor information\n * @param executor - Executor definition with resolve\n * @param outputDir - Base output directory\n * @param typeGenerationResult - Result from plugin type generation\n * @param sourceTypeInfoMap - Map of source type names to their source info\n * @param baseDirs - Base directories for resolving plugin import paths\n * @returns TypeScript source code for executor file\n */\nfunction generateExecutorFileContentNew(\n info: PluginExecutorInfoExtended,\n executor: PluginGeneratedExecutorWithFile,\n outputDir: string,\n typeGenerationResult?: PluginTypeGenerationResult,\n sourceTypeInfoMap?: Map<string, SourceTypeInfo>,\n baseDirs: string[] = [],\n): string {\n const { resolve, context } = executor;\n const pluginDir = sanitizePluginId(info.pluginId);\n const executorOutputDir = path.join(outputDir, pluginDir, \"executors\");\n\n const executorImportPath = resolveExecutorImportPath(\n resolve,\n info.pluginImportPath,\n executorOutputDir,\n baseDirs,\n );\n\n // Collect type imports from context\n const typeImports = collectTypeImports(\n context,\n outputDir,\n info.pluginId,\n typeGenerationResult,\n sourceTypeInfoMap,\n );\n\n // Generate import statements\n const imports: string[] = [];\n\n for (const [, importInfo] of typeImports) {\n imports.push(`import { ${importInfo.variableName} } from \"${importInfo.importPath}\";`);\n }\n\n // Generate context object code\n const contextCode = generateContextCode(context, typeImports);\n\n return ml /* ts */ `\n /**\n * Auto-generated executor by plugin: ${info.pluginId}\n * DO NOT EDIT - This file is generated by @tailor-platform/sdk\n */\n ${imports.join(\"\\n\")}\n\n const { default: executorFactory } = await import(${JSON.stringify(executorImportPath)});\n if (typeof executorFactory !== \"function\") {\n throw new Error(\n \"Plugin executor module must export a default function created by withPluginContext().\",\n );\n }\n export default executorFactory(${contextCode});\n `;\n}\n\n/**\n * Collect type imports needed for context.\n * @param context - Executor context values from plugin\n * @param outputDir - Base output directory for generated files\n * @param pluginId - Plugin identifier used for output paths\n * @param typeGenerationResult - Result from plugin type generation\n * @param sourceTypeInfoMap - Map of source type names to their source info\n * @returns Map of context keys to their import information\n */\nfunction collectTypeImports(\n context: PluginExecutorContext,\n outputDir: string,\n pluginId: string,\n typeGenerationResult?: PluginTypeGenerationResult,\n sourceTypeInfoMap?: Map<string, SourceTypeInfo>,\n): Map<string, TypeImportInfo> {\n const typeImports = new Map<string, TypeImportInfo>();\n const pluginDir = sanitizePluginId(pluginId);\n const executorDir = path.join(outputDir, pluginDir, \"executors\");\n\n for (const [key, value] of Object.entries(context)) {\n if (isTypeObject(value)) {\n const typeName = value.name;\n const sourceInfo = sourceTypeInfoMap?.get(typeName);\n const variableName = sourceInfo?.exportName ?? toCamelCase(typeName);\n\n // Check if it's a generated type\n let importPath: string;\n let isGeneratedType = false;\n\n if (typeGenerationResult?.typeFilePaths.has(typeName)) {\n // It's a generated type - import from plugin types directory\n const typeFilePath = typeGenerationResult.typeFilePaths.get(typeName)!;\n const absoluteTypePath = path.join(outputDir, typeFilePath);\n importPath = path.relative(executorDir, absoluteTypePath).replace(/\\.ts$/, \"\");\n if (!importPath.startsWith(\".\")) {\n importPath = `./${importPath}`;\n }\n isGeneratedType = true;\n } else if (sourceInfo) {\n // It's a user-defined type\n const sourceFilePath = sourceInfo.filePath;\n importPath = path.relative(executorDir, sourceFilePath).replace(/\\.ts$/, \"\");\n if (!importPath.startsWith(\".\")) {\n importPath = `./${importPath}`;\n }\n } else {\n // Fallback: generate relative path assumption\n // This might need adjustment based on actual project structure\n importPath = `../../../../tailordb/${toKebabCase(typeName)}`;\n }\n\n typeImports.set(key, {\n variableName,\n importPath,\n isGeneratedType,\n });\n }\n }\n\n return typeImports;\n}\n\n/**\n * Generate TypeScript code for context object.\n * @param context - Executor context values from plugin\n * @param typeImports - Resolved type import information for context keys\n * @returns TypeScript object literal code\n */\nfunction generateContextCode(\n context: PluginExecutorContext,\n typeImports: Map<string, TypeImportInfo>,\n): string {\n const entries: string[] = [];\n\n for (const [key, value] of Object.entries(context)) {\n if (isTypeObject(value)) {\n const importInfo = typeImports.get(key);\n if (importInfo) {\n entries.push(` ${key}: ${importInfo.variableName}`);\n }\n } else if (value !== undefined) {\n entries.push(` ${key}: ${JSON.stringify(value)}`);\n }\n }\n\n return `{\\n${entries.join(\",\\n\")},\\n}`;\n}\n\n/**\n * Check if a value is a TailorDB type object.\n * @param value - Value to inspect\n * @returns True if value is a type object with name and fields\n */\nfunction isTypeObject(value: unknown): value is { name: string; fields: Record<string, unknown> } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"name\" in value &&\n \"fields\" in value &&\n typeof (value as { name: unknown }).name === \"string\"\n );\n}\n\n// ============================================================================\n// Legacy format support\n// ============================================================================\n\n/**\n * Generate TypeScript file content for legacy format executor (trigger/operation).\n * @param executor - Legacy executor definition\n * @returns TypeScript source code for executor file\n */\nfunction generateExecutorFileContentLegacy(executor: PluginGeneratedExecutorLegacy): string {\n const triggerCode = generateTriggerCode(executor.trigger);\n const operationCode = generateOperationCode(executor.operation);\n\n // Extract inject from function operation\n const inject = executor.operation.kind === \"function\" ? executor.operation.inject : undefined;\n const injectDeclarations = generateInjectDeclarations(inject);\n\n const descriptionLine = executor.description\n ? `\\n description: ${JSON.stringify(executor.description)},`\n : \"\";\n\n return ml /* ts */ `\n /**\n * Auto-generated executor by plugin\n * DO NOT EDIT - This file is generated by @tailor-platform/sdk\n */\n import { createExecutor } from \"@tailor-platform/sdk\";\n ${injectDeclarations}\n export default createExecutor({\n name: ${JSON.stringify(executor.name)},${descriptionLine}\n trigger: ${triggerCode},\n operation: ${operationCode},\n });\n `;\n}\n\n/**\n * Generate const declarations for injected variables.\n * @param inject - Map of injected values keyed by variable name\n * @returns TypeScript const declarations or empty string\n */\nfunction generateInjectDeclarations(inject: PluginInjectMap | undefined): string {\n if (!inject || Object.keys(inject).length === 0) {\n return \"\";\n }\n\n const declarations = Object.entries(inject)\n .map(([name, value]) => `const ${name} = ${JSON.stringify(value)};`)\n .join(\"\\n\");\n\n return `\\n// Injected variables from plugin\\n${declarations}\\n`;\n}\n\n/**\n * Generate TypeScript code for trigger configuration.\n * @param trigger - Trigger configuration for executor\n * @returns TypeScript code for trigger object\n */\nfunction generateTriggerCode(trigger: PluginTriggerConfig): string {\n switch (trigger.kind) {\n case \"recordCreated\":\n case \"recordUpdated\":\n case \"recordDeleted\":\n return `{\n kind: ${JSON.stringify(trigger.kind)},\n typeName: ${JSON.stringify(trigger.typeName)},\n }`;\n\n case \"schedule\":\n return `{\n kind: \"schedule\",\n cron: ${JSON.stringify(trigger.cron)},\n timezone: ${JSON.stringify(trigger.timezone ?? \"UTC\")},\n }`;\n\n case \"incomingWebhook\":\n return `{\n kind: \"incomingWebhook\",\n }`;\n\n default:\n throw new Error(`Unknown trigger kind: ${(trigger as PluginTriggerConfig).kind}`);\n }\n}\n\n/**\n * Generate TypeScript code for operation configuration.\n * @param operation - Operation configuration for executor\n * @returns TypeScript code for operation object\n */\nfunction generateOperationCode(operation: PluginOperationConfig): string {\n switch (operation.kind) {\n case \"graphql\": {\n const appNameLine = operation.appName\n ? `\\n appName: ${JSON.stringify(operation.appName)},`\n : \"\";\n const variablesLine = operation.variables ? `\\n variables: ${operation.variables},` : \"\";\n\n return `{\n kind: \"graphql\",\n query: \\`${escapeTemplateLiteral(operation.query)}\\`,${appNameLine}${variablesLine}\n }`;\n }\n\n case \"function\":\n return `{\n kind: \"function\",\n body: ${operation.body},\n }`;\n\n case \"webhook\":\n return `{\n kind: \"webhook\",\n url: () => ${JSON.stringify(operation.url)},\n }`;\n\n case \"workflow\":\n return `{\n kind: \"workflow\",\n workflowName: ${JSON.stringify(operation.workflowName)},\n }`;\n\n default:\n throw new Error(`Unknown operation kind: ${(operation as PluginOperationConfig).kind}`);\n }\n}\n\n/**\n * Escape special characters in template literal content.\n * @param str - Raw template literal content\n * @returns Escaped string safe for template literals\n */\nfunction escapeTemplateLiteral(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\").replace(/\\$\\{/g, \"\\\\${\");\n}\n\n// ============================================================================\n// Utility functions\n// ============================================================================\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Resolve the import path for a plugin executor module.\n * @param resolve - Executor resolve function\n * @param pluginImportPath - Plugin's import path\n * @param executorOutputDir - Directory where the generated executor will be written\n * @param baseDirs - Base directories for resolving plugin import paths\n * @returns Import path string for the executor module\n */\nfunction resolveExecutorImportPath(\n resolve: () => Promise<{ default: unknown }>,\n pluginImportPath: string,\n executorOutputDir: string,\n baseDirs: string[],\n): string {\n const specifier = extractDynamicImportSpecifier(resolve);\n if (!specifier.startsWith(\".\")) {\n return specifier;\n }\n\n const pluginBaseDir = resolvePluginBaseDir(pluginImportPath, baseDirs);\n if (!pluginBaseDir) {\n throw new Error(\n `Unable to resolve plugin import base for \"${pluginImportPath}\". ` +\n `Tried base dirs: ${baseDirs.join(\", \") || \"(none)\"}. ` +\n `Use an absolute import specifier in resolve(), or ensure the plugin path is resolvable.`,\n );\n }\n\n const absolutePath = path.resolve(pluginBaseDir, specifier);\n let relativePath = path.relative(executorOutputDir, absolutePath).replace(/\\\\/g, \"/\");\n relativePath = stripSourceExtension(relativePath);\n if (!relativePath.startsWith(\".\")) {\n relativePath = `./${relativePath}`;\n }\n return relativePath;\n}\n\n/**\n * Extract the dynamic import specifier from a resolve function.\n * @param resolve - Executor resolve function\n * @returns The module specifier string\n */\nfunction extractDynamicImportSpecifier(resolve: () => Promise<{ default: unknown }>): string {\n const source = resolve.toString();\n const match = source.match(/import\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/);\n if (!match) {\n throw new Error(\n `resolve() must return a dynamic import, e.g. \\`async () => await import(\"./executors/on-create\")\\`.`,\n );\n }\n return match[1];\n}\n\n/**\n * Resolve plugin base directory for relative imports.\n * @param pluginImportPath - Plugin import path\n * @param baseDirs - Base directories for resolving plugin import paths\n * @returns Directory path or null if not resolvable\n */\nfunction resolvePluginBaseDir(pluginImportPath: string, baseDirs: string[]): string | null {\n if (pluginImportPath.startsWith(\".\")) {\n const resolvedPath =\n resolveRelativePluginImportPath(pluginImportPath, baseDirs) ??\n path.resolve(baseDirs[0] ?? process.cwd(), pluginImportPath);\n if (fs.existsSync(resolvedPath)) {\n const stats = fs.statSync(resolvedPath);\n return stats.isDirectory() ? resolvedPath : path.dirname(resolvedPath);\n }\n return path.extname(resolvedPath) ? path.dirname(resolvedPath) : resolvedPath;\n }\n\n for (const baseDir of baseDirs) {\n try {\n const resolved = require.resolve(pluginImportPath, { paths: [baseDir] });\n return path.dirname(resolved);\n } catch {\n continue;\n }\n }\n return null;\n}\n\n/**\n * Strip TypeScript source extensions from import paths.\n * @param importPath - Path to normalize\n * @returns Path without .ts/.tsx extension\n */\nfunction stripSourceExtension(importPath: string): string {\n return importPath.replace(/\\.(ts|tsx)$/, \"\");\n}\n\n/**\n * Convert plugin ID to safe directory name.\n * @param pluginId - Plugin identifier (e.g., \"@scope/name\")\n * @returns Safe directory name\n */\nfunction sanitizePluginId(pluginId: string): string {\n return pluginId.replace(/^@/, \"\").replace(/\\//g, \"-\");\n}\n\n/**\n * Convert executor name to safe filename.\n * @param executorName - Executor name\n * @returns Safe filename without extension\n */\nfunction sanitizeExecutorFileName(executorName: string): string {\n const baseName = path.basename(executorName);\n const withoutExtension = baseName.replace(/\\.[^/.]+$/, \"\");\n const sanitized = withoutExtension.replace(/[^a-zA-Z0-9_-]/g, \"-\");\n if (!sanitized) {\n throw new Error(`Invalid executor name: \"${executorName}\"`);\n }\n return sanitized;\n}\n\n/**\n * Convert string to camelCase.\n * @param str - Input string to convert\n * @returns camelCase string\n */\nfunction toCamelCase(str: string): string {\n const result = str.replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"));\n return result.charAt(0).toLowerCase() + result.slice(1);\n}\n\n/**\n * Convert string to kebab-case.\n * @param str - Input string to convert\n * @returns kebab-case string\n */\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n}\n","/**\n * Plugin Type Generator\n *\n * Generates TypeScript files for plugin-generated types (TailorDB types).\n * These files can be imported by plugin executors to reference generated types.\n */\n\nimport * as fs from \"node:fs\";\nimport ml from \"multiline-ts\";\nimport * as path from \"pathe\";\nimport { logger, styles } from \"@/cli/utils/logger\";\nimport type { PluginGeneratedType } from \"@/parser/plugin-config/types\";\nimport type { PluginGeneratedTypeInfo } from \"@/plugin/manager\";\n\n/**\n * Result of generating plugin type files.\n */\nexport interface PluginTypeGenerationResult {\n /** Map of type name to generated file path (relative to outputDir) */\n typeFilePaths: Map<string, string>;\n /** List of all generated file paths (absolute) */\n generatedFiles: string[];\n}\n\n/**\n * Generate TypeScript files for plugin-generated types.\n * These files export the type definition and can be imported by executor files.\n * @param types - Array of plugin type information\n * @param outputDir - Base output directory (e.g., .tailor-sdk)\n * @returns Generation result with file paths\n */\nexport function generatePluginTypeFiles(\n types: ReadonlyArray<PluginGeneratedTypeInfo>,\n outputDir: string,\n): PluginTypeGenerationResult {\n const typeFilePaths = new Map<string, string>();\n const generatedFiles: string[] = [];\n\n if (types.length === 0) {\n return { typeFilePaths, generatedFiles };\n }\n\n const seenTypeNames = new Map<string, PluginGeneratedTypeInfo>();\n\n for (const info of types) {\n const existing = seenTypeNames.get(info.type.name);\n if (existing) {\n throw new Error(\n `Duplicate plugin-generated type name \"${info.type.name}\" detected. ` +\n `First: plugin \"${existing.pluginId}\" (kind: \"${existing.kind}\", source type: \"${existing.sourceTypeName}\"), ` +\n `Second: plugin \"${info.pluginId}\" (kind: \"${info.kind}\", source type: \"${info.sourceTypeName}\"). ` +\n `Plugin-generated type names must be unique.`,\n );\n }\n seenTypeNames.set(info.type.name, info);\n\n const pluginDir = sanitizePluginId(info.pluginId);\n const typeOutputDir = path.join(outputDir, pluginDir, \"types\");\n fs.mkdirSync(typeOutputDir, { recursive: true });\n\n const fileName = `${toKebabCase(info.type.name)}.ts`;\n const filePath = path.join(typeOutputDir, fileName);\n const content = generateTypeFileContent(info);\n\n fs.writeFileSync(filePath, content);\n generatedFiles.push(filePath);\n\n // Store relative path from outputDir for import resolution\n const relativePath = path.relative(outputDir, filePath);\n typeFilePaths.set(info.type.name, relativePath);\n\n const displayPath = path.relative(process.cwd(), filePath);\n logger.log(\n ` Plugin Type File: ${styles.success(displayPath)} (${styles.dim(info.kind)}) from plugin ${styles.info(info.pluginId)}`,\n );\n }\n\n return { typeFilePaths, generatedFiles };\n}\n\n/**\n * Generate TypeScript file content for a single type.\n * @param info - Plugin type information\n * @returns TypeScript source code\n */\nfunction generateTypeFileContent(info: PluginGeneratedTypeInfo): string {\n const { type, pluginId, sourceTypeName, kind } = info;\n const variableName = toCamelCase(type.name);\n const fieldsCode = generateFieldsCode(type);\n\n return ml /* ts */ `\n /**\n * Auto-generated type by plugin: ${pluginId}\n * Source type: ${sourceTypeName}\n * Kind: ${kind}\n *\n * DO NOT EDIT - This file is generated by @tailor-platform/sdk\n */\n import { db } from \"@tailor-platform/sdk\";\n\n export const ${variableName} = db.type(${JSON.stringify(type.name)}, ${fieldsCode});\n\n export type ${type.name} = typeof ${variableName};\n `;\n}\n\n/**\n * Generate TypeScript code for field definitions.\n * This creates a simplified version of the type's fields.\n * @param type - TailorDB type\n * @returns TypeScript code for fields object\n */\nfunction generateFieldsCode(type: PluginGeneratedType): string {\n const fieldEntries: string[] = [];\n\n for (const [fieldName, field] of Object.entries(type.fields)) {\n // oxlint-disable-next-line no-explicit-any\n const fieldDef = field as any;\n const fieldCode = generateSingleFieldCode(fieldDef);\n if (fieldCode) {\n fieldEntries.push(` ${fieldName}: ${fieldCode}`);\n }\n }\n\n return `{\\n${fieldEntries.join(\",\\n\")},\\n}`;\n}\n\n/**\n * Map from TailorDB type to SDK method name.\n */\nconst typeToMethodMap: Record<string, string> = {\n string: \"string\",\n integer: \"int\",\n float: \"float\",\n boolean: \"bool\",\n uuid: \"uuid\",\n datetime: \"datetime\",\n date: \"date\",\n time: \"time\",\n enum: \"enum\",\n nested: \"nested\",\n};\n\n/**\n * Generate TypeScript code for a single field definition.\n * @param field - Field definition object\n * @returns TypeScript code for the field\n */\n// oxlint-disable-next-line no-explicit-any\nfunction generateSingleFieldCode(field: any): string | null {\n if (!field || typeof field !== \"object\") {\n return null;\n }\n\n const fieldType = field.type;\n if (!fieldType) {\n return null;\n }\n\n const method = typeToMethodMap[fieldType] || fieldType;\n const metadata = field._metadata || field.metadata || {};\n\n // Build options object\n const optionParts: string[] = [];\n if (metadata.required === false) {\n optionParts.push(\"optional: true\");\n }\n\n const optionsArg = optionParts.length > 0 ? `{ ${optionParts.join(\", \")} }` : \"\";\n\n // Handle enum type with values\n if (fieldType === \"enum\") {\n // Extract enum values from allowedValues array\n const allowedValues = metadata.allowedValues;\n let enumValues: string[] = [];\n if (Array.isArray(allowedValues)) {\n enumValues = allowedValues.map((v: { value: string }) => v.value);\n }\n\n let code = `db.enum(${JSON.stringify(enumValues)}${optionsArg ? `, ${optionsArg}` : \"\"})`;\n if (metadata.index) {\n code += \".index()\";\n }\n if (metadata.unique) {\n code += \".unique()\";\n }\n if (metadata.description) {\n code += `.description(${JSON.stringify(metadata.description)})`;\n }\n return code;\n }\n\n // Build method chain for other types\n let code = `db.${method}(${optionsArg})`;\n\n // Add index if present\n if (metadata.index) {\n code += \".index()\";\n }\n\n // Add unique if present\n if (metadata.unique) {\n code += \".unique()\";\n }\n\n // Add description if present\n if (metadata.description) {\n code += `.description(${JSON.stringify(metadata.description)})`;\n }\n\n return code;\n}\n\n/**\n * Convert plugin ID to safe directory name.\n * @param pluginId - Plugin identifier (e.g., \"@tailor-platform/change-history\")\n * @returns Safe directory name (e.g., \"tailor-platform-change-history\")\n */\nfunction sanitizePluginId(pluginId: string): string {\n return pluginId.replace(/^@/, \"\").replace(/\\//g, \"-\");\n}\n\n/**\n * Convert string to kebab-case.\n * @param str - Input string\n * @returns kebab-case string\n */\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n}\n\n/**\n * Convert string to camelCase.\n * @param str - Input string\n * @returns camelCase string\n */\nfunction toCamelCase(str: string): string {\n const result = str.replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"));\n return result.charAt(0).toLowerCase() + result.slice(1);\n}\n","import * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport ml from \"multiline-ts\";\nimport * as path from \"pathe\";\nimport { logger } from \"@/cli/utils/logger\";\nimport type { AppConfig } from \"@/parser/app-config\";\n\nexport interface AttributeMapConfig {\n [key: string]: string;\n}\n\nexport type AttributeListConfig = readonly string[];\n\ninterface ExtractedAttributes {\n attributeMap?: AttributeMapConfig;\n attributeList?: AttributeListConfig;\n env?: Record<string, string | number | boolean>;\n}\n\ntype AttributeFieldLike = {\n type?: string;\n metadata?: {\n array?: boolean;\n allowedValues?: Array<{ value: string }>;\n };\n};\n\n/**\n * Extract attribute definitions from the app config for user-defined typing.\n * @param config - Application config to inspect\n * @returns Extracted attribute map/list and env values\n * @internal\n */\nexport function extractAttributesFromConfig(config: AppConfig): ExtractedAttributes {\n return collectAttributesFromConfig(config);\n}\n\n/**\n * Generate the contents of the user-defined type definition file.\n * @param attributeMap - Attribute map configuration\n * @param attributeList - Attribute list configuration\n * @param env - Environment configuration\n * @returns Generated type definition source\n */\nexport function generateTypeDefinition(\n attributeMap: AttributeMapConfig | undefined,\n attributeList: AttributeListConfig | undefined,\n env?: Record<string, string | number | boolean>,\n): string {\n // Generate AttributeMap interface\n // attributeMap values are type string representations (e.g., \"string\", \"boolean\", \"string[]\")\n const mapFields = attributeMap\n ? Object.entries(attributeMap)\n .map(([key, value]) => ` ${key}: ${value};`)\n .join(\"\\n\")\n : \"\";\n\n const mapBody =\n !attributeMap || Object.keys(attributeMap).length === 0\n ? \"{}\"\n : `{\n${mapFields}\n }`;\n\n // Generate AttributeList type as a tuple of strings based on the length\n const listType = attributeList ? `[${attributeList.map(() => \"string\").join(\", \")}]` : \"[]\";\n\n // Use interface with __tuple marker for declaration merging and tuple type support\n const listBody = `{\n __tuple?: ${listType};\n }`;\n\n // Generate Env interface\n const envFields = env\n ? Object.entries(env)\n .map(([key, value]) => {\n const valueType = typeof value === \"string\" ? `\"${value}\"` : String(value);\n return ` ${key}: ${valueType};`;\n })\n .join(\"\\n\")\n : \"\";\n\n const envBody =\n !env || Object.keys(env).length === 0\n ? \"{}\"\n : `{\n${envFields}\n }`;\n\n return ml /* ts */ `\n// This file is auto-generated by @tailor-platform/sdk\n// Do not edit this file manually\n// Regenerated automatically when running 'tailor-sdk apply' or 'tailor-sdk generate'\n\ndeclare module \"@tailor-platform/sdk\" {\n interface AttributeMap ${mapBody}\n interface AttributeList ${listBody}\n interface Env ${envBody}\n}\n\nexport {};\n\n`;\n}\n\nconst require = createRequire(import.meta.url);\n\nfunction collectAttributesFromConfig(config: AppConfig): ExtractedAttributes {\n const auth = config.auth;\n if (!auth || typeof auth !== \"object\") {\n return {};\n }\n\n const inferAttributeType = (field?: AttributeFieldLike): string => {\n const type = field?.type;\n const metadata = field?.metadata;\n\n // Default to string if no metadata\n if (!metadata) {\n return \"string\";\n }\n\n let typeStr = \"string\";\n\n if (type === \"boolean\") {\n typeStr = \"boolean\";\n } else if (type === \"enum\" && metadata.allowedValues) {\n // Generate union type from enum values\n typeStr = metadata.allowedValues.map((v) => `\"${v.value}\"`).join(\" | \");\n }\n\n // Add array suffix if needed\n if (metadata.array) {\n typeStr += \"[]\";\n }\n\n return typeStr;\n };\n\n // Check if auth has userProfile with attributes/attributeList\n if (\"userProfile\" in auth) {\n const userProfile = (\n auth as {\n userProfile?: {\n type?: {\n fields?: Record<string, AttributeFieldLike>;\n };\n attributes?: Record<string, true>;\n attributeList?: AttributeListConfig;\n };\n }\n ).userProfile;\n\n const attributes = userProfile?.attributes;\n const fields = userProfile?.type?.fields;\n const attributeList = userProfile?.attributeList;\n\n // Convert attributes to AttributeMapConfig by inferring types from field metadata\n const attributeMap: AttributeMapConfig | undefined = attributes\n ? Object.keys(attributes).reduce((acc, key) => {\n acc[key] = inferAttributeType(fields?.[key]);\n return acc;\n }, {} as AttributeMapConfig)\n : undefined;\n\n return {\n attributeMap,\n attributeList,\n };\n }\n\n if (\"machineUserAttributes\" in auth) {\n const machineUserAttributes = (\n auth as {\n machineUserAttributes?: Record<string, AttributeFieldLike>;\n }\n ).machineUserAttributes;\n\n if (!machineUserAttributes) {\n return {};\n }\n\n const attributeMap = Object.entries(machineUserAttributes).reduce((acc, [key, field]) => {\n acc[key] = inferAttributeType(field);\n return acc;\n }, {} as AttributeMapConfig);\n\n return {\n attributeMap,\n };\n }\n\n return {};\n}\n\n/**\n * Resolve the output path for the generated type definition file.\n * @param configPath - Path to Tailor config file\n * @returns Absolute path to the type definition file\n */\nfunction resolveTypeDefinitionPath(configPath: string): string {\n // Check for environment variable override\n const typePath = process.env.TAILOR_PLATFORM_SDK_TYPE_PATH;\n if (typePath) {\n return path.resolve(process.cwd(), typePath);\n }\n\n const configDir = path.dirname(path.resolve(configPath));\n const packageDir = resolvePackageDirectory(configDir);\n\n if (!packageDir) {\n return path.join(\n configDir,\n \"node_modules\",\n \"@tailor-platform\",\n \"sdk\",\n \"dist\",\n \"user-defined.d.ts\",\n );\n }\n\n return path.join(packageDir, \"dist\", \"user-defined.d.ts\");\n}\n\n/**\n * Options for generating user type definitions\n */\ninterface GenerateUserTypesOptions {\n /** Application config */\n config: AppConfig;\n /** Path to Tailor config file */\n configPath: string;\n}\n\n/**\n * Generate user type definitions from the app config and write them to disk.\n * @param options - Generation options\n * @returns Promise that resolves when types are generated\n */\nexport async function generateUserTypes(options: GenerateUserTypesOptions): Promise<void> {\n const { config, configPath } = options;\n try {\n const { attributeMap, attributeList } = extractAttributesFromConfig(config);\n if (!attributeMap && !attributeList) {\n logger.info(\"No attributes found in configuration\", { mode: \"plain\" });\n }\n\n if (attributeMap) {\n logger.debug(`Extracted AttributeMap: ${JSON.stringify(attributeMap)}`);\n }\n if (attributeList) {\n logger.debug(`Extracted AttributeList: ${JSON.stringify(attributeList)}`);\n }\n\n const env = config.env;\n if (env) {\n logger.debug(`Extracted Env: ${JSON.stringify(env)}`);\n }\n\n // Generate type definition\n const typeDefContent = generateTypeDefinition(attributeMap, attributeList, env);\n const outputPath = resolveTypeDefinitionPath(configPath);\n\n // Write to file\n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.writeFileSync(outputPath, typeDefContent);\n const relativePath = path.relative(process.cwd(), outputPath);\n logger.newline();\n logger.success(`Generated type definitions: ${relativePath}`, {\n mode: \"plain\",\n });\n } catch (error) {\n logger.error(\"Error generating types\");\n logger.error(String(error));\n // Don't throw - this should not block apply/generate\n }\n}\n\nfunction resolvePackageDirectory(startDir: string): string | null {\n let currentDir = startDir;\n const root = path.parse(currentDir).root;\n\n while (true) {\n const candidate = path.join(currentDir, \"node_modules\", \"@tailor-platform\", \"sdk\");\n const packageJsonPath = path.join(candidate, \"package.json\");\n if (fs.existsSync(packageJsonPath)) {\n return candidate;\n }\n\n if (currentDir === root) {\n break;\n }\n\n const parentDir = path.dirname(currentDir);\n currentDir = parentDir;\n }\n\n try {\n const resolved = require.resolve(\"@tailor-platform/sdk/package.json\", {\n paths: [startDir],\n });\n return path.dirname(resolved);\n } catch {\n return null;\n }\n}\n","import { db } from \"@/parser/service/tailordb/runtime\";\nimport type {\n Plugin,\n PluginGeneratedExecutor,\n PluginGeneratedType,\n PluginNamespaceProcessContext,\n PluginOutput,\n TypePluginOutput,\n} from \"@/parser/plugin-config/types\";\nimport type {\n TailorAnyDBType,\n TailorTypePermission,\n TailorTypeGqlPermission,\n} from \"@/parser/service/tailordb/types\";\n\n/**\n * Context for processing a single plugin attachment on a raw TailorDBType\n */\nexport interface ProcessAttachmentContext {\n type: TailorAnyDBType;\n typeConfig: unknown;\n namespace: string;\n pluginId: string;\n}\n\n/**\n * Information about a plugin-generated type (for type file generation)\n */\nexport interface PluginGeneratedTypeInfo {\n /** Plugin ID that generated this type */\n pluginId: string;\n /** Plugin import path for resolving executor files */\n pluginImportPath: string;\n /** Source type name that triggered the plugin */\n sourceTypeName: string;\n /** Kind identifier for this generated type */\n kind: string;\n /** The generated TailorDB type object */\n type: PluginGeneratedType;\n /** Namespace where this type was generated */\n namespace: string;\n /** Plugin config used to generate this type */\n pluginConfig?: unknown;\n}\n\n/**\n * Extended executor info with plugin import path\n */\nexport interface PluginExecutorInfoExtended extends PluginExecutorInfo {\n /** Plugin's import path for resolving executor files */\n pluginImportPath: string;\n}\n\n/**\n * Result of processing a type-attached plugin\n */\nexport type ProcessAttachmentResult =\n | { success: true; output: TypePluginOutput }\n | { success: false; error: string };\n\n/**\n * Result of processing a namespace plugin\n */\nexport type ProcessNamespaceResult =\n | { success: true; output: PluginOutput }\n | { success: false; error: string };\n\n/**\n * Information about a plugin-generated executor\n */\nexport interface PluginExecutorInfo {\n /** The executor definition */\n executor: PluginGeneratedExecutor;\n /** Plugin ID that generated this executor */\n pluginId: string;\n /** Namespace where the executor was generated */\n namespace: string;\n /** Source type name (for type-attached executors, undefined for namespace) */\n sourceTypeName?: string;\n}\n\n/**\n * Manages plugin registration and processing\n */\nexport class PluginManager {\n private plugins: Map<string, Plugin> = new Map();\n private generatedExecutors: PluginExecutorInfo[] = [];\n private generatedTypes: PluginGeneratedTypeInfo[] = [];\n private namespaceGeneratedTypeKeys: Set<string> = new Set();\n private namespaceGeneratedExecutorKeys: Set<string> = new Set();\n\n constructor(plugins: Plugin[] = []) {\n for (const plugin of plugins) {\n if (this.plugins.has(plugin.id)) {\n throw new Error(\n `Duplicate plugin ID \"${plugin.id}\" detected. Each plugin must have a unique ID.`,\n );\n }\n this.plugins.set(plugin.id, plugin);\n }\n }\n\n /**\n * Process a single plugin attachment on a raw TailorDBType.\n * This method is called during type loading before parsing.\n * @param context - Context containing the raw type, config, namespace, and plugin ID\n * @returns Result with plugin output on success, or error message on failure\n */\n async processAttachment(context: ProcessAttachmentContext): Promise<ProcessAttachmentResult> {\n const plugin = this.plugins.get(context.pluginId);\n if (!plugin) {\n return {\n success: false,\n error: `Plugin \"${context.pluginId}\" not found`,\n };\n }\n\n const typeConfigRequired = plugin.typeConfigRequired;\n const resolvedRequired =\n typeof typeConfigRequired === \"function\"\n ? typeConfigRequired(plugin.pluginConfig)\n : typeConfigRequired === true;\n if (resolvedRequired && (context.typeConfig === undefined || context.typeConfig === null)) {\n return {\n success: false,\n error: `Plugin \"${plugin.id}\" requires typeConfig, but none was provided for type \"${context.type.name}\".`,\n };\n }\n\n // Check if plugin supports type-attached processing\n if (!plugin.processType) {\n return {\n success: false,\n error: `Plugin \"${plugin.id}\" does not support type-attached processing (missing processType method). Use processNamespace via definePlugins() instead.`,\n };\n }\n\n // Execute plugin processType with raw TailorDBType\n let output: TypePluginOutput;\n try {\n output = await plugin.processType({\n type: context.type,\n typeConfig: context.typeConfig,\n pluginConfig: plugin.pluginConfig,\n namespace: context.namespace,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: `Plugin \"${plugin.id}\" threw an error while processing type \"${context.type.name}\": ${message}`,\n };\n }\n\n // Collect generated types\n if (output.types && Object.keys(output.types).length > 0) {\n const importPath = plugin.importPath;\n for (const [kind, type] of Object.entries(output.types)) {\n this.generatedTypes.push({\n pluginId: context.pluginId,\n pluginImportPath: importPath,\n sourceTypeName: context.type.name,\n kind,\n type,\n namespace: context.namespace,\n pluginConfig: plugin.pluginConfig,\n });\n }\n }\n\n // Collect generated executors\n if (output.executors && output.executors.length > 0) {\n for (const executor of output.executors) {\n this.generatedExecutors.push({\n executor,\n pluginId: context.pluginId,\n namespace: context.namespace,\n sourceTypeName: context.type.name,\n });\n }\n }\n\n return { success: true, output };\n }\n\n /**\n * Process namespace plugins that don't require a source type.\n * This method is called once per namespace for plugins with processNamespace method.\n * @param namespace - The target namespace for generated types\n * @returns Array of results with plugin outputs and configs\n */\n async processNamespacePlugins(\n namespace: string,\n ): Promise<Array<{ pluginId: string; config: unknown; result: ProcessNamespaceResult }>> {\n const results: Array<{ pluginId: string; config: unknown; result: ProcessNamespaceResult }> =\n [];\n\n for (const [pluginId, plugin] of this.plugins) {\n // Skip plugins without processNamespace method\n if (!plugin.processNamespace) {\n continue;\n }\n\n // Use stored plugin config (from definePlugins)\n const config = plugin.pluginConfig;\n\n // Execute plugin processNamespace\n const context: PluginNamespaceProcessContext = {\n pluginConfig: config,\n namespace,\n };\n\n let output: Awaited<ReturnType<NonNullable<Plugin[\"processNamespace\"]>>>;\n try {\n output = await plugin.processNamespace(context);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n results.push({\n pluginId,\n config,\n result: {\n success: false,\n error: `Plugin \"${plugin.id}\" threw an error during namespace processing for \"${namespace}\": ${message}`,\n },\n });\n continue;\n }\n\n // Collect generated executors (namespace - no source type)\n if (output.executors && output.executors.length > 0) {\n for (const executor of output.executors) {\n const executorKey = `${pluginId}:${executor.name}`;\n if (this.namespaceGeneratedExecutorKeys.has(executorKey)) {\n continue;\n }\n this.namespaceGeneratedExecutorKeys.add(executorKey);\n this.generatedExecutors.push({\n executor,\n pluginId,\n namespace,\n });\n }\n }\n\n // Collect generated types (namespace - no source type)\n if (output.types && Object.keys(output.types).length > 0) {\n const importPath = plugin.importPath;\n for (const [kind, type] of Object.entries(output.types)) {\n const typeKey = `${pluginId}:${kind}:${type.name}`;\n if (this.namespaceGeneratedTypeKeys.has(typeKey)) {\n continue;\n }\n this.namespaceGeneratedTypeKeys.add(typeKey);\n this.generatedTypes.push({\n pluginId,\n pluginImportPath: importPath,\n sourceTypeName: \"(namespace)\",\n kind,\n type,\n namespace,\n pluginConfig: plugin.pluginConfig,\n });\n }\n }\n\n results.push({\n pluginId,\n config,\n result: { success: true, output },\n });\n }\n\n return results;\n }\n\n /**\n * Get plugins that have processNamespace method\n * @returns Array of plugin IDs that support namespace processing\n */\n getNamespacePluginIds(): string[] {\n return Array.from(this.plugins.entries())\n .filter(([, plugin]) => plugin.processNamespace !== undefined)\n .map(([id]) => id);\n }\n\n /**\n * Get the count of registered plugins\n * @returns Number of registered plugins\n */\n get pluginCount(): number {\n return this.plugins.size;\n }\n\n /**\n * Get a plugin by its ID\n * @param pluginId - The plugin ID to look up\n * @returns The plugin instance, or undefined if not found\n */\n getPlugin(pluginId: string): Plugin | undefined {\n return this.plugins.get(pluginId);\n }\n\n /**\n * Get the import path for a plugin\n * @param pluginId - The plugin ID to look up\n * @returns The plugin's import path, or undefined if not found\n */\n getPluginImportPath(pluginId: string): string | undefined {\n return this.plugins.get(pluginId)?.importPath;\n }\n\n /**\n * Get all plugin-generated executors\n * @returns Array of plugin-generated executor info\n */\n getPluginGeneratedExecutors(): ReadonlyArray<PluginExecutorInfo> {\n return this.generatedExecutors;\n }\n\n /**\n * Get all plugin-generated executors with import paths\n * @returns Array of plugin-generated executor info with import paths\n */\n getPluginGeneratedExecutorsWithImportPath(): ReadonlyArray<PluginExecutorInfoExtended> {\n return this.generatedExecutors.map((info) => ({\n ...info,\n pluginImportPath: this.getPluginImportPath(info.pluginId) ?? \"\",\n }));\n }\n\n /**\n * Get all plugin-generated types\n * @returns Array of plugin-generated type info\n */\n getPluginGeneratedTypes(): ReadonlyArray<PluginGeneratedTypeInfo> {\n return this.generatedTypes;\n }\n\n /**\n * Get plugin-generated executors for a specific namespace\n * @param namespace - The namespace to filter by\n * @returns Array of plugin-generated executor info for the namespace\n */\n getPluginGeneratedExecutorsForNamespace(namespace: string): ReadonlyArray<PluginExecutorInfo> {\n return this.generatedExecutors.filter((info) => info.namespace === namespace);\n }\n\n /**\n * Extend a TailorDB type with new fields.\n * This method handles the `db.type()` call and metadata copying internally.\n * @param params - Parameters for type extension\n * @returns The extended TailorDB type\n */\n extendType(params: ExtendTypeParams): TailorAnyDBType {\n const { originalType, extendFields, pluginId } = params;\n const existingFieldNames = Object.keys(originalType.fields);\n const newFieldNames = Object.keys(extendFields);\n const duplicateFields = newFieldNames.filter((name) => existingFieldNames.includes(name));\n\n if (duplicateFields.length > 0) {\n throw new Error(\n `Plugin \"${pluginId}\" attempted to add fields that already exist in type \"${originalType.name}\": ${duplicateFields.join(\", \")}. ` +\n `extendFields cannot overwrite existing fields.`,\n );\n }\n\n const mergedFields = {\n ...originalType.fields,\n ...extendFields,\n };\n\n const { id: _id, ...fieldsWithoutId } = mergedFields;\n const pluralForm = originalType.metadata.settings?.pluralForm;\n const typeName = pluralForm\n ? ([originalType.name, pluralForm] as [string, string])\n : originalType.name;\n const extendedType = db.type(typeName, fieldsWithoutId);\n return copyMetadataToExtendedType(originalType, extendedType);\n }\n}\n\n/**\n * Parameters for extending a TailorDB type\n */\nexport interface ExtendTypeParams {\n /** The original TailorDB type to extend */\n originalType: TailorAnyDBType;\n /** New fields to add to the type */\n extendFields: Record<string, unknown>;\n /** The ID of the plugin extending the type */\n pluginId: string;\n}\n\n/**\n * Copy metadata from original type to extended type.\n * Preserves files, settings, permissions, indexes, and plugins.\n * @param original - The original TailorDB type with metadata\n * @param extended - The newly created extended type\n * @returns The extended type with copied metadata\n */\nfunction copyMetadataToExtendedType(\n original: TailorAnyDBType,\n extended: TailorAnyDBType,\n): TailorAnyDBType {\n let result = extended;\n\n // Copy description\n if (original._description) {\n result = result.description(original._description);\n }\n\n // Copy files metadata\n const metadata = original.metadata;\n if (metadata.files && Object.keys(metadata.files).length > 0) {\n result = result.files(metadata.files);\n }\n\n // Copy settings/features (excluding pluralForm which is set during construction)\n if (metadata.settings) {\n const { pluralForm: _pluralForm, ...features } = metadata.settings;\n if (Object.keys(features).length > 0) {\n result = result.features(\n features as typeof features & { aggregation?: true; bulkUpsert?: true },\n );\n }\n }\n\n // Copy permissions from metadata\n // Zod schema operand types are wider unions than the configure layer's discriminated PermissionCondition,\n // so type assertions are needed here.\n if (metadata.permissions?.record) {\n result = result.permission(metadata.permissions.record as TailorTypePermission);\n }\n if (metadata.permissions?.gql) {\n result = result.gqlPermission(metadata.permissions.gql as TailorTypeGqlPermission);\n }\n\n // Copy indexes from metadata (indexes are stored in metadata, not as a direct property)\n if (metadata.indexes && Object.keys(metadata.indexes).length > 0) {\n const indexDefs = Object.entries(metadata.indexes).map(([name, def]) => ({\n name,\n // Cast fields array to tuple type (IndexDef expects [T, T, ...T[]])\n fields: def.fields as [string, string, ...string[]],\n unique: def.unique,\n }));\n result = result.indexes(...indexDefs);\n }\n\n // Copy plugins (but don't re-process them)\n if (original.plugins && original.plugins.length > 0) {\n for (const plugin of original.plugins) {\n // Use type assertion as plugin ID is dynamic at runtime\n result = result.plugin({\n [plugin.pluginId]: plugin.config,\n } as Parameters<typeof result.plugin>[0]);\n }\n }\n\n return result;\n}\n","import { readPackageJson } from \"@/cli/utils/package-json\";\nimport type { MessageInitShape } from \"@bufbuild/protobuf\";\nimport type { SetMetadataRequestSchema } from \"@tailor-proto/tailor/v1/metadata_pb\";\n\nexport type WithLabel<T> = Partial<\n Record<\n string,\n {\n resource: T;\n label: string | undefined;\n allLabels?: Record<string, string>;\n }\n >\n>;\n\n/**\n * Build TRN prefix for a workspace.\n * @param workspaceId - Workspace ID\n * @returns TRN prefix string\n */\nexport function trnPrefix(workspaceId: string): string {\n return `trn:v1:workspace:${workspaceId}`;\n}\n\nexport const sdkNameLabelKey = \"sdk-name\";\n\n/**\n * Build metadata request with SDK labels.\n * @param trn - Target TRN\n * @param appName - Application name label\n * @param existingLabels - Existing labels to preserve (optional)\n * @returns Metadata request\n */\nexport async function buildMetaRequest(\n trn: string,\n appName: string,\n existingLabels?: Record<string, string>,\n): Promise<MessageInitShape<typeof SetMetadataRequestSchema>> {\n const packageJson = await readPackageJson();\n // Format version to be suitable for label value\n const sdkVersion = packageJson.version\n ? `v${packageJson.version.replace(/\\./g, \"-\")}`\n : \"unknown\";\n\n return {\n trn,\n labels: {\n ...(existingLabels ?? {}),\n [sdkNameLabelKey]: appName,\n \"sdk-version\": sdkVersion,\n },\n };\n}\n","import { logger, styles, symbols } from \"../../utils/logger\";\n\nexport interface HasName {\n name: string;\n}\n\nexport type ChangeSet<\n C extends HasName,\n U extends HasName,\n D extends HasName,\n R extends HasName = never,\n> = {\n readonly title: string;\n readonly creates: C[];\n readonly updates: U[];\n readonly deletes: D[];\n readonly replaces: R[];\n isEmpty: () => boolean;\n print: () => void;\n};\n\n/**\n * Create a new ChangeSet for tracking resource changes.\n * @param title - Title for the change set\n * @returns Empty ChangeSet instance with isEmpty() and print() methods\n */\nexport function createChangeSet<\n C extends HasName,\n U extends HasName,\n D extends HasName,\n R extends HasName = never,\n>(title: string): ChangeSet<C, U, D, R> {\n const creates: C[] = [];\n const updates: U[] = [];\n const deletes: D[] = [];\n const replaces: R[] = [];\n\n const isEmpty = (): boolean =>\n creates.length === 0 && updates.length === 0 && deletes.length === 0 && replaces.length === 0;\n\n return {\n title,\n creates,\n updates,\n deletes,\n replaces,\n isEmpty,\n print: () => {\n if (isEmpty()) {\n return;\n }\n logger.log(styles.bold(`${title}:`));\n creates.forEach((item) => logger.log(` ${symbols.create} ${item.name}`));\n deletes.forEach((item) => logger.log(` ${symbols.delete} ${item.name}`));\n updates.forEach((item) => logger.log(` ${symbols.update} ${item.name}`));\n replaces.forEach((item) => logger.log(` ${symbols.replace} ${item.name}`));\n },\n };\n}\n","import { type MessageInitShape } from \"@bufbuild/protobuf\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport {\n Subgraph_ServiceType,\n type SubgraphSchema,\n} from \"@tailor-proto/tailor/v1/application_resource_pb\";\nimport { fetchAll, resolveStaticWebsiteUrls, type OperatorClient } from \"../../client\";\nimport { buildMetaRequest } from \"./label\";\nimport { createChangeSet } from \".\";\nimport type { ApplyPhase, PlanContext } from \"..\";\nimport type {\n DeleteApplicationRequestSchema,\n CreateApplicationRequestSchema,\n UpdateApplicationRequestSchema,\n} from \"@tailor-proto/tailor/v1/application_pb\";\nimport type { SetMetadataRequestSchema } from \"@tailor-proto/tailor/v1/metadata_pb\";\n\n/**\n * Apply application changes for the given phase.\n * @param client - Operator client instance\n * @param changeSet - Planned application changes\n * @param phase - Apply phase\n * @returns Promise that resolves when applications are applied\n */\nexport async function applyApplication(\n client: OperatorClient,\n changeSet: Awaited<ReturnType<typeof planApplication>>,\n phase: Extract<ApplyPhase, \"create-update\" | \"delete\"> = \"create-update\",\n) {\n if (phase === \"create-update\") {\n // Applications\n await Promise.all([\n ...changeSet.creates.map(async (create) => {\n create.request.cors = await resolveStaticWebsiteUrls(\n client,\n create.request.workspaceId!,\n create.request.cors,\n \"CORS\",\n );\n await client.createApplication(create.request);\n await client.setMetadata(create.metaRequest);\n }),\n ...changeSet.updates.map(async (update) => {\n update.request.cors = await resolveStaticWebsiteUrls(\n client,\n update.request.workspaceId!,\n update.request.cors,\n \"CORS\",\n );\n await client.updateApplication(update.request);\n await client.setMetadata(update.metaRequest);\n }),\n ]);\n } else if (phase === \"delete\") {\n // Delete in reverse order of dependencies\n // Applications\n await Promise.all(\n changeSet.deletes.map(async (del) => {\n await client.deleteApplication(del.request);\n }),\n );\n }\n}\n\ntype CreateApplication = {\n name: string;\n request: MessageInitShape<typeof CreateApplicationRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype UpdateApplication = {\n name: string;\n request: MessageInitShape<typeof UpdateApplicationRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype DeleteApplication = {\n name: string;\n request: MessageInitShape<typeof DeleteApplicationRequestSchema>;\n};\n\nfunction trn(workspaceId: string, name: string) {\n return `trn:v1:workspace:${workspaceId}:application:${name}`;\n}\n\n/**\n * Plan application changes based on current and desired state.\n * @param context - Planning context\n * @returns Planned changes\n */\nexport async function planApplication(context: PlanContext) {\n const { client, workspaceId, application, forRemoval } = context;\n const changeSet = createChangeSet<CreateApplication, UpdateApplication, DeleteApplication>(\n \"Applications\",\n );\n\n const existingApplications = await fetchAll(async (pageToken) => {\n try {\n const { applications, nextPageToken } = await client.listApplications({\n workspaceId,\n pageToken,\n });\n return [applications, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n\n if (forRemoval) {\n if (existingApplications.some((app) => app.name === application.name)) {\n changeSet.deletes.push({\n name: application.name,\n request: {\n workspaceId,\n applicationName: application.name,\n },\n });\n }\n changeSet.print();\n return changeSet;\n }\n\n let authNamespace: string | undefined;\n let authIdpConfigName: string | undefined;\n if (application.authService && application.authService.config) {\n authNamespace = application.authService.config.name;\n\n const idProvider = application.authService.config.idProvider;\n if (idProvider) {\n authIdpConfigName = idProvider.name;\n }\n } else if (application.config.auth) {\n // Retrieve idpConfig from remote when auth references an external namespace\n authNamespace = application.config.auth.name;\n const idpConfigs = await fetchAll(async (pageToken) => {\n try {\n const { idpConfigs, nextPageToken } = await client.listAuthIDPConfigs({\n workspaceId,\n namespaceName: authNamespace!,\n pageToken,\n });\n return [idpConfigs, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n if (idpConfigs.length > 0) {\n authIdpConfigName = idpConfigs[0].name;\n }\n }\n const metaRequest = await buildMetaRequest(trn(workspaceId, application.name), application.name);\n\n if (existingApplications.some((app) => app.name === application.name)) {\n changeSet.updates.push({\n name: application.name,\n request: {\n workspaceId,\n applicationName: application.name,\n authNamespace,\n authIdpConfigName,\n cors: application.config.cors,\n subgraphs: application.subgraphs.map((subgraph) => protoSubgraph(subgraph)),\n allowedIpAddresses: application.config.allowedIpAddresses,\n disableIntrospection: application.config.disableIntrospection,\n },\n metaRequest,\n });\n } else {\n changeSet.creates.push({\n name: application.name,\n request: {\n workspaceId,\n applicationName: application.name,\n authNamespace,\n authIdpConfigName,\n cors: application.config.cors,\n subgraphs: application.subgraphs.map((subgraph) => protoSubgraph(subgraph)),\n allowedIpAddresses: application.config.allowedIpAddresses,\n disableIntrospection: application.config.disableIntrospection,\n },\n metaRequest,\n });\n }\n\n changeSet.print();\n return changeSet;\n}\n\nfunction protoSubgraph(\n subgraph: Readonly<{ Type: string; Name: string }>,\n): MessageInitShape<typeof SubgraphSchema> {\n // TODO(remiposo): Make it type-safe\n let serviceType: Subgraph_ServiceType;\n switch (subgraph.Type) {\n case \"tailordb\":\n serviceType = Subgraph_ServiceType.TAILORDB;\n break;\n case \"pipeline\":\n serviceType = Subgraph_ServiceType.PIPELINE;\n break;\n case \"idp\":\n serviceType = Subgraph_ServiceType.IDP;\n break;\n case \"auth\":\n serviceType = Subgraph_ServiceType.AUTH;\n break;\n default:\n throw new Error(`Unknown subgraph type: ${subgraph.Type}`);\n }\n return {\n serviceType,\n serviceNamespace: subgraph.Name,\n };\n}\n","import { type MessageInitShape } from \"@bufbuild/protobuf\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport {\n type CreateIdPClientRequestSchema,\n type CreateIdPServiceRequestSchema,\n type DeleteIdPClientRequestSchema,\n type DeleteIdPServiceRequestSchema,\n type UpdateIdPServiceRequestSchema,\n} from \"@tailor-proto/tailor/v1/idp_pb\";\nimport { IdPLang } from \"@tailor-proto/tailor/v1/idp_resource_pb\";\nimport { type IdP, type IdPLang as IdPLangInput } from \"@/parser/service/idp\";\nimport { fetchAll, type OperatorClient } from \"../../client\";\nimport { buildMetaRequest, sdkNameLabelKey, type WithLabel } from \"./label\";\nimport { createChangeSet } from \".\";\nimport type { ApplyPhase, PlanContext } from \"..\";\nimport type { OwnerConflict, UnmanagedResource } from \"./confirm\";\nimport type { SetMetadataRequestSchema } from \"@tailor-proto/tailor/v1/metadata_pb\";\n\n/**\n * Build the vault name for an IdP client.\n * @param namespaceName - IdP namespace name\n * @param clientName - IdP client name\n * @returns Vault name\n */\nexport function idpClientVaultName(namespaceName: string, clientName: string) {\n return `idp-${namespaceName}-${clientName}`;\n}\n\n/**\n * Build the secret name for an IdP client.\n * @param namespaceName - IdP namespace name\n * @param clientName - IdP client name\n * @returns Secret name\n */\nexport function idpClientSecretName(namespaceName: string, clientName: string) {\n return `client-secret-${namespaceName}-${clientName}`;\n}\n\n/**\n * Apply IdP-related changes for the given phase.\n * @param client - Operator client instance\n * @param result - Planned IdP changes\n * @param phase - Apply phase\n * @returns Promise that resolves when IdP changes are applied\n */\nexport async function applyIdP(\n client: OperatorClient,\n result: Awaited<ReturnType<typeof planIdP>>,\n phase: Exclude<ApplyPhase, \"delete\"> = \"create-update\",\n) {\n const { changeSet } = result;\n if (phase === \"create-update\") {\n // Services\n await Promise.all([\n ...changeSet.service.creates.map(async (create) => {\n await client.createIdPService(create.request);\n await client.setMetadata(create.metaRequest);\n }),\n ...changeSet.service.updates.map(async (update) => {\n await client.updateIdPService(update.request);\n await client.setMetadata(update.metaRequest);\n }),\n ]);\n\n // Clients\n await Promise.all([\n ...changeSet.client.creates.map(async (create) => {\n const resp = await client.createIdPClient(create.request);\n\n // Create the secret manager vault and secret\n const vaultName = idpClientVaultName(\n create.request.namespaceName!,\n create.request.client?.name || \"\",\n );\n const secretName = idpClientSecretName(\n create.request.namespaceName!,\n create.request.client?.name || \"\",\n );\n await client.createSecretManagerVault({\n workspaceId: create.request.workspaceId,\n secretmanagerVaultName: vaultName,\n });\n await client.createSecretManagerSecret({\n workspaceId: create.request.workspaceId,\n secretmanagerVaultName: vaultName,\n secretmanagerSecretName: secretName,\n secretmanagerSecretValue: resp.client?.clientSecret,\n });\n }),\n ...changeSet.client.updates.map(async (update) => {\n // Ensure the vault and secret exist\n const vaultName = idpClientVaultName(update.namespaceName, update.name);\n const secretName = idpClientSecretName(update.namespaceName, update.name);\n try {\n await client.getSecretManagerVault({\n workspaceId: update.workspaceId,\n secretmanagerVaultName: vaultName,\n });\n return;\n } catch (error) {\n if (!(error instanceof ConnectError && error.code === Code.NotFound)) {\n throw error;\n }\n }\n await client.createSecretManagerVault({\n workspaceId: update.workspaceId,\n secretmanagerVaultName: vaultName,\n });\n await client.createSecretManagerSecret({\n workspaceId: update.workspaceId,\n secretmanagerVaultName: vaultName,\n secretmanagerSecretName: secretName,\n secretmanagerSecretValue: update.clientSecret,\n });\n }),\n ]);\n } else if (phase === \"delete-resources\") {\n // Delete in reverse order of dependencies\n // Clients\n await Promise.all(\n changeSet.client.deletes.map(async (del) => {\n await client.deleteIdPClient(del.request);\n\n // Delete the secret manager vault and secret\n const vaultName = `idp-${del.request.namespaceName}-${del.request.name}`;\n await client.deleteSecretManagerVault({\n workspaceId: del.request.workspaceId,\n secretmanagerVaultName: vaultName,\n });\n }),\n );\n } else if (phase === \"delete-services\") {\n // Services only\n await Promise.all(changeSet.service.deletes.map((del) => client.deleteIdPService(del.request)));\n }\n}\n\n/**\n * Plan IdP-related changes based on current and desired state.\n * @param context - Planning context\n * @returns Planned changes and metadata\n */\nexport async function planIdP(context: PlanContext) {\n const { client, workspaceId, application, forRemoval } = context;\n const idps = forRemoval ? [] : application.idpServices;\n const {\n changeSet: serviceChangeSet,\n conflicts,\n unmanaged,\n resourceOwners,\n } = await planServices(client, workspaceId, application.name, idps);\n const deletedServices = serviceChangeSet.deletes.map((del) => del.name);\n const clientChangeSet = await planClients(client, workspaceId, idps, deletedServices);\n\n serviceChangeSet.print();\n clientChangeSet.print();\n return {\n changeSet: {\n service: serviceChangeSet,\n client: clientChangeSet,\n },\n conflicts,\n unmanaged,\n resourceOwners,\n };\n}\n\ntype CreateService = {\n name: string;\n request: MessageInitShape<typeof CreateIdPServiceRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype UpdateService = {\n name: string;\n request: MessageInitShape<typeof UpdateIdPServiceRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype DeleteService = {\n name: string;\n request: MessageInitShape<typeof DeleteIdPServiceRequestSchema>;\n};\n\nfunction trn(workspaceId: string, name: string) {\n return `trn:v1:workspace:${workspaceId}:idp:${name}`;\n}\n\nasync function planServices(\n client: OperatorClient,\n workspaceId: string,\n appName: string,\n idps: ReadonlyArray<IdP>,\n) {\n const changeSet = createChangeSet<CreateService, UpdateService, DeleteService>(\"IdP services\");\n const conflicts: OwnerConflict[] = [];\n const unmanaged: UnmanagedResource[] = [];\n const resourceOwners = new Set<string>();\n\n const withoutLabel = await fetchAll(async (pageToken) => {\n try {\n const { idpServices, nextPageToken } = await client.listIdPServices({\n workspaceId,\n pageToken,\n });\n return [idpServices, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n const existingServices: WithLabel<(typeof withoutLabel)[number]> = {};\n await Promise.all(\n withoutLabel.map(async (resource) => {\n if (!resource.namespace?.name) {\n return;\n }\n const { metadata } = await client.getMetadata({\n trn: trn(workspaceId, resource.namespace.name),\n });\n existingServices[resource.namespace.name] = {\n resource,\n label: metadata?.labels[sdkNameLabelKey],\n };\n }),\n );\n\n for (const idp of idps) {\n const namespaceName = idp.name;\n const existing = existingServices[namespaceName];\n const metaRequest = await buildMetaRequest(trn(workspaceId, namespaceName), appName);\n let authorization;\n switch (idp.authorization) {\n case \"insecure\":\n authorization = \"true==true\";\n break;\n case \"loggedIn\":\n authorization = \"user != null && size(user.id) > 0\";\n break;\n default:\n authorization = idp.authorization.cel;\n break;\n }\n\n const lang = convertLang(idp.lang);\n const userAuthPolicy = idp.userAuthPolicy;\n\n if (existing) {\n if (!existing.label) {\n unmanaged.push({\n resourceType: \"IdP service\",\n resourceName: idp.name,\n });\n } else if (existing.label !== appName) {\n conflicts.push({\n resourceType: \"IdP service\",\n resourceName: idp.name,\n currentOwner: existing.label,\n });\n }\n\n changeSet.updates.push({\n name: namespaceName,\n request: {\n workspaceId,\n namespaceName,\n authorization,\n lang,\n userAuthPolicy,\n publishUserEvents: idp.publishUserEvents,\n },\n metaRequest,\n });\n delete existingServices[namespaceName];\n } else {\n changeSet.creates.push({\n name: namespaceName,\n request: {\n workspaceId,\n namespaceName,\n authorization,\n lang,\n userAuthPolicy,\n publishUserEvents: idp.publishUserEvents,\n },\n metaRequest,\n });\n }\n }\n Object.entries(existingServices).forEach(([namespaceName]) => {\n const label = existingServices[namespaceName]?.label;\n if (label && label !== appName) {\n resourceOwners.add(label);\n }\n // Only delete services managed by this application\n if (label === appName) {\n changeSet.deletes.push({\n name: namespaceName,\n request: {\n workspaceId,\n namespaceName,\n },\n });\n }\n });\n\n return { changeSet, conflicts, unmanaged, resourceOwners };\n}\n\ntype CreateClient = {\n name: string;\n request: MessageInitShape<typeof CreateIdPClientRequestSchema>;\n};\n\ntype UpdateClient = {\n name: string;\n workspaceId: string;\n namespaceName: string;\n clientSecret: string;\n};\n\ntype DeleteClient = {\n name: string;\n request: MessageInitShape<typeof DeleteIdPClientRequestSchema>;\n};\n\nasync function planClients(\n client: OperatorClient,\n workspaceId: string,\n idps: ReadonlyArray<IdP>,\n deletedServices: string[],\n) {\n const changeSet = createChangeSet<CreateClient, UpdateClient, DeleteClient>(\"IdP clients\");\n\n const fetchClients = (namespaceName: string) => {\n return fetchAll(async (pageToken) => {\n try {\n const { clients, nextPageToken } = await client.listIdPClients({\n workspaceId,\n namespaceName,\n pageToken,\n });\n return [clients, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n };\n\n for (const idp of idps) {\n const namespaceName = idp.name;\n const existingClients = await fetchClients(namespaceName);\n const existingNameMap = new Map<string, string>();\n existingClients.forEach((client) => {\n existingNameMap.set(client.name, client.clientSecret);\n });\n for (const name of idp.clients) {\n if (existingNameMap.has(name)) {\n changeSet.updates.push({\n name,\n workspaceId,\n namespaceName,\n clientSecret: existingNameMap.get(name)!,\n });\n existingNameMap.delete(name);\n } else {\n changeSet.creates.push({\n name,\n request: {\n workspaceId,\n namespaceName,\n client: {\n name,\n },\n },\n });\n }\n }\n existingNameMap.forEach((name) => {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n namespaceName,\n name,\n },\n });\n });\n }\n\n for (const namespaceName of deletedServices) {\n const existingClients = await fetchClients(namespaceName);\n existingClients.forEach((client) => {\n changeSet.deletes.push({\n name: client.name,\n request: {\n workspaceId,\n namespaceName,\n name: client.name,\n },\n });\n });\n }\n return changeSet;\n}\n\nfunction convertLang(lang: IdPLangInput | undefined): IdPLang {\n switch (lang) {\n case \"en\":\n return IdPLang.EN;\n case \"ja\":\n return IdPLang.JA;\n default:\n return IdPLang.UNSPECIFIED;\n }\n}\n","import { fromJson, type MessageInitShape } from \"@bufbuild/protobuf\";\nimport { ValueSchema } from \"@bufbuild/protobuf/wkt\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport {\n AuthIDPConfig_AuthType,\n AuthOAuth2Client_ClientType,\n AuthOAuth2Client_GrantType,\n AuthSCIMAttribute_Mutability,\n AuthSCIMAttribute_Type,\n AuthSCIMAttribute_Uniqueness,\n AuthSCIMConfig_AuthorizationType,\n TenantProviderConfig_TenantProviderType,\n UserProfileProviderConfig_UserProfileProviderType,\n} from \"@tailor-proto/tailor/v1/auth_resource_pb\";\nimport { type AuthService } from \"@/cli/application/auth/service\";\nimport {\n OAuth2ClientSchema,\n type BuiltinIdP,\n type IdProviderConfig,\n type OAuth2ClientInput,\n type SCIMAttribute,\n type SCIMConfig,\n type SCIMResource,\n type AuthAttributeValue,\n type TenantProviderConfig,\n} from \"@/parser/service/auth\";\nimport { fetchAll, resolveStaticWebsiteUrls, type OperatorClient } from \"../../client\";\nimport { idpClientSecretName, idpClientVaultName } from \"./idp\";\nimport { buildMetaRequest, sdkNameLabelKey, type WithLabel } from \"./label\";\nimport { createChangeSet } from \".\";\nimport type { ApplyPhase, PlanContext } from \"..\";\nimport type { OwnerConflict, UnmanagedResource } from \"./confirm\";\nimport type {\n CreateAuthIDPConfigRequestSchema,\n CreateAuthMachineUserRequestSchema,\n CreateAuthOAuth2ClientRequestSchema,\n CreateAuthSCIMConfigRequestSchema,\n CreateAuthSCIMResourceRequestSchema,\n CreateAuthServiceRequestSchema,\n CreateTenantConfigRequestSchema,\n CreateUserProfileConfigRequestSchema,\n DeleteAuthIDPConfigRequestSchema,\n DeleteAuthMachineUserRequestSchema,\n DeleteAuthOAuth2ClientRequestSchema,\n DeleteAuthSCIMConfigRequestSchema,\n DeleteAuthSCIMResourceRequestSchema,\n DeleteAuthServiceRequestSchema,\n DeleteTenantConfigRequestSchema,\n DeleteUserProfileConfigRequestSchema,\n UpdateAuthIDPConfigRequestSchema,\n UpdateAuthMachineUserRequestSchema,\n UpdateAuthOAuth2ClientRequestSchema,\n UpdateAuthSCIMConfigRequestSchema,\n UpdateAuthSCIMResourceRequestSchema,\n UpdateAuthServiceRequestSchema,\n UpdateTenantConfigRequestSchema,\n UpdateUserProfileConfigRequestSchema,\n} from \"@tailor-proto/tailor/v1/auth_pb\";\nimport type {\n AuthIDPConfig_ConfigSchema,\n AuthIDPConfigSchema,\n AuthOAuth2ClientSchema,\n AuthSCIMAttributeSchema,\n AuthSCIMConfigSchema,\n AuthSCIMResourceSchema,\n TenantProviderConfigSchema,\n UserProfileProviderConfigSchema,\n} from \"@tailor-proto/tailor/v1/auth_resource_pb\";\nimport type { SetMetadataRequestSchema } from \"@tailor-proto/tailor/v1/metadata_pb\";\n\n/**\n * Apply auth-related changes for the given phase.\n * @param client - Operator client instance\n * @param result - Planned auth changes\n * @param phase - Apply phase (defaults to \"create-update\")\n * @returns Promise that resolves when auth changes are applied\n */\nexport async function applyAuth(\n client: OperatorClient,\n result: Awaited<ReturnType<typeof planAuth>>,\n phase: Exclude<ApplyPhase, \"delete\"> = \"create-update\",\n) {\n const { changeSet } = result;\n if (phase === \"create-update\") {\n // Services\n await Promise.all([\n ...changeSet.service.creates.map(async (create) => {\n await client.createAuthService(create.request);\n await client.setMetadata(create.metaRequest);\n }),\n ...changeSet.service.updates.map(async (update) => {\n await client.updateAuthService(update.request);\n await client.setMetadata(update.metaRequest);\n }),\n ]);\n\n // IdPConfigs\n await Promise.all([\n ...changeSet.idpConfig.creates.map(async (create) => {\n if (create.idpConfig.kind === \"BuiltInIdP\") {\n create.request.idpConfig!.config = await protoBuiltinIdPConfig(\n client,\n create.request.workspaceId!,\n create.idpConfig,\n );\n }\n return client.createAuthIDPConfig(create.request);\n }),\n ...changeSet.idpConfig.updates.map(async (update) => {\n if (update.idpConfig.kind === \"BuiltInIdP\") {\n update.request.idpConfig!.config = await protoBuiltinIdPConfig(\n client,\n update.request.workspaceId!,\n update.idpConfig,\n );\n }\n return client.updateAuthIDPConfig(update.request);\n }),\n ]);\n\n // UserProfileConfigs\n await Promise.all([\n ...changeSet.userProfileConfig.creates.map((create) =>\n client.createUserProfileConfig(create.request),\n ),\n ...changeSet.userProfileConfig.updates.map((update) =>\n client.updateUserProfileConfig(update.request),\n ),\n ]);\n\n // TenantConfigs\n await Promise.all([\n ...changeSet.tenantConfig.creates.map((create) => client.createTenantConfig(create.request)),\n ...changeSet.tenantConfig.updates.map((update) => client.updateTenantConfig(update.request)),\n ]);\n\n // MachineUsers\n await Promise.all([\n ...changeSet.machineUser.creates.map((create) =>\n client.createAuthMachineUser(create.request),\n ),\n ...changeSet.machineUser.updates.map((update) =>\n client.updateAuthMachineUser(update.request),\n ),\n ]);\n\n // OAuth2Clients\n await Promise.all([\n ...changeSet.oauth2Client.creates.map(async (create) => {\n create.request.oauth2Client!.redirectUris = await resolveStaticWebsiteUrls(\n client,\n create.request.workspaceId!,\n create.request.oauth2Client!.redirectUris,\n \"OAuth2 redirect URIs\",\n );\n return client.createAuthOAuth2Client(create.request);\n }),\n ...changeSet.oauth2Client.updates.map(async (update) => {\n update.request.oauth2Client!.redirectUris = await resolveStaticWebsiteUrls(\n client,\n update.request.workspaceId!,\n update.request.oauth2Client!.redirectUris,\n \"OAuth2 redirect URIs\",\n );\n return client.updateAuthOAuth2Client(update.request);\n }),\n ]);\n\n // OAuth2Clients replaces (client type changed): delete then create sequentially\n for (const replace of changeSet.oauth2Client.replaces) {\n await client.deleteAuthOAuth2Client(replace.deleteRequest);\n replace.createRequest.oauth2Client!.redirectUris = await resolveStaticWebsiteUrls(\n client,\n replace.createRequest.workspaceId!,\n replace.createRequest.oauth2Client!.redirectUris,\n \"OAuth2 redirect URIs\",\n );\n await client.createAuthOAuth2Client(replace.createRequest);\n }\n\n // SCIMConfigs\n await Promise.all([\n ...changeSet.scim.creates.map((create) => client.createAuthSCIMConfig(create.request)),\n ...changeSet.scim.updates.map((update) => client.updateAuthSCIMConfig(update.request)),\n ]);\n\n // SCIMResources\n await Promise.all([\n ...changeSet.scimResource.creates.map((create) =>\n client.createAuthSCIMResource(create.request),\n ),\n ...changeSet.scimResource.updates.map((update) =>\n client.updateAuthSCIMResource(update.request),\n ),\n ]);\n } else if (phase === \"delete-resources\") {\n // Delete in reverse order of dependencies\n // SCIMResources\n await Promise.all(\n changeSet.scimResource.deletes.map((del) => client.deleteAuthSCIMResource(del.request)),\n );\n\n // SCIMConfigs\n await Promise.all(\n changeSet.scim.deletes.map((del) => client.deleteAuthSCIMConfig(del.request)),\n );\n\n // OAuth2Clients\n await Promise.all(\n changeSet.oauth2Client.deletes.map((del) => client.deleteAuthOAuth2Client(del.request)),\n );\n\n // MachineUsers\n await Promise.all(\n changeSet.machineUser.deletes.map((del) => client.deleteAuthMachineUser(del.request)),\n );\n\n // TenantConfigs\n await Promise.all(\n changeSet.tenantConfig.deletes.map((del) => client.deleteTenantConfig(del.request)),\n );\n\n // UserProfileConfigs\n await Promise.all(\n changeSet.userProfileConfig.deletes.map((del) => client.deleteUserProfileConfig(del.request)),\n );\n\n // IdPConfigs\n await Promise.all(\n changeSet.idpConfig.deletes.map((del) => client.deleteAuthIDPConfig(del.request)),\n );\n } else if (phase === \"delete-services\") {\n // Services only\n await Promise.all(\n changeSet.service.deletes.map((del) => client.deleteAuthService(del.request)),\n );\n }\n}\n\n/**\n * Plan auth-related changes based on current and desired state.\n * @param context - Planning context\n * @returns Planned auth changes and metadata\n */\nexport async function planAuth(context: PlanContext) {\n const { client, workspaceId, application, forRemoval } = context;\n const auths: Readonly<AuthService>[] = [];\n if (!forRemoval && application.authService) {\n await application.authService.resolveNamespaces();\n auths.push(application.authService);\n }\n const {\n changeSet: serviceChangeSet,\n conflicts,\n unmanaged,\n resourceOwners,\n } = await planServices(client, workspaceId, application.name, auths);\n const deletedServices = serviceChangeSet.deletes.map((del) => del.name);\n const idpConfigChangeSet = await planIdPConfigs(client, workspaceId, auths, deletedServices);\n const userProfileConfigChangeSet = await planUserProfileConfigs(\n client,\n workspaceId,\n auths,\n deletedServices,\n );\n const tenantConfigChangeSet = await planTenantConfigs(\n client,\n workspaceId,\n auths,\n deletedServices,\n );\n const machineUserChangeSet = await planMachineUsers(client, workspaceId, auths, deletedServices);\n const oauth2ClientChangeSet = await planOAuth2Clients(\n client,\n workspaceId,\n auths,\n deletedServices,\n );\n const scimChangeSet = await planSCIMConfigs(client, workspaceId, auths, deletedServices);\n const scimResourceChangeSet = await planSCIMResources(\n client,\n workspaceId,\n auths,\n deletedServices,\n );\n\n serviceChangeSet.print();\n idpConfigChangeSet.print();\n userProfileConfigChangeSet.print();\n tenantConfigChangeSet.print();\n machineUserChangeSet.print();\n oauth2ClientChangeSet.print();\n scimChangeSet.print();\n scimResourceChangeSet.print();\n return {\n changeSet: {\n service: serviceChangeSet,\n idpConfig: idpConfigChangeSet,\n userProfileConfig: userProfileConfigChangeSet,\n tenantConfig: tenantConfigChangeSet,\n machineUser: machineUserChangeSet,\n oauth2Client: oauth2ClientChangeSet,\n scim: scimChangeSet,\n scimResource: scimResourceChangeSet,\n },\n conflicts,\n unmanaged,\n resourceOwners,\n };\n}\n\ntype CreateService = {\n name: string;\n request: MessageInitShape<typeof CreateAuthServiceRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype UpdateService = {\n name: string;\n request: MessageInitShape<typeof UpdateAuthServiceRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype DeleteService = {\n name: string;\n request: MessageInitShape<typeof DeleteAuthServiceRequestSchema>;\n};\n\nfunction trn(workspaceId: string, name: string) {\n return `trn:v1:workspace:${workspaceId}:auth:${name}`;\n}\n\nasync function planServices(\n client: OperatorClient,\n workspaceId: string,\n appName: string,\n auths: ReadonlyArray<Readonly<AuthService>>,\n) {\n const changeSet = createChangeSet<CreateService, UpdateService, DeleteService>(\"Auth services\");\n const conflicts: OwnerConflict[] = [];\n const unmanaged: UnmanagedResource[] = [];\n const resourceOwners = new Set<string>();\n\n const withoutLabel = await fetchAll(async (pageToken) => {\n try {\n const { authServices, nextPageToken } = await client.listAuthServices({\n workspaceId,\n pageToken,\n });\n return [authServices, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n const existingServices: WithLabel<(typeof withoutLabel)[number]> = {};\n await Promise.all(\n withoutLabel.map(async (resource) => {\n if (!resource.namespace?.name) {\n return;\n }\n const { metadata } = await client.getMetadata({\n trn: trn(workspaceId, resource.namespace.name),\n });\n existingServices[resource.namespace.name] = {\n resource,\n label: metadata?.labels[sdkNameLabelKey],\n };\n }),\n );\n\n for (const auth of auths) {\n const { parsedConfig: config } = auth;\n const existing = existingServices[config.name];\n const metaRequest = await buildMetaRequest(trn(workspaceId, config.name), appName);\n if (existing) {\n if (!existing.label) {\n unmanaged.push({\n resourceType: \"Auth service\",\n resourceName: config.name,\n });\n } else if (existing.label !== appName) {\n conflicts.push({\n resourceType: \"Auth service\",\n resourceName: config.name,\n currentOwner: existing.label,\n });\n }\n\n changeSet.updates.push({\n name: config.name,\n request: {\n workspaceId,\n namespaceName: config.name,\n publishSessionEvents: config.publishSessionEvents,\n },\n metaRequest,\n });\n delete existingServices[config.name];\n } else {\n changeSet.creates.push({\n name: config.name,\n request: {\n workspaceId,\n namespaceName: config.name,\n publishSessionEvents: config.publishSessionEvents,\n },\n metaRequest,\n });\n }\n }\n Object.entries(existingServices).forEach(([namespaceName]) => {\n const label = existingServices[namespaceName]?.label;\n if (label && label !== appName) {\n resourceOwners.add(label);\n }\n // Only delete services managed by this application\n if (label === appName) {\n changeSet.deletes.push({\n name: namespaceName,\n request: {\n workspaceId,\n namespaceName,\n },\n });\n }\n });\n\n return { changeSet, conflicts, unmanaged, resourceOwners };\n}\n\ntype CreateIdPConfig = {\n name: string;\n idpConfig: Readonly<IdProviderConfig>;\n request: MessageInitShape<typeof CreateAuthIDPConfigRequestSchema>;\n};\n\ntype UpdateIdPConfig = {\n name: string;\n idpConfig: Readonly<IdProviderConfig>;\n request: MessageInitShape<typeof UpdateAuthIDPConfigRequestSchema>;\n};\n\ntype DeleteIdPConfig = {\n name: string;\n request: MessageInitShape<typeof DeleteAuthIDPConfigRequestSchema>;\n};\n\nasync function planIdPConfigs(\n client: OperatorClient,\n workspaceId: string,\n auths: ReadonlyArray<Readonly<AuthService>>,\n deletedServices: ReadonlyArray<string>,\n) {\n const changeSet = createChangeSet<CreateIdPConfig, UpdateIdPConfig, DeleteIdPConfig>(\n \"Auth idpConfigs\",\n );\n\n const fetchIdPConfigs = (namespaceName: string) => {\n return fetchAll(async (pageToken) => {\n try {\n const { idpConfigs, nextPageToken } = await client.listAuthIDPConfigs({\n workspaceId,\n namespaceName,\n pageToken,\n });\n return [idpConfigs, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n };\n\n for (const authService of auths) {\n const { parsedConfig: config } = authService;\n const existingIdPConfigs = await fetchIdPConfigs(config.name);\n const existingNameSet = new Set<string>();\n existingIdPConfigs.forEach((idpConfig) => {\n existingNameSet.add(idpConfig.name);\n });\n const idpConfig = config.idProvider;\n if (idpConfig) {\n if (existingNameSet.has(idpConfig.name)) {\n changeSet.updates.push({\n name: idpConfig.name,\n idpConfig,\n request: {\n workspaceId,\n namespaceName: config.name,\n idpConfig: protoIdPConfig(idpConfig),\n },\n });\n existingNameSet.delete(idpConfig.name);\n } else {\n changeSet.creates.push({\n name: idpConfig.name,\n idpConfig,\n request: {\n workspaceId,\n namespaceName: config.name,\n idpConfig: protoIdPConfig(idpConfig),\n },\n });\n }\n }\n existingNameSet.forEach((name) => {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n name,\n },\n });\n });\n }\n\n for (const namespaceName of deletedServices) {\n const existingIdPConfigs = await fetchIdPConfigs(namespaceName);\n existingIdPConfigs.forEach((idpConfig) => {\n changeSet.deletes.push({\n name: idpConfig.name,\n request: {\n workspaceId,\n namespaceName,\n name: idpConfig.name,\n },\n });\n });\n }\n return changeSet;\n}\n\nfunction protoIdPConfig(idpConfig: IdProviderConfig): MessageInitShape<typeof AuthIDPConfigSchema> {\n switch (idpConfig.kind) {\n case \"IDToken\":\n return {\n name: idpConfig.name,\n authType: AuthIDPConfig_AuthType.ID_TOKEN,\n config: {\n config: {\n case: \"idToken\",\n value: {\n providerUrl: idpConfig.providerURL,\n clientId: idpConfig.clientID,\n issuerUrl: idpConfig.issuerURL,\n usernameClaim: idpConfig.usernameClaim,\n },\n },\n },\n };\n case \"SAML\":\n return {\n name: idpConfig.name,\n authType: AuthIDPConfig_AuthType.SAML,\n config: {\n config: {\n case: \"saml\",\n value: {\n ...(idpConfig.metadataURL !== undefined\n ? { metadataUrl: idpConfig.metadataURL }\n : { rawMetadata: idpConfig.rawMetadata! }),\n enableSignRequest: idpConfig.enableSignRequest,\n },\n },\n },\n };\n case \"OIDC\":\n return {\n name: idpConfig.name,\n authType: AuthIDPConfig_AuthType.OIDC,\n config: {\n config: {\n case: \"oidc\",\n value: {\n clientIdKey: idpConfig.clientID,\n clientSecretKey: {\n vaultName: idpConfig.clientSecret.vaultName,\n secretKey: idpConfig.clientSecret.secretKey,\n },\n providerUrl: idpConfig.providerURL,\n issuerUrl: idpConfig.issuerURL,\n usernameClaim: idpConfig.usernameClaim,\n },\n },\n },\n };\n case \"BuiltInIdP\":\n return {\n name: idpConfig.name,\n authType: AuthIDPConfig_AuthType.OIDC,\n // config is set at apply time\n config: {},\n };\n default:\n throw new Error(`Unexpected idp kind: ${idpConfig satisfies never}`);\n }\n}\n\nasync function protoBuiltinIdPConfig(\n client: OperatorClient,\n workspaceId: string,\n builtinIdPConfig: BuiltinIdP,\n): Promise<MessageInitShape<typeof AuthIDPConfig_ConfigSchema>> {\n let idpService;\n try {\n idpService = await client.getIdPService({\n workspaceId,\n namespaceName: builtinIdPConfig.namespace,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(\n `Built-in IdP \"${builtinIdPConfig.namespace}\" not found. Please ensure that idp is configured correctly.`,\n );\n }\n throw error;\n }\n const idpClient = await client.getIdPClient({\n workspaceId,\n namespaceName: builtinIdPConfig.namespace,\n name: builtinIdPConfig.clientName,\n });\n const vaultName = idpClientVaultName(builtinIdPConfig.namespace, builtinIdPConfig.clientName);\n const secretKey = idpClientSecretName(builtinIdPConfig.namespace, builtinIdPConfig.clientName);\n return {\n config: {\n case: \"oidc\",\n value: {\n clientIdKey: idpClient.client?.clientId,\n clientSecretKey: {\n vaultName,\n secretKey,\n },\n providerUrl: idpService.idpService?.providerUrl,\n usernameClaim: \"name\",\n },\n },\n };\n}\n\ntype CreateUserProfileConfig = {\n name: string;\n request: MessageInitShape<typeof CreateUserProfileConfigRequestSchema>;\n};\n\ntype UpdateUserProfileConfig = {\n name: string;\n request: MessageInitShape<typeof UpdateUserProfileConfigRequestSchema>;\n};\n\ntype DeleteUserProfileConfig = {\n name: string;\n request: MessageInitShape<typeof DeleteUserProfileConfigRequestSchema>;\n};\n\nasync function planUserProfileConfigs(\n client: OperatorClient,\n workspaceId: string,\n auths: ReadonlyArray<Readonly<AuthService>>,\n deletedServices: ReadonlyArray<string>,\n) {\n const changeSet = createChangeSet<\n CreateUserProfileConfig,\n UpdateUserProfileConfig,\n DeleteUserProfileConfig\n >(\"Auth userProfileConfigs\");\n\n for (const auth of auths) {\n const { parsedConfig: config } = auth;\n const name = `${config.name}-user-profile-config`;\n try {\n await client.getUserProfileConfig({\n workspaceId,\n namespaceName: config.name,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n const userProfileForCreate = auth.userProfile;\n if (userProfileForCreate) {\n changeSet.creates.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n userProfileProviderConfig: protoUserProfileConfig(userProfileForCreate),\n },\n });\n }\n continue;\n }\n throw error;\n }\n const userProfileForUpdate = auth.userProfile;\n if (userProfileForUpdate) {\n changeSet.updates.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n userProfileProviderConfig: protoUserProfileConfig(userProfileForUpdate),\n },\n });\n } else {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n },\n });\n }\n }\n\n for (const namespaceName of deletedServices) {\n try {\n await client.getUserProfileConfig({\n workspaceId,\n namespaceName,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n continue;\n }\n throw error;\n }\n changeSet.deletes.push({\n name: `${namespaceName}-user-profile-config`,\n request: {\n workspaceId,\n namespaceName,\n },\n });\n }\n return changeSet;\n}\n\nfunction protoUserProfileConfig(\n userProfile: NonNullable<AuthService[\"userProfile\"]>,\n): MessageInitShape<typeof UserProfileProviderConfigSchema> {\n // Convert attributes from { key: true } to { key: \"key\" }\n const attributeMap = userProfile.attributes\n ? Object.fromEntries(Object.keys(userProfile.attributes).map((key) => [key, key]))\n : undefined;\n\n return {\n provider: \"TAILORDB\",\n providerType: UserProfileProviderConfig_UserProfileProviderType.TAILORDB,\n config: {\n config: {\n case: \"tailordb\",\n value: {\n namespace: userProfile.namespace,\n type: userProfile.type.name,\n usernameField: userProfile.usernameField,\n tenantIdField: undefined,\n attributesFields: userProfile.attributeList,\n attributeMap,\n },\n },\n },\n };\n}\n\ntype CreateTenantConfig = {\n name: string;\n request: MessageInitShape<typeof CreateTenantConfigRequestSchema>;\n};\n\ntype UpdateTenantConfig = {\n name: string;\n request: MessageInitShape<typeof UpdateTenantConfigRequestSchema>;\n};\n\ntype DeleteTenantConfig = {\n name: string;\n request: MessageInitShape<typeof DeleteTenantConfigRequestSchema>;\n};\n\nasync function planTenantConfigs(\n client: OperatorClient,\n workspaceId: string,\n auths: ReadonlyArray<Readonly<AuthService>>,\n deletedServices: ReadonlyArray<string>,\n) {\n const changeSet = createChangeSet<CreateTenantConfig, UpdateTenantConfig, DeleteTenantConfig>(\n \"Auth tenantConfigs\",\n );\n\n for (const auth of auths) {\n const { parsedConfig: config } = auth;\n const name = `${config.name}-tenant-config`;\n try {\n await client.getTenantConfig({\n workspaceId,\n namespaceName: config.name,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n if (config.tenantProvider) {\n changeSet.creates.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n tenantProviderConfig: protoTenantConfig(config.tenantProvider),\n },\n });\n }\n continue;\n }\n throw error;\n }\n if (config.tenantProvider) {\n changeSet.updates.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n tenantProviderConfig: protoTenantConfig(config.tenantProvider),\n },\n });\n } else {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n },\n });\n }\n }\n\n for (const namespaceName of deletedServices) {\n try {\n await client.getTenantConfig({\n workspaceId,\n namespaceName,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n continue;\n }\n throw error;\n }\n changeSet.deletes.push({\n name: `${namespaceName}-tenant-config`,\n request: {\n workspaceId,\n namespaceName,\n },\n });\n }\n return changeSet;\n}\n\nfunction protoTenantConfig(\n tenantConfig: TenantProviderConfig,\n): MessageInitShape<typeof TenantProviderConfigSchema> {\n return {\n providerType: TenantProviderConfig_TenantProviderType.TAILORDB,\n config: {\n config: {\n case: \"tailordb\",\n value: {\n namespace: tenantConfig.namespace,\n type: tenantConfig.type,\n signatureField: tenantConfig.signatureField,\n },\n },\n },\n };\n}\n\ntype CreateMachineUser = {\n name: string;\n request: MessageInitShape<typeof CreateAuthMachineUserRequestSchema>;\n};\n\ntype UpdateMachineUser = {\n name: string;\n request: MessageInitShape<typeof UpdateAuthMachineUserRequestSchema>;\n};\n\ntype DeleteMachineUser = {\n name: string;\n request: MessageInitShape<typeof DeleteAuthMachineUserRequestSchema>;\n};\n\nasync function planMachineUsers(\n client: OperatorClient,\n workspaceId: string,\n auths: ReadonlyArray<Readonly<AuthService>>,\n deletedServices: ReadonlyArray<string>,\n) {\n const changeSet = createChangeSet<CreateMachineUser, UpdateMachineUser, DeleteMachineUser>(\n \"Auth machineUsers\",\n );\n\n const fetchMachineUsers = (authNamespace: string) => {\n return fetchAll(async (pageToken) => {\n try {\n const { machineUsers, nextPageToken } = await client.listAuthMachineUsers({\n workspaceId,\n authNamespace,\n pageToken,\n });\n return [machineUsers, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n };\n\n for (const auth of auths) {\n const { parsedConfig: config } = auth;\n const existingMachineUsers = await fetchMachineUsers(config.name);\n const existingNameSet = new Set<string>();\n existingMachineUsers.forEach((machineUser) => {\n existingNameSet.add(machineUser.name);\n });\n for (const machineUsername of Object.keys(config.machineUsers ?? {})) {\n const machineUser = config.machineUsers?.[machineUsername];\n if (!machineUser) {\n continue;\n }\n if (existingNameSet.has(machineUsername)) {\n changeSet.updates.push({\n name: machineUsername,\n request: {\n workspaceId,\n authNamespace: config.name,\n name: machineUsername,\n attributes: machineUser.attributeList,\n attributeMap: machineUser.attributes\n ? protoMachineUserAttributeMap(machineUser.attributes)\n : undefined,\n },\n });\n existingNameSet.delete(machineUsername);\n } else {\n changeSet.creates.push({\n name: machineUsername,\n request: {\n workspaceId,\n authNamespace: config.name,\n name: machineUsername,\n attributes: machineUser.attributeList,\n attributeMap: machineUser.attributes\n ? protoMachineUserAttributeMap(machineUser.attributes)\n : undefined,\n },\n });\n }\n }\n existingNameSet.forEach((name) => {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n authNamespace: config.name,\n name,\n },\n });\n });\n }\n\n for (const namespaceName of deletedServices) {\n const existingMachineUsers = await fetchMachineUsers(namespaceName);\n existingMachineUsers.forEach((machineUser) => {\n changeSet.deletes.push({\n name: machineUser.name,\n request: {\n workspaceId,\n authNamespace: namespaceName,\n name: machineUser.name,\n },\n });\n });\n }\n return changeSet;\n}\n\nfunction protoMachineUserAttributeMap(\n attributeMap: Record<string, AuthAttributeValue>,\n): Record<string, MessageInitShape<typeof ValueSchema>> {\n const ret: Record<string, MessageInitShape<typeof ValueSchema>> = {};\n for (const [key, value] of Object.entries(attributeMap)) {\n ret[key] = fromJson(ValueSchema, value ?? null);\n }\n return ret;\n}\n\ntype CreateOAuth2Clients = {\n name: string;\n request: MessageInitShape<typeof CreateAuthOAuth2ClientRequestSchema>;\n};\n\ntype UpdateOAuth2Client = {\n name: string;\n request: MessageInitShape<typeof UpdateAuthOAuth2ClientRequestSchema>;\n};\n\ntype DeleteOAuth2Client = {\n name: string;\n request: MessageInitShape<typeof DeleteAuthOAuth2ClientRequestSchema>;\n};\n\ntype ReplaceOAuth2Client = {\n name: string;\n deleteRequest: MessageInitShape<typeof DeleteAuthOAuth2ClientRequestSchema>;\n createRequest: MessageInitShape<typeof CreateAuthOAuth2ClientRequestSchema>;\n};\n\nasync function planOAuth2Clients(\n client: OperatorClient,\n workspaceId: string,\n auths: ReadonlyArray<Readonly<AuthService>>,\n deletedServices: ReadonlyArray<string>,\n) {\n const changeSet = createChangeSet<\n CreateOAuth2Clients,\n UpdateOAuth2Client,\n DeleteOAuth2Client,\n ReplaceOAuth2Client\n >(\"Auth oauth2Clients\");\n\n const fetchOAuth2Clients = (namespaceName: string) => {\n return fetchAll(async (pageToken) => {\n try {\n const { oauth2Clients, nextPageToken } = await client.listAuthOAuth2Clients({\n workspaceId,\n namespaceName,\n pageToken,\n });\n return [oauth2Clients, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n };\n\n for (const auth of auths) {\n const { parsedConfig: config } = auth;\n const existingOAuth2Clients = await fetchOAuth2Clients(config.name);\n const existingClientsMap = new Map<string, AuthOAuth2Client_ClientType>();\n existingOAuth2Clients.forEach((oauth2Client) => {\n existingClientsMap.set(oauth2Client.name, oauth2Client.clientType);\n });\n for (const oauth2ClientName of Object.keys(config.oauth2Clients ?? {})) {\n const oauth2Client = config.oauth2Clients?.[oauth2ClientName];\n if (!oauth2Client) {\n continue;\n }\n const newOAuth2Client = protoOAuth2Client(oauth2ClientName, oauth2Client);\n if (existingClientsMap.has(oauth2ClientName)) {\n const existingClientType = existingClientsMap.get(oauth2ClientName)!;\n if (existingClientType !== newOAuth2Client.clientType) {\n // Client type changed: need to replace (delete then create)\n changeSet.replaces.push({\n name: oauth2ClientName,\n deleteRequest: {\n workspaceId,\n namespaceName: config.name,\n name: oauth2ClientName,\n },\n createRequest: {\n workspaceId,\n namespaceName: config.name,\n oauth2Client: newOAuth2Client,\n },\n });\n } else {\n changeSet.updates.push({\n name: oauth2ClientName,\n request: {\n workspaceId,\n namespaceName: config.name,\n oauth2Client: newOAuth2Client,\n },\n });\n }\n existingClientsMap.delete(oauth2ClientName);\n } else {\n changeSet.creates.push({\n name: oauth2ClientName,\n request: {\n workspaceId,\n namespaceName: config.name,\n oauth2Client: newOAuth2Client,\n },\n });\n }\n }\n existingClientsMap.forEach((_, name) => {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n name,\n },\n });\n });\n }\n\n for (const namespaceName of deletedServices) {\n const existingOAuth2Clients = await fetchOAuth2Clients(namespaceName);\n existingOAuth2Clients.forEach((oauth2Client) => {\n changeSet.deletes.push({\n name: oauth2Client.name,\n request: {\n workspaceId,\n namespaceName,\n name: oauth2Client.name,\n },\n });\n });\n }\n\n return changeSet;\n}\n\nfunction protoOAuth2Client(\n oauth2ClientName: string,\n oauth2Client: OAuth2ClientInput,\n): MessageInitShape<typeof AuthOAuth2ClientSchema> {\n // Parse to transform token lifetimes\n const parsed = OAuth2ClientSchema.parse(oauth2Client);\n\n return {\n name: oauth2ClientName,\n description: parsed.description,\n grantTypes: parsed.grantTypes?.map((grantType) => {\n switch (grantType) {\n case \"authorization_code\":\n return AuthOAuth2Client_GrantType.AUTHORIZATION_CODE;\n case \"refresh_token\":\n return AuthOAuth2Client_GrantType.REFRESH_TOKEN;\n default:\n throw new Error(`Unknown OAuth2 client grant type: ${grantType satisfies never}`);\n }\n }),\n redirectUris: parsed.redirectURIs,\n clientType: (\n {\n confidential: AuthOAuth2Client_ClientType.CONFIDENTIAL,\n public: AuthOAuth2Client_ClientType.PUBLIC,\n browser: AuthOAuth2Client_ClientType.BROWSER,\n } satisfies Record<NonNullable<OAuth2ClientInput[\"clientType\"]>, AuthOAuth2Client_ClientType>\n )[parsed.clientType ?? \"confidential\"],\n accessTokenLifetime: parsed.accessTokenLifetimeSeconds,\n refreshTokenLifetime: parsed.refreshTokenLifetimeSeconds,\n requireDpop: parsed.requireDpop,\n };\n}\n\ntype CreateSCIMConfig = {\n name: string;\n request: MessageInitShape<typeof CreateAuthSCIMConfigRequestSchema>;\n};\n\ntype UpdateSCIMConfig = {\n name: string;\n request: MessageInitShape<typeof UpdateAuthSCIMConfigRequestSchema>;\n};\n\ntype DeleteSCIMConfig = {\n name: string;\n request: MessageInitShape<typeof DeleteAuthSCIMConfigRequestSchema>;\n};\n\nasync function planSCIMConfigs(\n client: OperatorClient,\n workspaceId: string,\n auths: ReadonlyArray<Readonly<AuthService>>,\n deletedServices: ReadonlyArray<string>,\n) {\n const changeSet = createChangeSet<CreateSCIMConfig, UpdateSCIMConfig, DeleteSCIMConfig>(\n \"Auth scimConfigs\",\n );\n\n for (const auth of auths) {\n const { parsedConfig: config } = auth;\n const name = `${config.name}-scim-config`;\n try {\n await client.getAuthSCIMConfig({\n workspaceId,\n namespaceName: config.name,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n if (config.scim) {\n changeSet.creates.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n scimConfig: protoSCIMConfig(config.scim),\n },\n });\n }\n continue;\n }\n throw error;\n }\n if (config.scim) {\n changeSet.updates.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n scimConfig: protoSCIMConfig(config.scim),\n },\n });\n } else {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n },\n });\n }\n }\n\n for (const namespaceName of deletedServices) {\n try {\n await client.getAuthSCIMConfig({\n workspaceId,\n namespaceName,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n continue;\n }\n throw error;\n }\n changeSet.deletes.push({\n name: `${namespaceName}-scim-config`,\n request: {\n workspaceId,\n namespaceName,\n },\n });\n }\n return changeSet;\n}\n\nfunction protoSCIMConfig(scimConfig: SCIMConfig): MessageInitShape<typeof AuthSCIMConfigSchema> {\n let authorizationType;\n switch (scimConfig.authorization.type) {\n case \"bearer\":\n authorizationType = AuthSCIMConfig_AuthorizationType.BEARER;\n break;\n case \"oauth2\":\n authorizationType = AuthSCIMConfig_AuthorizationType.OAUTH2;\n break;\n default:\n throw new Error(\n `Unknown SCIM authorization type: ${scimConfig.authorization.type satisfies never}`,\n );\n }\n\n return {\n machineUserName: scimConfig.machineUserName,\n authorizationType,\n authorizationConfig: {\n case: \"bearerSecret\",\n value: {\n vaultName: scimConfig.authorization.bearerSecret?.vaultName,\n secretKey: scimConfig.authorization.bearerSecret?.secretKey,\n },\n },\n };\n}\n\ntype CreateSCIMResource = {\n name: string;\n request: MessageInitShape<typeof CreateAuthSCIMResourceRequestSchema>;\n};\n\ntype UpdateSCIMResource = {\n name: string;\n request: MessageInitShape<typeof UpdateAuthSCIMResourceRequestSchema>;\n};\n\ntype DeleteSCIMResource = {\n name: string;\n request: MessageInitShape<typeof DeleteAuthSCIMResourceRequestSchema>;\n};\n\nasync function planSCIMResources(\n client: OperatorClient,\n workspaceId: string,\n auths: ReadonlyArray<Readonly<AuthService>>,\n deletedServices: ReadonlyArray<string>,\n) {\n const changeSet = createChangeSet<CreateSCIMResource, UpdateSCIMResource, DeleteSCIMResource>(\n \"Auth scimResources\",\n );\n\n const fetchSCIMResources = async (namespaceName: string) => {\n try {\n const { scimResources } = await client.getAuthSCIMResources({\n workspaceId,\n namespaceName,\n });\n return scimResources;\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [];\n }\n throw error;\n }\n };\n\n for (const auth of auths) {\n const { parsedConfig: config } = auth;\n const existingSCIMResources = await fetchSCIMResources(config.name);\n const existingNameSet = new Set<string>();\n existingSCIMResources.forEach((scimResource) => {\n existingNameSet.add(scimResource.name);\n });\n for (const scimResource of config.scim?.resources ?? []) {\n if (existingNameSet.has(scimResource.name)) {\n changeSet.updates.push({\n name: scimResource.name,\n request: {\n workspaceId,\n namespaceName: config.name,\n scimResource: protoSCIMResource(scimResource),\n },\n });\n existingNameSet.delete(scimResource.name);\n } else {\n changeSet.creates.push({\n name: scimResource.name,\n request: {\n workspaceId,\n namespaceName: config.name,\n scimResource: protoSCIMResource(scimResource),\n },\n });\n }\n }\n existingNameSet.forEach((name) => {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n namespaceName: config.name,\n name,\n },\n });\n });\n }\n\n for (const namespaceName of deletedServices) {\n const existingSCIMResources = await fetchSCIMResources(namespaceName);\n existingSCIMResources.forEach((scimResource) => {\n changeSet.deletes.push({\n name: scimResource.name,\n request: {\n workspaceId,\n namespaceName,\n name: scimResource.name,\n },\n });\n });\n }\n return changeSet;\n}\n\nfunction protoSCIMResource(\n scimResource: SCIMResource,\n): MessageInitShape<typeof AuthSCIMResourceSchema> {\n return {\n name: scimResource.name,\n tailorDbNamespace: scimResource.tailorDBNamespace,\n tailorDbType: scimResource.tailorDBType,\n coreSchema: {\n name: scimResource.coreSchema.name,\n attributes: scimResource.coreSchema.attributes.map((attr) => protoSCIMAttribute(attr)),\n },\n attributeMapping: scimResource.attributeMapping.map((attr) => ({\n tailorDbField: attr.tailorDBField,\n scimPath: attr.scimPath,\n })),\n };\n}\n\nfunction protoSCIMAttribute(attr: SCIMAttribute): MessageInitShape<typeof AuthSCIMAttributeSchema> {\n let typ;\n switch (attr.type) {\n case \"string\":\n typ = AuthSCIMAttribute_Type.STRING;\n break;\n case \"number\":\n typ = AuthSCIMAttribute_Type.NUMBER;\n break;\n case \"boolean\":\n typ = AuthSCIMAttribute_Type.BOOLEAN;\n break;\n case \"datetime\":\n typ = AuthSCIMAttribute_Type.DATETIME;\n break;\n case \"complex\":\n typ = AuthSCIMAttribute_Type.COMPLEX;\n break;\n default:\n throw new Error(`Unknown SCIM attribute type: ${attr.type satisfies never}`);\n }\n let mutability;\n if (attr.mutability) {\n switch (attr.mutability) {\n case \"readOnly\":\n mutability = AuthSCIMAttribute_Mutability.READ_ONLY;\n break;\n case \"readWrite\":\n mutability = AuthSCIMAttribute_Mutability.READ_WRITE;\n break;\n case \"writeOnly\":\n mutability = AuthSCIMAttribute_Mutability.WRITE_ONLY;\n break;\n default:\n throw new Error(`Unknown SCIM attribute mutability: ${attr.mutability satisfies never}`);\n }\n }\n let uniqueness;\n if (attr.uniqueness) {\n switch (attr.uniqueness) {\n case \"none\":\n uniqueness = AuthSCIMAttribute_Uniqueness.NONE;\n break;\n case \"server\":\n uniqueness = AuthSCIMAttribute_Uniqueness.SERVER;\n break;\n case \"global\":\n uniqueness = AuthSCIMAttribute_Uniqueness.GLOBAL;\n break;\n default:\n throw new Error(`Unknown SCIM attribute uniqueness: ${attr.uniqueness satisfies never}`);\n }\n }\n return {\n type: typ,\n name: attr.name,\n description: attr.description,\n mutability,\n required: attr.required,\n multiValued: attr.multiValued,\n uniqueness,\n canonicalValues: attr.canonicalValues ?? undefined,\n subAttributes: attr.subAttributes?.map((attr) => protoSCIMAttribute(attr)),\n };\n}\n","import ml from \"multiline-ts\";\nimport { styles, logger } from \"../../utils/logger\";\n\nexport interface OwnerConflict {\n resourceType: string;\n resourceName: string;\n currentOwner: string;\n}\n\nexport interface UnmanagedResource {\n resourceType: string;\n resourceName: string;\n}\n\n/**\n * Confirm reassignment of resources when owner conflicts are detected.\n * @param conflicts - Detected owner conflicts\n * @param appName - Target application name\n * @param yes - Whether to auto-confirm without prompting\n * @returns Promise that resolves when confirmation completes\n */\nexport async function confirmOwnerConflict(\n conflicts: OwnerConflict[],\n appName: string,\n yes: boolean,\n): Promise<void> {\n if (conflicts.length === 0) return;\n\n const currentOwners = [...new Set(conflicts.map((c) => c.currentOwner))];\n\n logger.warn(\"Application name mismatch detected:\");\n\n logger.log(\n ` ${styles.warning(\"Current application(s)\")}: ${currentOwners.map((o) => styles.bold(`\"${o}\"`)).join(\", \")}`,\n );\n logger.log(` ${styles.success(\"New application\")}: ${styles.bold(`\"${appName}\"`)}`);\n logger.newline();\n logger.log(` ${styles.info(\"Resources\")}:`);\n for (const c of conflicts) {\n logger.log(` • ${styles.bold(c.resourceType)} ${styles.info(`\"${c.resourceName}\"`)}`);\n }\n\n if (yes) {\n logger.success(\"Updating resources (--yes flag specified)...\", {\n mode: \"plain\",\n });\n return;\n }\n\n const promptMessage =\n currentOwners.length === 1\n ? `Update these resources to be managed by \"${appName}\"?\\n${styles.dim(\"(Common when renaming your application)\")}`\n : `Update these resources to be managed by \"${appName}\"?`;\n const confirmed = await logger.prompt(promptMessage, {\n type: \"confirm\",\n initial: false,\n });\n if (!confirmed) {\n throw new Error(ml`\n Apply cancelled. Resources remain managed by their current applications.\n To override, run again and confirm, or use --yes flag.\n `);\n }\n}\n\n/**\n * Confirm allowing tailor-sdk to manage previously unmanaged resources.\n * @param resources - Unmanaged resources\n * @param appName - Target application name\n * @param yes - Whether to auto-confirm without prompting\n * @returns Promise that resolves when confirmation completes\n */\nexport async function confirmUnmanagedResources(\n resources: UnmanagedResource[],\n appName: string,\n yes: boolean,\n): Promise<void> {\n if (resources.length === 0) return;\n\n logger.warn(\"Existing resources not tracked by tailor-sdk were found:\");\n\n logger.log(` ${styles.info(\"Resources\")}:`);\n for (const r of resources) {\n logger.log(` • ${styles.bold(r.resourceType)} ${styles.info(`\"${r.resourceName}\"`)}`);\n }\n logger.newline();\n logger.log(\" These resources may have been created by older SDK versions, Terraform, or CUE.\");\n logger.log(\" To continue, confirm that tailor-sdk should manage them.\");\n logger.log(\n \" If they are managed by another tool (e.g., Terraform), cancel and manage them there instead.\",\n );\n\n if (yes) {\n logger.success(`Adding to \"${appName}\" (--yes flag specified)...`, {\n mode: \"plain\",\n });\n return;\n }\n\n const confirmed = await logger.prompt(\n `Allow tailor-sdk to manage these resources for \"${appName}\"?`,\n { type: \"confirm\", initial: false },\n );\n if (!confirmed) {\n throw new Error(ml`\n Apply cancelled. Resources remain unmanaged.\n To override, run again and confirm, or use --yes flag.\n `);\n }\n}\n\nexport interface ImportantResourceDeletion {\n resourceType: string;\n resourceName: string;\n}\n\n/**\n * Confirm deletion of important resources.\n * @param resources - Resources scheduled for deletion\n * @param yes - Whether to auto-confirm without prompting\n * @returns Promise that resolves when confirmation completes\n */\nexport async function confirmImportantResourceDeletion(\n resources: ImportantResourceDeletion[],\n yes: boolean,\n): Promise<void> {\n if (resources.length === 0) return;\n\n logger.warn(\"The following resources will be deleted:\");\n\n logger.log(` ${styles.info(\"Resources\")}:`);\n for (const r of resources) {\n logger.log(` • ${styles.bold(r.resourceType)} ${styles.error(`\"${r.resourceName}\"`)}`);\n }\n logger.newline();\n logger.log(\n styles.warning(\" Deleting these resources will permanently remove all associated data.\"),\n );\n\n if (yes) {\n logger.success(\"Deleting resources (--yes flag specified)...\", {\n mode: \"plain\",\n });\n return;\n }\n\n const confirmed = await logger.prompt(\"Are you sure you want to delete these resources?\", {\n type: \"confirm\",\n initial: false,\n });\n if (!confirmed) {\n throw new Error(ml`\n Apply cancelled. Resources will not be deleted.\n To override, run again and confirm, or use --yes flag.\n `);\n }\n}\n","import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport * as path from \"pathe\";\nimport { getDistDir } from \"@/cli/utils/dist-dir\";\nimport { logger } from \"@/cli/utils/logger\";\nimport { fetchAll, type OperatorClient } from \"../../client\";\nimport { buildMetaRequest, sdkNameLabelKey, type WithLabel } from \"./label\";\nimport { createChangeSet } from \".\";\nimport type { ApplyPhase } from \"..\";\nimport type { OwnerConflict, UnmanagedResource } from \"./confirm\";\nimport type { Application } from \"@/cli/application\";\nimport type { CollectedJob } from \"@/cli/application/workflow/service\";\nimport type { MessageInitShape } from \"@bufbuild/protobuf\";\nimport type { UpdateFunctionRegistryRequestSchema } from \"@tailor-proto/tailor/v1/function_registry_pb\";\nimport type { CreateFunctionRegistryRequestSchema } from \"@tailor-proto/tailor/v1/function_registry_pb\";\nimport type { SetMetadataRequestSchema } from \"@tailor-proto/tailor/v1/metadata_pb\";\n\nconst CHUNK_SIZE = 64 * 1024; // 64KB\n\nexport type FunctionEntry = {\n name: string;\n scriptContent: string;\n contentHash: string;\n description: string;\n};\n\ntype CreateFunction = {\n name: string;\n entry: FunctionEntry;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype UpdateFunction = {\n name: string;\n entry: FunctionEntry;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype DeleteFunction = {\n name: string;\n workspaceId: string;\n};\n\n/**\n * Compute SHA-256 content hash for a script string.\n * @param content - Script content to hash\n * @returns Hex-encoded SHA-256 hash\n */\nfunction computeContentHash(content: string): string {\n return crypto.createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n}\n\nfunction functionRegistryTrn(workspaceId: string, name: string) {\n return `trn:v1:workspace:${workspaceId}:function_registry:${name}`;\n}\n\n/**\n * Build a function registry name for a resolver.\n * @param namespace - Resolver namespace\n * @param resolverName - Resolver name\n * @returns Function registry name\n */\nexport function resolverFunctionName(namespace: string, resolverName: string): string {\n return `resolver--${namespace}--${resolverName}`;\n}\n\n/**\n * Build a function registry name for an executor.\n * @param executorName - Executor name\n * @returns Function registry name\n */\nexport function executorFunctionName(executorName: string): string {\n return `executor--${executorName}`;\n}\n\n/**\n * Build a function registry name for a workflow job.\n * @param jobName - Workflow job name\n * @returns Function registry name\n */\nexport function workflowJobFunctionName(jobName: string): string {\n return `workflow--${jobName}`;\n}\n\n/**\n * Collect all function entries from bundled scripts for all services.\n * @param application - Application definition\n * @param workflowJobs - Collected workflow jobs from config\n * @returns Array of function entries to register\n */\nexport function collectFunctionEntries(\n application: Readonly<Application>,\n workflowJobs: CollectedJob[],\n): FunctionEntry[] {\n const entries: FunctionEntry[] = [];\n const distDir = getDistDir();\n\n // Resolvers\n for (const app of application.applications) {\n for (const pipeline of app.resolverServices) {\n for (const resolver of Object.values(pipeline.getResolvers())) {\n const scriptPath = path.join(distDir, \"resolvers\", `${resolver.name}.js`);\n try {\n const content = fs.readFileSync(scriptPath, \"utf-8\");\n entries.push({\n name: resolverFunctionName(pipeline.namespace, resolver.name),\n scriptContent: content,\n contentHash: computeContentHash(content),\n description: `Resolver: ${pipeline.namespace}/${resolver.name}`,\n });\n } catch {\n logger.warn(`Function file not found: ${scriptPath}`);\n }\n }\n }\n }\n\n // Executors\n if (application.executorService) {\n const executors = application.executorService.getExecutors();\n for (const executor of Object.values(executors)) {\n if (executor.operation.kind === \"function\" || executor.operation.kind === \"jobFunction\") {\n const scriptPath = path.join(distDir, \"executors\", `${executor.name}.js`);\n try {\n const content = fs.readFileSync(scriptPath, \"utf-8\");\n entries.push({\n name: executorFunctionName(executor.name),\n scriptContent: content,\n contentHash: computeContentHash(content),\n description: `Executor: ${executor.name}`,\n });\n } catch {\n logger.warn(`Function file not found: ${scriptPath}`);\n }\n }\n }\n }\n\n // Workflow jobs\n for (const job of workflowJobs) {\n const scriptPath = path.join(distDir, \"workflow-jobs\", `${job.name}.js`);\n try {\n const content = fs.readFileSync(scriptPath, \"utf-8\");\n entries.push({\n name: workflowJobFunctionName(job.name),\n scriptContent: content,\n contentHash: computeContentHash(content),\n description: `Workflow job: ${job.name}`,\n });\n } catch {\n logger.warn(`Function file not found: ${scriptPath}`);\n }\n }\n\n return entries;\n}\n\ntype ExistingFunction = {\n name: string;\n contentHash: string;\n};\n\n/**\n * Plan function registry changes based on current and desired state.\n * @param client - Operator client instance\n * @param workspaceId - Workspace ID\n * @param appName - Application name\n * @param entries - Desired function entries\n * @returns Planned changes\n */\nexport async function planFunctionRegistry(\n client: OperatorClient,\n workspaceId: string,\n appName: string,\n entries: FunctionEntry[],\n) {\n const changeSet = createChangeSet<CreateFunction, UpdateFunction, DeleteFunction>(\n \"Function registry\",\n );\n const conflicts: OwnerConflict[] = [];\n const unmanaged: UnmanagedResource[] = [];\n const resourceOwners = new Set<string>();\n\n // Fetch existing function registry entries\n const existingFunctions = await fetchAll(async (pageToken) => {\n try {\n const response = await client.listFunctionRegistries({\n workspaceId,\n pageToken,\n });\n return [\n response.functions.map(\n (f): ExistingFunction => ({\n name: f.name,\n contentHash: f.contentHash,\n }),\n ),\n response.nextPageToken,\n ];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n\n // Build map of existing functions with their labels\n const existingMap: WithLabel<ExistingFunction> = {};\n await Promise.all(\n existingFunctions.map(async (func) => {\n const { metadata } = await client.getMetadata({\n trn: functionRegistryTrn(workspaceId, func.name),\n });\n existingMap[func.name] = {\n resource: func,\n label: metadata?.labels[sdkNameLabelKey],\n };\n }),\n );\n\n // Process desired entries\n for (const entry of entries) {\n const existing = existingMap[entry.name];\n const metaRequest = await buildMetaRequest(\n functionRegistryTrn(workspaceId, entry.name),\n appName,\n );\n\n if (existing) {\n if (!existing.label) {\n unmanaged.push({\n resourceType: \"Function registry\",\n resourceName: entry.name,\n });\n } else if (existing.label !== appName) {\n conflicts.push({\n resourceType: \"Function registry\",\n resourceName: entry.name,\n currentOwner: existing.label,\n });\n }\n\n changeSet.updates.push({\n name: entry.name,\n entry,\n metaRequest,\n });\n delete existingMap[entry.name];\n } else {\n changeSet.creates.push({\n name: entry.name,\n entry,\n metaRequest,\n });\n }\n }\n\n // Remaining entries in existingMap are candidates for deletion\n for (const [name, existing] of Object.entries(existingMap)) {\n if (!existing) continue;\n const label = existing.label;\n if (label && label !== appName) {\n resourceOwners.add(label);\n }\n // Only delete functions managed by this application\n if (label === appName) {\n changeSet.deletes.push({\n name,\n workspaceId,\n });\n }\n }\n\n changeSet.print();\n return { changeSet, conflicts, unmanaged, resourceOwners };\n}\n\n/**\n * Upload a function script to the function registry using client streaming.\n * @param client - Operator client instance\n * @param workspaceId - Workspace ID\n * @param entry - Function entry to upload\n * @param isCreate - Whether this is a create (true) or update (false)\n */\nasync function uploadFunctionScript(\n client: OperatorClient,\n workspaceId: string,\n entry: FunctionEntry,\n isCreate: boolean,\n) {\n const buffer = Buffer.from(entry.scriptContent, \"utf-8\");\n\n const info = {\n workspaceId,\n name: entry.name,\n description: entry.description,\n sizeBytes: BigInt(buffer.length),\n contentHash: entry.contentHash,\n };\n\n if (isCreate) {\n async function* createStream(): AsyncIterable<\n MessageInitShape<typeof CreateFunctionRegistryRequestSchema>\n > {\n yield { payload: { case: \"info\" as const, value: info } };\n for (let i = 0; i < buffer.length; i += CHUNK_SIZE) {\n yield {\n payload: {\n case: \"chunk\" as const,\n value: buffer.subarray(i, Math.min(i + CHUNK_SIZE, buffer.length)),\n },\n };\n }\n }\n await client.createFunctionRegistry(createStream());\n } else {\n async function* updateStream(): AsyncIterable<\n MessageInitShape<typeof UpdateFunctionRegistryRequestSchema>\n > {\n yield { payload: { case: \"info\" as const, value: info } };\n for (let i = 0; i < buffer.length; i += CHUNK_SIZE) {\n yield {\n payload: {\n case: \"chunk\" as const,\n value: buffer.subarray(i, Math.min(i + CHUNK_SIZE, buffer.length)),\n },\n };\n }\n }\n await client.updateFunctionRegistry(updateStream());\n }\n}\n\n/**\n * Apply function registry changes for the given phase.\n * @param client - Operator client instance\n * @param workspaceId\n * @param result - Planned function registry changes\n * @param phase - Apply phase\n */\nexport async function applyFunctionRegistry(\n client: OperatorClient,\n workspaceId: string,\n result: Awaited<ReturnType<typeof planFunctionRegistry>>,\n phase: Extract<ApplyPhase, \"create-update\" | \"delete\"> = \"create-update\",\n) {\n const { changeSet } = result;\n if (phase === \"create-update\") {\n // Upload new functions\n for (const create of changeSet.creates) {\n await uploadFunctionScript(client, workspaceId, create.entry, true);\n await client.setMetadata(create.metaRequest);\n }\n\n // Update existing functions (server deduplicates content by hash)\n for (const update of changeSet.updates) {\n await uploadFunctionScript(client, workspaceId, update.entry, false);\n await client.setMetadata(update.metaRequest);\n }\n } else if (phase === \"delete\") {\n await Promise.all(\n changeSet.deletes.map((del) =>\n client.deleteFunctionRegistry({\n workspaceId: del.workspaceId,\n name: del.name,\n }),\n ),\n );\n }\n}\n","import { type MessageInitShape } from \"@bufbuild/protobuf\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport {\n type CreateExecutorExecutorRequestSchema,\n type DeleteExecutorExecutorRequestSchema,\n type UpdateExecutorExecutorRequestSchema,\n} from \"@tailor-proto/tailor/v1/executor_pb\";\nimport {\n type ExecutorExecutorSchema,\n type ExecutorTargetConfigSchema,\n ExecutorTargetType,\n type ExecutorTargetWebhookHeaderSchema,\n type ExecutorTriggerConfigSchema,\n ExecutorTriggerType,\n} from \"@tailor-proto/tailor/v1/executor_resource_pb\";\nimport { stringifyFunction } from \"@/parser/service/tailordb\";\nimport { fetchAll, type OperatorClient } from \"../../client\";\nimport { executorFunctionName } from \"./function-registry\";\nimport { buildMetaRequest, sdkNameLabelKey, type WithLabel } from \"./label\";\nimport { createChangeSet } from \".\";\nimport type { ApplyPhase, PlanContext } from \"..\";\nimport type { OwnerConflict, UnmanagedResource } from \"./confirm\";\nimport type { Executor, Trigger } from \"@/parser/service/executor\";\nimport type { SetMetadataRequestSchema } from \"@tailor-proto/tailor/v1/metadata_pb\";\n\n/**\n * Apply executor-related changes for the given phase.\n * @param client - Operator client instance\n * @param result - Planned executor changes\n * @param phase - Apply phase (defaults to \"create-update\")\n * @returns Promise that resolves when executors are applied\n */\nexport async function applyExecutor(\n client: OperatorClient,\n result: Awaited<ReturnType<typeof planExecutor>>,\n phase: Extract<ApplyPhase, \"create-update\" | \"delete\"> = \"create-update\",\n) {\n const { changeSet } = result;\n if (phase === \"create-update\") {\n // Executors\n await Promise.all([\n ...changeSet.creates.map(async (create) => {\n await client.createExecutorExecutor(create.request);\n await client.setMetadata(create.metaRequest);\n }),\n ...changeSet.updates.map(async (update) => {\n await client.updateExecutorExecutor(update.request);\n await client.setMetadata(update.metaRequest);\n }),\n ]);\n } else if (phase === \"delete\") {\n // Delete in reverse order of dependencies\n // Executors\n await Promise.all(changeSet.deletes.map((del) => client.deleteExecutorExecutor(del.request)));\n }\n}\n\ntype CreateExecutor = {\n name: string;\n request: MessageInitShape<typeof CreateExecutorExecutorRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype UpdateExecutor = {\n name: string;\n request: MessageInitShape<typeof UpdateExecutorExecutorRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype DeleteExecutor = {\n name: string;\n request: MessageInitShape<typeof DeleteExecutorExecutorRequestSchema>;\n};\n\nfunction trn(workspaceId: string, name: string) {\n return `trn:v1:workspace:${workspaceId}:executor:${name}`;\n}\n\n/**\n * Plan executor-related changes based on current and desired state.\n * @param context - Planning context\n * @returns Planned changes\n */\nexport async function planExecutor(context: PlanContext) {\n const { client, workspaceId, application, forRemoval } = context;\n const changeSet = createChangeSet<CreateExecutor, UpdateExecutor, DeleteExecutor>(\"Executors\");\n const conflicts: OwnerConflict[] = [];\n const unmanaged: UnmanagedResource[] = [];\n const resourceOwners = new Set<string>();\n\n const withoutLabel = await fetchAll(async (pageToken) => {\n try {\n const { executors, nextPageToken } = await client.listExecutorExecutors({\n workspaceId,\n pageToken,\n });\n return [executors, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n const existingExecutors: WithLabel<(typeof withoutLabel)[number]> = {};\n await Promise.all(\n withoutLabel.map(async (resource) => {\n const { metadata } = await client.getMetadata({\n trn: trn(workspaceId, resource.name),\n });\n existingExecutors[resource.name] = {\n resource,\n label: metadata?.labels[sdkNameLabelKey],\n };\n }),\n );\n\n const executors = forRemoval ? {} : ((await application.executorService?.loadExecutors()) ?? {});\n for (const executor of Object.values(executors)) {\n const existing = existingExecutors[executor.name];\n const metaRequest = await buildMetaRequest(trn(workspaceId, executor.name), application.name);\n if (existing) {\n if (!existing.label) {\n unmanaged.push({\n resourceType: \"Executor\",\n resourceName: executor.name,\n });\n } else if (existing.label !== application.name) {\n conflicts.push({\n resourceType: \"Executor\",\n resourceName: executor.name,\n currentOwner: existing.label,\n });\n }\n\n changeSet.updates.push({\n name: executor.name,\n request: {\n workspaceId,\n executor: protoExecutor(application.name, executor, application.env),\n },\n metaRequest,\n });\n delete existingExecutors[executor.name];\n } else {\n changeSet.creates.push({\n name: executor.name,\n request: {\n workspaceId,\n executor: protoExecutor(application.name, executor, application.env),\n },\n metaRequest,\n });\n }\n }\n Object.entries(existingExecutors).forEach(([name]) => {\n const label = existingExecutors[name]?.label;\n if (label && label !== application.name) {\n resourceOwners.add(label);\n }\n // Only delete executors managed by this application\n if (label === application.name) {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n name,\n },\n });\n }\n });\n\n changeSet.print();\n return { changeSet, conflicts, unmanaged, resourceOwners };\n}\n\n// Transform actor fields from server format to SDK format\nconst actorTransformExpr = `actor: args.actor ? (({ attributeMap, attributes: attrList, ...rest }) => ({ ...rest, attributes: attributeMap, attributeList: attrList }))(args.actor) : null`;\n\n/**\n * Build args expression for resolverExecuted trigger.\n * Transforms server's succeeded/failed fields to success/result/error fields.\n * @param additionalFields - Additional fields to include in the args expression\n * @returns JavaScript expression for resolverExecuted trigger args\n */\nfunction buildResolverExecutedArgsExpr(additionalFields?: string): string {\n const baseFields = `...args, appNamespace: args.namespaceName, ${actorTransformExpr}, success: !!args.succeeded, result: args.succeeded?.result.resolver, error: args.failed?.error`;\n return additionalFields ? `({ ${baseFields}, ${additionalFields} })` : `({ ${baseFields} })`;\n}\n\n/**\n * Build args expression for incomingWebhook trigger.\n * Transforms server's raw_body field to rawBody field.\n * @param additionalFields - Additional fields to include in the args expression\n * @returns JavaScript expression for incomingWebhook trigger args\n */\nfunction buildIncomingWebhookArgsExpr(additionalFields?: string): string {\n const baseFields = `...args, appNamespace: args.namespaceName, rawBody: args.raw_body`;\n return additionalFields ? `({ ${baseFields}, ${additionalFields} })` : `({ ${baseFields} })`;\n}\n\nfunction protoExecutor(\n appName: string,\n executor: Executor,\n env: Record<string, string | number | boolean>,\n): MessageInitShape<typeof ExecutorExecutorSchema> {\n const trigger = executor.trigger;\n let triggerType: ExecutorTriggerType;\n let triggerConfig: MessageInitShape<typeof ExecutorTriggerConfigSchema>;\n\n // Common args expressions with env and actor transformation\n const envField = `env: ${JSON.stringify(env)}`;\n const baseArgsExpr = `({ ...args, appNamespace: args.namespaceName, ${actorTransformExpr}, ${envField} })`;\n\n const eventType: { [key in Trigger[\"kind\"]]?: string } = {\n recordCreated: \"tailordb.type_record.created\",\n recordUpdated: \"tailordb.type_record.updated\",\n recordDeleted: \"tailordb.type_record.deleted\",\n resolverExecuted: \"pipeline.resolver.executed\",\n idpUserCreated: \"idp.user.created\",\n idpUserUpdated: \"idp.user.updated\",\n idpUserDeleted: \"idp.user.deleted\",\n authAccessTokenIssued: \"auth.access_token.issued\",\n authAccessTokenRefreshed: \"auth.access_token.refreshed\",\n authAccessTokenRevoked: \"auth.access_token.revoked\",\n };\n switch (trigger.kind) {\n case \"schedule\":\n triggerType = ExecutorTriggerType.SCHEDULE;\n triggerConfig = {\n config: {\n case: \"schedule\",\n value: {\n timezone: trigger.timezone,\n frequency: trigger.cron,\n },\n },\n };\n break;\n case \"recordCreated\":\n case \"recordUpdated\":\n case \"recordDeleted\":\n triggerType = ExecutorTriggerType.EVENT;\n triggerConfig = {\n config: {\n case: \"event\",\n value: {\n eventType: eventType[trigger.kind],\n condition: {\n expr: [\n /* js */ `args.typeName === \"${trigger.typeName}\"`,\n ...(trigger.condition\n ? [/* js */ `(${stringifyFunction(trigger.condition)})(${baseArgsExpr})`]\n : []),\n ].join(\" && \"),\n },\n },\n },\n };\n break;\n case \"resolverExecuted\":\n triggerType = ExecutorTriggerType.EVENT;\n triggerConfig = {\n config: {\n case: \"event\",\n value: {\n eventType: eventType[trigger.kind],\n condition: {\n expr: [\n /* js */ `args.resolverName === \"${trigger.resolverName}\"`,\n ...(trigger.condition\n ? [\n /* js */ `(${stringifyFunction(trigger.condition)})(${buildResolverExecutedArgsExpr(envField)})`,\n ]\n : []),\n ].join(\" && \"),\n },\n },\n },\n };\n break;\n case \"incomingWebhook\":\n triggerType = ExecutorTriggerType.INCOMING_WEBHOOK;\n triggerConfig = {\n config: {\n case: \"incomingWebhook\",\n value: {},\n },\n };\n break;\n case \"idpUserCreated\":\n case \"idpUserUpdated\":\n case \"idpUserDeleted\":\n case \"authAccessTokenIssued\":\n case \"authAccessTokenRefreshed\":\n case \"authAccessTokenRevoked\":\n triggerType = ExecutorTriggerType.EVENT;\n triggerConfig = {\n config: {\n case: \"event\",\n value: {\n eventType: eventType[trigger.kind],\n },\n },\n };\n break;\n default:\n throw new Error(`Unknown trigger: ${trigger satisfies never}`);\n }\n\n const target = executor.operation;\n let targetType: ExecutorTargetType;\n let targetConfig: MessageInitShape<typeof ExecutorTargetConfigSchema>;\n\n // Build args expression for target operations\n const argsExpr =\n trigger.kind === \"resolverExecuted\"\n ? buildResolverExecutedArgsExpr(envField)\n : trigger.kind === \"incomingWebhook\"\n ? buildIncomingWebhookArgsExpr(envField)\n : baseArgsExpr;\n\n switch (target.kind) {\n case \"webhook\": {\n targetType = ExecutorTargetType.WEBHOOK;\n targetConfig = {\n config: {\n case: \"webhook\",\n value: {\n url: {\n expr: `(${stringifyFunction(target.url)})(${argsExpr})`,\n },\n headers: target.headers\n ? Object.entries(target.headers).map(([key, v]) => {\n let value: MessageInitShape<typeof ExecutorTargetWebhookHeaderSchema>[\"value\"];\n if (typeof v === \"string\") {\n value = {\n case: \"rawValue\",\n value: v,\n };\n } else {\n value = {\n case: \"secretValue\",\n value: {\n vaultName: v.vault,\n secretKey: v.key,\n },\n };\n }\n return { key, value };\n })\n : undefined,\n body: target.requestBody\n ? {\n expr: `(${stringifyFunction(target.requestBody)})(${argsExpr})`,\n }\n : undefined,\n },\n },\n };\n break;\n }\n case \"graphql\": {\n targetType = ExecutorTargetType.TAILOR_GRAPHQL;\n targetConfig = {\n config: {\n case: \"tailorGraphql\",\n value: {\n appName: target.appName ?? appName,\n query: target.query,\n variables: target.variables\n ? {\n expr: `(${stringifyFunction(target.variables)})(${argsExpr})`,\n }\n : undefined,\n invoker: target.authInvoker ?? undefined,\n },\n },\n };\n break;\n }\n case \"function\":\n case \"jobFunction\": {\n if (target.kind === \"function\") {\n targetType = ExecutorTargetType.FUNCTION;\n } else {\n targetType = ExecutorTargetType.JOB_FUNCTION;\n }\n\n targetConfig = {\n config: {\n case: \"function\",\n value: {\n name: \"operation\",\n scriptRef: executorFunctionName(executor.name),\n variables: {\n expr: argsExpr,\n },\n invoker: target.authInvoker ?? undefined,\n },\n },\n };\n break;\n }\n case \"workflow\": {\n targetType = ExecutorTargetType.WORKFLOW;\n targetConfig = {\n config: {\n case: \"workflow\",\n value: {\n workflowName: target.workflowName,\n variables: target.args\n ? typeof target.args === \"function\"\n ? { expr: `(${stringifyFunction(target.args)})(${argsExpr})` }\n : { expr: JSON.stringify(target.args) }\n : undefined,\n invoker: target.authInvoker ?? undefined,\n },\n },\n };\n break;\n }\n default:\n throw new Error(`Unknown target: ${target satisfies never}`);\n }\n\n return {\n name: executor.name,\n description: executor.description,\n disabled: executor.disabled,\n triggerType,\n triggerConfig,\n targetType,\n targetConfig,\n };\n}\n","import { type MessageInitShape } from \"@bufbuild/protobuf\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport {\n type CreatePipelineResolverRequestSchema,\n type CreatePipelineServiceRequestSchema,\n type DeletePipelineResolverRequestSchema,\n type DeletePipelineServiceRequestSchema,\n type UpdatePipelineResolverRequestSchema,\n type UpdatePipelineServiceRequestSchema,\n} from \"@tailor-proto/tailor/v1/pipeline_pb\";\nimport {\n type PipelineResolver_FieldSchema,\n PipelineResolver_OperationType,\n type PipelineResolver_PipelineSchema,\n type PipelineResolver_TypeSchema,\n type PipelineResolverSchema,\n} from \"@tailor-proto/tailor/v1/pipeline_resource_pb\";\nimport * as inflection from \"inflection\";\nimport { type ResolverService } from \"@/cli/application/resolver/service\";\nimport { type Resolver, type TailorField } from \"@/parser/service/resolver\";\nimport { tailorUserMap } from \"@/parser/service/tailordb\";\nimport { fetchAll, type OperatorClient } from \"../../client\";\nimport { resolverFunctionName } from \"./function-registry\";\nimport { buildMetaRequest, sdkNameLabelKey, type WithLabel } from \"./label\";\nimport { createChangeSet } from \".\";\nimport type { ApplyPhase, PlanContext } from \"..\";\nimport type { OwnerConflict, UnmanagedResource } from \"./confirm\";\nimport type { Executor } from \"@/parser/service/executor\";\nimport type { SetMetadataRequestSchema } from \"@tailor-proto/tailor/v1/metadata_pb\";\n\n// Scalar type mapping for field type conversion\nconst SCALAR_TYPE_MAP = {\n uuid: { kind: \"ScalarType\", name: \"ID\" },\n string: { kind: \"ScalarType\", name: \"String\" },\n integer: { kind: \"ScalarType\", name: \"Int\" },\n float: { kind: \"ScalarType\", name: \"Float\" },\n boolean: { kind: \"ScalarType\", name: \"Boolean\" },\n date: { kind: \"CustomScalarType\", name: \"Date\" },\n datetime: { kind: \"CustomScalarType\", name: \"DateTime\" },\n time: { kind: \"CustomScalarType\", name: \"Time\" },\n} as const satisfies Record<\n Exclude<TailorField[\"type\"], \"enum\" | \"nested\">,\n { kind: \"ScalarType\" | \"CustomScalarType\"; name: string }\n>;\n\n/**\n * Apply resolver pipeline changes for the given phase.\n * @param client - Operator client instance\n * @param result - Planned pipeline changes\n * @param phase - Apply phase\n * @returns Promise that resolves when pipeline changes are applied\n */\nexport async function applyPipeline(\n client: OperatorClient,\n result: Awaited<ReturnType<typeof planPipeline>>,\n phase: Exclude<ApplyPhase, \"delete\"> = \"create-update\",\n) {\n const { changeSet } = result;\n if (phase === \"create-update\") {\n // Services\n await Promise.all([\n ...changeSet.service.creates.map(async (create) => {\n await client.createPipelineService(create.request);\n await client.setMetadata(create.metaRequest);\n }),\n ...changeSet.service.updates.map(async (update) => {\n await client.updatePipelineService(update.request);\n await client.setMetadata(update.metaRequest);\n }),\n ]);\n\n // Resolvers\n await Promise.all([\n ...changeSet.resolver.creates.map((create) => client.createPipelineResolver(create.request)),\n ...changeSet.resolver.updates.map((update) => client.updatePipelineResolver(update.request)),\n ]);\n } else if (phase === \"delete-resources\") {\n // Delete in reverse order of dependencies\n // Resolvers\n await Promise.all(\n changeSet.resolver.deletes.map((del) => client.deletePipelineResolver(del.request)),\n );\n } else if (phase === \"delete-services\") {\n // Services only\n await Promise.all(\n changeSet.service.deletes.map((del) => client.deletePipelineService(del.request)),\n );\n }\n}\n\n/**\n * Plan resolver pipeline changes based on current and desired state.\n * @param context - Planning context\n * @returns Planned changes\n */\nexport async function planPipeline(context: PlanContext) {\n const { client, workspaceId, application, forRemoval } = context;\n const pipelines: Readonly<ResolverService>[] = [];\n if (!forRemoval) {\n for (const pipeline of application.resolverServices) {\n await pipeline.loadResolvers();\n pipelines.push(pipeline);\n }\n }\n const executors = forRemoval\n ? []\n : Object.values((await application.executorService?.loadExecutors()) ?? {});\n\n const {\n changeSet: serviceChangeSet,\n conflicts,\n unmanaged,\n resourceOwners,\n } = await planServices(client, workspaceId, application.name, pipelines);\n const deletedServices = serviceChangeSet.deletes.map((del) => del.name);\n const resolverChangeSet = await planResolvers(\n client,\n workspaceId,\n pipelines,\n executors,\n deletedServices,\n application.env,\n );\n\n serviceChangeSet.print();\n resolverChangeSet.print();\n return {\n changeSet: {\n service: serviceChangeSet,\n resolver: resolverChangeSet,\n },\n conflicts,\n unmanaged,\n resourceOwners,\n };\n}\n\ntype CreateService = {\n name: string;\n request: MessageInitShape<typeof CreatePipelineServiceRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype UpdateService = {\n name: string;\n request: MessageInitShape<typeof UpdatePipelineServiceRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype DeleteService = {\n name: string;\n request: MessageInitShape<typeof DeletePipelineServiceRequestSchema>;\n};\n\nfunction trn(workspaceId: string, name: string) {\n return `trn:v1:workspace:${workspaceId}:pipeline:${name}`;\n}\n\nasync function planServices(\n client: OperatorClient,\n workspaceId: string,\n appName: string,\n pipelines: ReadonlyArray<Readonly<ResolverService>>,\n) {\n const changeSet = createChangeSet<CreateService, UpdateService, DeleteService>(\n \"Pipeline services\",\n );\n const conflicts: OwnerConflict[] = [];\n const unmanaged: UnmanagedResource[] = [];\n const resourceOwners = new Set<string>();\n\n const withoutLabel = await fetchAll(async (pageToken) => {\n try {\n const { pipelineServices, nextPageToken } = await client.listPipelineServices({\n workspaceId,\n pageToken,\n });\n return [pipelineServices, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n const existingServices: WithLabel<(typeof withoutLabel)[number]> = {};\n await Promise.all(\n withoutLabel.map(async (resource) => {\n if (!resource.namespace?.name) {\n return;\n }\n const { metadata } = await client.getMetadata({\n trn: trn(workspaceId, resource.namespace.name),\n });\n existingServices[resource.namespace.name] = {\n resource,\n label: metadata?.labels[sdkNameLabelKey],\n };\n }),\n );\n\n for (const pipeline of pipelines) {\n const existing = existingServices[pipeline.namespace];\n const metaRequest = await buildMetaRequest(trn(workspaceId, pipeline.namespace), appName);\n if (existing) {\n if (!existing.label) {\n unmanaged.push({\n resourceType: \"Pipeline service\",\n resourceName: pipeline.namespace,\n });\n } else if (existing.label !== appName) {\n conflicts.push({\n resourceType: \"Pipeline service\",\n resourceName: pipeline.namespace,\n currentOwner: existing.label,\n });\n }\n\n changeSet.updates.push({\n name: pipeline.namespace,\n request: {\n workspaceId,\n namespaceName: pipeline.namespace,\n },\n metaRequest,\n });\n delete existingServices[pipeline.namespace];\n } else {\n changeSet.creates.push({\n name: pipeline.namespace,\n request: {\n workspaceId,\n namespaceName: pipeline.namespace,\n },\n metaRequest,\n });\n }\n }\n Object.entries(existingServices).forEach(([namespaceName]) => {\n const label = existingServices[namespaceName]?.label;\n if (label && label !== appName) {\n resourceOwners.add(label);\n }\n // Only delete services managed by this application\n if (label === appName) {\n changeSet.deletes.push({\n name: namespaceName,\n request: {\n workspaceId,\n namespaceName,\n },\n });\n }\n });\n\n return { changeSet, conflicts, unmanaged, resourceOwners };\n}\n\ntype CreateResolver = {\n name: string;\n request: MessageInitShape<typeof CreatePipelineResolverRequestSchema>;\n};\n\ntype UpdateResolver = {\n name: string;\n request: MessageInitShape<typeof UpdatePipelineResolverRequestSchema>;\n};\n\ntype DeleteResolver = {\n name: string;\n request: MessageInitShape<typeof DeletePipelineResolverRequestSchema>;\n};\n\nasync function planResolvers(\n client: OperatorClient,\n workspaceId: string,\n pipelines: ReadonlyArray<Readonly<ResolverService>>,\n executors: ReadonlyArray<Executor>,\n deletedServices: ReadonlyArray<string>,\n env: Record<string, string | number | boolean>,\n) {\n const changeSet = createChangeSet<CreateResolver, UpdateResolver, DeleteResolver>(\n \"Pipeline resolvers\",\n );\n\n const fetchResolvers = (namespaceName: string) => {\n return fetchAll(async (pageToken) => {\n try {\n const { pipelineResolvers, nextPageToken } = await client.listPipelineResolvers({\n workspaceId,\n namespaceName,\n pageToken,\n });\n return [pipelineResolvers, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n };\n\n const executorUsedResolvers = new Set<string>();\n for (const executor of executors) {\n if (executor.trigger.kind === \"resolverExecuted\") {\n executorUsedResolvers.add(executor.trigger.resolverName);\n }\n }\n\n for (const pipeline of pipelines) {\n const existingResolvers = await fetchResolvers(pipeline.namespace);\n const existingNameSet = new Set<string>();\n existingResolvers.forEach((resolver) => {\n existingNameSet.add(resolver.name);\n });\n for (const resolver of Object.values(pipeline.getResolvers())) {\n if (existingNameSet.has(resolver.name)) {\n changeSet.updates.push({\n name: resolver.name,\n request: {\n workspaceId,\n namespaceName: pipeline.namespace,\n pipelineResolver: processResolver(\n pipeline.namespace,\n resolver,\n executorUsedResolvers,\n env,\n ),\n },\n });\n existingNameSet.delete(resolver.name);\n } else {\n changeSet.creates.push({\n name: resolver.name,\n request: {\n workspaceId,\n namespaceName: pipeline.namespace,\n pipelineResolver: processResolver(\n pipeline.namespace,\n resolver,\n executorUsedResolvers,\n env,\n ),\n },\n });\n }\n }\n existingNameSet.forEach((name) => {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n namespaceName: pipeline.namespace,\n resolverName: name,\n },\n });\n });\n }\n\n for (const namespaceName of deletedServices) {\n const existingResolvers = await fetchResolvers(namespaceName);\n existingResolvers.forEach((resolver) => {\n changeSet.deletes.push({\n name: resolver.name,\n request: {\n workspaceId,\n namespaceName,\n resolverName: resolver.name,\n },\n });\n });\n }\n return changeSet;\n}\n\nfunction processResolver(\n namespace: string,\n resolver: Resolver,\n executorUsedResolvers: ReadonlySet<string>,\n env: Record<string, string | number | boolean>,\n): MessageInitShape<typeof PipelineResolverSchema> {\n const pipelines: MessageInitShape<typeof PipelineResolver_PipelineSchema>[] = [\n {\n name: \"body\",\n operationName: \"body\",\n description: `${resolver.name} function body`,\n operationType: PipelineResolver_OperationType.FUNCTION,\n operationSourceRef: resolverFunctionName(namespace, resolver.name),\n operationHook: {\n expr: `({ ...context.pipeline, input: context.args, user: ${tailorUserMap}, env: ${JSON.stringify(env)} });`,\n },\n postScript: `args.body`,\n },\n ];\n\n const typeBaseName = inflection.camelize(resolver.name);\n\n // Build inputs\n const inputs: MessageInitShape<typeof PipelineResolver_FieldSchema>[] = resolver.input\n ? protoFields(resolver.input, `${typeBaseName}Input`, true)\n : [];\n\n // Build response\n const response: MessageInitShape<typeof PipelineResolver_FieldSchema> = protoFields(\n { \"\": resolver.output },\n `${typeBaseName}Output`,\n false,\n )[0];\n\n // Build description (combine resolver description and output description)\n const resolverDescription = resolver.description || `${resolver.name} resolver`;\n const outputDescription = resolver.output.metadata.description;\n const combinedDescription = outputDescription\n ? `${resolverDescription}\\n\\nReturns:\\n${outputDescription}`\n : resolverDescription;\n\n return {\n authorization: \"true==true\",\n description: combinedDescription,\n inputs,\n name: resolver.name,\n operationType: resolver.operation,\n response,\n pipelines,\n publishExecutionEvents: executorUsedResolvers.has(resolver.name),\n };\n}\n\nfunction protoFields(\n fields: Record<string, TailorField>,\n baseName: string,\n isInput: boolean,\n): MessageInitShape<typeof PipelineResolver_FieldSchema>[] {\n if (!fields) {\n return [];\n }\n\n return Object.entries(fields).map(([fieldName, field]) => {\n let type: MessageInitShape<typeof PipelineResolver_TypeSchema>;\n const hasCreateHook = isInput && field.metadata.hooks?.create !== undefined;\n const required = hasCreateHook ? false : (field.metadata.required ?? true);\n\n if (field.type === \"nested\") {\n const typeName = field.metadata.typeName ?? `${baseName}${inflection.camelize(fieldName)}`;\n type = {\n kind: \"UserDefined\",\n name: typeName,\n description: field.metadata.description ?? \"\",\n required,\n fields: protoFields(field.fields, typeName, isInput),\n };\n } else if (field.type === \"enum\") {\n const typeName = field.metadata.typeName ?? `${baseName}${inflection.camelize(fieldName)}`;\n type = {\n kind: \"EnumType\",\n name: typeName,\n required,\n allowedValues: field.metadata.allowedValues,\n };\n } else {\n type = { ...SCALAR_TYPE_MAP[field.type], required };\n }\n\n return {\n name: fieldName,\n description: field.metadata.description,\n array: field.metadata.array ?? false,\n required,\n type,\n };\n });\n}\n","import { type MessageInitShape } from \"@bufbuild/protobuf\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport {\n type CreateStaticWebsiteRequestSchema,\n type DeleteStaticWebsiteRequestSchema,\n type UpdateStaticWebsiteRequestSchema,\n} from \"@tailor-proto/tailor/v1/staticwebsite_pb\";\nimport { fetchAll, type OperatorClient } from \"../../client\";\nimport { buildMetaRequest, sdkNameLabelKey, type WithLabel } from \"./label\";\nimport { createChangeSet } from \".\";\nimport type { ApplyPhase, PlanContext } from \"..\";\nimport type { OwnerConflict, UnmanagedResource } from \"./confirm\";\nimport type { SetMetadataRequestSchema } from \"@tailor-proto/tailor/v1/metadata_pb\";\n\n/**\n * Apply static website changes for the given phase.\n * @param client - Operator client instance\n * @param result - Planned static website changes\n * @param phase - Apply phase\n * @returns Promise that resolves when static websites are applied\n */\nexport async function applyStaticWebsite(\n client: OperatorClient,\n result: Awaited<ReturnType<typeof planStaticWebsite>>,\n phase: Extract<ApplyPhase, \"create-update\" | \"delete\"> = \"create-update\",\n) {\n const { changeSet } = result;\n if (phase === \"create-update\") {\n // StaticWebsites\n await Promise.all([\n ...changeSet.creates.map(async (create) => {\n await client.createStaticWebsite(create.request);\n await client.setMetadata(create.metaRequest);\n }),\n ...changeSet.updates.map(async (update) => {\n await client.updateStaticWebsite(update.request);\n await client.setMetadata(update.metaRequest);\n }),\n ]);\n } else if (phase === \"delete\") {\n // Delete in reverse order of dependencies\n // StaticWebsites\n await Promise.all(changeSet.deletes.map((del) => client.deleteStaticWebsite(del.request)));\n }\n}\n\ntype CreateStaticWebsite = {\n name: string;\n request: MessageInitShape<typeof CreateStaticWebsiteRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype UpdateStaticWebsite = {\n name: string;\n request: MessageInitShape<typeof UpdateStaticWebsiteRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype DeleteStaticWebsite = {\n name: string;\n request: MessageInitShape<typeof DeleteStaticWebsiteRequestSchema>;\n};\n\nfunction trn(workspaceId: string, name: string) {\n return `trn:v1:workspace:${workspaceId}:staticwebsite:${name}`;\n}\n\n/**\n * Plan static website changes based on current and desired state.\n * @param context - Planning context\n * @returns Planned changes\n */\nexport async function planStaticWebsite(context: PlanContext) {\n const { client, workspaceId, application, forRemoval } = context;\n const changeSet = createChangeSet<CreateStaticWebsite, UpdateStaticWebsite, DeleteStaticWebsite>(\n \"StaticWebsites\",\n );\n const conflicts: OwnerConflict[] = [];\n const unmanaged: UnmanagedResource[] = [];\n const resourceOwners = new Set<string>();\n\n // Fetch existing static websites\n const withoutLabel = await fetchAll(async (pageToken) => {\n try {\n const { staticwebsites, nextPageToken } = await client.listStaticWebsites({\n workspaceId,\n pageToken,\n });\n return [staticwebsites, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n const existingWebsites: WithLabel<(typeof withoutLabel)[number]> = {};\n await Promise.all(\n withoutLabel.map(async (resource) => {\n const { metadata } = await client.getMetadata({\n trn: trn(workspaceId, resource.name),\n });\n existingWebsites[resource.name] = {\n resource,\n label: metadata?.labels[sdkNameLabelKey],\n };\n }),\n );\n\n const staticWebsiteServices = forRemoval ? [] : application.staticWebsiteServices;\n for (const websiteService of staticWebsiteServices) {\n const config = websiteService;\n const name = websiteService.name;\n const existing = existingWebsites[name];\n const metaRequest = await buildMetaRequest(trn(workspaceId, name), application.name);\n\n if (existing) {\n if (!existing.label) {\n unmanaged.push({\n resourceType: \"StaticWebsite\",\n resourceName: name,\n });\n } else if (existing.label !== application.name) {\n conflicts.push({\n resourceType: \"StaticWebsite\",\n resourceName: name,\n currentOwner: existing.label,\n });\n }\n\n changeSet.updates.push({\n name,\n request: {\n workspaceId,\n staticwebsite: {\n name,\n description: config.description || \"\",\n allowedIpAddresses: config.allowedIpAddresses || [],\n },\n },\n metaRequest,\n });\n delete existingWebsites[name];\n } else {\n changeSet.creates.push({\n name,\n request: {\n workspaceId,\n staticwebsite: {\n name,\n description: config.description || \"\",\n allowedIpAddresses: config.allowedIpAddresses || [],\n },\n },\n metaRequest,\n });\n }\n }\n Object.entries(existingWebsites).forEach(([name]) => {\n const label = existingWebsites[name]?.label;\n if (label && label !== application.name) {\n resourceOwners.add(label);\n }\n // Only delete websites managed by this application\n if (label === application.name) {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n name,\n },\n });\n }\n });\n\n changeSet.print();\n return { changeSet, conflicts, unmanaged, resourceOwners };\n}\n","/**\n * Migration configuration utilities\n */\n\nimport * as path from \"pathe\";\nimport type { AppConfig } from \"@/parser/app-config\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Namespace with migrations configuration\n */\nexport interface NamespaceWithMigrations {\n namespace: string;\n migrationsDir: string;\n}\n\n// ============================================================================\n// Config Helpers\n// ============================================================================\n\nfunction hasMigrationConfig(dbConfig: unknown): dbConfig is { migration: { directory: string } } {\n if (typeof dbConfig !== \"object\" || dbConfig === null) return false;\n if (!(\"migration\" in dbConfig)) return false;\n\n const migration = (dbConfig as { migration: unknown }).migration;\n if (typeof migration !== \"object\" || migration === null) return false;\n if (!(\"directory\" in migration)) return false;\n\n return typeof (migration as { directory: unknown }).directory === \"string\";\n}\n\n/**\n * Get namespaces that have migrations configured\n * @param {AppConfig} config - Application configuration\n * @param {string} configDir - Configuration directory path\n * @returns {NamespaceWithMigrations[]} Array of namespaces with migrations configured\n */\nexport function getNamespacesWithMigrations(\n config: AppConfig,\n configDir: string,\n): NamespaceWithMigrations[] {\n const result: NamespaceWithMigrations[] = [];\n\n for (const namespace of Object.keys(config.db ?? {})) {\n const dbConfig = config.db?.[namespace];\n if (!hasMigrationConfig(dbConfig)) continue;\n\n const migrationsDir = path.resolve(configDir, dbConfig.migration.directory);\n result.push({ namespace, migrationsDir });\n }\n\n return result;\n}\n","/**\n * Diff calculator and formatter for TailorDB schema migrations\n *\n * This module provides utilities for formatting and displaying migration diffs.\n * The actual diff calculation is performed by snapshot.ts.\n */\n\nimport type { SnapshotFieldConfig } from \"./snapshot\";\n\n// ============================================================================\n// Diff Types\n// ============================================================================\n\n/**\n * Current schema snapshot format version\n */\nexport const SCHEMA_SNAPSHOT_VERSION = 1 as const;\n\n/**\n * Change kind in migration diff\n */\nexport type DiffChangeKind =\n | \"type_added\"\n | \"type_removed\"\n | \"type_modified\"\n | \"field_added\"\n | \"field_removed\"\n | \"field_modified\"\n | \"index_added\"\n | \"index_removed\"\n | \"index_modified\"\n | \"file_added\"\n | \"file_removed\"\n | \"file_modified\"\n | \"relationship_added\"\n | \"relationship_removed\"\n | \"relationship_modified\"\n | \"permission_modified\";\n\n/**\n * Single change in migration diff\n */\nexport interface DiffChange {\n kind: DiffChangeKind;\n typeName: string;\n fieldName?: string;\n /** Index name for index_* changes */\n indexName?: string;\n /** Relationship name for relationship_* changes */\n relationshipName?: string;\n /** Relationship type for relationship_* changes */\n relationshipType?: \"forward\" | \"backward\";\n before?: unknown;\n after?: unknown;\n reason?: string;\n}\n\n/**\n * Migration diff - changes between two schema versions\n * Stored as XXXX/diff.json (e.g., 0001/diff.json)\n */\nexport interface MigrationDiff {\n /** Format version for future compatibility */\n version: typeof SCHEMA_SNAPSHOT_VERSION;\n namespace: string;\n createdAt: string;\n description?: string;\n changes: DiffChange[];\n /** Whether there are breaking changes (data loss or constraint violations possible) */\n hasBreakingChanges: boolean;\n /** List of breaking changes */\n breakingChanges: BreakingChangeInfo[];\n /** Whether a migration script is required to handle data migration */\n requiresMigrationScript: boolean;\n}\n\n/**\n * Breaking change information in migration diff\n */\nexport interface BreakingChangeInfo {\n typeName: string;\n fieldName?: string;\n reason: string;\n /** If true, this change is not supported and migration generation will fail */\n unsupported?: boolean;\n /** If true, show 3-step migration instructions for this unsupported change */\n showThreeStepHint?: boolean;\n}\n\n/**\n * Check if a migration diff has any changes\n * @param {MigrationDiff} diff - Migration diff to check\n * @returns {boolean} True if diff has changes\n */\nexport function hasChanges(diff: MigrationDiff): boolean {\n return diff.changes.length > 0;\n}\n\n/**\n * Format a migration diff for display\n * @param {MigrationDiff} diff - Migration diff to format\n * @returns {string} Formatted diff string\n */\nexport function formatMigrationDiff(diff: MigrationDiff): string {\n if (diff.changes.length === 0) {\n return \"No schema differences detected.\";\n }\n\n const lines: string[] = [];\n\n // Group changes by type name\n const changesByType = new Map<string, DiffChange[]>();\n for (const change of diff.changes) {\n const existing = changesByType.get(change.typeName) ?? [];\n existing.push(change);\n changesByType.set(change.typeName, existing);\n }\n\n for (const [typeName, changes] of changesByType) {\n lines.push(`${diff.namespace}.${typeName}:`);\n\n for (const change of changes) {\n lines.push(formatDiffChange(change));\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a single diff change for display\n * @param {DiffChange} change - Diff change to format\n * @returns {string} Formatted change string\n */\nfunction formatDiffChange(change: DiffChange): string {\n switch (change.kind) {\n case \"type_added\":\n return ` + [Type] ${change.typeName} (new type)`;\n case \"type_removed\":\n return ` - [Type] ${change.typeName} (removed)`;\n case \"type_modified\":\n return ` ~ [Type] ${change.typeName}: ${change.reason}`;\n case \"field_added\": {\n const field = change.after as SnapshotFieldConfig;\n const typeStr = formatFieldType(field);\n return ` + ${change.fieldName}: ${typeStr}`;\n }\n case \"field_removed\": {\n const field = change.before as SnapshotFieldConfig;\n return ` - ${change.fieldName}: ${field.type}`;\n }\n case \"field_modified\": {\n const before = change.before as SnapshotFieldConfig;\n const after = change.after as SnapshotFieldConfig;\n return ` ~ ${change.fieldName}: ${formatFieldModification(before, after)}`;\n }\n case \"index_added\":\n return ` + [Index] ${change.indexName}`;\n case \"index_removed\":\n return ` - [Index] ${change.indexName}`;\n case \"index_modified\":\n return ` ~ [Index] ${change.indexName}: ${change.reason ?? \"modified\"}`;\n case \"file_added\":\n return ` + [File] ${change.fieldName}`;\n case \"file_removed\":\n return ` - [File] ${change.fieldName}`;\n case \"file_modified\":\n return ` ~ [File] ${change.fieldName}: ${change.reason ?? \"modified\"}`;\n case \"relationship_added\":\n return ` + [Relationship${change.relationshipType ? ` (${change.relationshipType})` : \"\"}] ${change.relationshipName}`;\n case \"relationship_removed\":\n return ` - [Relationship${change.relationshipType ? ` (${change.relationshipType})` : \"\"}] ${change.relationshipName}`;\n case \"relationship_modified\":\n return ` ~ [Relationship${change.relationshipType ? ` (${change.relationshipType})` : \"\"}] ${change.relationshipName}: ${change.reason ?? \"modified\"}`;\n case \"permission_modified\":\n return ` ~ [Permission] ${change.reason ?? \"modified\"}`;\n default:\n return ` ? ${change.typeName}.${change.fieldName ?? \"\"}`;\n }\n}\n\n/**\n * Format field type with attributes\n * @param {SnapshotFieldConfig} field - Field configuration\n * @returns {string} Formatted field type string\n */\nfunction formatFieldType(field: SnapshotFieldConfig): string {\n let type = field.type;\n if (field.array) type += \"[]\";\n if (field.required) type += \" (required)\";\n else type += \" (optional)\";\n return type;\n}\n\n/**\n * Format field modification details\n * @param {SnapshotFieldConfig} before - Before field configuration\n * @param {SnapshotFieldConfig} after - After field configuration\n * @returns {string} Formatted modification details\n */\nfunction formatFieldModification(before: SnapshotFieldConfig, after: SnapshotFieldConfig): string {\n const changes: string[] = [];\n\n if (before.type !== after.type) {\n changes.push(`type: ${before.type} → ${after.type}`);\n }\n if (before.required !== after.required) {\n changes.push(`required: ${before.required} → ${after.required}`);\n }\n if (Boolean(before.array) !== Boolean(after.array)) {\n changes.push(`array: ${before.array ?? false} → ${after.array ?? false}`);\n }\n if (Boolean(before.index) !== Boolean(after.index)) {\n changes.push(`index: ${before.index ?? false} → ${after.index ?? false}`);\n }\n if (Boolean(before.unique) !== Boolean(after.unique)) {\n changes.push(`unique: ${before.unique ?? false} → ${after.unique ?? false}`);\n }\n if (Boolean(before.vector) !== Boolean(after.vector)) {\n changes.push(`vector: ${before.vector ?? false} → ${after.vector ?? false}`);\n }\n\n const beforeAllowed = before.allowedValues ?? [];\n const afterAllowed = after.allowedValues ?? [];\n const afterSet = new Set(afterAllowed.map((v) => v.value));\n const hasAllowedValuesChange =\n beforeAllowed.length !== afterAllowed.length ||\n beforeAllowed.some((v) => !afterSet.has(v.value));\n if (hasAllowedValuesChange) {\n const beforeValues = beforeAllowed.map((v) => v.value).join(\", \");\n const afterValues = afterAllowed.map((v) => v.value).join(\", \");\n changes.push(`allowedValues: [${beforeValues}] → [${afterValues}]`);\n }\n\n const beforeHooks = before.hooks;\n const afterHooks = after.hooks;\n if (\n (beforeHooks?.create?.expr ?? \"\") !== (afterHooks?.create?.expr ?? \"\") ||\n (beforeHooks?.update?.expr ?? \"\") !== (afterHooks?.update?.expr ?? \"\")\n ) {\n changes.push(\"hooks modified\");\n }\n\n const beforeValidate = before.validate ?? [];\n const afterValidate = after.validate ?? [];\n if (beforeValidate.length !== afterValidate.length) {\n changes.push(`validations: ${beforeValidate.length} → ${afterValidate.length}`);\n }\n\n if (Boolean(before.serial) !== Boolean(after.serial)) {\n changes.push(\n `serial: ${before.serial ? \"enabled\" : \"disabled\"} → ${after.serial ? \"enabled\" : \"disabled\"}`,\n );\n }\n\n return changes.join(\", \");\n}\n\n/**\n * Format breaking changes for display\n * @param {BreakingChangeInfo[]} breakingChanges - Breaking changes to format\n * @returns {string} Formatted breaking changes string\n */\nexport function formatBreakingChanges(breakingChanges: BreakingChangeInfo[]): string {\n if (breakingChanges.length === 0) {\n return \"\";\n }\n\n const lines: string[] = [\"Breaking changes detected:\", \"\"];\n\n for (const bc of breakingChanges) {\n const location = bc.fieldName ? `${bc.typeName}.${bc.fieldName}` : bc.typeName;\n lines.push(` - ${location}: ${bc.reason}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nconst DIFF_CHANGE_LABELS: Record<DiffChangeKind, string> = {\n type_added: \"type(s) added\",\n type_removed: \"type(s) removed\",\n type_modified: \"type(s) modified\",\n field_added: \"field(s) added\",\n field_removed: \"field(s) removed\",\n field_modified: \"field(s) modified\",\n index_added: \"index(es) added\",\n index_removed: \"index(es) removed\",\n index_modified: \"index(es) modified\",\n file_added: \"file field(s) added\",\n file_removed: \"file field(s) removed\",\n file_modified: \"file field(s) modified\",\n relationship_added: \"relationship(s) added\",\n relationship_removed: \"relationship(s) removed\",\n relationship_modified: \"relationship(s) modified\",\n permission_modified: \"permission(s) modified\",\n};\n\n/**\n * Format a summary of the migration diff\n * @param {MigrationDiff} diff - Migration diff to summarize\n * @returns {string} Formatted summary string\n */\nexport function formatDiffSummary(diff: MigrationDiff): string {\n const stats: Partial<Record<DiffChangeKind, number>> = {};\n for (const change of diff.changes) {\n stats[change.kind] = (stats[change.kind] ?? 0) + 1;\n }\n\n const parts = Object.keys(stats).map(\n (kind) => `${stats[kind as DiffChangeKind]} ${DIFF_CHANGE_LABELS[kind as DiffChangeKind]}`,\n );\n\n return parts.length > 0 ? parts.join(\", \") : \"No changes\";\n}\n","/**\n * Schema snapshot management for TailorDB migrations\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport {\n type MigrationDiff,\n type DiffChange,\n type BreakingChangeInfo,\n SCHEMA_SNAPSHOT_VERSION,\n} from \"./diff-calculator\";\nimport type { SchemaDrift } from \"./types\";\nimport type {\n ParsedField,\n TailorDBType,\n OperatorFieldConfig,\n StandardActionPermission,\n} from \"@/parser/service/tailordb/types\";\nimport type { TailorDBType as ProtoTailorDBType } from \"@tailor-proto/tailor/v1/tailordb_resource_pb\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Initial schema migration number (0000)\n */\nexport const INITIAL_SCHEMA_NUMBER = 0;\n\n/**\n * Migration file names (used within migration directories)\n */\nexport const SCHEMA_FILE_NAME = \"schema.json\";\nexport const DIFF_FILE_NAME = \"diff.json\";\nexport const MIGRATE_FILE_NAME = \"migrate.ts\";\nexport const DB_TYPES_FILE_NAME = \"db.ts\";\n\n/**\n * Pattern for validating migration number format (4-digit sequential number)\n * Examples: 0001, 0002, 0003, ...\n */\nexport const MIGRATION_NUMBER_PATTERN = /^\\d{4}$/;\n\n// Re-export SCHEMA_SNAPSHOT_VERSION for convenience\nexport { SCHEMA_SNAPSHOT_VERSION };\n\n// ============================================================================\n// Snapshot Types\n// ============================================================================\n\n/**\n * Hook configuration in schema snapshot\n */\nexport interface SnapshotHook {\n expr: string;\n}\n\n/**\n * Validation configuration in schema snapshot\n */\nexport interface SnapshotValidation {\n script: { expr: string };\n errorMessage: string;\n}\n\n/**\n * Serial configuration in schema snapshot\n */\nexport interface SnapshotSerial {\n start: number;\n maxValue?: number;\n format?: string;\n}\n\n/**\n * Enum value with optional description in schema snapshot\n */\nexport interface SnapshotEnumValue {\n value: string;\n description?: string;\n}\n\n/**\n * Field configuration in schema snapshot\n */\nexport interface SnapshotFieldConfig {\n type: string;\n required: boolean;\n array?: boolean;\n index?: boolean;\n unique?: boolean;\n allowedValues?: SnapshotEnumValue[];\n foreignKey?: boolean;\n foreignKeyType?: string;\n foreignKeyField?: string;\n description?: string;\n vector?: boolean;\n hooks?: {\n create?: SnapshotHook;\n update?: SnapshotHook;\n };\n validate?: SnapshotValidation[];\n serial?: SnapshotSerial;\n /** Nested fields (recursive) */\n fields?: Record<string, SnapshotFieldConfig>;\n}\n\n/**\n * Index configuration in schema snapshot\n */\nexport interface SnapshotIndexConfig {\n fields: string[];\n unique?: boolean;\n}\n\n/**\n * Relationship configuration in schema snapshot\n */\nexport interface SnapshotRelationship {\n targetType: string;\n targetField: string;\n sourceField: string;\n isArray: boolean;\n description: string;\n}\n\n// ============================================================================\n// Permission Types\n// ============================================================================\n\n/**\n * Permission operand types\n */\nexport type SnapshotPermissionOperand =\n | { user: string }\n | { record: string }\n | { newRecord: string }\n | { oldRecord: string }\n | unknown; // ValueOperand (primitives, arrays)\n\n/**\n * Permission operators\n */\nexport type SnapshotPermissionOperator = \"eq\" | \"ne\" | \"in\" | \"nin\" | \"hasAny\" | \"nhasAny\";\n\n/**\n * Permission condition tuple\n */\nexport type SnapshotPermissionCondition = readonly [\n SnapshotPermissionOperand,\n SnapshotPermissionOperator,\n SnapshotPermissionOperand,\n];\n\n/**\n * Action permission policy\n */\nexport interface SnapshotActionPermission {\n conditions: readonly SnapshotPermissionCondition[];\n description?: string;\n permit: \"allow\" | \"deny\";\n}\n\n/**\n * Record-level permission configuration\n */\nexport interface SnapshotRecordPermission {\n create: readonly SnapshotActionPermission[];\n read: readonly SnapshotActionPermission[];\n update: readonly SnapshotActionPermission[];\n delete: readonly SnapshotActionPermission[];\n}\n\n/**\n * GQL permission actions\n */\nexport type SnapshotGqlAction =\n | \"read\"\n | \"create\"\n | \"update\"\n | \"delete\"\n | \"aggregate\"\n | \"bulkUpsert\"\n | \"all\";\n\n/**\n * GQL permission policy\n */\nexport interface SnapshotGqlPermissionPolicy {\n conditions: readonly SnapshotPermissionCondition[];\n actions: readonly SnapshotGqlAction[];\n permit: \"allow\" | \"deny\";\n description?: string;\n}\n\n/**\n * GQL permission configuration\n */\nexport type SnapshotGqlPermission = readonly SnapshotGqlPermissionPolicy[];\n\n/**\n * Type definition in schema snapshot\n */\nexport interface SnapshotType {\n name: string;\n pluralForm?: string;\n description?: string;\n fields: Record<string, SnapshotFieldConfig>;\n settings?: {\n aggregation?: boolean;\n bulkUpsert?: boolean;\n gqlOperations?: {\n create?: boolean;\n update?: boolean;\n delete?: boolean;\n read?: boolean;\n };\n };\n indexes?: Record<string, SnapshotIndexConfig>;\n files?: Record<string, string>;\n forwardRelationships?: Record<string, SnapshotRelationship>;\n backwardRelationships?: Record<string, SnapshotRelationship>;\n permissions?: {\n record?: SnapshotRecordPermission;\n gql?: SnapshotGqlPermission;\n };\n}\n\n/**\n * Schema snapshot - full schema state at a point in time\n * Stored as XXXX/schema.json (e.g., 0000/schema.json for initial snapshot)\n */\nexport interface SchemaSnapshot {\n /** Format version for future compatibility */\n version: typeof SCHEMA_SNAPSHOT_VERSION;\n namespace: string;\n createdAt: string;\n types: Record<string, SnapshotType>;\n}\n\n/**\n * Migration file type\n */\nexport type MigrationFileType = \"schema\" | \"diff\" | \"migrate\" | \"db\";\n\n/**\n * Information about a migration\n */\nexport interface MigrationInfo {\n /** Migration number (e.g., 1, 2, 3) */\n number: number;\n /** Migration number as 4-digit string (e.g., \"0001\", \"0002\") */\n numberStr: string;\n /** Migration file type */\n type: MigrationFileType;\n /** Path to migration file */\n path: string;\n /** Parsed content (schema snapshot or diff) */\n content: SchemaSnapshot | MigrationDiff;\n}\n\n// ============================================================================\n// Migration Number Helpers\n// ============================================================================\n\n/**\n * Validate that a migration number follows the expected format (4-digit number)\n * @param {string} numberStr - Migration number string to validate\n * @returns {boolean} True if number matches expected format\n */\nexport function isValidMigrationNumber(numberStr: string): boolean {\n return MIGRATION_NUMBER_PATTERN.test(numberStr);\n}\n\n/**\n * Format migration number as 4-digit string\n * @param {number} num - Migration number\n * @returns {string} 4-digit padded string (e.g., \"0001\")\n */\nexport function formatMigrationNumber(num: number): string {\n return num.toString().padStart(4, \"0\");\n}\n\n/**\n * Parse migration number from file name\n * @param {string} fileName - File name (e.g., \"0001_schema.json\")\n * @returns {number | null} Parsed number or null if invalid\n */\nexport function parseMigrationNumber(fileName: string): number | null {\n const match = fileName.match(/^(\\d{4})_/);\n if (!match) return null;\n const num = parseInt(match[1], 10);\n return isNaN(num) ? null : num;\n}\n\n// ============================================================================\n// Path Helpers\n// ============================================================================\n\n/**\n * Map of migration file types to their file names\n */\nconst MIGRATION_FILE_NAMES: Record<MigrationFileType, string> = {\n schema: SCHEMA_FILE_NAME,\n diff: DIFF_FILE_NAME,\n migrate: MIGRATE_FILE_NAME,\n db: DB_TYPES_FILE_NAME,\n};\n\n/**\n * Get migration directory path for a given number\n * @param {string} migrationsDir - Base migrations directory path\n * @param {number} num - Migration number\n * @returns {string} Full directory path for the migration\n */\nexport function getMigrationDirPath(migrationsDir: string, num: number): string {\n const numStr = formatMigrationNumber(num);\n return path.join(migrationsDir, numStr);\n}\n\n/**\n * Get migration file path for a given number and type\n * @param {string} migrationsDir - Migrations directory path\n * @param {number} num - Migration number\n * @param {MigrationFileType} type - File type\n * @returns {string} Full file path\n */\nexport function getMigrationFilePath(\n migrationsDir: string,\n num: number,\n type: MigrationFileType,\n): string {\n const migrationDir = getMigrationDirPath(migrationsDir, num);\n return path.join(migrationDir, MIGRATION_FILE_NAMES[type]);\n}\n\n// ============================================================================\n// Snapshot Creation\n// ============================================================================\n\n/**\n * Create a snapshot field config from a parsed field\n * @param {ParsedField} field - Parsed field definition\n * @returns {SnapshotFieldConfig} Snapshot field configuration\n */\nfunction createSnapshotFieldConfig(field: ParsedField): SnapshotFieldConfig {\n // Note: Use `!== false` to match generateParsedTailorDBTypeManifest behavior\n // where undefined defaults to true (required by default in SDK)\n const config: SnapshotFieldConfig = {\n type: field.config.type,\n required: field.config.required !== false,\n };\n\n if (field.config.array) config.array = true;\n if (field.config.index) config.index = true;\n if (field.config.unique) config.unique = true;\n\n if (field.config.allowedValues && field.config.allowedValues.length > 0) {\n config.allowedValues = field.config.allowedValues.map((v) => ({\n value: v.value,\n ...(v.description && { description: v.description }),\n }));\n }\n\n if (field.config.foreignKey) {\n config.foreignKey = true;\n if (field.config.foreignKeyType) config.foreignKeyType = field.config.foreignKeyType;\n if (field.config.foreignKeyField) config.foreignKeyField = field.config.foreignKeyField;\n }\n\n if (field.config.description) config.description = field.config.description;\n if (field.config.vector) config.vector = true;\n\n if (field.config.hooks) {\n config.hooks = {};\n if (field.config.hooks.create) {\n config.hooks.create = { expr: field.config.hooks.create.expr };\n }\n if (field.config.hooks.update) {\n config.hooks.update = { expr: field.config.hooks.update.expr };\n }\n }\n\n if (field.config.validate && field.config.validate.length > 0) {\n config.validate = field.config.validate.map((v) => ({\n script: { expr: v.script.expr },\n errorMessage: v.errorMessage,\n }));\n }\n\n if (field.config.serial) {\n config.serial = {\n start: field.config.serial.start,\n ...(field.config.serial.maxValue !== undefined && { maxValue: field.config.serial.maxValue }),\n ...(field.config.serial.format && { format: field.config.serial.format }),\n };\n }\n\n if (field.config.fields && Object.keys(field.config.fields).length > 0) {\n config.fields = {};\n for (const [nestedName, nestedConfig] of Object.entries(field.config.fields)) {\n config.fields[nestedName] = createSnapshotFieldConfigFromOperatorConfig(nestedConfig);\n }\n }\n\n return config;\n}\n\n/**\n * Create a snapshot field config from an OperatorFieldConfig (for nested fields)\n * @param {import(\"@/parser/service/tailordb/types\").OperatorFieldConfig} fieldConfig - Field configuration\n * @returns {SnapshotFieldConfig} Snapshot field configuration\n */\nfunction createSnapshotFieldConfigFromOperatorConfig(\n fieldConfig: OperatorFieldConfig,\n): SnapshotFieldConfig {\n const config: SnapshotFieldConfig = {\n type: fieldConfig.type,\n required: fieldConfig.required !== false,\n };\n\n if (fieldConfig.array) config.array = true;\n if (fieldConfig.index) config.index = true;\n if (fieldConfig.unique) config.unique = true;\n\n if (fieldConfig.allowedValues && fieldConfig.allowedValues.length > 0) {\n config.allowedValues = fieldConfig.allowedValues.map((v) => ({\n value: v.value,\n ...(v.description && { description: v.description }),\n }));\n }\n\n if (fieldConfig.foreignKey) {\n config.foreignKey = true;\n if (fieldConfig.foreignKeyType) config.foreignKeyType = fieldConfig.foreignKeyType;\n if (fieldConfig.foreignKeyField) config.foreignKeyField = fieldConfig.foreignKeyField;\n }\n\n if (fieldConfig.description) config.description = fieldConfig.description;\n if (fieldConfig.vector) config.vector = true;\n\n if (fieldConfig.hooks) {\n config.hooks = {};\n if (fieldConfig.hooks.create) {\n config.hooks.create = { expr: fieldConfig.hooks.create.expr };\n }\n if (fieldConfig.hooks.update) {\n config.hooks.update = { expr: fieldConfig.hooks.update.expr };\n }\n }\n\n if (fieldConfig.validate && fieldConfig.validate.length > 0) {\n config.validate = fieldConfig.validate.map((v) => ({\n script: { expr: v.script.expr },\n errorMessage: v.errorMessage,\n }));\n }\n\n if (fieldConfig.serial) {\n config.serial = {\n start: fieldConfig.serial.start,\n ...(fieldConfig.serial.maxValue !== undefined && { maxValue: fieldConfig.serial.maxValue }),\n ...(fieldConfig.serial.format && { format: fieldConfig.serial.format }),\n };\n }\n\n // Recursive for nested fields\n if (fieldConfig.fields && Object.keys(fieldConfig.fields).length > 0) {\n config.fields = {};\n for (const [nestedName, nestedConfig] of Object.entries(fieldConfig.fields)) {\n config.fields[nestedName] = createSnapshotFieldConfigFromOperatorConfig(nestedConfig);\n }\n }\n\n return config;\n}\n\n/**\n * Create a snapshot type from a parsed type\n * @param {TailorDBType} type - Parsed TailorDB type definition\n * @returns {SnapshotType} Snapshot type configuration\n */\nfunction createSnapshotType(type: TailorDBType): SnapshotType {\n const fields: Record<string, SnapshotFieldConfig> = {};\n\n for (const [fieldName, field] of Object.entries(type.fields)) {\n fields[fieldName] = createSnapshotFieldConfig(field);\n }\n\n const snapshotType: SnapshotType = {\n name: type.name,\n fields,\n };\n\n if (type.pluralForm) snapshotType.pluralForm = type.pluralForm;\n if (type.description) snapshotType.description = type.description;\n if (type.settings) {\n snapshotType.settings = {};\n if (type.settings.aggregation !== undefined) {\n snapshotType.settings.aggregation = type.settings.aggregation;\n }\n if (type.settings.bulkUpsert !== undefined) {\n snapshotType.settings.bulkUpsert = type.settings.bulkUpsert;\n }\n if (type.settings.gqlOperations) {\n // gqlOperations is already normalized by schema transform\n const ops = type.settings.gqlOperations;\n snapshotType.settings.gqlOperations = {\n ...(ops.create !== undefined && {\n create: ops.create,\n }),\n ...(ops.update !== undefined && {\n update: ops.update,\n }),\n ...(ops.delete !== undefined && {\n delete: ops.delete,\n }),\n ...(ops.read !== undefined && {\n read: ops.read,\n }),\n };\n }\n }\n\n if (type.indexes && Object.keys(type.indexes).length > 0) {\n snapshotType.indexes = {};\n for (const [indexName, indexConfig] of Object.entries(type.indexes)) {\n snapshotType.indexes[indexName] = {\n fields: indexConfig.fields,\n unique: indexConfig.unique,\n };\n }\n }\n\n if (type.files && Object.keys(type.files).length > 0) {\n snapshotType.files = { ...type.files };\n }\n\n if (Object.keys(type.forwardRelationships).length > 0) {\n snapshotType.forwardRelationships = {};\n for (const [relName, rel] of Object.entries(type.forwardRelationships)) {\n snapshotType.forwardRelationships[relName] = {\n targetType: rel.targetType,\n targetField: rel.targetField,\n sourceField: rel.sourceField,\n isArray: rel.isArray,\n description: rel.description,\n };\n }\n }\n\n if (Object.keys(type.backwardRelationships).length > 0) {\n snapshotType.backwardRelationships = {};\n for (const [relName, rel] of Object.entries(type.backwardRelationships)) {\n snapshotType.backwardRelationships[relName] = {\n targetType: rel.targetType,\n targetField: rel.targetField,\n sourceField: rel.sourceField,\n isArray: rel.isArray,\n description: rel.description,\n };\n }\n }\n\n if (type.permissions.record || type.permissions.gql) {\n snapshotType.permissions = {};\n\n if (type.permissions.record) {\n snapshotType.permissions.record = {\n create: type.permissions.record.create.map(convertActionPermission),\n read: type.permissions.record.read.map(convertActionPermission),\n update: type.permissions.record.update.map(convertActionPermission),\n delete: type.permissions.record.delete.map(convertActionPermission),\n };\n }\n\n if (type.permissions.gql) {\n snapshotType.permissions.gql = type.permissions.gql.map((policy) => ({\n conditions: policy.conditions as SnapshotPermissionCondition[],\n actions: policy.actions as SnapshotGqlAction[],\n permit: policy.permit,\n ...(policy.description && { description: policy.description }),\n }));\n }\n }\n\n return snapshotType;\n}\n\n/**\n * Convert an action permission to snapshot format\n * @param {StandardActionPermission<\"record\">} permission - Action permission\n * @returns {SnapshotActionPermission} Snapshot action permission\n */\nfunction convertActionPermission(\n permission: StandardActionPermission<\"record\">,\n): SnapshotActionPermission {\n return {\n conditions: permission.conditions as SnapshotPermissionCondition[],\n permit: permission.permit,\n ...(permission.description && { description: permission.description }),\n };\n}\n\n/**\n * Create a schema snapshot from local type definitions\n * @param {Record<string, TailorDBType>} types - Local type definitions\n * @param {string} namespace - Namespace for the snapshot\n * @returns {SchemaSnapshot} Schema snapshot\n */\nexport function createSnapshotFromLocalTypes(\n types: Record<string, TailorDBType>,\n namespace: string,\n): SchemaSnapshot {\n const snapshotTypes: Record<string, SnapshotType> = {};\n\n for (const [typeName, type] of Object.entries(types)) {\n snapshotTypes[typeName] = createSnapshotType(type);\n }\n\n return {\n version: SCHEMA_SNAPSHOT_VERSION,\n namespace,\n createdAt: new Date().toISOString(),\n types: snapshotTypes,\n };\n}\n\n// ============================================================================\n// Snapshot Loading\n// ============================================================================\n\n/**\n * Load a schema snapshot from a file\n * @param {string} filePath - Path to the snapshot file\n * @returns {SchemaSnapshot} Loaded schema snapshot\n */\nexport function loadSnapshot(filePath: string): SchemaSnapshot {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(content) as SchemaSnapshot;\n}\n\n/**\n * Load a migration diff from a file\n * @param {string} filePath - Path to the diff file\n * @returns {MigrationDiff} Loaded migration diff\n */\nexport function loadDiff(filePath: string): MigrationDiff {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(content) as MigrationDiff;\n}\n\n/**\n * Get all migration directories and their files, sorted by number\n * @param {string} migrationsDir - Migrations directory path\n * @returns {Array<{number: number, type: \"schema\" | \"diff\", path: string}>} Migration files sorted by number\n */\nexport function getMigrationFiles(\n migrationsDir: string,\n): { number: number; type: \"schema\" | \"diff\"; path: string }[] {\n if (!fs.existsSync(migrationsDir)) {\n return [];\n }\n\n const entries = fs.readdirSync(migrationsDir, { withFileTypes: true });\n const migrations: {\n number: number;\n type: \"schema\" | \"diff\";\n path: string;\n }[] = [];\n\n for (const entry of entries) {\n // Only process directories with valid migration numbers (e.g., \"0000\", \"0001\")\n if (!entry.isDirectory()) continue;\n if (!isValidMigrationNumber(entry.name)) continue;\n\n const num = parseInt(entry.name, 10);\n const migrationDir = path.join(migrationsDir, entry.name);\n\n // Check for schema.json\n const schemaPath = path.join(migrationDir, SCHEMA_FILE_NAME);\n if (fs.existsSync(schemaPath)) {\n migrations.push({\n number: num,\n type: \"schema\",\n path: schemaPath,\n });\n }\n\n // Check for diff.json\n const diffPath = path.join(migrationDir, DIFF_FILE_NAME);\n if (fs.existsSync(diffPath)) {\n migrations.push({\n number: num,\n type: \"diff\",\n path: diffPath,\n });\n }\n }\n\n // Sort by number\n migrations.sort((a, b) => a.number - b.number);\n return migrations;\n}\n\n/**\n * Get the next migration number for a directory\n * Returns INITIAL_SCHEMA_NUMBER (0) if no migrations exist\n * @param {string} migrationsDir - Migrations directory path\n * @returns {number} Next migration number\n */\nexport function getNextMigrationNumber(migrationsDir: string): number {\n const files = getMigrationFiles(migrationsDir);\n if (files.length === 0) return INITIAL_SCHEMA_NUMBER;\n return Math.max(...files.map((f) => f.number)) + 1;\n}\n\n/**\n * Apply a diff to a snapshot to get the resulting snapshot\n * @param {SchemaSnapshot} snapshot - Base snapshot to apply diff to\n * @param {MigrationDiff} diff - Diff to apply\n * @returns {SchemaSnapshot} Resulting snapshot after applying diff\n */\nfunction applyDiffToSnapshot(snapshot: SchemaSnapshot, diff: MigrationDiff): SchemaSnapshot {\n const types = { ...snapshot.types };\n\n for (const change of diff.changes) {\n switch (change.kind) {\n case \"type_added\":\n types[change.typeName] = change.after as SnapshotType;\n break;\n case \"type_removed\":\n delete types[change.typeName];\n break;\n case \"type_modified\":\n if (types[change.typeName] && change.after) {\n const after = change.after as {\n indexes?: Record<string, SnapshotIndexConfig>;\n files?: Record<string, string>;\n };\n types[change.typeName] = {\n ...types[change.typeName],\n ...(after.indexes !== undefined && { indexes: after.indexes }),\n ...(after.files !== undefined && { files: after.files }),\n };\n }\n break;\n case \"field_added\":\n case \"field_modified\":\n if (types[change.typeName] && change.fieldName) {\n types[change.typeName] = {\n ...types[change.typeName],\n fields: {\n ...types[change.typeName].fields,\n [change.fieldName]: change.after as SnapshotFieldConfig,\n },\n };\n }\n break;\n case \"field_removed\":\n if (types[change.typeName] && change.fieldName) {\n const { [change.fieldName]: _, ...remainingFields } = types[change.typeName].fields;\n types[change.typeName] = {\n ...types[change.typeName],\n fields: remainingFields,\n };\n }\n break;\n case \"index_added\":\n case \"index_modified\":\n if (types[change.typeName] && change.indexName) {\n types[change.typeName] = {\n ...types[change.typeName],\n indexes: {\n ...types[change.typeName].indexes,\n [change.indexName]: change.after as SnapshotIndexConfig,\n },\n };\n }\n break;\n case \"index_removed\":\n if (types[change.typeName] && change.indexName && types[change.typeName].indexes) {\n const { [change.indexName]: _, ...remainingIndexes } = types[change.typeName].indexes!;\n types[change.typeName] = {\n ...types[change.typeName],\n indexes: Object.keys(remainingIndexes).length > 0 ? remainingIndexes : undefined,\n };\n }\n break;\n case \"file_added\":\n case \"file_modified\":\n if (types[change.typeName] && change.fieldName) {\n types[change.typeName] = {\n ...types[change.typeName],\n files: {\n ...types[change.typeName].files,\n [change.fieldName]: change.after as string,\n },\n };\n }\n break;\n case \"file_removed\":\n if (types[change.typeName] && change.fieldName && types[change.typeName].files) {\n const { [change.fieldName]: _, ...remainingFiles } = types[change.typeName].files!;\n types[change.typeName] = {\n ...types[change.typeName],\n files: Object.keys(remainingFiles).length > 0 ? remainingFiles : undefined,\n };\n }\n break;\n case \"relationship_added\":\n case \"relationship_modified\":\n if (types[change.typeName] && change.relationshipName) {\n const rel = change.after as SnapshotRelationship;\n // Use relationshipType if specified, fallback to existing logic for backwards compatibility\n const targetType =\n change.relationshipType ??\n (types[change.typeName].forwardRelationships?.[change.relationshipName]\n ? \"forward\"\n : types[change.typeName].backwardRelationships?.[change.relationshipName]\n ? \"backward\"\n : \"forward\");\n\n if (targetType === \"forward\") {\n types[change.typeName] = {\n ...types[change.typeName],\n forwardRelationships: {\n ...types[change.typeName].forwardRelationships,\n [change.relationshipName]: rel,\n },\n };\n } else {\n types[change.typeName] = {\n ...types[change.typeName],\n backwardRelationships: {\n ...types[change.typeName].backwardRelationships,\n [change.relationshipName]: rel,\n },\n };\n }\n }\n break;\n case \"relationship_removed\":\n if (types[change.typeName] && change.relationshipName) {\n const type = types[change.typeName];\n // Use relationshipType if specified\n const targetType =\n change.relationshipType ??\n (type.forwardRelationships?.[change.relationshipName]\n ? \"forward\"\n : type.backwardRelationships?.[change.relationshipName]\n ? \"backward\"\n : null);\n\n if (targetType === \"forward\" && type.forwardRelationships?.[change.relationshipName]) {\n const { [change.relationshipName]: _, ...remaining } = type.forwardRelationships;\n types[change.typeName] = {\n ...type,\n forwardRelationships: Object.keys(remaining).length > 0 ? remaining : undefined,\n };\n } else if (\n targetType === \"backward\" &&\n type.backwardRelationships?.[change.relationshipName]\n ) {\n const { [change.relationshipName]: _, ...remaining } = type.backwardRelationships;\n types[change.typeName] = {\n ...type,\n backwardRelationships: Object.keys(remaining).length > 0 ? remaining : undefined,\n };\n }\n }\n break;\n case \"permission_modified\":\n if (types[change.typeName] && change.after) {\n const after = change.after as {\n recordPermission?: SnapshotRecordPermission;\n gqlPermission?: SnapshotGqlPermission;\n };\n types[change.typeName] = {\n ...types[change.typeName],\n permissions: {\n record: after.recordPermission,\n gql: after.gqlPermission,\n },\n };\n }\n break;\n }\n }\n\n return {\n ...snapshot,\n types,\n createdAt: diff.createdAt,\n };\n}\n\n/**\n * Reconstruct the latest schema snapshot from all migration files\n * Returns null if no migrations exist\n * @param {string} migrationsDir - Migrations directory path\n * @param {number} [maxVersion] - Optional maximum migration version to apply\n * @returns {SchemaSnapshot | null} Reconstructed snapshot or null if no migrations exist\n */\nexport function reconstructSnapshotFromMigrations(\n migrationsDir: string,\n maxVersion?: number,\n): SchemaSnapshot | null {\n const files = getMigrationFiles(migrationsDir);\n if (files.length === 0) return null;\n\n // Find the initial schema file (should be 0000/schema.json)\n const schemaFile = files.find((f) => f.type === \"schema\" && f.number === INITIAL_SCHEMA_NUMBER);\n if (!schemaFile) {\n throw new Error(\n `No initial schema file found in ${migrationsDir}. Expected ${formatMigrationNumber(\n INITIAL_SCHEMA_NUMBER,\n )}/schema.json`,\n );\n }\n\n let snapshot = loadSnapshot(schemaFile.path);\n\n // Apply subsequent diffs in order (up to maxVersion if specified)\n for (const file of files) {\n if (file.type === \"diff\" && file.number > schemaFile.number) {\n // Skip diffs beyond maxVersion if specified\n if (maxVersion !== undefined && file.number > maxVersion) {\n continue;\n }\n const diff = loadDiff(file.path);\n snapshot = applyDiffToSnapshot(snapshot, diff);\n }\n }\n\n return snapshot;\n}\n\n/**\n * Get the latest migration number from a directory\n * Returns 0 if no migrations exist\n * @param {string} migrationsDir - Migrations directory path\n * @returns {number} Latest migration number or 0 if no migrations exist\n */\nexport function getLatestMigrationNumber(migrationsDir: string): number {\n const files = getMigrationFiles(migrationsDir);\n if (files.length === 0) return 0;\n return Math.max(...files.map((f) => f.number));\n}\n\n// ============================================================================\n// Snapshot Comparison\n// ============================================================================\n\n/**\n * Compare two field configs and determine if they are different\n * @param {SnapshotFieldConfig} oldField - Old field configuration\n * @param {SnapshotFieldConfig} newField - New field configuration\n * @returns {boolean} True if fields are different\n */\nfunction areFieldsDifferent(oldField: SnapshotFieldConfig, newField: SnapshotFieldConfig): boolean {\n // Compare required properties\n if (oldField.type !== newField.type) return true;\n if (oldField.required !== newField.required) return true;\n\n // Compare optional boolean properties (default to false)\n const booleanProps = [\"array\", \"index\", \"unique\", \"foreignKey\", \"vector\"] as const;\n for (const prop of booleanProps) {\n if ((oldField[prop] ?? false) !== (newField[prop] ?? false)) return true;\n }\n\n // Compare foreign key properties\n if (oldField.foreignKeyType !== newField.foreignKeyType) return true;\n if (oldField.foreignKeyField !== newField.foreignKeyField) return true;\n\n if ((oldField.description ?? \"\") !== (newField.description ?? \"\")) return true;\n\n const oldAllowed = oldField.allowedValues ?? [];\n const newAllowed = newField.allowedValues ?? [];\n if (oldAllowed.length !== newAllowed.length) return true;\n const newAllowedMap = new Map(newAllowed.map((v) => [v.value, v.description]));\n for (const v of oldAllowed) {\n if (!newAllowedMap.has(v.value)) return true;\n if ((v.description ?? \"\") !== (newAllowedMap.get(v.value) ?? \"\")) return true;\n }\n\n const oldHooks = oldField.hooks;\n const newHooks = newField.hooks;\n if (Boolean(oldHooks) !== Boolean(newHooks)) return true;\n if (oldHooks && newHooks) {\n if ((oldHooks.create?.expr ?? \"\") !== (newHooks.create?.expr ?? \"\")) return true;\n if ((oldHooks.update?.expr ?? \"\") !== (newHooks.update?.expr ?? \"\")) return true;\n }\n\n const oldValidate = oldField.validate ?? [];\n const newValidate = newField.validate ?? [];\n if (oldValidate.length !== newValidate.length) return true;\n for (let i = 0; i < oldValidate.length; i++) {\n if (oldValidate[i].script.expr !== newValidate[i].script.expr) return true;\n if (oldValidate[i].errorMessage !== newValidate[i].errorMessage) return true;\n }\n\n const oldSerial = oldField.serial;\n const newSerial = newField.serial;\n if (Boolean(oldSerial) !== Boolean(newSerial)) return true;\n if (oldSerial && newSerial) {\n if (oldSerial.start !== newSerial.start) return true;\n if (oldSerial.maxValue !== newSerial.maxValue) return true;\n if ((oldSerial.format ?? \"\") !== (newSerial.format ?? \"\")) return true;\n }\n\n const oldFields = oldField.fields ?? {};\n const newFields = newField.fields ?? {};\n const oldFieldNames = Object.keys(oldFields);\n const newFieldNames = Object.keys(newFields);\n if (oldFieldNames.length !== newFieldNames.length) return true;\n for (const fieldName of oldFieldNames) {\n if (!newFields[fieldName]) return true;\n if (areFieldsDifferent(oldFields[fieldName], newFields[fieldName])) return true;\n }\n\n return false;\n}\n\n/**\n * Determine if a field change is a breaking change\n * @param {string} typeName - Name of the type containing the field\n * @param {string} fieldName - Name of the field being changed\n * @param {SnapshotFieldConfig | undefined} oldField - Old field configuration\n * @param {SnapshotFieldConfig | undefined} newField - New field configuration\n * @returns {BreakingChangeInfo | null} Breaking change info or null if not breaking\n */\nfunction isBreakingFieldChange(\n typeName: string,\n fieldName: string,\n oldField: SnapshotFieldConfig | undefined,\n newField: SnapshotFieldConfig | undefined,\n): BreakingChangeInfo | null {\n // Field added as required - breaking (existing records don't have this value)\n if (!oldField && newField && newField.required) {\n return {\n typeName,\n fieldName,\n reason: \"Required field added\",\n };\n }\n\n // Field type changed - unsupported (requires 3-step migration)\n if (oldField && newField && oldField.type !== newField.type) {\n return {\n typeName,\n fieldName,\n reason: `Field type changed from ${oldField.type} to ${newField.type}`,\n unsupported: true,\n showThreeStepHint: true,\n };\n }\n\n // Optional to required - breaking\n if (oldField && newField && !oldField.required && newField.required) {\n return {\n typeName,\n fieldName,\n reason: \"Field changed from optional to required\",\n };\n }\n\n // Array property changed - unsupported (requires 3-step migration)\n if (oldField && newField && (oldField.array ?? false) !== (newField.array ?? false)) {\n const [fromType, toType] = oldField.array\n ? [\"array\", \"single value\"]\n : [\"single value\", \"array\"];\n return {\n typeName,\n fieldName,\n reason: `Field changed from ${fromType} to ${toType}`,\n unsupported: true,\n showThreeStepHint: true,\n };\n }\n\n // Foreign key relationship changed - breaking (existing references may become invalid)\n if (oldField && newField) {\n const oldForeignKeyType = oldField.foreignKeyType;\n const newForeignKeyType = newField.foreignKeyType;\n if (oldForeignKeyType && newForeignKeyType && oldForeignKeyType !== newForeignKeyType) {\n return {\n typeName,\n fieldName,\n reason: `Foreign key target type changed from ${oldForeignKeyType} to ${newForeignKeyType}`,\n };\n }\n }\n\n // Unique constraint added - breaking (existing duplicate values would violate constraint)\n if (oldField && newField && !(oldField.unique ?? false) && (newField.unique ?? false)) {\n return {\n typeName,\n fieldName,\n reason: \"Unique constraint added to field\",\n };\n }\n\n // Enum values removed - breaking (existing records may have removed values)\n if (oldField && newField && oldField.type === \"enum\" && newField.type === \"enum\") {\n const oldAllowed = oldField.allowedValues ?? [];\n const newAllowed = newField.allowedValues ?? [];\n const oldValues = oldAllowed.map((v) => v.value);\n const newValuesSet = new Set(newAllowed.map((v) => v.value));\n const removedValues = oldValues.filter((v) => !newValuesSet.has(v));\n if (removedValues.length > 0) {\n return {\n typeName,\n fieldName,\n reason: `Enum values removed: ${removedValues.join(\", \")}`,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Context for collecting diff changes and breaking changes\n */\ninterface DiffContext {\n changes: DiffChange[];\n breakingChanges: BreakingChangeInfo[];\n}\n\nfunction addChange(\n ctx: DiffContext,\n change: DiffChange,\n oldField: SnapshotFieldConfig | undefined,\n newField: SnapshotFieldConfig | undefined,\n): void {\n ctx.changes.push(change);\n\n if (change.fieldName) {\n const breaking = isBreakingFieldChange(change.typeName, change.fieldName, oldField, newField);\n if (breaking) {\n ctx.breakingChanges.push(breaking);\n }\n }\n}\n\nfunction compareTypeFields(\n ctx: DiffContext,\n typeName: string,\n prevType: SnapshotType,\n currType: SnapshotType,\n): void {\n const prevFieldNames = new Set(Object.keys(prevType.fields));\n const currFieldNames = new Set(Object.keys(currType.fields));\n\n // Check for added fields\n for (const fieldName of currFieldNames) {\n if (!prevFieldNames.has(fieldName)) {\n addChange(\n ctx,\n {\n kind: \"field_added\",\n typeName,\n fieldName,\n after: currType.fields[fieldName],\n },\n undefined,\n currType.fields[fieldName],\n );\n }\n }\n\n // Check for removed fields\n for (const fieldName of prevFieldNames) {\n if (!currFieldNames.has(fieldName)) {\n addChange(\n ctx,\n {\n kind: \"field_removed\",\n typeName,\n fieldName,\n before: prevType.fields[fieldName],\n },\n prevType.fields[fieldName],\n undefined,\n );\n }\n }\n\n // Check for modified fields\n for (const fieldName of currFieldNames) {\n if (!prevFieldNames.has(fieldName)) continue;\n\n const prevField = prevType.fields[fieldName];\n const currField = currType.fields[fieldName];\n\n if (areFieldsDifferent(prevField, currField)) {\n addChange(\n ctx,\n {\n kind: \"field_modified\",\n typeName,\n fieldName,\n before: prevField,\n after: currField,\n },\n prevField,\n currField,\n );\n }\n }\n}\n\n/**\n * Compare type-level indexes\n * @param {DiffContext} ctx - Diff context\n * @param {string} typeName - Type name\n * @param {Record<string, SnapshotIndexConfig> | undefined} oldIndexes - Previous indexes\n * @param {Record<string, SnapshotIndexConfig> | undefined} newIndexes - Current indexes\n * @returns {void}\n */\nfunction compareIndexes(\n ctx: DiffContext,\n typeName: string,\n oldIndexes: Record<string, SnapshotIndexConfig> | undefined,\n newIndexes: Record<string, SnapshotIndexConfig> | undefined,\n): void {\n const oldKeys = new Set(Object.keys(oldIndexes || {}));\n const newKeys = new Set(Object.keys(newIndexes || {}));\n\n // Index added\n for (const indexName of newKeys) {\n if (!oldKeys.has(indexName)) {\n ctx.changes.push({\n kind: \"index_added\",\n typeName,\n indexName,\n after: newIndexes![indexName],\n });\n }\n }\n\n // Index removed\n for (const indexName of oldKeys) {\n if (!newKeys.has(indexName)) {\n ctx.changes.push({\n kind: \"index_removed\",\n typeName,\n indexName,\n before: oldIndexes![indexName],\n });\n }\n }\n\n // Index modified\n for (const indexName of newKeys) {\n if (oldKeys.has(indexName)) {\n const oldIndex = oldIndexes![indexName];\n const newIndex = newIndexes![indexName];\n\n const oldFieldsStr = JSON.stringify(oldIndex.fields.toSorted());\n const newFieldsStr = JSON.stringify(newIndex.fields.toSorted());\n\n if (oldFieldsStr !== newFieldsStr || oldIndex.unique !== newIndex.unique) {\n const reasons: string[] = [];\n if (oldFieldsStr !== newFieldsStr) reasons.push(\"fields changed\");\n if (oldIndex.unique !== newIndex.unique) reasons.push(\"unique constraint changed\");\n ctx.changes.push({\n kind: \"index_modified\",\n typeName,\n indexName,\n reason: reasons.join(\", \"),\n before: oldIndex,\n after: newIndex,\n });\n }\n }\n }\n}\n\n/**\n * Compare type-level file fields\n * @param {DiffContext} ctx - Diff context\n * @param {string} typeName - Type name\n * @param {Record<string, string> | undefined} oldFiles - Previous file fields\n * @param {Record<string, string> | undefined} newFiles - Current file fields\n * @returns {void}\n */\nfunction compareFiles(\n ctx: DiffContext,\n typeName: string,\n oldFiles: Record<string, string> | undefined,\n newFiles: Record<string, string> | undefined,\n): void {\n const oldKeys = new Set(Object.keys(oldFiles || {}));\n const newKeys = new Set(Object.keys(newFiles || {}));\n\n // File field added\n for (const fileName of newKeys) {\n if (!oldKeys.has(fileName)) {\n ctx.changes.push({\n kind: \"file_added\",\n typeName,\n fieldName: fileName,\n after: newFiles![fileName],\n });\n }\n }\n\n // File field removed\n for (const fileName of oldKeys) {\n if (!newKeys.has(fileName)) {\n ctx.changes.push({\n kind: \"file_removed\",\n typeName,\n fieldName: fileName,\n before: oldFiles![fileName],\n });\n }\n }\n\n // File field modified (description changed)\n for (const fileName of newKeys) {\n if (oldKeys.has(fileName)) {\n if (oldFiles![fileName] !== newFiles![fileName]) {\n ctx.changes.push({\n kind: \"file_modified\",\n typeName,\n fieldName: fileName,\n reason: \"description changed\",\n before: oldFiles![fileName],\n after: newFiles![fileName],\n });\n }\n }\n }\n}\n\n/**\n * Compare type-level relationships\n * @param {DiffContext} ctx - Diff context\n * @param {string} typeName - Type name\n * @param {\"forward\" | \"backward\"} relationshipType - Relationship direction to compare\n * @param {Record<string, SnapshotRelationship> | undefined} oldRelationships - Previous relationships\n * @param {Record<string, SnapshotRelationship> | undefined} newRelationships - Current relationships\n * @returns {void}\n */\nfunction compareRelationships(\n ctx: DiffContext,\n typeName: string,\n relationshipType: \"forward\" | \"backward\",\n oldRelationships: Record<string, SnapshotRelationship> | undefined,\n newRelationships: Record<string, SnapshotRelationship> | undefined,\n): void {\n const oldKeys = new Set(Object.keys(oldRelationships || {}));\n const newKeys = new Set(Object.keys(newRelationships || {}));\n\n // Relationship added\n for (const relName of newKeys) {\n if (!oldKeys.has(relName)) {\n ctx.changes.push({\n kind: \"relationship_added\",\n typeName,\n relationshipName: relName,\n relationshipType,\n after: newRelationships![relName],\n });\n }\n }\n\n // Relationship removed\n for (const relName of oldKeys) {\n if (!newKeys.has(relName)) {\n ctx.changes.push({\n kind: \"relationship_removed\",\n typeName,\n relationshipName: relName,\n relationshipType,\n before: oldRelationships![relName],\n });\n }\n }\n\n // Relationship modified\n for (const relName of newKeys) {\n if (oldKeys.has(relName)) {\n const oldRel = oldRelationships![relName];\n const newRel = newRelationships![relName];\n\n const reasons: string[] = [];\n if (oldRel.targetType !== newRel.targetType) reasons.push(\"targetType changed\");\n if (oldRel.targetField !== newRel.targetField) reasons.push(\"targetField changed\");\n if (oldRel.sourceField !== newRel.sourceField) reasons.push(\"sourceField changed\");\n if (oldRel.isArray !== newRel.isArray) reasons.push(\"isArray changed\");\n\n if (reasons.length > 0) {\n ctx.changes.push({\n kind: \"relationship_modified\",\n typeName,\n relationshipName: relName,\n relationshipType,\n reason: reasons.join(\", \"),\n before: oldRel,\n after: newRel,\n });\n }\n }\n }\n}\n\n/**\n * Compare type-level permissions\n * @param {DiffContext} ctx - Diff context\n * @param {string} typeName - Type name\n * @param {SnapshotRecordPermission | undefined} oldRecordPerm - Previous record permission\n * @param {SnapshotRecordPermission | undefined} newRecordPerm - Current record permission\n * @param {SnapshotGqlPermission | undefined} oldGqlPerm - Previous GQL permission\n * @param {SnapshotGqlPermission | undefined} newGqlPerm - Current GQL permission\n * @returns {void}\n */\nfunction comparePermissions(\n ctx: DiffContext,\n typeName: string,\n oldRecordPerm: SnapshotRecordPermission | undefined,\n newRecordPerm: SnapshotRecordPermission | undefined,\n oldGqlPerm: SnapshotGqlPermission | undefined,\n newGqlPerm: SnapshotGqlPermission | undefined,\n): void {\n // Compare record permissions\n const oldRecordStr = JSON.stringify(oldRecordPerm ?? null);\n const newRecordStr = JSON.stringify(newRecordPerm ?? null);\n const recordPermChanged = oldRecordStr !== newRecordStr;\n\n // Compare GQL permissions\n const oldGqlStr = JSON.stringify(oldGqlPerm ?? null);\n const newGqlStr = JSON.stringify(newGqlPerm ?? null);\n const gqlPermChanged = oldGqlStr !== newGqlStr;\n\n if (recordPermChanged || gqlPermChanged) {\n const reasons: string[] = [];\n if (recordPermChanged) reasons.push(\"record permission\");\n if (gqlPermChanged) reasons.push(\"GQL permission\");\n\n ctx.changes.push({\n kind: \"permission_modified\",\n typeName,\n reason: `${reasons.join(\" and \")} changed`,\n before: { recordPermission: oldRecordPerm, gqlPermission: oldGqlPerm },\n after: { recordPermission: newRecordPerm, gqlPermission: newGqlPerm },\n });\n }\n}\n\n/**\n * Compare two snapshots and generate a diff\n * @param {SchemaSnapshot} previous - Previous schema snapshot\n * @param {SchemaSnapshot} current - Current schema snapshot\n * @returns {MigrationDiff} Migration diff between snapshots\n */\nexport function compareSnapshots(previous: SchemaSnapshot, current: SchemaSnapshot): MigrationDiff {\n const ctx: DiffContext = { changes: [], breakingChanges: [] };\n\n const previousTypeNames = new Set(Object.keys(previous.types));\n const currentTypeNames = new Set(Object.keys(current.types));\n\n // Check for added types\n for (const typeName of currentTypeNames) {\n if (!previousTypeNames.has(typeName)) {\n ctx.changes.push({\n kind: \"type_added\",\n typeName,\n after: current.types[typeName],\n });\n }\n }\n\n // Check for removed types\n for (const typeName of previousTypeNames) {\n if (!currentTypeNames.has(typeName)) {\n ctx.changes.push({\n kind: \"type_removed\",\n typeName,\n before: previous.types[typeName],\n });\n }\n }\n\n // Check for modified types\n for (const typeName of currentTypeNames) {\n if (!previousTypeNames.has(typeName)) continue;\n\n const prevType = previous.types[typeName];\n const currType = current.types[typeName];\n\n // Compare fields\n compareTypeFields(ctx, typeName, prevType, currType);\n\n // Compare indexes\n compareIndexes(ctx, typeName, prevType.indexes, currType.indexes);\n\n // Compare file fields\n compareFiles(ctx, typeName, prevType.files, currType.files);\n\n // Compare relationships\n compareRelationships(\n ctx,\n typeName,\n \"forward\",\n prevType.forwardRelationships,\n currType.forwardRelationships,\n );\n compareRelationships(\n ctx,\n typeName,\n \"backward\",\n prevType.backwardRelationships,\n currType.backwardRelationships,\n );\n\n // Compare permissions\n comparePermissions(\n ctx,\n typeName,\n prevType.permissions?.record,\n currType.permissions?.record,\n prevType.permissions?.gql,\n currType.permissions?.gql,\n );\n }\n\n return {\n version: SCHEMA_SNAPSHOT_VERSION,\n namespace: current.namespace,\n createdAt: new Date().toISOString(),\n changes: ctx.changes,\n hasBreakingChanges: ctx.breakingChanges.length > 0,\n breakingChanges: ctx.breakingChanges,\n requiresMigrationScript: ctx.breakingChanges.length > 0,\n };\n}\n\n/**\n * Compare local types with a snapshot and generate a diff\n * @param {SchemaSnapshot} snapshot - Schema snapshot to compare against\n * @param {Record<string, TailorDBType>} localTypes - Local type definitions\n * @param {string} namespace - Namespace for comparison\n * @returns {MigrationDiff} Migration diff\n */\nexport function compareLocalTypesWithSnapshot(\n snapshot: SchemaSnapshot,\n localTypes: Record<string, TailorDBType>,\n namespace: string,\n): MigrationDiff {\n const currentSnapshot = createSnapshotFromLocalTypes(localTypes, namespace);\n return compareSnapshots(snapshot, currentSnapshot);\n}\n\n// ============================================================================\n// Snapshot Writing\n// ============================================================================\n\n/**\n * Write a schema snapshot to a file (creates directory structure)\n * @param {SchemaSnapshot} snapshot - Snapshot to write\n * @param {string} migrationsDir - Migrations directory path\n * @param {number} num - Migration number\n * @returns {string} Path to the written file\n */\nexport function writeSnapshot(\n snapshot: SchemaSnapshot,\n migrationsDir: string,\n num: number,\n): string {\n const migrationDir = getMigrationDirPath(migrationsDir, num);\n fs.mkdirSync(migrationDir, { recursive: true });\n const filePath = getMigrationFilePath(migrationsDir, num, \"schema\");\n fs.writeFileSync(filePath, JSON.stringify(snapshot, null, 2));\n return filePath;\n}\n\n/**\n * Write a migration diff to a file (creates directory structure)\n * @param {MigrationDiff} diff - Diff to write\n * @param {string} migrationsDir - Migrations directory path\n * @param {number} num - Migration number\n * @returns {string} Path to the written file\n */\nexport function writeDiff(diff: MigrationDiff, migrationsDir: string, num: number): string {\n const migrationDir = getMigrationDirPath(migrationsDir, num);\n fs.mkdirSync(migrationDir, { recursive: true });\n const filePath = getMigrationFilePath(migrationsDir, num, \"diff\");\n fs.writeFileSync(filePath, JSON.stringify(diff, null, 2));\n return filePath;\n}\n\n// ============================================================================\n// Migration Validation\n// ============================================================================\n\n/**\n * Validation error for migration files\n */\nexport interface MigrationValidationError {\n type: \"missing_schema\" | \"missing_diff\" | \"duplicate\" | \"gap\" | \"invalid_schema_number\";\n message: string;\n migrationNumber?: number;\n}\n\n/**\n * Validate migration files in a directory\n *\n * Checks:\n * - Schema file exists at 0000 (initial schema)\n * - No gaps in migration numbers\n * - No duplicate migration numbers (schema at 0000, diffs at 1+)\n * - Diff files exist for migrations 1+\n * @param {string} migrationsDir - Migrations directory path\n * @returns {MigrationValidationError[]} Array of validation errors (empty if valid)\n */\nexport function validateMigrationFiles(migrationsDir: string): MigrationValidationError[] {\n const errors: MigrationValidationError[] = [];\n\n if (!fs.existsSync(migrationsDir)) {\n // No migrations directory - this is valid (no migrations yet)\n return errors;\n }\n\n // Use getMigrationFiles to get directory-based migration files\n const migrationFiles = getMigrationFiles(migrationsDir);\n if (migrationFiles.length === 0) {\n // No migration files at all - valid\n return errors;\n }\n\n // Categorize files by type\n const schemaFiles: number[] = [];\n const diffFiles: number[] = [];\n\n for (const file of migrationFiles) {\n if (file.type === \"schema\") {\n schemaFiles.push(file.number);\n } else if (file.type === \"diff\") {\n diffFiles.push(file.number);\n }\n }\n\n // Check for schema file at INITIAL_SCHEMA_NUMBER (0000)\n if (!schemaFiles.includes(INITIAL_SCHEMA_NUMBER)) {\n errors.push({\n type: \"missing_schema\",\n message: `Initial schema snapshot (${formatMigrationNumber(\n INITIAL_SCHEMA_NUMBER,\n )}/schema.json) is missing`,\n migrationNumber: INITIAL_SCHEMA_NUMBER,\n });\n }\n\n // Check for schema files at wrong positions (only 0000 should have schema)\n for (const num of schemaFiles) {\n if (num !== INITIAL_SCHEMA_NUMBER) {\n errors.push({\n type: \"invalid_schema_number\",\n message: `Schema file found at migration ${formatMigrationNumber(\n num,\n )}, but schema should only exist at ${formatMigrationNumber(INITIAL_SCHEMA_NUMBER)}`,\n migrationNumber: num,\n });\n }\n }\n\n // Get all migration numbers\n const allNumbers = [...new Set([...schemaFiles, ...diffFiles])].sort((a, b) => a - b);\n\n if (allNumbers.length === 0) {\n return errors;\n }\n\n // Check for duplicate files (same number with both schema and diff, except for INITIAL_SCHEMA_NUMBER)\n for (const num of schemaFiles) {\n if (num !== INITIAL_SCHEMA_NUMBER && diffFiles.includes(num)) {\n errors.push({\n type: \"duplicate\",\n message: `Migration ${formatMigrationNumber(num)} has both schema and diff files`,\n migrationNumber: num,\n });\n }\n }\n\n // Check for gaps in sequence (from INITIAL_SCHEMA_NUMBER to max)\n const maxNum = Math.max(...allNumbers);\n for (let i = INITIAL_SCHEMA_NUMBER; i <= maxNum; i++) {\n if (!allNumbers.includes(i)) {\n errors.push({\n type: \"gap\",\n message: `Migration ${formatMigrationNumber(i)} is missing (gap in sequence)`,\n migrationNumber: i,\n });\n }\n }\n\n // Check that migrations > INITIAL_SCHEMA_NUMBER have diff files\n for (const num of allNumbers) {\n if (num > INITIAL_SCHEMA_NUMBER && !diffFiles.includes(num)) {\n errors.push({\n type: \"missing_diff\",\n message: `Migration ${formatMigrationNumber(num)} is missing diff file`,\n migrationNumber: num,\n });\n }\n }\n\n return errors;\n}\n\n/**\n * Validate migration files and throw if invalid\n * @param {string} migrationsDir - Migrations directory path\n * @param {string} namespace - Namespace for error messages\n * @throws {Error} If validation fails\n */\nexport function assertValidMigrationFiles(migrationsDir: string, namespace: string): void {\n const errors = validateMigrationFiles(migrationsDir);\n if (errors.length > 0) {\n const errorMessages = errors.map((e) => ` - ${e.message}`).join(\"\\n\");\n throw new Error(\n `Migration file validation failed for namespace \"${namespace}\":\\n${errorMessages}`,\n );\n }\n}\n\n// ============================================================================\n// Remote Schema Verification\n// ============================================================================\n\n/**\n * Convert remote ParsedTailorDBType to SnapshotFieldConfig for comparison\n * @param {ProtoTailorDBType} remoteType - Remote TailorDB type from API\n * @returns {Record<string, SnapshotFieldConfig>} Converted field configs\n */\nfunction convertRemoteFieldsToSnapshot(\n remoteType: ProtoTailorDBType,\n): Record<string, SnapshotFieldConfig> {\n const fields: Record<string, SnapshotFieldConfig> = {};\n const remoteFields = remoteType.schema?.fields ?? {};\n\n for (const [fieldName, remoteField] of Object.entries(remoteFields)) {\n const config: SnapshotFieldConfig = {\n type: remoteField.type,\n required: remoteField.required,\n };\n\n if (remoteField.array) config.array = true;\n if (remoteField.index) config.index = true;\n if (remoteField.unique) config.unique = true;\n if (remoteField.foreignKey) {\n config.foreignKey = true;\n if (remoteField.foreignKeyType) config.foreignKeyType = remoteField.foreignKeyType;\n if (remoteField.foreignKeyField) config.foreignKeyField = remoteField.foreignKeyField;\n }\n if (remoteField.allowedValues && remoteField.allowedValues.length > 0) {\n config.allowedValues = remoteField.allowedValues.map((v) => ({\n value: v.value,\n ...(v.description && { description: v.description }),\n }));\n }\n\n if (remoteField.description) config.description = remoteField.description;\n if (remoteField.vector) config.vector = true;\n\n if (remoteField.hooks) {\n config.hooks = {};\n if (remoteField.hooks.create?.expr) {\n config.hooks.create = { expr: remoteField.hooks.create.expr };\n }\n if (remoteField.hooks.update?.expr) {\n config.hooks.update = { expr: remoteField.hooks.update.expr };\n }\n }\n\n if (remoteField.validate && remoteField.validate.length > 0) {\n config.validate = remoteField.validate.map((v) => ({\n script: { expr: v.script?.expr ?? \"\" },\n errorMessage: v.errorMessage ?? \"\",\n }));\n }\n\n if (remoteField.serial) {\n config.serial = {\n start: Number(remoteField.serial.start),\n ...(remoteField.serial.maxValue && { maxValue: Number(remoteField.serial.maxValue) }),\n ...(remoteField.serial.format && { format: remoteField.serial.format }),\n };\n }\n\n // TODO: Add nested field conversion when remote API supports it\n\n fields[fieldName] = config;\n }\n\n return fields;\n}\n\n/**\n * Compare a single field between remote and snapshot\n * @param {string} typeName - Name of the type\n * @param {string} fieldName - Name of the field\n * @param {SnapshotFieldConfig} remoteField - Remote field config\n * @param {SnapshotFieldConfig} snapshotField - Snapshot field config\n * @returns {SchemaDrift | null} Drift info or null if fields match\n */\nfunction compareFields(\n typeName: string,\n fieldName: string,\n remoteField: SnapshotFieldConfig,\n snapshotField: SnapshotFieldConfig,\n): SchemaDrift | null {\n const differences: string[] = [];\n\n // Compare type\n if (remoteField.type !== snapshotField.type) {\n differences.push(`type: remote=${remoteField.type}, expected=${snapshotField.type}`);\n }\n\n // Compare required\n if (remoteField.required !== snapshotField.required) {\n differences.push(\n `required: remote=${remoteField.required}, expected=${snapshotField.required}`,\n );\n }\n\n // Compare array\n const remoteArray = remoteField.array ?? false;\n const snapshotArray = snapshotField.array ?? false;\n if (remoteArray !== snapshotArray) {\n differences.push(`array: remote=${remoteArray}, expected=${snapshotArray}`);\n }\n\n // Compare unique\n const remoteUnique = remoteField.unique ?? false;\n const snapshotUnique = snapshotField.unique ?? false;\n if (remoteUnique !== snapshotUnique) {\n differences.push(`unique: remote=${remoteUnique}, expected=${snapshotUnique}`);\n }\n\n // Compare foreignKey\n const remoteFk = remoteField.foreignKey ?? false;\n const snapshotFk = snapshotField.foreignKey ?? false;\n if (remoteFk !== snapshotFk) {\n differences.push(`foreignKey: remote=${remoteFk}, expected=${snapshotFk}`);\n }\n\n // Compare foreignKeyType\n if (remoteField.foreignKeyType !== snapshotField.foreignKeyType) {\n differences.push(\n `foreignKeyType: remote=${remoteField.foreignKeyType ?? \"none\"}, expected=${snapshotField.foreignKeyType ?? \"none\"}`,\n );\n }\n\n const remoteAllowed = remoteField.allowedValues ?? [];\n const snapshotAllowed = snapshotField.allowedValues ?? [];\n const remoteAllowedValues = new Set(remoteAllowed.map((v) => v.value));\n const snapshotAllowedValues = new Set(snapshotAllowed.map((v) => v.value));\n if (remoteAllowedValues.size !== snapshotAllowedValues.size) {\n differences.push(\n `allowedValues count: remote=${remoteAllowedValues.size}, expected=${snapshotAllowedValues.size}`,\n );\n } else {\n for (const v of remoteAllowedValues) {\n if (!snapshotAllowedValues.has(v)) {\n differences.push(`allowedValues: remote has '${v}' not in snapshot`);\n break;\n }\n }\n for (const v of snapshotAllowedValues) {\n if (!remoteAllowedValues.has(v)) {\n differences.push(`allowedValues: snapshot has '${v}' not in remote`);\n break;\n }\n }\n }\n\n const remoteVector = remoteField.vector ?? false;\n const snapshotVector = snapshotField.vector ?? false;\n if (remoteVector !== snapshotVector) {\n differences.push(`vector: remote=${remoteVector}, expected=${snapshotVector}`);\n }\n\n if (differences.length > 0) {\n return {\n typeName,\n kind: \"field_mismatch\",\n fieldName,\n details: differences.join(\"; \"),\n };\n }\n\n return null;\n}\n\n/**\n * System fields that are auto-generated and should be excluded from comparison\n */\nconst SYSTEM_FIELDS = new Set([\"id\"]);\n\n/**\n * Compare remote TailorDB types with a local snapshot\n * @param {ProtoTailorDBType[]} remoteTypes - Remote types from listParsedTailorDBTypes API\n * @param {SchemaSnapshot} snapshot - Local schema snapshot\n * @returns {SchemaDrift[]} List of drifts detected\n */\nexport function compareRemoteWithSnapshot(\n remoteTypes: ProtoTailorDBType[],\n snapshot: SchemaSnapshot,\n): SchemaDrift[] {\n const drifts: SchemaDrift[] = [];\n\n // Build maps for easy lookup\n const remoteTypeMap = new Map<string, ProtoTailorDBType>();\n for (const remoteType of remoteTypes) {\n remoteTypeMap.set(remoteType.name, remoteType);\n }\n\n const snapshotTypeNames = new Set(Object.keys(snapshot.types));\n const remoteTypeNames = new Set(remoteTypeMap.keys());\n\n // Check for types missing in remote\n for (const typeName of snapshotTypeNames) {\n if (!remoteTypeNames.has(typeName)) {\n drifts.push({\n typeName,\n kind: \"type_missing_remote\",\n details: `Type '${typeName}' exists in snapshot but not in remote`,\n });\n }\n }\n\n // Check for types missing in snapshot (unexpected types in remote)\n for (const typeName of remoteTypeNames) {\n if (!snapshotTypeNames.has(typeName)) {\n drifts.push({\n typeName,\n kind: \"type_missing_local\",\n details: `Type '${typeName}' exists in remote but not in snapshot`,\n });\n }\n }\n\n // Compare fields for types that exist in both\n for (const typeName of snapshotTypeNames) {\n if (!remoteTypeNames.has(typeName)) continue;\n\n const remoteType = remoteTypeMap.get(typeName)!;\n const snapshotType = snapshot.types[typeName];\n\n const remoteFields = convertRemoteFieldsToSnapshot(remoteType);\n const snapshotFields = snapshotType.fields;\n\n // Exclude system fields (like 'id') from comparison\n const remoteFieldNames = new Set(\n Object.keys(remoteFields).filter((f) => !SYSTEM_FIELDS.has(f)),\n );\n const snapshotFieldNames = new Set(\n Object.keys(snapshotFields).filter((f) => !SYSTEM_FIELDS.has(f)),\n );\n\n // Check for fields missing in remote\n for (const fieldName of snapshotFieldNames) {\n if (!remoteFieldNames.has(fieldName)) {\n drifts.push({\n typeName,\n kind: \"field_missing_remote\",\n fieldName,\n details: `Field '${fieldName}' exists in snapshot but not in remote`,\n });\n }\n }\n\n // Check for fields missing in snapshot\n for (const fieldName of remoteFieldNames) {\n if (!snapshotFieldNames.has(fieldName)) {\n drifts.push({\n typeName,\n kind: \"field_missing_local\",\n fieldName,\n details: `Field '${fieldName}' exists in remote but not in snapshot`,\n });\n }\n }\n\n // Compare fields that exist in both\n for (const fieldName of snapshotFieldNames) {\n if (!remoteFieldNames.has(fieldName)) continue;\n\n const drift = compareFields(\n typeName,\n fieldName,\n remoteFields[fieldName],\n snapshotFields[fieldName],\n );\n if (drift) {\n drifts.push(drift);\n }\n }\n }\n\n return drifts;\n}\n\n/**\n * Format schema drifts for display\n * @param {SchemaDrift[]} drifts - List of drifts to format\n * @returns {string} Formatted drift report\n */\nexport function formatSchemaDrifts(drifts: SchemaDrift[]): string {\n if (drifts.length === 0) {\n return \"No schema drifts detected.\";\n }\n\n const lines: string[] = [];\n\n // Group drifts by type\n const driftsByType = new Map<string, SchemaDrift[]>();\n for (const drift of drifts) {\n const existing = driftsByType.get(drift.typeName) ?? [];\n existing.push(drift);\n driftsByType.set(drift.typeName, existing);\n }\n\n for (const [typeName, typeDrifts] of driftsByType) {\n lines.push(` Type '${typeName}':`);\n for (const drift of typeDrifts) {\n if (drift.fieldName) {\n lines.push(` - Field '${drift.fieldName}': ${drift.details}`);\n } else {\n lines.push(` - ${drift.details}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Migration script bundler for TailorDB migrations\n *\n * Bundles migration scripts to be executed via TestExecScript API\n */\n\nimport * as fs from \"node:fs\";\nimport ml from \"multiline-ts\";\nimport * as path from \"pathe\";\nimport { resolveTSConfig } from \"pkg-types\";\nimport * as rolldown from \"rolldown\";\nimport { getDistDir } from \"@/cli/utils/dist-dir\";\n\nexport interface MigrationBundleResult {\n namespace: string;\n migrationNumber: number;\n bundledCode: string;\n}\n\n/**\n * Bundle a single migration script\n *\n * Creates an entry that:\n * 1. Imports the migration script's main function\n * 2. Defines getDB() function inline\n * 3. Wraps migration in a transaction using getDB()\n * 4. Exports as main() for TestExecScript\n * @param {string} sourceFile - Path to the migration script file\n * @param {string} namespace - TailorDB namespace\n * @param {number} migrationNumber - Migration number\n * @returns {Promise<MigrationBundleResult>} Bundled migration result\n */\nexport async function bundleMigrationScript(\n sourceFile: string,\n namespace: string,\n migrationNumber: number,\n): Promise<MigrationBundleResult> {\n // Output directory in .tailor-sdk (relative to project root)\n const outputDir = path.resolve(getDistDir(), \"migrations\");\n fs.mkdirSync(outputDir, { recursive: true });\n\n // Entry file in output directory (consistent with resolver/executor bundlers)\n const entryPath = path.join(outputDir, `migration_${namespace}_${migrationNumber}.entry.js`);\n const outputPath = path.join(outputDir, `migration_${namespace}_${migrationNumber}.js`);\n\n const absoluteSourcePath = path.resolve(sourceFile).replace(/\\\\/g, \"/\");\n\n // Create entry file that wraps migration in a transaction\n // getDB function is defined inline to avoid dependency on generated types\n const entryContent = ml /* js */ `\n import { main as _migrationMain } from \"${absoluteSourcePath}\";\n import { Kysely, TailordbDialect } from \"@tailor-platform/sdk/kysely\";\n\n function getDB(namespace) {\n const client = new tailordb.Client({ namespace });\n return new Kysely({\n dialect: new TailordbDialect(client),\n });\n }\n\n export async function main(input) {\n const db = getDB(\"${namespace}\");\n await db.transaction().execute(async (trx) => {\n await _migrationMain(trx);\n });\n return { success: true };\n }\n `;\n fs.writeFileSync(entryPath, entryContent);\n\n let tsconfig: string | undefined;\n try {\n tsconfig = await resolveTSConfig();\n } catch {\n tsconfig = undefined;\n }\n\n // Bundle with tree-shaking\n await rolldown.build(\n rolldown.defineConfig({\n input: entryPath,\n output: {\n file: outputPath,\n format: \"esm\",\n sourcemap: false,\n minify: false,\n inlineDynamicImports: true,\n globals: {\n tailordb: \"tailordb\",\n },\n },\n external: [\"tailordb\"],\n resolve: {\n conditionNames: [\"node\", \"import\"],\n },\n tsconfig,\n treeshake: {\n moduleSideEffects: false,\n annotations: true,\n unknownGlobalSideEffects: false,\n },\n logLevel: \"silent\",\n }) as rolldown.BuildOptions,\n );\n\n // Read bundled output\n const bundledCode = fs.readFileSync(outputPath, \"utf-8\");\n\n // Entry file remains in output directory (consistent with resolver/executor bundlers)\n\n return {\n namespace,\n migrationNumber,\n bundledCode,\n };\n}\n","/**\n * Types for TailorDB migration execution\n */\n\nimport { formatMigrationNumber } from \"./snapshot\";\nimport type { MigrationDiff } from \"./diff-calculator\";\n\n// ============================================================================\n// Label Constants\n// ============================================================================\n\n/**\n * Maximum length for Kubernetes label values\n * Labels must match pattern: ^[a-z][a-z0-9_-]{0,62}\n */\nexport const MAX_LABEL_LENGTH = 63;\n\n/**\n * Prefix added to migration numbers in labels (required because migration names start with numbers)\n */\nexport const MIGRATION_LABEL_PREFIX = \"m\";\n\n/**\n * Label key for storing migration state in TailorDB Service metadata\n */\nexport const MIGRATION_LABEL_KEY = \"sdk-migration\";\n\n// ============================================================================\n// Error Constants\n// ============================================================================\n\n/**\n * Error patterns that indicate schema corruption\n */\nexport const SCHEMA_ERROR_PATTERNS = [\n \"failed to fetch schema\",\n \"sqlaccess error\",\n \"schema not found\",\n \"invalid schema\",\n] as const;\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Pending migration to be executed\n */\nexport interface PendingMigration {\n /** Migration number */\n number: number;\n /** Path to migration script file */\n scriptPath: string;\n /** Path to diff file */\n diffPath: string;\n /** Namespace this migration belongs to */\n namespace: string;\n /** Migrations directory path */\n migrationsDir: string;\n /** Migration diff content */\n diff: MigrationDiff;\n}\n\n// ============================================================================\n// Label Helper Functions\n// ============================================================================\n\n/**\n * Sanitize migration number for use as label value\n * Label pattern: ^[a-z][a-z0-9_-]{0,62}\n * - Must start with lowercase letter (add prefix since migration numbers start with digits)\n * - Max 63 characters\n * @param {number} migrationNumber - Migration number to sanitize\n * @returns {string} Sanitized label value\n */\nexport function sanitizeMigrationLabel(migrationNumber: number): string {\n const sanitized = MIGRATION_LABEL_PREFIX + formatMigrationNumber(migrationNumber);\n return sanitized.slice(0, MAX_LABEL_LENGTH);\n}\n\n/**\n * Parse migration number from label value\n * @param {string} label - Label value (e.g., \"m0001\")\n * @returns {number | null} Parsed number or null if invalid\n */\nexport function parseMigrationLabelNumber(label: string): number | null {\n if (!label.startsWith(MIGRATION_LABEL_PREFIX)) return null;\n const numStr = label.slice(MIGRATION_LABEL_PREFIX.length);\n const num = parseInt(numStr, 10);\n return isNaN(num) ? null : num;\n}\n\n// ============================================================================\n// Error Helper Functions\n// ============================================================================\n\n/**\n * Check if an error message indicates schema corruption\n * @param {string} errorMessage - Error message to check\n * @returns {boolean} True if error indicates schema corruption\n */\nexport function isSchemaError(errorMessage: string): boolean {\n const lowerMessage = errorMessage.toLowerCase();\n return SCHEMA_ERROR_PATTERNS.some((pattern) => lowerMessage.includes(pattern));\n}\n\n// ============================================================================\n// Remote Schema Verification Types\n// ============================================================================\n\n/**\n * Type of schema drift detected between remote and local snapshot\n */\nexport type SchemaDriftKind =\n | \"type_missing_remote\"\n | \"type_missing_local\"\n | \"field_missing_remote\"\n | \"field_missing_local\"\n | \"field_mismatch\";\n\n/**\n * Single schema drift item\n */\nexport interface SchemaDrift {\n typeName: string;\n kind: SchemaDriftKind;\n fieldName?: string;\n details: string;\n}\n\n/**\n * Result of remote schema verification for a single namespace\n */\nexport interface RemoteSchemaVerificationResult {\n namespace: string;\n remoteMigrationNumber: number;\n drifts: SchemaDrift[];\n hasDrift: boolean;\n}\n","/**\n * Script execution service for TestExecScript API\n *\n * Provides a reusable utility for executing scripts via the TestExecScript API\n * with polling for completion status.\n */\n\nimport { FunctionExecution_Status } from \"@tailor-proto/tailor/v1/function_resource_pb\";\nimport type { OperatorClient } from \"../client\";\nimport type { AuthInvoker } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\n\n/**\n * Default polling interval for script execution status in milliseconds (1 second)\n */\nexport const DEFAULT_POLL_INTERVAL = 1000;\n\n/**\n * Options for script execution\n */\nexport interface ScriptExecutionOptions {\n /** Operator client instance */\n client: OperatorClient;\n /** Workspace ID */\n workspaceId: string;\n /** Script name (for identification) */\n name: string;\n /** Bundled script code to execute */\n code: string;\n /** Optional JSON string argument to pass to the script */\n arg?: string;\n /** Auth invoker for script execution */\n invoker: AuthInvoker;\n /** Polling interval in milliseconds (default: 1000ms) */\n pollInterval?: number;\n}\n\n/**\n * Result of script execution\n */\nexport interface ScriptExecutionResult {\n /** Whether the script executed successfully */\n success: boolean;\n /** Logs output from the script execution */\n logs: string;\n /** Result value from the script execution */\n result: string;\n /** Error message if execution failed */\n error?: string;\n}\n\n/**\n * Result from waiting for execution completion\n */\nexport interface ExecutionWaitResult {\n /** Execution status */\n status: FunctionExecution_Status;\n /** Logs output from the execution */\n logs: string;\n /** Result value from the execution */\n result: string;\n}\n\n/**\n * Wait for a function execution to complete\n *\n * Polls the getFunctionExecution API until the execution reaches a terminal state\n * (SUCCESS or FAILED).\n * @param {OperatorClient} client - Operator client instance\n * @param {string} workspaceId - Workspace ID\n * @param {string} executionId - Execution ID to wait for\n * @param {number} [pollInterval] - Polling interval in milliseconds (default: 1000ms)\n * @returns {Promise<ExecutionWaitResult>} Execution result\n * @throws {Error} If execution is not found\n */\nexport async function waitForExecution(\n client: OperatorClient,\n workspaceId: string,\n executionId: string,\n pollInterval: number = DEFAULT_POLL_INTERVAL,\n): Promise<ExecutionWaitResult> {\n while (true) {\n const { execution } = await client.getFunctionExecution({\n workspaceId,\n executionId,\n });\n\n if (!execution) {\n throw new Error(`Execution '${executionId}' not found.`);\n }\n\n // Check for terminal states\n if (\n execution.status === FunctionExecution_Status.SUCCESS ||\n execution.status === FunctionExecution_Status.FAILED\n ) {\n return {\n status: execution.status,\n logs: execution.logs,\n result: execution.result,\n };\n }\n\n // Wait before polling again\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n}\n\n/**\n * Execute a script via TestExecScript API and wait for completion\n *\n * This function:\n * 1. Calls testExecScript API to start execution\n * 2. Polls getFunctionExecution until completion\n * 3. Returns structured result with success/failure status\n * @param {ScriptExecutionOptions} options - Execution options\n * @returns {Promise<ScriptExecutionResult>} Execution result\n */\nexport async function executeScript(\n options: ScriptExecutionOptions,\n): Promise<ScriptExecutionResult> {\n const { client, workspaceId, name, code, arg, invoker, pollInterval } = options;\n\n // Execute the script\n const response = await client.testExecScript({\n workspaceId,\n name,\n code,\n arg: arg ?? JSON.stringify({}),\n invoker,\n });\n const executionId = response.executionId;\n\n // Wait for completion\n const result = await waitForExecution(client, workspaceId, executionId, pollInterval);\n\n if (result.status === FunctionExecution_Status.SUCCESS) {\n return {\n success: true,\n logs: result.logs,\n result: result.result,\n };\n } else {\n const errorDetails = [result.logs, result.result].filter(Boolean).join(\"\\n\");\n return {\n success: false,\n logs: result.logs,\n result: result.result,\n error: errorDetails || \"Script execution failed with unknown error\",\n };\n }\n}\n","/**\n * Migration execution service for TailorDB migrations\n *\n * Handles detection and execution of pending migration scripts via TestExecScript API.\n */\n\nimport * as fs from \"node:fs\";\nimport { create } from \"@bufbuild/protobuf\";\nimport { AuthInvokerSchema, type AuthInvoker } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\nimport ora from \"ora\";\nimport { bundleMigrationScript } from \"../../../bundler/migration/migration-bundler\";\nimport { type OperatorClient } from \"../../../client\";\nimport { type NamespaceWithMigrations } from \"../../../tailordb/migrate/config\";\nimport {\n loadDiff,\n getMigrationFiles,\n getMigrationFilePath,\n formatMigrationNumber,\n} from \"../../../tailordb/migrate/snapshot\";\nimport {\n type PendingMigration,\n MIGRATION_LABEL_KEY,\n parseMigrationLabelNumber,\n} from \"../../../tailordb/migrate/types\";\nimport { logger, styles } from \"../../../utils/logger\";\nimport { executeScript } from \"../../../utils/script-executor\";\nimport { trnPrefix } from \"../label\";\nimport type { TailorDBServiceConfig } from \"@/parser/service/tailordb/types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MigrationExecutionOptions {\n client: OperatorClient;\n workspaceId: string;\n authInvoker: AuthInvoker;\n}\n\n/**\n * Context for migration execution with per-namespace configuration\n */\nexport interface MigrationContext {\n client: OperatorClient;\n workspaceId: string;\n authNamespace: string;\n machineUsers: string[] | undefined;\n dbConfig: Record<string, TailorDBServiceConfig | undefined>;\n}\n\ninterface ExecutionResult {\n namespace: string;\n migrationNumber: number;\n success: boolean;\n logs?: string;\n error?: string;\n}\n\n// ============================================================================\n// Migration Detection\n// ============================================================================\n\n/**\n * Get the current migration label from TailorDB Service metadata\n * @param {OperatorClient} client - Operator client instance\n * @param {string} workspaceId - Workspace ID\n * @param {string} namespace - TailorDB namespace\n * @returns {Promise<number>} Current migration number (0 if none)\n */\nasync function getCurrentMigrationNumber(\n client: OperatorClient,\n workspaceId: string,\n namespace: string,\n): Promise<number> {\n try {\n const trn = `${trnPrefix(workspaceId)}:tailordb:${namespace}`;\n\n const { metadata } = await client.getMetadata({ trn });\n\n const label = metadata?.labels[MIGRATION_LABEL_KEY];\n\n if (!label) {\n return 0;\n }\n const num = parseMigrationLabelNumber(label);\n return num ?? 0;\n } catch {\n return 0;\n }\n}\n\n/**\n * Detect pending migrations that need to be executed\n * @param {OperatorClient} client - Operator client instance\n * @param {string} workspaceId - Workspace ID\n * @param {NamespaceWithMigrations[]} namespacesWithMigrations - Namespaces with migrations config\n * @returns {Promise<PendingMigration[]>} List of pending migrations\n */\nexport async function detectPendingMigrations(\n client: OperatorClient,\n workspaceId: string,\n namespacesWithMigrations: NamespaceWithMigrations[],\n): Promise<PendingMigration[]> {\n const pendingMigrations: PendingMigration[] = [];\n\n for (const { namespace, migrationsDir } of namespacesWithMigrations) {\n // Get current applied migration number\n const currentMigration = await getCurrentMigrationNumber(client, workspaceId, namespace);\n\n // Get all migration files\n const migrationFiles = getMigrationFiles(migrationsDir);\n\n // Find migrations that haven't been applied yet\n for (const file of migrationFiles) {\n if (file.number <= currentMigration) {\n continue;\n }\n\n // Check for diff file (all migrations must have a diff)\n const diffPath = getMigrationFilePath(migrationsDir, file.number, \"diff\");\n if (!fs.existsSync(diffPath)) {\n continue;\n }\n\n // Load the diff to check if migration script is required\n const diff = loadDiff(diffPath);\n\n // Check for migration script (only required for breaking changes)\n const scriptPath = getMigrationFilePath(migrationsDir, file.number, \"migrate\");\n if (diff.requiresMigrationScript && !fs.existsSync(scriptPath)) {\n logger.warn(\n `Migration ${namespace}/${file.number} requires a script but migrate.ts not found`,\n );\n continue;\n }\n\n pendingMigrations.push({\n number: file.number,\n scriptPath, // May not exist for non-breaking changes\n diffPath,\n namespace,\n migrationsDir,\n diff,\n });\n }\n }\n\n // Sort by namespace and migration number\n pendingMigrations.sort((a, b) => {\n if (a.namespace !== b.namespace) {\n return a.namespace.localeCompare(b.namespace);\n }\n return a.number - b.number;\n });\n\n return pendingMigrations;\n}\n\n// ============================================================================\n// Migration Execution\n// ============================================================================\n\n/**\n * Execute a single migration script\n * @param {MigrationExecutionOptions} options - Execution options\n * @param {PendingMigration} migration - Migration to execute\n * @returns {Promise<ExecutionResult>} Execution result\n */\nasync function executeSingleMigration(\n options: MigrationExecutionOptions,\n migration: PendingMigration,\n): Promise<ExecutionResult> {\n const { client, workspaceId, authInvoker } = options;\n\n const migrationName = `migration-${migration.namespace}-${formatMigrationNumber(migration.number)}.js`;\n\n // Bundle the migration script\n const bundleResult = await bundleMigrationScript(\n migration.scriptPath,\n migration.namespace,\n migration.number,\n );\n\n // Execute the script using the shared script executor\n const result = await executeScript({\n client,\n workspaceId,\n name: migrationName,\n code: bundleResult.bundledCode,\n invoker: authInvoker,\n });\n\n return {\n namespace: migration.namespace,\n migrationNumber: migration.number,\n success: result.success,\n logs: result.logs,\n error: result.error,\n };\n}\n\n/**\n * Update the migration label on TailorDB Service metadata\n * @param {OperatorClient} client - Operator client instance\n * @param {string} workspaceId - Workspace ID\n * @param {string} namespace - TailorDB namespace\n * @param {number} migrationNumber - Migration number to set\n * @returns {Promise<void>}\n */\nexport async function updateMigrationLabel(\n client: OperatorClient,\n workspaceId: string,\n namespace: string,\n migrationNumber: number,\n): Promise<void> {\n const trn = `${trnPrefix(workspaceId)}:tailordb:${namespace}`;\n\n // Get existing metadata\n const { metadata } = await client.getMetadata({ trn });\n const existingLabels = metadata?.labels ?? {};\n\n const newLabel = `m${formatMigrationNumber(migrationNumber)}`;\n\n // Update with new migration label\n await client.setMetadata({\n trn,\n labels: {\n ...existingLabels,\n [MIGRATION_LABEL_KEY]: newLabel,\n },\n });\n}\n\n/**\n * Execute all pending migrations, grouping by namespace and using appropriate machine user\n * @param {MigrationContext} context - Migration context with per-namespace configuration\n * @param {PendingMigration[]} migrations - Migrations to execute\n * @returns {Promise<void>}\n */\nexport async function executeMigrations(\n context: MigrationContext,\n migrations: PendingMigration[],\n): Promise<void> {\n // Filter migrations that require script execution\n const migrationsWithScripts = migrations.filter((m) => m.diff.requiresMigrationScript);\n\n if (migrationsWithScripts.length === 0) {\n return;\n }\n\n // Group migrations by namespace\n const migrationsByNamespace = groupMigrationsByNamespace(migrationsWithScripts);\n\n // Execute migrations for each namespace with appropriate machine user\n for (const [namespace, namespaceMigrations] of migrationsByNamespace) {\n const dbConfig = context.dbConfig[namespace];\n const migrationConfig = dbConfig?.migration;\n\n // Get machine user name for this namespace\n const machineUserName = getMigrationMachineUser(migrationConfig, context.machineUsers);\n if (!machineUserName) {\n throw new Error(\n `No machine user available for migration execution in namespace '${namespace}'. ` +\n \"Either configure 'migration.machineUser' in db config or define machine users in auth config.\",\n );\n }\n\n // Create authInvoker for this namespace\n const authInvoker = create(AuthInvokerSchema, {\n namespace: context.authNamespace,\n machineUserName,\n });\n\n const options: MigrationExecutionOptions = {\n client: context.client,\n workspaceId: context.workspaceId,\n authInvoker,\n };\n\n logger.info(`Using machine user: ${styles.bold(machineUserName)} for namespace '${namespace}'`);\n\n for (const migration of namespaceMigrations) {\n const migrationLabel = `${migration.namespace}/${formatMigrationNumber(migration.number)}`;\n const spinner = ora({\n text: `Executing migration ${migrationLabel}...`,\n prefixText: \"\",\n }).start();\n\n const result = await executeSingleMigration(options, migration);\n\n if (result.success) {\n spinner.succeed(`Migration ${migrationLabel} completed successfully`);\n\n // Show logs if any\n if (result.logs && result.logs.trim()) {\n logger.log(`Logs:\\n${result.logs}`);\n }\n } else {\n spinner.fail(`Migration ${migrationLabel} failed`);\n if (result.logs) {\n logger.error(`Logs:\\n${result.logs}`);\n }\n throw new Error(result.error ?? \"Migration failed\");\n }\n }\n }\n}\n\n/**\n * Get the machine user name for migration execution\n *\n * Priority:\n * 1. machineUser from migration config (if set)\n * 2. First machine user from auth config\n * @param {object | undefined} migrationConfig - Migration config for namespace\n * @param {string[] | undefined} machineUsers - Machine users from auth config\n * @returns {string | undefined} Machine user name or undefined if none available\n */\nexport function getMigrationMachineUser(\n migrationConfig: { machineUser?: string } | undefined,\n machineUsers: string[] | undefined,\n): string | undefined {\n // Priority 1: Explicit config\n if (migrationConfig?.machineUser) {\n return migrationConfig.machineUser;\n }\n\n // Priority 2: First machine user from auth\n if (machineUsers && machineUsers.length > 0) {\n return machineUsers[0];\n }\n\n return undefined;\n}\n\n/**\n * Group migrations by namespace\n * @param {PendingMigration[]} migrations - Migrations to group\n * @returns {Map<string, PendingMigration[]>} Migrations grouped by namespace\n */\nexport function groupMigrationsByNamespace(\n migrations: PendingMigration[],\n): Map<string, PendingMigration[]> {\n const grouped = new Map<string, PendingMigration[]>();\n for (const migration of migrations) {\n const existing = grouped.get(migration.namespace) ?? [];\n existing.push(migration);\n grouped.set(migration.namespace, existing);\n }\n return grouped;\n}\n","import { fromJson, type MessageInitShape } from \"@bufbuild/protobuf\";\nimport { ValueSchema } from \"@bufbuild/protobuf/wkt\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport {\n type CreateTailorDBGQLPermissionRequestSchema,\n type CreateTailorDBServiceRequestSchema,\n type CreateTailorDBTypeRequestSchema,\n type DeleteTailorDBGQLPermissionRequestSchema,\n type DeleteTailorDBServiceRequestSchema,\n type DeleteTailorDBTypeRequestSchema,\n type UpdateTailorDBGQLPermissionRequestSchema,\n type UpdateTailorDBTypeRequestSchema,\n} from \"@tailor-proto/tailor/v1/tailordb_pb\";\nimport {\n TailorDBGQLPermission_Action,\n type TailorDBGQLPermission_ConditionSchema,\n type TailorDBGQLPermission_OperandSchema,\n TailorDBGQLPermission_Operator,\n TailorDBGQLPermission_Permit,\n type TailorDBGQLPermission_PolicySchema,\n type TailorDBGQLPermissionSchema,\n type TailorDBType as ProtoTailorDBType,\n type TailorDBType_FieldConfigSchema,\n type TailorDBType_FileConfigSchema,\n type TailorDBType_IndexSchema,\n type TailorDBType_Permission_ConditionSchema,\n type TailorDBType_Permission_OperandSchema,\n TailorDBType_Permission_Operator,\n TailorDBType_Permission_Permit,\n type TailorDBType_Permission_PolicySchema,\n type TailorDBType_PermissionSchema,\n TailorDBType_PermitAction,\n type TailorDBType_RelationshipConfigSchema,\n type TailorDBTypeSchema,\n} from \"@tailor-proto/tailor/v1/tailordb_resource_pb\";\nimport * as inflection from \"inflection\";\nimport * as path from \"pathe\";\nimport { type TailorDBService } from \"@/cli/application/tailordb/service\";\nimport { createChangeSet } from \"..\";\nimport { fetchAll, type OperatorClient } from \"../../../client\";\nimport {\n getNamespacesWithMigrations,\n type NamespaceWithMigrations,\n} from \"../../../tailordb/migrate/config\";\nimport {\n hasChanges,\n formatMigrationDiff,\n formatDiffSummary,\n type MigrationDiff,\n type DiffChange,\n} from \"../../../tailordb/migrate/diff-calculator\";\nimport {\n reconstructSnapshotFromMigrations,\n compareLocalTypesWithSnapshot,\n assertValidMigrationFiles,\n formatMigrationNumber,\n compareRemoteWithSnapshot,\n formatSchemaDrifts,\n} from \"../../../tailordb/migrate/snapshot\";\nimport { logger } from \"../../../utils/logger\";\nimport { buildMetaRequest, sdkNameLabelKey, trnPrefix, type WithLabel } from \"../label\";\nimport {\n executeMigrations,\n detectPendingMigrations,\n updateMigrationLabel,\n type MigrationContext,\n} from \"./migration\";\nimport type { ApplyPhase, PlanContext } from \"../..\";\nimport type {\n PendingMigration,\n RemoteSchemaVerificationResult,\n} from \"../../../tailordb/migrate/types\";\nimport type { OwnerConflict, UnmanagedResource } from \"../confirm\";\nimport type { LoadedConfig } from \"@/cli/config-loader\";\nimport type { Executor } from \"@/parser/service/executor\";\nimport type {\n EnumValue,\n GqlOperations,\n PermissionOperand,\n StandardActionPermission,\n StandardGqlPermissionPolicy,\n StandardPermissionCondition,\n StandardTailorTypeGqlPermission,\n StandardTailorTypePermission,\n OperatorFieldConfig,\n TailorDBType,\n TailorDBServiceConfig,\n} from \"@/parser/service/tailordb/types\";\nimport type { SetMetadataRequestSchema } from \"@tailor-proto/tailor/v1/metadata_pb\";\n\n// ============================================================================\n// Remote Schema Verification\n// ============================================================================\n\n/**\n * Fetch all TailorDB types from remote for a namespace\n * @param {OperatorClient} client - Operator client instance\n * @param {string} workspaceId - Workspace ID\n * @param {string} namespace - TailorDB namespace\n * @returns {Promise<ProtoTailorDBType[]>} Remote TailorDB types\n */\nasync function fetchRemoteTypes(\n client: OperatorClient,\n workspaceId: string,\n namespace: string,\n): Promise<ProtoTailorDBType[]> {\n return fetchAll(async (pageToken) => {\n try {\n const { tailordbTypes, nextPageToken } = await client.listTailorDBTypes({\n workspaceId,\n namespaceName: namespace,\n pageToken,\n });\n return [tailordbTypes, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n}\n\n/**\n * Get the current migration number from remote metadata\n * @param {OperatorClient} client - Operator client instance\n * @param {string} workspaceId - Workspace ID\n * @param {string} namespace - TailorDB namespace\n * @returns {Promise<number | null>} Current migration number, or null if no migration label exists\n */\nasync function getRemoteMigrationNumber(\n client: OperatorClient,\n workspaceId: string,\n namespace: string,\n): Promise<number | null> {\n try {\n const trn = `${trnPrefix(workspaceId)}:tailordb:${namespace}`;\n const { metadata } = await client.getMetadata({ trn });\n const label = metadata?.labels?.[\"sdk-migration\"];\n if (!label) return null; // No migration label means first apply\n const match = label.match(/^m(\\d+)$/);\n return match ? parseInt(match[1], 10) : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Verify remote schema matches the expected snapshot state\n * @param {OperatorClient} client - Operator client instance\n * @param {string} workspaceId - Workspace ID\n * @param {NamespaceWithMigrations[]} namespacesWithMigrations - Namespaces with migration config\n * @returns {Promise<RemoteSchemaVerificationResult[]>} Verification results per namespace\n */\nasync function verifyRemoteSchema(\n client: OperatorClient,\n workspaceId: string,\n namespacesWithMigrations: NamespaceWithMigrations[],\n): Promise<RemoteSchemaVerificationResult[]> {\n const results: RemoteSchemaVerificationResult[] = [];\n\n for (const { namespace, migrationsDir } of namespacesWithMigrations) {\n // Get current remote migration number\n const remoteMigrationNumber = await getRemoteMigrationNumber(client, workspaceId, namespace);\n\n // If no migration label exists, this is likely a first apply - skip verification\n // Remote verification only makes sense when there's an established migration history\n if (remoteMigrationNumber === null) {\n results.push({\n namespace,\n remoteMigrationNumber: 0,\n drifts: [],\n hasDrift: false,\n });\n continue;\n }\n\n // Reconstruct snapshot at the remote migration version\n const expectedSnapshot = reconstructSnapshotFromMigrations(\n migrationsDir,\n remoteMigrationNumber,\n );\n if (!expectedSnapshot) {\n // No snapshots exist - skip verification\n results.push({\n namespace,\n remoteMigrationNumber,\n drifts: [],\n hasDrift: false,\n });\n continue;\n }\n\n // Fetch remote types\n const remoteTypes = await fetchRemoteTypes(client, workspaceId, namespace);\n\n // Compare remote with expected snapshot\n const drifts = compareRemoteWithSnapshot(remoteTypes, expectedSnapshot);\n\n results.push({\n namespace,\n remoteMigrationNumber,\n drifts,\n hasDrift: drifts.length > 0,\n });\n }\n\n return results;\n}\n\n/**\n * Format remote schema verification results for display\n * @param {RemoteSchemaVerificationResult[]} results - Verification results\n * @returns {string} Formatted results string\n */\nfunction formatRemoteVerificationResults(results: RemoteSchemaVerificationResult[]): string {\n const lines: string[] = [];\n\n for (const result of results) {\n if (!result.hasDrift) continue;\n\n lines.push(`Namespace: ${result.namespace}`);\n lines.push(` Remote migration: ${formatMigrationNumber(result.remoteMigrationNumber)}`);\n lines.push(` Differences:`);\n lines.push(formatSchemaDrifts(result.drifts));\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n// ============================================================================\n// Migration Validation\n// ============================================================================\n\n/**\n * Validate migration files and detect pending migrations\n * @param {OperatorClient} client - Operator client instance\n * @param {string} workspaceId - Workspace ID\n * @param {ReadonlyMap<string, Record<string, TailorDBType>>} typesByNamespace - Types by namespace\n * @param {LoadedConfig} config - Loaded application config (includes path)\n * @param {boolean} noSchemaCheck - Whether to skip schema diff check\n * @returns {Promise<PendingMigration[]>} List of pending migrations\n */\nasync function validateAndDetectMigrations(\n client: OperatorClient,\n workspaceId: string,\n typesByNamespace: ReadonlyMap<string, Record<string, TailorDBType>>,\n config: LoadedConfig,\n noSchemaCheck: boolean,\n): Promise<PendingMigration[]> {\n const configDir = path.dirname(config.path);\n const namespacesWithMigrations = getNamespacesWithMigrations(config, configDir);\n let pendingMigrations: PendingMigration[] = [];\n\n if (namespacesWithMigrations.length > 0) {\n // Validate migration file integrity (sequential numbers, no gaps, no duplicates)\n for (const { namespace, migrationsDir } of namespacesWithMigrations) {\n assertValidMigrationFiles(migrationsDir, namespace);\n }\n\n // Check for schema diffs if not skipped\n if (!noSchemaCheck) {\n // 1. Check local types vs local snapshot (existing check)\n const migrationResults = await checkMigrationDiffs(\n typesByNamespace,\n namespacesWithMigrations,\n );\n const hasDiffs = migrationResults.some((r) => r.hasDiff);\n\n if (hasDiffs) {\n logger.error(\"Schema changes detected that are not in migration files:\");\n logger.log(formatMigrationCheckResults(migrationResults));\n logger.newline();\n logger.info(\"Run 'tailor-sdk tailordb migration generate' to create migration files.\");\n logger.info(\"Or use '--no-schema-check' to skip this check.\");\n throw new Error(\"Schema migration check failed\");\n }\n\n // 2. Check remote schema vs local snapshot (new check)\n const remoteVerificationResults = await verifyRemoteSchema(\n client,\n workspaceId,\n namespacesWithMigrations,\n );\n const hasRemoteDrift = remoteVerificationResults.some((r) => r.hasDrift);\n\n if (hasRemoteDrift) {\n logger.error(\"Remote schema drift detected:\");\n logger.log(formatRemoteVerificationResults(remoteVerificationResults));\n logger.newline();\n logger.info(\"This may indicate:\");\n logger.info(\" - Another developer applied different migrations\", { mode: \"plain\" });\n logger.info(\" - Manual schema changes were made directly\", { mode: \"plain\" });\n logger.info(\" - Migration history is out of sync\", { mode: \"plain\" });\n logger.newline();\n logger.info(\"Use '--no-schema-check' to skip this check (not recommended).\");\n throw new Error(\"Remote schema verification failed\");\n }\n }\n\n // Detect pending migrations (migration scripts that haven't been executed yet)\n pendingMigrations = await detectPendingMigrations(\n client,\n workspaceId,\n namespacesWithMigrations,\n );\n\n if (pendingMigrations.length > 0) {\n logger.newline();\n\n // Classify migrations by whether they require migration scripts\n const withScripts = pendingMigrations.filter((m) => m.diff.requiresMigrationScript);\n const withoutScripts = pendingMigrations.filter((m) => !m.diff.requiresMigrationScript);\n\n logger.info(`Applying ${pendingMigrations.length} migration(s):`);\n if (withoutScripts.length > 0) {\n logger.info(\n ` • ${withoutScripts.length} schema change(s) (applied automatically with schema deployment)`,\n { mode: \"plain\" },\n );\n }\n if (withScripts.length > 0) {\n logger.info(\n ` • ${withScripts.length} data migration(s) (requires migration script execution)`,\n { mode: \"plain\" },\n );\n }\n }\n }\n\n return pendingMigrations;\n}\n\n/**\n * Build migration execution context for script-based migrations.\n * @param client - Operator client instance\n * @param migrationContext - Planned TailorDB context\n * @param migrationsRequiringScripts - Migrations that require scripts\n * @returns Migration context for script execution\n */\nfunction buildMigrationContextForScripts(\n client: OperatorClient,\n migrationContext: Awaited<ReturnType<typeof planTailorDB>>[\"context\"],\n migrationsRequiringScripts: PendingMigration[],\n): MigrationContext {\n const authService = migrationContext.application.authService;\n if (!authService) {\n throw new Error(\"Auth configuration is required to execute migration scripts.\");\n }\n\n const dbConfigMap: Record<string, TailorDBServiceConfig | undefined> = {};\n for (const migration of migrationsRequiringScripts) {\n if (!(migration.namespace in dbConfigMap)) {\n dbConfigMap[migration.namespace] = migrationContext.config.db?.[migration.namespace] as\n | TailorDBServiceConfig\n | undefined;\n }\n }\n\n return {\n client,\n workspaceId: migrationContext.workspaceId,\n authNamespace: authService.config.name,\n machineUsers: authService.config.machineUsers\n ? Object.keys(authService.config.machineUsers)\n : undefined,\n dbConfig: dbConfigMap,\n };\n}\n\n/**\n * Apply TailorDB-related changes for the given phase.\n * @param client - Operator client instance\n * @param result - Planned TailorDB changes\n * @param phase - Apply phase (defaults to \"create-update\")\n */\nexport async function applyTailorDB(\n client: OperatorClient,\n result: Awaited<ReturnType<typeof planTailorDB>>,\n phase: Exclude<ApplyPhase, \"delete\"> = \"create-update\",\n): Promise<void> {\n const { changeSet, context: migrationContext } = result;\n\n if (phase === \"create-update\") {\n let pendingMigrations: PendingMigration[] = [];\n\n // Validate and detect migrations\n // Build types by namespace map\n const typesByNamespace = new Map<string, Record<string, TailorDBType>>();\n for (const tailordb of migrationContext.application.tailorDBServices) {\n const types = tailordb.getTypes();\n if (types) {\n typesByNamespace.set(tailordb.namespace, types);\n }\n }\n\n pendingMigrations = await validateAndDetectMigrations(\n client,\n migrationContext.workspaceId,\n typesByNamespace,\n migrationContext.config,\n migrationContext.noSchemaCheck,\n );\n\n if (pendingMigrations.length > 0) {\n // Migration flow: Execute each migration sequentially (pre -> script -> post)\n // This ensures intermediate states are properly handled when scripts depend on them\n\n // Reset tracking state for this migration run\n processedTypes.reset();\n deletedResources.reset();\n\n // Step 1: Create/update services once at the beginning (services don't need per-migration handling)\n await executeServicesCreation(client, changeSet);\n\n const migrationsRequiringScripts = pendingMigrations.filter(\n (m) => m.diff.requiresMigrationScript,\n );\n\n // Step 2: Build migration context for script execution (if any migrations require scripts)\n const migrationCtx =\n migrationsRequiringScripts.length > 0\n ? buildMigrationContextForScripts(client, migrationContext, migrationsRequiringScripts)\n : undefined;\n\n // Step 3: Execute each migration sequentially: pre -> script -> post\n if (migrationsRequiringScripts.length > 0) {\n logger.info(`Executing ${migrationsRequiringScripts.length} data migration(s)...`);\n logger.newline();\n }\n\n for (const migration of pendingMigrations) {\n // Pre-migration phase: Create/update types with breaking fields as optional\n await executeSingleMigrationPrePhase(client, changeSet, migration);\n\n // Script execution (only if this migration requires a script)\n if (migration.diff.requiresMigrationScript && migrationCtx) {\n await executeMigrations(migrationCtx, [migration]);\n }\n\n // Post-migration phase: Apply final types (required: true) and deletions\n await executeSingleMigrationPostPhase(client, changeSet, migration);\n\n // Update migration label only after all phases complete successfully\n await updateMigrationLabel(\n client,\n migrationContext.workspaceId,\n migration.namespace,\n migration.number,\n );\n }\n\n if (migrationsRequiringScripts.length > 0) {\n logger.newline();\n logger.success(`All data migrations completed successfully.`);\n }\n\n // Step 4: Delete remaining GQL permissions that weren't deleted with their types\n const remainingGqlPermissionDeletes = changeSet.gqlPermission.deletes.filter((del) => {\n const permKey = `${del.request.namespaceName}/${del.name}`;\n return !deletedResources.gqlPermissions.has(permKey);\n });\n if (remainingGqlPermissionDeletes.length > 0) {\n await Promise.all(\n remainingGqlPermissionDeletes.map((del) =>\n client.deleteTailorDBGQLPermission(del.request),\n ),\n );\n }\n } else {\n // Normal create-update flow without migrations\n // Services\n await Promise.all([\n ...changeSet.service.creates.map(async (create) => {\n await client.createTailorDBService(create.request);\n await client.setMetadata(create.metaRequest);\n }),\n ...changeSet.service.updates.map((update) => client.setMetadata(update.metaRequest)),\n ]);\n\n // Types\n try {\n await Promise.all([\n ...changeSet.type.creates.map((create) => client.createTailorDBType(create.request)),\n ...changeSet.type.updates.map((update) => client.updateTailorDBType(update.request)),\n ]);\n } catch (error) {\n handleOptionalToRequiredError(error, [\n \"Run 'tailor-sdk tailordb migration generate' to create migration files.\",\n \"Migration scripts allow you to handle existing data before applying the schema change.\",\n ]);\n }\n\n // GQLPermissions\n await Promise.all([\n ...changeSet.gqlPermission.creates.map((create) =>\n client.createTailorDBGQLPermission(create.request),\n ),\n ...changeSet.gqlPermission.updates.map((update) =>\n client.updateTailorDBGQLPermission(update.request),\n ),\n ]);\n\n // Delete resources (only when no migrations occurred)\n // Migrations already handle deletions in post-migration phase\n await Promise.all(\n changeSet.gqlPermission.deletes.map((del) =>\n client.deleteTailorDBGQLPermission(del.request),\n ),\n );\n await Promise.all(\n changeSet.type.deletes.map((del) => client.deleteTailorDBType(del.request)),\n );\n }\n } else if (phase === \"delete-resources\") {\n // Delete GQL permissions first, then types\n await Promise.all(\n changeSet.gqlPermission.deletes.map((del) => client.deleteTailorDBGQLPermission(del.request)),\n );\n await Promise.all(changeSet.type.deletes.map((del) => client.deleteTailorDBType(del.request)));\n } else if (phase === \"delete-services\") {\n // Services only\n await Promise.all(\n changeSet.service.deletes.map((del) => client.deleteTailorDBService(del.request)),\n );\n }\n}\n\n// ============================================================================\n// Error Handling Helpers\n// ============================================================================\n\n/**\n * Handle optional-to-required field change error with helpful message\n * @param {unknown} error - Error to handle\n * @param {string[]} messages - Additional messages to display\n */\nfunction handleOptionalToRequiredError(error: unknown, messages: string[]): never {\n if (\n error instanceof ConnectError &&\n error.code === Code.FailedPrecondition &&\n error.message.includes(\"cannot be updated from non-required to required when records exist\")\n ) {\n logger.error(\n \"Schema change failed: Cannot change field from optional to required when records exist.\",\n );\n logger.newline();\n for (const message of messages) {\n logger.info(message);\n }\n }\n throw error;\n}\n\n// ============================================================================\n// Pre-Migration Support\n// ============================================================================\n\n/**\n * Map of breaking changes: typeName -> fieldName -> change kind\n */\ntype BreakingChangesMap = Map<string, Map<string, DiffChange>>;\n\n/**\n * Build a map of breaking field changes from pending migrations\n * @param {PendingMigration[]} pendingMigrations - Pending migrations\n * @returns {BreakingChangesMap} Map of breaking changes\n */\nfunction buildBreakingChangesMap(pendingMigrations: PendingMigration[]): BreakingChangesMap {\n const map: BreakingChangesMap = new Map();\n\n for (const migration of pendingMigrations) {\n for (const change of migration.diff.changes) {\n // We care about field changes that affect required status\n if (\n change.kind === \"field_added\" ||\n change.kind === \"field_modified\" ||\n change.kind === \"field_removed\"\n ) {\n if (!change.fieldName) continue;\n\n if (!map.has(change.typeName)) {\n map.set(change.typeName, new Map());\n }\n map.get(change.typeName)!.set(change.fieldName, change);\n }\n }\n }\n\n return map;\n}\n\n/**\n * Field config type for breaking change detection\n */\ninterface FieldConfig {\n required?: boolean;\n unique?: boolean;\n allowedValues?: EnumValue[];\n}\n\n/**\n * Apply pre-migration schema adjustments to avoid breaking changes before scripts run.\n * @param fields - Field configs to adjust\n * @param typeChanges - Breaking changes for a type\n */\nfunction applyPreMigrationFieldAdjustments(\n fields: Record<string, MessageInitShape<typeof TailorDBType_FieldConfigSchema>>,\n typeChanges: Map<string, DiffChange>,\n): void {\n for (const [fieldName, change] of typeChanges) {\n const field = fields[fieldName];\n if (!field) continue;\n\n const before = change.before as FieldConfig | undefined;\n const after = change.after as FieldConfig | undefined;\n\n if (change.kind === \"field_added\" && after?.required) {\n field.required = false;\n }\n\n if (change.kind !== \"field_modified\") {\n continue;\n }\n\n // Optional to required\n if (!before?.required && after?.required) {\n field.required = false;\n }\n\n // Unique constraint added\n if (!(before?.unique ?? false) && (after?.unique ?? false)) {\n field.unique = false;\n }\n\n // Enum values removed: keep old values + add new values (union)\n if (before?.allowedValues && after?.allowedValues) {\n const afterValues = new Set(after.allowedValues.map((v) => v.value));\n const removedValues = before.allowedValues.filter((v) => !afterValues.has(v.value));\n if (removedValues.length > 0) {\n // Create union of all values, preserving descriptions where available\n const valueMap = new Map<string, string>();\n for (const v of before.allowedValues) {\n valueMap.set(v.value, v.description ?? \"\");\n }\n for (const v of after.allowedValues) {\n if (!valueMap.has(v.value)) {\n valueMap.set(v.value, v.description ?? \"\");\n }\n }\n field.allowedValues = Array.from(valueMap.entries()).map(([value, description]) => ({\n value,\n description,\n }));\n }\n }\n }\n}\n\n// ============================================================================\n// Migration Execution Helpers\n// ============================================================================\n\ntype TailorDBChangeSet = Awaited<ReturnType<typeof planTailorDB>>[\"changeSet\"];\n\n/**\n * Get the set of type names affected by a migration\n * @param {PendingMigration} migration - Pending migration\n * @returns {Set<string>} Set of affected type names\n */\nfunction getAffectedTypeNames(migration: PendingMigration): Set<string> {\n const typeNames = new Set<string>();\n for (const change of migration.diff.changes) {\n typeNames.add(change.typeName);\n }\n return typeNames;\n}\n\n/**\n * Get the set of type names to be deleted by a migration\n * @param {PendingMigration} migration - Pending migration\n * @returns {Set<string>} Set of type names to delete\n */\nfunction getDeletedTypeNames(migration: PendingMigration): Set<string> {\n const typeNames = new Set<string>();\n for (const change of migration.diff.changes) {\n if (change.kind === \"type_removed\") {\n typeNames.add(change.typeName);\n }\n }\n return typeNames;\n}\n\n/**\n * Execute services creation (called once at the beginning of migration flow)\n * @param {OperatorClient} client - Operator client instance\n * @param {TailorDBChangeSet} changeSet - TailorDB change set\n * @returns {Promise<void>} Promise that resolves when services are created\n */\nasync function executeServicesCreation(\n client: OperatorClient,\n changeSet: TailorDBChangeSet,\n): Promise<void> {\n await Promise.all([\n ...changeSet.service.creates.map(async (create) => {\n await client.createTailorDBService(create.request);\n await client.setMetadata(create.metaRequest);\n }),\n ...changeSet.service.updates.map((update) => client.setMetadata(update.metaRequest)),\n ]);\n}\n\n/**\n * Track which types have been created/updated across migrations\n */\nconst processedTypes = {\n created: new Set<string>(),\n updated: new Set<string>(),\n gqlPermissionsProcessed: new Set<string>(),\n reset() {\n this.created.clear();\n this.updated.clear();\n this.gqlPermissionsProcessed.clear();\n },\n};\n\n/**\n * Execute pre-migration phase for a single migration\n * @param {OperatorClient} client - Operator client instance\n * @param {TailorDBChangeSet} changeSet - TailorDB change set\n * @param {PendingMigration} migration - Single pending migration\n * @returns {Promise<void>} Promise that resolves when pre-migration phase completes\n */\nasync function executeSingleMigrationPrePhase(\n client: OperatorClient,\n changeSet: TailorDBChangeSet,\n migration: PendingMigration,\n): Promise<void> {\n // Build breaking changes map for this single migration\n const breakingChanges = buildBreakingChangesMap([migration]);\n const affectedTypes = getAffectedTypeNames(migration);\n const createdBeforeMigration = new Set(processedTypes.created);\n\n // Types - create/update only types affected by this migration\n await Promise.all([\n // Create types that are affected by this migration and haven't been created yet\n ...changeSet.type.creates\n .filter((create) => {\n const typeName = create.request.tailordbType?.name;\n return typeName && affectedTypes.has(typeName) && !createdBeforeMigration.has(typeName);\n })\n .map((create) => {\n const typeName = create.request.tailordbType?.name;\n if (typeName) processedTypes.created.add(typeName);\n\n const typeChanges = typeName ? breakingChanges.get(typeName) : undefined;\n\n if (!typeChanges || typeChanges.size === 0) {\n return client.createTailorDBType(create.request);\n }\n\n // Clone request to avoid modifying the original changeSet\n const clonedRequest = structuredClone(create.request);\n if (clonedRequest.tailordbType?.schema?.fields) {\n applyPreMigrationFieldAdjustments(clonedRequest.tailordbType.schema.fields, typeChanges);\n }\n\n return client.createTailorDBType(clonedRequest);\n }),\n // Update types already created in previous migrations (from create list)\n ...changeSet.type.creates\n .filter((create) => {\n const typeName = create.request.tailordbType?.name;\n return typeName && affectedTypes.has(typeName) && createdBeforeMigration.has(typeName);\n })\n .map((create) => {\n const typeName = create.request.tailordbType?.name;\n if (typeName) processedTypes.updated.add(typeName);\n\n const typeChanges = typeName ? breakingChanges.get(typeName) : undefined;\n\n if (!typeChanges || typeChanges.size === 0) {\n return client.updateTailorDBType({\n workspaceId: create.request.workspaceId,\n namespaceName: create.request.namespaceName,\n tailordbType: create.request.tailordbType,\n });\n }\n\n const clonedRequest = structuredClone(create.request);\n if (clonedRequest.tailordbType?.schema?.fields) {\n applyPreMigrationFieldAdjustments(clonedRequest.tailordbType.schema.fields, typeChanges);\n }\n\n return client.updateTailorDBType({\n workspaceId: create.request.workspaceId,\n namespaceName: create.request.namespaceName,\n tailordbType: clonedRequest.tailordbType,\n });\n }),\n // Update types that are affected by this migration\n ...changeSet.type.updates\n .filter((update) => {\n const typeName = update.request.tailordbType?.name;\n return typeName && affectedTypes.has(typeName);\n })\n .map((update) => {\n const typeName = update.request.tailordbType?.name;\n if (typeName) processedTypes.updated.add(typeName);\n\n const typeChanges = typeName ? breakingChanges.get(typeName) : undefined;\n\n if (!typeChanges || typeChanges.size === 0) {\n return client.updateTailorDBType(update.request);\n }\n\n // Clone request to avoid modifying the original changeSet\n const clonedRequest = structuredClone(update.request);\n if (clonedRequest.tailordbType?.schema?.fields) {\n applyPreMigrationFieldAdjustments(clonedRequest.tailordbType.schema.fields, typeChanges);\n }\n\n return client.updateTailorDBType(clonedRequest);\n }),\n ]);\n\n // GQLPermissions - process once (on the first migration)\n if (!processedTypes.gqlPermissionsProcessed.has(migration.namespace)) {\n const gqlPermissionCreatesForNamespace = changeSet.gqlPermission.creates.filter(\n (create) => create.request.namespaceName === migration.namespace,\n );\n const gqlPermissionUpdatesForNamespace = changeSet.gqlPermission.updates.filter(\n (update) => update.request.namespaceName === migration.namespace,\n );\n const gqlPermissionTypeNames = new Set(\n gqlPermissionCreatesForNamespace.map((create) => create.name),\n );\n const missingTypeCreates = changeSet.type.creates.filter((create) => {\n const typeName = create.request.tailordbType?.name;\n const namespaceName = create.request.namespaceName;\n return (\n namespaceName === migration.namespace &&\n typeName &&\n gqlPermissionTypeNames.has(typeName) &&\n !processedTypes.created.has(typeName)\n );\n });\n if (missingTypeCreates.length > 0) {\n await Promise.all(\n missingTypeCreates.map((create) => {\n const typeName = create.request.tailordbType?.name;\n if (typeName) processedTypes.created.add(typeName);\n return client.createTailorDBType(create.request);\n }),\n );\n }\n processedTypes.gqlPermissionsProcessed.add(migration.namespace);\n await Promise.all([\n ...gqlPermissionCreatesForNamespace.map((create) =>\n client.createTailorDBGQLPermission(create.request),\n ),\n ...gqlPermissionUpdatesForNamespace.map((update) =>\n client.updateTailorDBGQLPermission(update.request),\n ),\n ]);\n }\n}\n\n/**\n * Track which types/permissions have been deleted across migrations\n */\nconst deletedResources = {\n types: new Set<string>(),\n gqlPermissions: new Set<string>(),\n reset() {\n this.types.clear();\n this.gqlPermissions.clear();\n },\n};\n\n/**\n * Execute post-migration phase for a single migration: Apply final types (with required: true) and deletions\n * @param {OperatorClient} client - Operator client instance\n * @param {TailorDBChangeSet} changeSet - TailorDB change set\n * @param {PendingMigration} migration - Single pending migration\n * @returns {Promise<void>} Promise that resolves when post-migration phase completes\n */\nasync function executeSingleMigrationPostPhase(\n client: OperatorClient,\n changeSet: TailorDBChangeSet,\n migration: PendingMigration,\n): Promise<void> {\n // Build breaking changes map for this single migration\n const breakingChanges = buildBreakingChangesMap([migration]);\n const affectedTypes = getAffectedTypeNames(migration);\n const deletedTypeNames = getDeletedTypeNames(migration);\n\n // Types - apply final schema values for types affected by this migration\n // Pre-migration used cloned requests, so the original changeSet still has correct values\n try {\n await Promise.all([\n // For newly created types that had breaking changes in this migration, send update with final values\n ...changeSet.type.creates\n .filter((create) => {\n const typeName = create.request.tailordbType?.name;\n return typeName && affectedTypes.has(typeName) && breakingChanges.has(typeName);\n })\n .map((create) =>\n client.updateTailorDBType({\n workspaceId: create.request.workspaceId,\n namespaceName: create.request.namespaceName,\n tailordbType: create.request.tailordbType,\n }),\n ),\n // For updated types affected by this migration, send update with final values\n ...changeSet.type.updates\n .filter((update) => {\n const typeName = update.request.tailordbType?.name;\n return typeName && affectedTypes.has(typeName) && breakingChanges.has(typeName);\n })\n .map((update) => client.updateTailorDBType(update.request)),\n ]);\n } catch (error) {\n handleOptionalToRequiredError(error, [\n \"This error occurred during post-migration phase. Please check your migration script.\",\n \"Ensure all existing records have values for fields being changed to required.\",\n ]);\n }\n\n // Delete types that are removed in this migration\n if (deletedTypeNames.size > 0) {\n // First delete GQL permissions for the types being deleted\n const gqlPermissionsToDelete = changeSet.gqlPermission.deletes.filter((del) => {\n const permKey = `${del.request.namespaceName}/${del.name}`;\n if (deletedResources.gqlPermissions.has(permKey)) return false;\n // Check if this permission is for a type being deleted in this migration\n // del.name and del.request.typeName both hold the type name\n const typeName = del.name;\n if (typeName && deletedTypeNames.has(typeName)) {\n deletedResources.gqlPermissions.add(permKey);\n return true;\n }\n return false;\n });\n await Promise.all(\n gqlPermissionsToDelete.map((del) => client.deleteTailorDBGQLPermission(del.request)),\n );\n\n // Then delete the types\n const typesToDelete = changeSet.type.deletes.filter((del) => {\n // del.name and del.request.tailordbTypeName both hold the type name\n const typeName = del.name;\n if (!typeName || deletedResources.types.has(typeName)) return false;\n if (deletedTypeNames.has(typeName)) {\n deletedResources.types.add(typeName);\n return true;\n }\n return false;\n });\n await Promise.all(typesToDelete.map((del) => client.deleteTailorDBType(del.request)));\n }\n}\n\n/**\n * Plan TailorDB-related changes based on current and desired state.\n * @param context - Planning context\n * @returns Planned changes\n */\nexport async function planTailorDB(context: PlanContext) {\n const { client, workspaceId, application, forRemoval, config, noSchemaCheck } = context;\n const tailordbs: TailorDBService[] = [];\n if (!forRemoval) {\n for (const tailordb of application.tailorDBServices) {\n await tailordb.loadTypes();\n tailordbs.push(tailordb);\n }\n }\n const executors = forRemoval\n ? []\n : Object.values((await application.executorService?.loadExecutors()) ?? {});\n\n const {\n changeSet: serviceChangeSet,\n conflicts,\n unmanaged,\n resourceOwners,\n } = await planServices(client, workspaceId, application.name, tailordbs);\n const deletedServices = serviceChangeSet.deletes.map((del) => del.name);\n const typeChangeSet = await planTypes(client, workspaceId, tailordbs, executors, deletedServices);\n const gqlPermissionChangeSet = await planGqlPermissions(\n client,\n workspaceId,\n tailordbs,\n deletedServices,\n );\n\n serviceChangeSet.print();\n typeChangeSet.print();\n gqlPermissionChangeSet.print();\n\n return {\n changeSet: {\n service: serviceChangeSet,\n type: typeChangeSet,\n gqlPermission: gqlPermissionChangeSet,\n },\n conflicts,\n unmanaged,\n resourceOwners,\n context: {\n workspaceId,\n application,\n config,\n noSchemaCheck: noSchemaCheck ?? false,\n },\n };\n}\n\ntype CreateService = {\n name: string;\n request: MessageInitShape<typeof CreateTailorDBServiceRequestSchema>;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype UpdateService = {\n name: string;\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype DeleteService = {\n name: string;\n request: MessageInitShape<typeof DeleteTailorDBServiceRequestSchema>;\n};\n\nfunction trn(workspaceId: string, name: string) {\n return `${trnPrefix(workspaceId)}:tailordb:${name}`;\n}\n\nasync function planServices(\n client: OperatorClient,\n workspaceId: string,\n appName: string,\n tailordbs: ReadonlyArray<TailorDBService>,\n) {\n const changeSet = createChangeSet<CreateService, UpdateService, DeleteService>(\n \"TailorDB services\",\n );\n const conflicts: OwnerConflict[] = [];\n const unmanaged: UnmanagedResource[] = [];\n const resourceOwners = new Set<string>();\n\n const withoutLabel = await fetchAll(async (pageToken) => {\n try {\n const { tailordbServices, nextPageToken } = await client.listTailorDBServices({\n workspaceId,\n pageToken,\n });\n return [tailordbServices, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n const existingServices: WithLabel<(typeof withoutLabel)[number]> = {};\n await Promise.all(\n withoutLabel.map(async (resource) => {\n if (!resource.namespace?.name) {\n return;\n }\n const { metadata } = await client.getMetadata({\n trn: trn(workspaceId, resource.namespace.name),\n });\n existingServices[resource.namespace.name] = {\n resource,\n label: metadata?.labels[sdkNameLabelKey],\n allLabels: metadata?.labels,\n };\n }),\n );\n\n for (const tailordb of tailordbs) {\n const existing = existingServices[tailordb.namespace];\n const metaRequest = await buildMetaRequest(\n trn(workspaceId, tailordb.namespace),\n appName,\n existing?.allLabels,\n );\n if (existing) {\n if (!existing.label) {\n unmanaged.push({\n resourceType: \"TailorDB service\",\n resourceName: tailordb.namespace,\n });\n } else if (existing.label !== appName) {\n conflicts.push({\n resourceType: \"TailorDB service\",\n resourceName: tailordb.namespace,\n currentOwner: existing.label,\n });\n }\n\n changeSet.updates.push({\n name: tailordb.namespace,\n metaRequest,\n });\n delete existingServices[tailordb.namespace];\n } else {\n changeSet.creates.push({\n name: tailordb.namespace,\n request: {\n workspaceId,\n namespaceName: tailordb.namespace,\n // Set UTC to match tailorctl/terraform\n defaultTimezone: \"UTC\",\n },\n metaRequest,\n });\n }\n }\n Object.entries(existingServices).forEach(([namespaceName]) => {\n const label = existingServices[namespaceName]?.label;\n if (label && label !== appName) {\n resourceOwners.add(label);\n }\n // Only delete services managed by this application\n if (label === appName) {\n changeSet.deletes.push({\n name: namespaceName,\n request: {\n workspaceId,\n namespaceName,\n },\n });\n }\n });\n\n return { changeSet, conflicts, unmanaged, resourceOwners };\n}\n\ntype CreateType = {\n name: string;\n request: MessageInitShape<typeof CreateTailorDBTypeRequestSchema>;\n};\n\ntype UpdateType = {\n name: string;\n request: MessageInitShape<typeof UpdateTailorDBTypeRequestSchema>;\n};\n\ntype DeleteType = {\n name: string;\n request: MessageInitShape<typeof DeleteTailorDBTypeRequestSchema>;\n};\n\nasync function planTypes(\n client: OperatorClient,\n workspaceId: string,\n tailordbs: ReadonlyArray<TailorDBService>,\n executors: ReadonlyArray<Executor>,\n deletedServices: ReadonlyArray<string>,\n filteredTypesByNamespace?: Map<string, Record<string, TailorDBType>>,\n) {\n const changeSet = createChangeSet<CreateType, UpdateType, DeleteType>(\"TailorDB types\");\n\n const fetchTypes = (namespaceName: string) => {\n return fetchAll(async (pageToken) => {\n try {\n const { tailordbTypes, nextPageToken } = await client.listTailorDBTypes({\n workspaceId,\n namespaceName,\n pageToken,\n });\n return [tailordbTypes, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n };\n\n const executorUsedTypes = new Set<string>();\n for (const executor of executors) {\n if (\n executor.trigger.kind === \"recordCreated\" ||\n executor.trigger.kind === \"recordUpdated\" ||\n executor.trigger.kind === \"recordDeleted\"\n ) {\n executorUsedTypes.add(executor.trigger.typeName);\n }\n }\n\n for (const tailordb of tailordbs) {\n const existingTypes = await fetchTypes(tailordb.namespace);\n const existingNameSet = new Set<string>();\n existingTypes.forEach((type) => existingNameSet.add(type.name));\n\n // Use filtered types if provided, otherwise use local types\n const types = filteredTypesByNamespace?.get(tailordb.namespace) ?? tailordb.getTypes();\n\n for (const typeName of Object.keys(types)) {\n const tailordbType = generateTailorDBTypeManifest(\n types[typeName],\n executorUsedTypes,\n tailordb.config.gqlOperations,\n );\n if (existingNameSet.has(typeName)) {\n changeSet.updates.push({\n name: typeName,\n request: {\n workspaceId,\n namespaceName: tailordb.namespace,\n tailordbType,\n },\n });\n existingNameSet.delete(typeName);\n } else {\n changeSet.creates.push({\n name: typeName,\n request: {\n workspaceId,\n namespaceName: tailordb.namespace,\n tailordbType,\n },\n });\n }\n }\n existingNameSet.forEach((name) => {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n namespaceName: tailordb.namespace,\n tailordbTypeName: name,\n },\n });\n });\n }\n for (const namespaceName of deletedServices) {\n const existingTypes = await fetchTypes(namespaceName);\n existingTypes.forEach((typ) => {\n changeSet.deletes.push({\n name: typ.name,\n request: {\n workspaceId,\n namespaceName,\n tailordbTypeName: typ.name,\n },\n });\n });\n }\n return changeSet;\n}\n\n// TODO(remiposo): Copied the type-processor / aggregator processing almost as-is.\n// This will need refactoring later.\n/**\n * Generate a TailorDB type manifest from parsed type\n * @param {TailorDBType} type - Parsed TailorDB type\n * @param {ReadonlySet<string>} executorUsedTypes - Set of types used by executors\n * @param {GqlOperations} [namespaceGqlOperations] - Default gqlOperations for the namespace (already normalized)\n * @returns {MessageInitShape<typeof TailorDBTypeSchema>} Type manifest\n */\nfunction generateTailorDBTypeManifest(\n type: TailorDBType,\n executorUsedTypes: ReadonlySet<string>,\n namespaceGqlOperations?: GqlOperations,\n): MessageInitShape<typeof TailorDBTypeSchema> {\n // This ensures that explicitly provided pluralForm like \"PurchaseOrderList\" becomes \"purchaseOrderList\"\n const pluralForm = inflection.camelize(type.pluralForm, true);\n\n const defaultSettings: {\n aggregation: boolean;\n bulkUpsert: boolean;\n draft: boolean;\n defaultQueryLimitSize: bigint;\n maxBulkUpsertSize: bigint;\n pluralForm: string;\n publishRecordEvents: boolean;\n disableGqlOperations?: {\n create: boolean;\n update: boolean;\n delete: boolean;\n read: boolean;\n };\n } = {\n aggregation: type.settings?.aggregation || false,\n bulkUpsert: type.settings?.bulkUpsert || false,\n draft: false,\n defaultQueryLimitSize: 100n,\n maxBulkUpsertSize: 1000n,\n pluralForm,\n publishRecordEvents: false,\n };\n if (executorUsedTypes.has(type.name)) {\n defaultSettings.publishRecordEvents = true;\n }\n // Both type.settings.gqlOperations and namespaceGqlOperations are already normalized by schema\n const ops = type.settings?.gqlOperations ?? namespaceGqlOperations;\n if (ops) {\n defaultSettings.disableGqlOperations = {\n create: ops.create === false,\n update: ops.update === false,\n delete: ops.delete === false,\n read: ops.read === false,\n };\n }\n\n const fields: Record<string, MessageInitShape<typeof TailorDBType_FieldConfigSchema>> = {};\n\n Object.keys(type.fields)\n .filter((fieldName) => fieldName !== \"id\")\n .forEach((fieldName) => {\n const fieldConfig = type.fields[fieldName].config;\n const fieldType = fieldConfig.type;\n const fieldEntry: MessageInitShape<typeof TailorDBType_FieldConfigSchema> = {\n type: fieldType,\n allowedValues: fieldType === \"enum\" ? fieldConfig.allowedValues || [] : [],\n description: fieldConfig.description || \"\",\n validate: toProtoFieldValidate(fieldConfig),\n array: fieldConfig.array || false,\n index: fieldConfig.index || false,\n unique: fieldConfig.unique || false,\n foreignKey: fieldConfig.foreignKey || false,\n foreignKeyType: fieldConfig.foreignKeyType,\n foreignKeyField: fieldConfig.foreignKeyField,\n required: fieldConfig.required !== false,\n vector: fieldConfig.vector || false,\n ...toProtoFieldHooks(fieldConfig),\n ...(fieldConfig.serial && {\n serial: {\n start: fieldConfig.serial.start as unknown as bigint,\n ...(fieldConfig.serial.maxValue && {\n maxValue: fieldConfig.serial.maxValue as unknown as bigint,\n }),\n ...(fieldConfig.serial.format && {\n format: fieldConfig.serial.format,\n }),\n },\n }),\n };\n\n // Handle nested fields\n if (fieldConfig.type === \"nested\" && fieldConfig.fields) {\n fieldEntry.fields = processNestedFields(fieldConfig.fields);\n }\n\n fields[fieldName] = fieldEntry;\n });\n\n const relationships: Record<\n string,\n MessageInitShape<typeof TailorDBType_RelationshipConfigSchema>\n > = {};\n\n for (const [relationName, rel] of Object.entries(type.forwardRelationships)) {\n relationships[relationName] = {\n refType: rel.targetType,\n refField: rel.sourceField,\n srcField: rel.targetField,\n array: rel.isArray,\n description: rel.description,\n };\n }\n\n for (const [relationName, rel] of Object.entries(type.backwardRelationships)) {\n relationships[relationName] = {\n refType: rel.targetType,\n refField: rel.targetField,\n srcField: rel.sourceField,\n array: rel.isArray,\n description: rel.description,\n };\n }\n\n // Process indexes from metadata\n const indexes: Record<string, MessageInitShape<typeof TailorDBType_IndexSchema>> = {};\n if (type.indexes) {\n Object.entries(type.indexes).forEach(([key, index]) => {\n indexes[key] = {\n fieldNames: index.fields,\n unique: index.unique || false,\n };\n });\n }\n\n // Process files from metadata\n const files: Record<string, MessageInitShape<typeof TailorDBType_FileConfigSchema>> = {};\n if (type.files) {\n Object.entries(type.files).forEach(([key, description]) => {\n files[key] = { description: description || \"\" };\n });\n }\n\n // To be secure by default, add Permission settings that reject everyone\n // when Permission/RecordPermission is not configured.\n const defaultPermission: MessageInitShape<typeof TailorDBType_PermissionSchema> = {\n create: [],\n read: [],\n update: [],\n delete: [],\n };\n const permission = type.permissions.record\n ? protoPermission(type.permissions.record)\n : defaultPermission;\n\n return {\n name: type.name,\n schema: {\n description: type.description || \"\",\n fields,\n relationships: relationships,\n settings: defaultSettings,\n extends: false,\n directives: [],\n indexes,\n files,\n permission,\n },\n };\n}\n\nfunction toProtoFieldValidate(\n fieldConfig: OperatorFieldConfig,\n): MessageInitShape<typeof TailorDBType_FieldConfigSchema>[\"validate\"] {\n return (fieldConfig.validate || []).map((val) => ({\n action: TailorDBType_PermitAction.DENY,\n errorMessage: val.errorMessage || \"\",\n ...(val.script && {\n script: {\n expr: val.script.expr ? `!${val.script.expr}` : \"\",\n },\n }),\n }));\n}\n\nfunction toProtoFieldHooks(\n fieldConfig: OperatorFieldConfig,\n): Pick<MessageInitShape<typeof TailorDBType_FieldConfigSchema>, \"hooks\"> | Record<never, never> {\n if (!fieldConfig.hooks) {\n return {};\n }\n return {\n hooks: {\n create: fieldConfig.hooks.create\n ? {\n expr: fieldConfig.hooks.create.expr || \"\",\n }\n : undefined,\n update: fieldConfig.hooks.update\n ? {\n expr: fieldConfig.hooks.update.expr || \"\",\n }\n : undefined,\n },\n };\n}\n\nfunction processNestedFields(\n fields: Record<string, OperatorFieldConfig>,\n): Record<string, MessageInitShape<typeof TailorDBType_FieldConfigSchema>> {\n const nestedFields: Record<string, MessageInitShape<typeof TailorDBType_FieldConfigSchema>> = {};\n\n Object.entries(fields).forEach(([nestedFieldName, nestedFieldConfig]) => {\n const nestedType = nestedFieldConfig.type;\n\n if (nestedType === \"nested\" && nestedFieldConfig.fields) {\n const deepNestedFields = processNestedFields(nestedFieldConfig.fields);\n nestedFields[nestedFieldName] = {\n type: \"nested\",\n allowedValues: nestedFieldConfig.allowedValues || [],\n description: nestedFieldConfig.description || \"\",\n validate: toProtoFieldValidate(nestedFieldConfig),\n required: nestedFieldConfig.required ?? true,\n array: nestedFieldConfig.array ?? false,\n index: false,\n unique: false,\n foreignKey: false,\n vector: false,\n ...toProtoFieldHooks(nestedFieldConfig),\n fields: deepNestedFields,\n };\n } else {\n nestedFields[nestedFieldName] = {\n type: nestedType,\n allowedValues: nestedType === \"enum\" ? nestedFieldConfig.allowedValues || [] : [],\n description: nestedFieldConfig.description || \"\",\n validate: toProtoFieldValidate(nestedFieldConfig),\n required: nestedFieldConfig.required ?? true,\n array: nestedFieldConfig.array ?? false,\n index: false,\n unique: false,\n foreignKey: false,\n vector: false,\n ...toProtoFieldHooks(nestedFieldConfig),\n ...(nestedFieldConfig.serial && {\n serial: {\n start: nestedFieldConfig.serial.start as unknown as bigint,\n ...(nestedFieldConfig.serial.maxValue && {\n maxValue: nestedFieldConfig.serial.maxValue as unknown as bigint,\n }),\n ...(nestedFieldConfig.serial.format && {\n format: nestedFieldConfig.serial.format,\n }),\n },\n }),\n };\n }\n });\n\n return nestedFields;\n}\n\nfunction protoPermission(\n permission: StandardTailorTypePermission,\n): MessageInitShape<typeof TailorDBType_PermissionSchema> {\n const ret: MessageInitShape<typeof TailorDBType_PermissionSchema> = {};\n for (const [key, policies] of Object.entries(permission)) {\n ret[key as keyof StandardTailorTypePermission] = policies.map((policy) => protoPolicy(policy));\n }\n return ret;\n}\n\nfunction protoPolicy(\n policy: StandardActionPermission<\"record\">,\n): MessageInitShape<typeof TailorDBType_Permission_PolicySchema> {\n let permit: TailorDBType_Permission_Permit;\n switch (policy.permit) {\n case \"allow\":\n permit = TailorDBType_Permission_Permit.ALLOW;\n break;\n case \"deny\":\n permit = TailorDBType_Permission_Permit.DENY;\n break;\n default:\n throw new Error(`Unknown permission: ${policy.permit satisfies never}`);\n }\n return {\n conditions: policy.conditions.map((cond) => protoCondition(cond)),\n permit,\n description: policy.description,\n };\n}\n\nfunction protoCondition(\n condition: StandardPermissionCondition<\"record\">,\n): MessageInitShape<typeof TailorDBType_Permission_ConditionSchema> {\n const [left, operator, right] = condition;\n\n const l = protoOperand(left);\n const r = protoOperand(right);\n let op: TailorDBType_Permission_Operator;\n switch (operator) {\n case \"eq\":\n op = TailorDBType_Permission_Operator.EQ;\n break;\n case \"ne\":\n op = TailorDBType_Permission_Operator.NE;\n break;\n case \"in\":\n op = TailorDBType_Permission_Operator.IN;\n break;\n case \"nin\":\n op = TailorDBType_Permission_Operator.NIN;\n break;\n case \"hasAny\":\n op = TailorDBType_Permission_Operator.HAS_ANY;\n break;\n case \"nhasAny\":\n op = TailorDBType_Permission_Operator.NHAS_ANY;\n break;\n default:\n throw new Error(`Unknown operator: ${operator satisfies never}`);\n }\n return {\n left: l,\n operator: op,\n right: r,\n };\n}\n\nfunction protoOperand(\n operand: PermissionOperand,\n): MessageInitShape<typeof TailorDBType_Permission_OperandSchema> {\n if (typeof operand === \"object\" && !Array.isArray(operand)) {\n if (\"user\" in operand) {\n return {\n kind: {\n case: \"userField\",\n value: operand.user,\n },\n };\n } else if (\"record\" in operand) {\n return {\n kind: {\n case: \"recordField\",\n value: operand.record,\n },\n };\n } else if (\"newRecord\" in operand) {\n return {\n kind: {\n case: \"newRecordField\",\n value: operand.newRecord,\n },\n };\n } else if (\"oldRecord\" in operand) {\n return {\n kind: {\n case: \"oldRecordField\",\n value: operand.oldRecord,\n },\n };\n } else {\n throw new Error(`Unknown operand: ${JSON.stringify(operand)}`);\n }\n }\n\n return {\n kind: {\n case: \"value\",\n value: fromJson(ValueSchema, operand),\n },\n };\n}\n\ntype CreateGqlPermission = {\n name: string;\n request: MessageInitShape<typeof CreateTailorDBGQLPermissionRequestSchema>;\n};\n\ntype UpdateGqlPermission = {\n name: string;\n request: MessageInitShape<typeof UpdateTailorDBGQLPermissionRequestSchema>;\n};\n\ntype DeleteGqlPermission = {\n name: string;\n request: MessageInitShape<typeof DeleteTailorDBGQLPermissionRequestSchema>;\n};\n\nasync function planGqlPermissions(\n client: OperatorClient,\n workspaceId: string,\n tailordbs: ReadonlyArray<TailorDBService>,\n deletedServices: ReadonlyArray<string>,\n) {\n const changeSet = createChangeSet<CreateGqlPermission, UpdateGqlPermission, DeleteGqlPermission>(\n \"TailorDB gqlPermissions\",\n );\n\n const fetchGqlPermissions = (namespaceName: string) => {\n return fetchAll(async (pageToken) => {\n try {\n const { permissions, nextPageToken } = await client.listTailorDBGQLPermissions({\n workspaceId,\n namespaceName,\n pageToken,\n });\n return [permissions, nextPageToken];\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n return [[], \"\"];\n }\n throw error;\n }\n });\n };\n\n for (const tailordb of tailordbs) {\n const existingGqlPermissions = await fetchGqlPermissions(tailordb.namespace);\n const existingNameSet = new Set<string>();\n existingGqlPermissions.forEach((gqlPermission) => {\n existingNameSet.add(gqlPermission.typeName);\n });\n\n const types = tailordb.getTypes();\n for (const typeName of Object.keys(types)) {\n const gqlPermission = types[typeName].permissions.gql;\n if (!gqlPermission) {\n continue;\n }\n if (existingNameSet.has(typeName)) {\n changeSet.updates.push({\n name: typeName,\n request: {\n workspaceId,\n namespaceName: tailordb.namespace,\n typeName: typeName,\n permission: protoGqlPermission(gqlPermission),\n },\n });\n existingNameSet.delete(typeName);\n } else {\n changeSet.creates.push({\n name: typeName,\n request: {\n workspaceId,\n namespaceName: tailordb.namespace,\n typeName: typeName,\n permission: protoGqlPermission(gqlPermission),\n },\n });\n }\n }\n existingNameSet.forEach((name) => {\n changeSet.deletes.push({\n name,\n request: {\n workspaceId,\n namespaceName: tailordb.namespace,\n typeName: name,\n },\n });\n });\n }\n for (const namespaceName of deletedServices) {\n const existingGqlPermissions = await fetchGqlPermissions(namespaceName);\n existingGqlPermissions.forEach((gqlPermission) => {\n changeSet.deletes.push({\n name: gqlPermission.typeName,\n request: {\n workspaceId,\n namespaceName,\n typeName: gqlPermission.typeName,\n },\n });\n });\n }\n return changeSet;\n}\n\nfunction protoGqlPermission(\n permission: StandardTailorTypeGqlPermission,\n): MessageInitShape<typeof TailorDBGQLPermissionSchema> {\n return {\n policies: permission.map((policy) => protoGqlPolicy(policy)),\n };\n}\n\nfunction protoGqlPolicy(\n policy: StandardGqlPermissionPolicy,\n): MessageInitShape<typeof TailorDBGQLPermission_PolicySchema> {\n const actions: TailorDBGQLPermission_Action[] = [];\n for (const action of policy.actions) {\n switch (action) {\n case \"all\":\n actions.push(TailorDBGQLPermission_Action.ALL);\n break;\n case \"create\":\n actions.push(TailorDBGQLPermission_Action.CREATE);\n break;\n case \"read\":\n actions.push(TailorDBGQLPermission_Action.READ);\n break;\n case \"update\":\n actions.push(TailorDBGQLPermission_Action.UPDATE);\n break;\n case \"delete\":\n actions.push(TailorDBGQLPermission_Action.DELETE);\n break;\n case \"aggregate\":\n actions.push(TailorDBGQLPermission_Action.AGGREGATE);\n break;\n case \"bulkUpsert\":\n actions.push(TailorDBGQLPermission_Action.BULK_UPSERT);\n break;\n default:\n throw new Error(`Unknown action: ${action satisfies never}`);\n }\n }\n let permit: TailorDBGQLPermission_Permit;\n switch (policy.permit) {\n case \"allow\":\n permit = TailorDBGQLPermission_Permit.ALLOW;\n break;\n case \"deny\":\n permit = TailorDBGQLPermission_Permit.DENY;\n break;\n default:\n throw new Error(`Unknown permission: ${policy.permit satisfies never}`);\n }\n return {\n conditions: policy.conditions.map((cond) => protoGqlCondition(cond)),\n actions,\n permit,\n description: policy.description,\n };\n}\n\nfunction protoGqlCondition(\n condition: StandardPermissionCondition<\"gql\">,\n): MessageInitShape<typeof TailorDBGQLPermission_ConditionSchema> {\n const [left, operator, right] = condition;\n\n const l = protoGqlOperand(left);\n const r = protoGqlOperand(right);\n let op: TailorDBGQLPermission_Operator;\n switch (operator) {\n case \"eq\":\n op = TailorDBGQLPermission_Operator.EQ;\n break;\n case \"ne\":\n op = TailorDBGQLPermission_Operator.NE;\n break;\n case \"in\":\n op = TailorDBGQLPermission_Operator.IN;\n break;\n case \"nin\":\n op = TailorDBGQLPermission_Operator.NIN;\n break;\n case \"hasAny\":\n op = TailorDBGQLPermission_Operator.HAS_ANY;\n break;\n case \"nhasAny\":\n op = TailorDBGQLPermission_Operator.NHAS_ANY;\n break;\n default:\n throw new Error(`Unknown operator: ${operator satisfies never}`);\n }\n return {\n left: l,\n operator: op,\n right: r,\n };\n}\n\nfunction protoGqlOperand(\n operand: PermissionOperand,\n): MessageInitShape<typeof TailorDBGQLPermission_OperandSchema> {\n if (typeof operand === \"object\" && !Array.isArray(operand)) {\n if (\"user\" in operand) {\n return {\n kind: {\n case: \"userField\",\n value: operand.user,\n },\n };\n }\n }\n\n return {\n kind: {\n case: \"value\",\n value: fromJson(ValueSchema, operand),\n },\n };\n}\n\n// ============================================================================\n// Migration Integration\n// ============================================================================\n\ninterface MigrationCheckResult {\n namespace: string;\n migrationsDir: string;\n hasDiff: boolean;\n diff?: MigrationDiff;\n}\n\n/**\n * Check if there are schema differences between migration snapshots and local definitions\n * @param {ReadonlyMap<string, Record<string, TailorDBType>>} typesByNamespace - Types by namespace\n * @param {NamespaceWithMigrations[]} namespacesWithMigrations - Namespaces with migrations config\n * @returns {Promise<MigrationCheckResult[]>} Results for each namespace\n */\nasync function checkMigrationDiffs(\n typesByNamespace: ReadonlyMap<string, Record<string, TailorDBType>>,\n namespacesWithMigrations: NamespaceWithMigrations[],\n): Promise<MigrationCheckResult[]> {\n const results: MigrationCheckResult[] = [];\n\n for (const { namespace, migrationsDir } of namespacesWithMigrations) {\n const localTypes = typesByNamespace.get(namespace);\n if (!localTypes) {\n continue;\n }\n\n // Try to reconstruct snapshot from migrations\n let previousSnapshot;\n try {\n previousSnapshot = reconstructSnapshotFromMigrations(migrationsDir);\n } catch {\n // No migrations directory - this is fine, no check needed\n results.push({\n namespace,\n migrationsDir,\n hasDiff: false,\n });\n continue;\n }\n\n if (!previousSnapshot) {\n // No snapshots yet - user should run migrate generate first\n results.push({\n namespace,\n migrationsDir,\n hasDiff: true,\n diff: undefined, // Indicates no snapshot exists\n });\n continue;\n }\n\n // Compare with local types\n const diff = compareLocalTypesWithSnapshot(previousSnapshot, localTypes, namespace);\n\n results.push({\n namespace,\n migrationsDir,\n hasDiff: hasChanges(diff),\n diff: hasChanges(diff) ? diff : undefined,\n });\n }\n\n return results;\n}\n\n/**\n * Format migration check results for display\n * @param {MigrationCheckResult[]} results - Migration check results\n * @returns {string} Formatted results string\n */\nfunction formatMigrationCheckResults(results: MigrationCheckResult[]): string {\n const lines: string[] = [];\n\n for (const result of results) {\n if (!result.hasDiff) {\n continue;\n }\n\n lines.push(`Namespace: ${result.namespace}`);\n\n if (!result.diff) {\n lines.push(\n \" No migration snapshot found. Run 'tailor-sdk tailordb migration generate' first.\",\n );\n } else {\n lines.push(` ${formatDiffSummary(result.diff)}`);\n lines.push(\"\");\n lines.push(formatMigrationDiff(result.diff));\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","import { type ApplyPhase } from \"..\";\nimport { type OperatorClient, fetchAll } from \"../../client\";\nimport { workflowJobFunctionName } from \"./function-registry\";\nimport { buildMetaRequest, sdkNameLabelKey, type WithLabel } from \"./label\";\nimport { createChangeSet, type ChangeSet } from \".\";\nimport type { OwnerConflict, UnmanagedResource } from \"./confirm\";\nimport type { Workflow } from \"@/parser/service/workflow\";\nimport type { MessageInitShape } from \"@bufbuild/protobuf\";\nimport type { SetMetadataRequestSchema } from \"@tailor-proto/tailor/v1/metadata_pb\";\n\n/**\n * Apply workflow changes for the given phase.\n * @param client - Operator client instance\n * @param result - Planned workflow changes\n * @param phase - Apply phase\n * @returns Promise that resolves when workflows are applied\n */\nexport async function applyWorkflow(\n client: OperatorClient,\n result: Awaited<ReturnType<typeof planWorkflow>>,\n phase: Extract<ApplyPhase, \"create-update\" | \"delete\"> = \"create-update\",\n) {\n const { changeSet, appName } = result;\n if (phase === \"create-update\") {\n // Register job functions used by any workflow, returns map of job name to version\n const jobFunctionVersions = await registerJobFunctions(client, changeSet, appName);\n\n // Create and update workflows in parallel\n // Each workflow only gets the job function versions it actually uses\n await Promise.all([\n ...changeSet.creates.map(async (create) => {\n const filteredVersions = filterJobFunctionVersions(\n jobFunctionVersions,\n create.usedJobNames,\n );\n await client.createWorkflow({\n workspaceId: create.workspaceId,\n workflowName: create.workflow.name,\n mainJobFunctionName: create.workflow.mainJob.name,\n jobFunctions: filteredVersions,\n });\n await client.setMetadata(create.metaRequest);\n }),\n ...changeSet.updates.map(async (update) => {\n const filteredVersions = filterJobFunctionVersions(\n jobFunctionVersions,\n update.usedJobNames,\n );\n await client.updateWorkflow({\n workspaceId: update.workspaceId,\n workflowName: update.workflow.name,\n mainJobFunctionName: update.workflow.mainJob.name,\n jobFunctions: filteredVersions,\n });\n await client.setMetadata(update.metaRequest);\n }),\n ]);\n } else if (phase === \"delete\") {\n // Delete workflows\n await Promise.all(\n changeSet.deletes.map((del) =>\n client.deleteWorkflow({\n workspaceId: del.workspaceId,\n workflowId: del.workflowId,\n }),\n ),\n );\n }\n}\n\n/**\n * Filter job function versions to only include those used by a workflow\n * @param allVersions - Map of job function names to versions\n * @param usedJobNames - Job names used by the workflow\n * @returns Filtered job function versions\n */\nfunction filterJobFunctionVersions(\n allVersions: { [key: string]: bigint },\n usedJobNames: string[],\n): { [key: string]: bigint } {\n const filtered: { [key: string]: bigint } = {};\n for (const jobName of usedJobNames) {\n if (allVersions[jobName] !== undefined) {\n filtered[jobName] = allVersions[jobName];\n }\n }\n return filtered;\n}\n\n/**\n * Register job functions used by any workflow.\n * Only registers jobs that are actually used (based on usedJobNames in changeSet).\n * Uses create for new jobs and update for existing jobs.\n * Sets metadata on used JobFunctions and removes metadata from unused ones.\n * @param client - Operator client instance\n * @param changeSet - Workflow change set\n * @param appName - Application name\n * @returns Map of job function names to versions\n */\nasync function registerJobFunctions(\n client: OperatorClient,\n changeSet: ChangeSet<CreateWorkflow, UpdateWorkflow, DeleteWorkflow>,\n appName: string,\n): Promise<{ [key: string]: bigint }> {\n const jobFunctionVersions: { [key: string]: bigint } = {};\n\n // Get workspaceId from the first workflow\n const firstWorkflow = changeSet.creates[0] || changeSet.updates[0];\n if (!firstWorkflow) {\n return jobFunctionVersions;\n }\n\n const { workspaceId } = firstWorkflow;\n\n // Collect all job names used by any workflow\n const allUsedJobNames = new Set<string>();\n for (const item of [...changeSet.creates, ...changeSet.updates]) {\n for (const jobName of item.usedJobNames) {\n allUsedJobNames.add(jobName);\n }\n }\n\n // Fetch existing job functions with their names\n const existingJobFunctions = await fetchAll(async (pageToken) => {\n const response = await client.listWorkflowJobFunctions({\n workspaceId,\n pageToken,\n });\n return [response.jobFunctions.map((j) => j.name), response.nextPageToken];\n });\n const existingJobNamesSet = new Set(existingJobFunctions);\n\n // Register job functions in parallel\n // Use create for new jobs, update for existing jobs\n const results = await Promise.all(\n Array.from(allUsedJobNames).map(async (jobName) => {\n const isExisting = existingJobNamesSet.has(jobName);\n const response = isExisting\n ? await client.updateWorkflowJobFunction({\n workspaceId,\n jobFunctionName: jobName,\n scriptRef: workflowJobFunctionName(jobName),\n })\n : await client.createWorkflowJobFunction({\n workspaceId,\n jobFunctionName: jobName,\n scriptRef: workflowJobFunctionName(jobName),\n });\n\n // Set metadata to mark this JobFunction as owned by this app\n await client.setMetadata(\n await buildMetaRequest(jobFunctionTrn(workspaceId, jobName), appName),\n );\n\n return { jobName, version: response.jobFunction?.version };\n }),\n );\n\n for (const { jobName, version } of results) {\n if (version) {\n jobFunctionVersions[jobName] = version;\n }\n }\n\n // Remove metadata from JobFunctions that are no longer used by this app\n const unusedJobFunctions = existingJobFunctions.filter(\n (jobName) => !allUsedJobNames.has(jobName),\n );\n await Promise.all(\n unusedJobFunctions.map(async (jobName) => {\n const { metadata } = await client.getMetadata({\n trn: jobFunctionTrn(workspaceId, jobName),\n });\n const label = metadata?.labels?.[sdkNameLabelKey];\n\n // Only remove metadata if owned by this app\n if (label === appName) {\n await client.setMetadata({\n trn: jobFunctionTrn(workspaceId, jobName),\n labels: { [sdkNameLabelKey]: \"\" }, // Remove ownership\n });\n }\n }),\n );\n\n return jobFunctionVersions;\n}\n\ntype CreateWorkflow = {\n name: string;\n workspaceId: string;\n workflow: Workflow;\n usedJobNames: string[];\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype UpdateWorkflow = {\n name: string;\n workspaceId: string;\n workflow: Workflow;\n usedJobNames: string[];\n metaRequest: MessageInitShape<typeof SetMetadataRequestSchema>;\n};\n\ntype DeleteWorkflow = {\n name: string;\n workspaceId: string;\n workflowId: string;\n};\n\nfunction workflowTrn(workspaceId: string, name: string) {\n return `trn:v1:workspace:${workspaceId}:workflow:${name}`;\n}\n\nfunction jobFunctionTrn(workspaceId: string, name: string) {\n return `trn:v1:workspace:${workspaceId}:workflow_job_function:${name}`;\n}\n\n/**\n * Plan workflow changes and job functions based on current and desired state.\n * @param client - Operator client instance\n * @param workspaceId - Workspace ID\n * @param appName - Application name\n * @param workflows - Parsed workflows\n * @param mainJobDeps - Main job dependencies by workflow\n * @returns Planned workflow changes\n */\nexport async function planWorkflow(\n client: OperatorClient,\n workspaceId: string,\n appName: string,\n workflows: Record<string, Workflow>,\n mainJobDeps: Record<string, string[]>,\n) {\n const changeSet = createChangeSet<CreateWorkflow, UpdateWorkflow, DeleteWorkflow>(\"Workflows\");\n const conflicts: OwnerConflict[] = [];\n const unmanaged: UnmanagedResource[] = [];\n const resourceOwners = new Set<string>();\n\n // Fetch existing workflows from API\n const withoutLabel = await fetchAll(async (pageToken) => {\n const response = await client.listWorkflows({\n workspaceId,\n pageToken,\n });\n return [response.workflows.map((w) => ({ id: w.id, name: w.name })), response.nextPageToken];\n });\n const existingWorkflows: WithLabel<(typeof withoutLabel)[number]> = {};\n await Promise.all(\n withoutLabel.map(async (resource) => {\n const { metadata } = await client.getMetadata({\n trn: workflowTrn(workspaceId, resource.name),\n });\n existingWorkflows[resource.name] = {\n resource,\n label: metadata?.labels[sdkNameLabelKey],\n };\n }),\n );\n\n for (const workflow of Object.values(workflows)) {\n const existing = existingWorkflows[workflow.name];\n const metaRequest = await buildMetaRequest(workflowTrn(workspaceId, workflow.name), appName);\n // Get jobs used by this workflow from mainJobDeps\n const usedJobNames = mainJobDeps[workflow.mainJob.name];\n if (!usedJobNames) {\n throw new Error(\n `Job \"${workflow.mainJob.name}\" (mainJob of workflow \"${workflow.name}\") was not found.\\n\\n` +\n `Possible causes:\\n` +\n ` - The job is not exported as a named export\\n` +\n ` - The file containing the job is not included in workflow.files glob pattern\\n\\n` +\n `Solution:\\n` +\n ` export const ${workflow.mainJob.name} = createWorkflowJob({ name: \"${workflow.mainJob.name}\", ... })`,\n );\n }\n\n if (existing) {\n if (!existing.label) {\n unmanaged.push({\n resourceType: \"Workflow\",\n resourceName: workflow.name,\n });\n } else if (existing.label !== appName) {\n conflicts.push({\n resourceType: \"Workflow\",\n resourceName: workflow.name,\n currentOwner: existing.label,\n });\n }\n\n changeSet.updates.push({\n name: workflow.name,\n workspaceId,\n workflow,\n usedJobNames,\n metaRequest,\n });\n delete existingWorkflows[workflow.name];\n } else {\n changeSet.creates.push({\n name: workflow.name,\n workspaceId,\n workflow,\n usedJobNames,\n metaRequest,\n });\n }\n }\n\n Object.values(existingWorkflows).forEach((existing) => {\n const label = existing?.label;\n if (label && label !== appName) {\n resourceOwners.add(label);\n }\n // Only delete workflows managed by this application\n if (label === appName) {\n changeSet.deletes.push({\n name: existing!.resource.name,\n workspaceId,\n workflowId: existing!.resource.id,\n });\n }\n });\n\n changeSet.print();\n return { changeSet, conflicts, unmanaged, resourceOwners, appName };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineApplication } from \"@/cli/application\";\nimport { createExecutorService } from \"@/cli/application/executor/service\";\nimport {\n loadAndCollectJobs,\n printLoadedWorkflows,\n type CollectedJob,\n type WorkflowLoadResult,\n} from \"@/cli/application/workflow/service\";\nimport { bundleExecutors } from \"@/cli/bundler/executor/executor-bundler\";\nimport { bundleResolvers } from \"@/cli/bundler/resolver/resolver-bundler\";\nimport { buildTriggerContext, type TriggerContext } from \"@/cli/bundler/trigger-context\";\nimport {\n bundleWorkflowJobs,\n type BundleWorkflowJobsResult,\n} from \"@/cli/bundler/workflow/workflow-bundler\";\nimport { loadConfig } from \"@/cli/config-loader\";\nimport { generatePluginExecutorFiles } from \"@/cli/generator/plugin-executor-generator\";\nimport { generatePluginTypeFiles } from \"@/cli/generator/plugin-type-generator\";\nimport { generateUserTypes } from \"@/cli/type-generator\";\nimport { getDistDir } from \"@/cli/utils/dist-dir\";\nimport { PluginManager } from \"@/plugin/manager\";\nimport { commonArgs, confirmationArgs, deploymentArgs, withCommonArgs } from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger } from \"../utils/logger\";\nimport { applyApplication, planApplication } from \"./services/application\";\nimport { applyAuth, planAuth } from \"./services/auth\";\nimport {\n confirmImportantResourceDeletion,\n confirmOwnerConflict,\n confirmUnmanagedResources,\n type ImportantResourceDeletion,\n type OwnerConflict,\n type UnmanagedResource,\n} from \"./services/confirm\";\nimport { applyExecutor, planExecutor } from \"./services/executor\";\nimport {\n applyFunctionRegistry,\n collectFunctionEntries,\n planFunctionRegistry,\n} from \"./services/function-registry\";\nimport { applyIdP, planIdP } from \"./services/idp\";\nimport { applyPipeline, planPipeline } from \"./services/resolver\";\nimport { applyStaticWebsite, planStaticWebsite } from \"./services/staticwebsite\";\nimport { applyTailorDB, planTailorDB } from \"./services/tailordb\";\nimport { applyWorkflow, planWorkflow } from \"./services/workflow\";\nimport type { Application } from \"@/cli/application\";\nimport type { FileLoadConfig } from \"@/cli/application/file-loader\";\nimport type { OperatorClient } from \"@/cli/client\";\nimport type { LoadedConfig } from \"@/cli/config-loader\";\nimport type { Plugin } from \"@/parser/plugin-config/types\";\n\nexport interface ApplyOptions {\n workspaceId?: string;\n profile?: string;\n configPath?: string;\n dryRun?: boolean;\n yes?: boolean;\n noSchemaCheck?: boolean;\n // NOTE(remiposo): Provide an option to run build-only for testing purposes.\n // This could potentially be exposed as a CLI option.\n buildOnly?: boolean;\n}\n\nexport interface PlanContext {\n client: OperatorClient;\n workspaceId: string;\n application: Readonly<Application>;\n forRemoval: boolean;\n config: LoadedConfig;\n noSchemaCheck?: boolean;\n}\n\nexport type ApplyPhase = \"create-update\" | \"delete\" | \"delete-resources\" | \"delete-services\";\n\ntype MutableApplication = Omit<Application, \"executorService\"> & {\n executorService: Application[\"executorService\"];\n};\n\n/**\n * Apply the configured application to the Tailor platform.\n * @param options - Options for apply execution\n * @returns Promise that resolves when apply completes\n */\nexport async function apply(options?: ApplyOptions) {\n // Load and validate options\n const { config, plugins } = await loadConfig(options?.configPath);\n const dryRun = options?.dryRun ?? false;\n const yes = options?.yes ?? false;\n const buildOnly = options?.buildOnly ?? process.env.TAILOR_PLATFORM_SDK_BUILD_ONLY === \"true\";\n\n // Initialize plugin manager if plugins are provided\n let pluginManager: PluginManager | undefined;\n if (plugins.length > 0) {\n pluginManager = new PluginManager(plugins as unknown as Plugin[]);\n }\n\n // Generate user types from loaded config\n await generateUserTypes({ config, configPath: config.path });\n const application = defineApplication({ config, pluginManager });\n\n // Load files first (before building)\n // Load workflows first and collect jobs for bundling\n let workflowResult: WorkflowLoadResult | undefined;\n if (application.workflowConfig) {\n workflowResult = await loadAndCollectJobs(application.workflowConfig);\n }\n\n // Build trigger context for workflow/job trigger transformation\n const triggerContext = await buildTriggerContext(application.workflowConfig);\n\n let tailordbTypesLoaded = false;\n let pluginExecutorFiles: string[] = [];\n\n // Load TailorDB types early to generate plugin type/executor files before bundling\n if (application.tailorDBServices.length > 0) {\n for (const tailordb of application.tailorDBServices) {\n await tailordb.loadTypes();\n // Process namespace plugins (generates types without requiring a source type)\n await tailordb.processNamespacePlugins();\n }\n tailordbTypesLoaded = true;\n }\n\n // Generate plugin type/executor files (matches `generate` flow ordering)\n const pluginOutputDir = path.join(getDistDir(), \"plugin\");\n const pluginTypes = pluginManager?.getPluginGeneratedTypes() ?? [];\n const typeGenerationResult = generatePluginTypeFiles(pluginTypes, pluginOutputDir);\n\n const sourceTypeInfoMap = new Map<string, { filePath: string; exportName: string }>();\n for (const db of application.tailorDBServices) {\n const typeSourceInfo = db.getTypeSourceInfo();\n for (const [typeName, sourceInfo] of Object.entries(typeSourceInfo)) {\n if (sourceInfo.filePath) {\n sourceTypeInfoMap.set(typeName, {\n filePath: sourceInfo.filePath,\n exportName: sourceInfo.exportName,\n });\n }\n }\n }\n\n const pluginExecutors = pluginManager?.getPluginGeneratedExecutorsWithImportPath() ?? [];\n const generatedExecutorFiles = generatePluginExecutorFiles(\n pluginExecutors,\n pluginOutputDir,\n typeGenerationResult,\n sourceTypeInfoMap,\n config.path,\n );\n\n // Discover plugin executor files after generation\n const pluginExecutorFileSet = new Set<string>(generatedExecutorFiles);\n // Also check legacy path for backwards compatibility\n const legacyPluginExecutorDir = path.join(getDistDir(), \"plugin-executors\");\n if (fs.existsSync(legacyPluginExecutorDir)) {\n const legacyFiles = fs\n .readdirSync(legacyPluginExecutorDir)\n .filter((f) => f.endsWith(\".ts\"))\n .map((f) => path.join(legacyPluginExecutorDir, f));\n for (const file of legacyFiles) {\n pluginExecutorFileSet.add(file);\n }\n }\n pluginExecutorFiles = Array.from(pluginExecutorFileSet);\n const executorService =\n application.executorService ??\n (pluginExecutorFiles.length > 0\n ? createExecutorService({ config: { files: [] }, pluginManager })\n : undefined);\n const mutableApplication = application as MutableApplication;\n mutableApplication.executorService = executorService;\n\n // Build functions (using already loaded data)\n for (const app of application.applications) {\n for (const pipeline of app.resolverServices) {\n await buildPipeline(pipeline.namespace, pipeline.config, triggerContext);\n }\n }\n\n if (executorService) {\n await buildExecutor(executorService.config, triggerContext, pluginExecutorFiles);\n }\n let workflowBuildResult: BundleWorkflowJobsResult | undefined;\n if (workflowResult && workflowResult.jobs.length > 0) {\n const mainJobNames = workflowResult.workflowSources.map((ws) => ws.workflow.mainJob.name);\n workflowBuildResult = await buildWorkflow(\n workflowResult.jobs,\n mainJobNames,\n application.env,\n triggerContext,\n );\n }\n if (buildOnly) return;\n\n // Initialize client\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n // Load remaining files and print logs\n // Order: TailorDB → Resolver → Executor → Workflow\n if (!tailordbTypesLoaded) {\n for (const tailordb of application.tailorDBServices) {\n await tailordb.loadTypes();\n // Process namespace plugins (generates types without requiring a source type)\n await tailordb.processNamespacePlugins();\n }\n }\n\n for (const pipeline of application.resolverServices) {\n await pipeline.loadResolvers();\n }\n if (executorService) {\n await executorService.loadExecutors();\n // Load plugin-generated executors from generated TypeScript files\n if (pluginExecutorFiles.length > 0) {\n await executorService.loadPluginExecutorFiles(pluginExecutorFiles);\n }\n }\n // Print workflow loading logs last (workflows were already loaded for bundling)\n if (workflowResult) {\n printLoadedWorkflows(workflowResult);\n }\n logger.newline();\n\n // Collect function entries from bundled scripts (after build, before plan)\n const functionEntries = collectFunctionEntries(application, workflowResult?.jobs ?? []);\n\n // Phase 1: Plan\n const ctx: PlanContext = {\n client,\n workspaceId,\n application,\n forRemoval: false,\n config,\n noSchemaCheck: options?.noSchemaCheck,\n };\n const functionRegistry = await planFunctionRegistry(\n client,\n workspaceId,\n application.name,\n functionEntries,\n );\n const tailorDB = await planTailorDB(ctx);\n const staticWebsite = await planStaticWebsite(ctx);\n const idp = await planIdP(ctx);\n const auth = await planAuth(ctx);\n const pipeline = await planPipeline(ctx);\n const app = await planApplication(ctx);\n const executor = await planExecutor(ctx);\n const workflow = await planWorkflow(\n client,\n workspaceId,\n application.name,\n workflowResult?.workflows ?? {},\n workflowBuildResult?.mainJobDeps ?? {},\n );\n\n // Confirm conflicts\n const allConflicts: OwnerConflict[] = [\n ...functionRegistry.conflicts,\n ...tailorDB.conflicts,\n ...staticWebsite.conflicts,\n ...idp.conflicts,\n ...auth.conflicts,\n ...pipeline.conflicts,\n ...executor.conflicts,\n ...workflow.conflicts,\n ];\n await confirmOwnerConflict(allConflicts, application.name, yes);\n // Confirm unmanaged resources\n const allUnmanaged: UnmanagedResource[] = [\n ...functionRegistry.unmanaged,\n ...tailorDB.unmanaged,\n ...staticWebsite.unmanaged,\n ...idp.unmanaged,\n ...auth.unmanaged,\n ...pipeline.unmanaged,\n ...executor.unmanaged,\n ...workflow.unmanaged,\n ];\n await confirmUnmanagedResources(allUnmanaged, application.name, yes);\n // Confirm important deletions\n const importantDeletions: ImportantResourceDeletion[] = [];\n for (const del of tailorDB.changeSet.type.deletes) {\n importantDeletions.push({\n resourceType: \"TailorDB type\",\n resourceName: del.name,\n });\n }\n for (const del of staticWebsite.changeSet.deletes) {\n importantDeletions.push({\n resourceType: \"StaticWebsite\",\n resourceName: del.name,\n });\n }\n for (const del of auth.changeSet.oauth2Client.deletes) {\n importantDeletions.push({\n resourceType: \"OAuth2 client\",\n resourceName: del.name,\n });\n }\n for (const replace of auth.changeSet.oauth2Client.replaces) {\n importantDeletions.push({\n resourceType: \"OAuth2 client (client type change)\",\n resourceName: replace.name,\n });\n }\n await confirmImportantResourceDeletion(importantDeletions, yes);\n\n // Delete renamed applications\n // NOTE: When removing resources while renaming the app at the same time,\n // the app and its resources don't get deleted and are left orphaned...\n const resourceOwners = new Set([\n ...functionRegistry.resourceOwners,\n ...tailorDB.resourceOwners,\n ...staticWebsite.resourceOwners,\n ...idp.resourceOwners,\n ...auth.resourceOwners,\n ...pipeline.resourceOwners,\n ...executor.resourceOwners,\n ...workflow.resourceOwners,\n ]);\n const conflictOwners = new Set(allConflicts.map((c) => c.currentOwner));\n const emptyApps = [...conflictOwners].filter((owner) => !resourceOwners.has(owner));\n for (const emptyApp of emptyApps) {\n app.deletes.push({\n name: emptyApp,\n request: {\n workspaceId,\n applicationName: emptyApp,\n },\n });\n }\n if (dryRun) {\n logger.info(\"Dry run enabled. No changes applied.\");\n return;\n }\n\n // Phase 2: Create/Update services that Application depends on\n // - Function registry (must be registered before services that reference them)\n // - Subgraph services (for GraphQL SDL composition): TailorDB, IdP, Auth, Pipeline\n // - StaticWebsite (for CORS and OAuth2 redirect URI resolution)\n\n // Register function scripts first (resolvers, executors, workflows reference them)\n await applyFunctionRegistry(client, workspaceId, functionRegistry, \"create-update\");\n\n // Other services: Apply before TailorDB (migration scripts may require Auth)\n await applyStaticWebsite(client, staticWebsite, \"create-update\");\n await applyIdP(client, idp, \"create-update\");\n await applyAuth(client, auth, \"create-update\");\n await applyTailorDB(client, tailorDB, \"create-update\");\n\n await applyPipeline(client, pipeline, \"create-update\");\n\n // Phase 3: Delete subgraph resources (types, resolvers, etc.) before Application update\n // This avoids GraphQL SDL composition errors when resources conflict with system-generated ones\n // NOTE: Services are NOT deleted here - they will be deleted after Application is deleted\n // NOTE: TailorDB resource deletions are handled during the create-update phase\n // after migration scripts execute.\n await applyPipeline(client, pipeline, \"delete-resources\");\n await applyAuth(client, auth, \"delete-resources\");\n await applyIdP(client, idp, \"delete-resources\");\n\n // Phase 4: Create/Update Application (after subgraph resource changes complete)\n await applyApplication(client, app, \"create-update\");\n\n // Phase 5: Create/Update services that depend on Application\n await applyExecutor(client, executor, \"create-update\");\n await applyWorkflow(client, workflow, \"create-update\");\n\n // Phase 6: Delete services that depend on Application\n await applyWorkflow(client, workflow, \"delete\");\n await applyExecutor(client, executor, \"delete\");\n await applyStaticWebsite(client, staticWebsite, \"delete\");\n\n // Phase 7: Delete Application\n await applyApplication(client, app, \"delete\");\n\n // Phase 8: Delete subgraph services (after Application is deleted, no reference errors)\n // Fix for issue #570: Services couldn't be deleted because Application was still referencing them\n await applyPipeline(client, pipeline, \"delete-services\");\n await applyAuth(client, auth, \"delete-services\");\n await applyIdP(client, idp, \"delete-services\");\n await applyTailorDB(client, tailorDB, \"delete-services\");\n\n // Phase 9: Delete unused function registry entries (after all referencing services are deleted)\n await applyFunctionRegistry(client, workspaceId, functionRegistry, \"delete\");\n\n logger.success(\"Successfully applied changes.\");\n}\n\nasync function buildPipeline(\n namespace: string,\n config: FileLoadConfig,\n triggerContext?: TriggerContext,\n) {\n await bundleResolvers(namespace, config, triggerContext);\n}\n\nasync function buildExecutor(\n config: FileLoadConfig,\n triggerContext?: TriggerContext,\n additionalFiles?: string[],\n) {\n await bundleExecutors({ config, triggerContext, additionalFiles });\n}\n\nasync function buildWorkflow(\n collectedJobs: CollectedJob[],\n mainJobNames: string[],\n env: Record<string, string | number | boolean>,\n triggerContext?: TriggerContext,\n): Promise<BundleWorkflowJobsResult> {\n // Use the workflow bundler with already collected jobs\n return bundleWorkflowJobs(collectedJobs, mainJobNames, env, triggerContext);\n}\n\nexport const applyCommand = defineCommand({\n name: \"apply\",\n description: \"Apply Tailor configuration to deploy your application.\",\n args: z.object({\n ...commonArgs,\n ...deploymentArgs,\n ...confirmationArgs,\n \"dry-run\": arg(z.boolean().optional(), {\n alias: \"d\",\n description: \"Run the command without making any changes\",\n }),\n \"no-schema-check\": arg(z.boolean().optional(), {\n description: \"Skip schema diff check against migration snapshots\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n await apply({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n configPath: args.config,\n dryRun: args[\"dry-run\"],\n yes: args.yes,\n noSchemaCheck: args[\"no-schema-check\"],\n });\n }),\n});\n","import {\n ExecutorJobStatus,\n ExecutorTargetType,\n ExecutorTriggerType,\n} from \"@tailor-proto/tailor/v1/executor_resource_pb\";\nimport { FunctionExecution_Status } from \"@tailor-proto/tailor/v1/function_resource_pb\";\nimport { styles } from \"../utils/logger\";\n\n// ============================================================================\n// Executor Job Status\n// ============================================================================\n\n/**\n * Colorize executor job status string.\n * @param status - Executor job status string\n * @returns Colorized status string\n */\nexport function colorizeExecutorJobStatus(status: string): string {\n switch (status) {\n case \"PENDING\":\n return styles.dim(status);\n case \"RUNNING\":\n return styles.info(status);\n case \"SUCCESS\":\n return styles.success(status);\n case \"FAILED\":\n return styles.error(status);\n case \"CANCELED\":\n return styles.warning(status);\n default:\n return status;\n }\n}\n\n/**\n * Check if executor job status is terminal.\n * @param status - Executor job status enum value\n * @returns True if status is terminal\n */\nexport function isExecutorJobTerminalStatus(status: ExecutorJobStatus): boolean {\n return (\n status === ExecutorJobStatus.SUCCESS ||\n status === ExecutorJobStatus.FAILED ||\n status === ExecutorJobStatus.CANCELED\n );\n}\n\n/**\n * Parse executor job status string to enum.\n * @param status - Status string to parse\n * @returns ExecutorJobStatus enum value\n */\nexport function parseExecutorJobStatus(status: string): ExecutorJobStatus {\n const upperStatus = status.toUpperCase();\n switch (upperStatus) {\n case \"PENDING\":\n return ExecutorJobStatus.PENDING;\n case \"RUNNING\":\n return ExecutorJobStatus.RUNNING;\n case \"SUCCESS\":\n return ExecutorJobStatus.SUCCESS;\n case \"FAILED\":\n return ExecutorJobStatus.FAILED;\n case \"CANCELED\":\n return ExecutorJobStatus.CANCELED;\n default:\n throw new Error(\n `Invalid status: ${status}. Valid values: PENDING, RUNNING, SUCCESS, FAILED, CANCELED`,\n );\n }\n}\n\n// ============================================================================\n// Function Execution Status\n// ============================================================================\n\n/**\n * Colorize function execution status string.\n * @param status - Function execution status string\n * @returns Colorized status string\n */\nexport function colorizeFunctionExecutionStatus(status: string): string {\n switch (status) {\n case \"RUNNING\":\n return styles.info(status);\n case \"SUCCESS\":\n return styles.success(status);\n case \"FAILED\":\n return styles.error(status);\n default:\n return status;\n }\n}\n\n/**\n * Check if function execution status is terminal.\n * @param status - Function execution status enum value\n * @returns True if status is terminal\n */\nexport function isFunctionExecutionTerminalStatus(status: FunctionExecution_Status): boolean {\n return status === FunctionExecution_Status.SUCCESS || status === FunctionExecution_Status.FAILED;\n}\n\n// ============================================================================\n// Executor Target Type\n// ============================================================================\n\n/**\n * Convert executor target type enum to string.\n * @param targetType - Executor target type enum value\n * @returns Target type string representation\n */\nexport function executorTargetTypeToString(targetType: ExecutorTargetType): string {\n switch (targetType) {\n case ExecutorTargetType.WEBHOOK:\n return \"WEBHOOK\";\n case ExecutorTargetType.TAILOR_GRAPHQL:\n return \"GRAPHQL\";\n case ExecutorTargetType.FUNCTION:\n return \"FUNCTION\";\n case ExecutorTargetType.JOB_FUNCTION:\n return \"JOB_FUNCTION\";\n case ExecutorTargetType.WORKFLOW:\n return \"WORKFLOW\";\n default:\n return \"UNSPECIFIED\";\n }\n}\n\n/**\n * Convert executor trigger type enum to string.\n * @param triggerType - Executor trigger type enum value\n * @returns Trigger type string representation\n */\nexport function executorTriggerTypeToString(triggerType: ExecutorTriggerType): string {\n switch (triggerType) {\n case ExecutorTriggerType.SCHEDULE:\n return \"SCHEDULE\";\n case ExecutorTriggerType.EVENT:\n return \"EVENT\";\n case ExecutorTriggerType.INCOMING_WEBHOOK:\n return \"INCOMING_WEBHOOK\";\n default:\n return \"UNSPECIFIED\";\n }\n}\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { ExecutorJobStatus } from \"@tailor-proto/tailor/v1/executor_resource_pb\";\nimport { executorTargetTypeToString, executorTriggerTypeToString } from \"./status\";\nimport type {\n ExecutorExecutor,\n ExecutorJob,\n ExecutorJobAttempt,\n} from \"@tailor-proto/tailor/v1/executor_resource_pb\";\n\nexport interface ExecutorJobListInfo {\n id: string;\n executorName: string;\n status: string;\n createdAt: string;\n}\n\nexport interface ExecutorJobInfo {\n id: string;\n executorName: string;\n status: string;\n scheduledAt: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ExecutorJobAttemptInfo {\n id: string;\n jobId: string;\n status: string;\n error: string;\n startedAt: string;\n finishedAt: string;\n operationReference: string;\n}\n\nfunction executorJobStatusToString(status: ExecutorJobStatus): string {\n switch (status) {\n case ExecutorJobStatus.PENDING:\n return \"PENDING\";\n case ExecutorJobStatus.RUNNING:\n return \"RUNNING\";\n case ExecutorJobStatus.SUCCESS:\n return \"SUCCESS\";\n case ExecutorJobStatus.FAILED:\n return \"FAILED\";\n case ExecutorJobStatus.CANCELED:\n return \"CANCELED\";\n default:\n return \"UNSPECIFIED\";\n }\n}\n\n/**\n * Transform ExecutorJob to ExecutorJobListInfo for list display.\n * @param job - ExecutorJob from proto\n * @returns Executor job list info\n */\nexport function toExecutorJobListInfo(job: ExecutorJob): ExecutorJobListInfo {\n return {\n id: job.id,\n executorName: job.executorName,\n status: executorJobStatusToString(job.status),\n createdAt: job.createdAt ? timestampDate(job.createdAt).toISOString() : \"N/A\",\n };\n}\n\n/**\n * Transform ExecutorJob to ExecutorJobInfo for detail display.\n * @param job - ExecutorJob from proto\n * @returns Executor job info\n */\nexport function toExecutorJobInfo(job: ExecutorJob): ExecutorJobInfo {\n return {\n id: job.id,\n executorName: job.executorName,\n status: executorJobStatusToString(job.status),\n scheduledAt: job.scheduledAt ? timestampDate(job.scheduledAt).toISOString() : \"N/A\",\n createdAt: job.createdAt ? timestampDate(job.createdAt).toISOString() : \"N/A\",\n updatedAt: job.updatedAt ? timestampDate(job.updatedAt).toISOString() : \"N/A\",\n };\n}\n\n/**\n * Transform ExecutorJobAttempt to ExecutorJobAttemptInfo.\n * @param attempt - ExecutorJobAttempt from proto\n * @returns Executor job attempt info\n */\nexport function toExecutorJobAttemptInfo(attempt: ExecutorJobAttempt): ExecutorJobAttemptInfo {\n return {\n id: attempt.id,\n jobId: attempt.jobId,\n status: executorJobStatusToString(attempt.status),\n error: attempt.error || \"\",\n startedAt: attempt.startedAt ? timestampDate(attempt.startedAt).toISOString() : \"N/A\",\n finishedAt: attempt.finishedAt ? timestampDate(attempt.finishedAt).toISOString() : \"N/A\",\n operationReference: attempt.operationReference || \"\",\n };\n}\n\n// ============================================================================\n// Executor (ExecutorExecutor) Transform Functions\n// ============================================================================\n\nexport interface ExecutorListInfo {\n name: string;\n triggerType: string;\n targetType: string;\n disabled: boolean;\n}\n\nexport interface ExecutorInfo {\n name: string;\n description: string;\n triggerType: string;\n targetType: string;\n disabled: boolean;\n triggerConfig: string;\n targetConfig: string;\n}\n\n/**\n * Format trigger type for human-readable display.\n * Examples:\n * - event with typeName \"User\" and action \"created\" → \"event: User created\"\n * - event with resolverName \"myResolver\" → \"event: myResolver executed\"\n * - schedule with frequency \"0 12 * * *\" and timezone \"UTC\" → \"schedule: 0 12 * * * (UTC)\"\n * - incomingWebhook → \"webhook\"\n * @param executor - Executor from proto\n * @returns Formatted trigger type string\n */\nfunction formatTriggerType(executor: ExecutorExecutor): string {\n const config = executor.triggerConfig?.config;\n if (!config || config.case === undefined) {\n return executorTriggerTypeToString(executor.triggerType);\n }\n\n switch (config.case) {\n case \"schedule\":\n return `schedule: ${config.value.frequency} (${config.value.timezone})`;\n case \"event\":\n return formatEventTrigger(config.value.eventType, config.value.condition?.expr);\n case \"incomingWebhook\":\n return \"webhook\";\n default:\n return executorTriggerTypeToString(executor.triggerType);\n }\n}\n\n/**\n * Format event trigger for display by parsing condition to extract type/resolver name.\n * @param eventType - Event type string (e.g., \"tailordb.type_record.created\")\n * @param condition - Condition expression that may contain args.typeName or args.resolverName\n * @returns Formatted string (e.g., \"event: User created\")\n */\nfunction formatEventTrigger(eventType: string, condition?: string): string {\n const parts = eventType.split(\".\");\n if (parts.length < 3) {\n return `event: ${eventType}`;\n }\n\n const [service, resource, action] = parts;\n\n // Try to extract name from condition\n if (condition) {\n // Match args.typeName === \"User\" or args.typeName === 'User'\n const typeNameMatch = condition.match(/args\\.typeName\\s*===?\\s*[\"']([^\"']+)[\"']/);\n if (typeNameMatch) {\n return `event: ${typeNameMatch[1]} ${action}`;\n }\n\n // Match args.resolverName === \"myResolver\" or args.resolverName === 'myResolver'\n const resolverNameMatch = condition.match(/args\\.resolverName\\s*===?\\s*[\"']([^\"']+)[\"']/);\n if (resolverNameMatch) {\n return `event: ${resolverNameMatch[1]} ${action}`;\n }\n }\n\n // Fallback: use service, resource and action\n return `event: ${service} ${resource} ${action}`;\n}\n\n/**\n * Format trigger config for display.\n * @param executor - Executor from proto\n * @returns Formatted trigger config\n */\nfunction formatTriggerConfig(executor: ExecutorExecutor): Record<string, unknown> {\n const config = executor.triggerConfig?.config;\n if (!config || config.case === undefined) {\n return {};\n }\n\n switch (config.case) {\n case \"schedule\":\n return {\n timezone: config.value.timezone,\n frequency: config.value.frequency,\n };\n case \"event\":\n return {\n eventType: config.value.eventType,\n condition: config.value.condition?.expr || \"\",\n };\n case \"incomingWebhook\":\n return {\n secret: config.value.secret ? \"***\" : \"\",\n };\n default:\n return {};\n }\n}\n\n/**\n * Format target config for display.\n * @param executor - Executor from proto\n * @returns Formatted target config\n */\nfunction formatTargetConfig(executor: ExecutorExecutor): Record<string, unknown> {\n const config = executor.targetConfig?.config;\n if (!config || config.case === undefined) {\n return {};\n }\n\n switch (config.case) {\n case \"webhook\":\n return {\n url: config.value.url?.expr || \"\",\n headers: config.value.headers.length,\n };\n case \"tailorGraphql\":\n return {\n appName: config.value.appName,\n query: config.value.query,\n };\n case \"function\":\n return {\n name: config.value.name,\n };\n case \"workflow\":\n return {\n workflowName: config.value.workflowName,\n };\n default:\n return {};\n }\n}\n\n/**\n * Transform ExecutorExecutor to ExecutorListInfo for list display.\n * @param executor - Executor from proto\n * @returns Executor list info\n */\nexport function toExecutorListInfo(executor: ExecutorExecutor): ExecutorListInfo {\n return {\n name: executor.name,\n triggerType: formatTriggerType(executor),\n targetType: executorTargetTypeToString(executor.targetType),\n disabled: executor.disabled,\n };\n}\n\n/**\n * Transform ExecutorExecutor to ExecutorInfo for detail display.\n * @param executor - Executor from proto\n * @returns Executor info\n */\nexport function toExecutorInfo(executor: ExecutorExecutor): ExecutorInfo {\n return {\n name: executor.name,\n description: executor.description,\n triggerType: formatTriggerType(executor),\n targetType: executorTargetTypeToString(executor.targetType),\n disabled: executor.disabled,\n triggerConfig: JSON.stringify(formatTriggerConfig(executor), null, 2),\n targetConfig: JSON.stringify(formatTargetConfig(executor), null, 2),\n };\n}\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { arg, defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, withCommonArgs, workspaceArgs } from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger } from \"../utils/logger\";\nimport { type ExecutorInfo, toExecutorInfo } from \"./transform\";\n\nconst nameArgs = {\n name: arg(z.string(), {\n positional: true,\n description: \"Executor name\",\n }),\n};\n\nexport interface GetExecutorOptions {\n name: string;\n workspaceId?: string;\n profile?: string;\n}\n\n/**\n * Resolve an executor by name.\n * @param client - Operator client\n * @param workspaceId - Workspace ID\n * @param name - Executor name\n * @returns Resolved executor\n */\nasync function resolveExecutor(\n client: Awaited<ReturnType<typeof initOperatorClient>>,\n workspaceId: string,\n name: string,\n) {\n const { executor } = await client.getExecutorExecutor({\n workspaceId,\n name,\n });\n if (!executor) {\n throw new Error(`Executor '${name}' not found.`);\n }\n return executor;\n}\n\n/**\n * Get an executor by name and return CLI-friendly info.\n * @param options - Executor lookup options\n * @returns Executor information\n */\nexport async function getExecutor(options: GetExecutorOptions): Promise<ExecutorInfo> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n try {\n const executor = await resolveExecutor(client, workspaceId, options.name);\n return toExecutorInfo(executor);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Executor '${options.name}' not found.`);\n }\n throw error;\n }\n}\n\nexport const getCommand = defineCommand({\n name: \"get\",\n description: \"Get executor details\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n ...nameArgs,\n }),\n run: withCommonArgs(async (args) => {\n const executor = await getExecutor({\n name: args.name,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n logger.out(executor, {\n display: {\n triggerConfig: null,\n targetConfig: null,\n },\n });\n }),\n});\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { formatDistanceToNowStrict } from \"date-fns\";\n// eslint-disable-next-line no-restricted-imports\nimport { getBorderCharacters, table } from \"table\";\nimport type { Timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { TableUserConfig } from \"table\";\n\n/**\n * Format a protobuf Timestamp to ISO string.\n * @param timestamp - Protobuf timestamp\n * @returns Date object or null if invalid\n */\nexport function formatTimestamp(timestamp: Timestamp | undefined): Date | null {\n if (!timestamp) {\n return null;\n }\n const date = timestampDate(timestamp);\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n return date;\n}\n\n/**\n * Formats a table with consistent single-line border style.\n * Use this instead of importing `table` directly.\n * @param data - Table data\n * @param config - Table configuration\n * @returns Formatted table string\n */\nexport function formatTable(data: unknown[][], config?: TableUserConfig): string {\n return table(data, {\n ...config,\n border: getBorderCharacters(\"norc\"),\n });\n}\n\n/**\n * Formats a key-value table with single-line border style.\n * @param data - Key-value pairs\n * @returns Formatted key-value table string\n */\nexport function formatKeyValueTable(data: [string, string][]): string {\n return formatTable(data, { singleLine: true });\n}\n\n/**\n * Formats a table with headers, using single-line border style.\n * Draws horizontal lines only at top, after header, and bottom.\n * @param headers - Table header labels\n * @param rows - Table rows\n * @returns Formatted table string with headers\n */\nexport function formatTableWithHeaders(headers: string[], rows: string[][]): string {\n return formatTable([headers, ...rows], {\n drawHorizontalLine: (lineIndex, rowCount) => {\n return lineIndex === 0 || lineIndex === 1 || lineIndex === rowCount;\n },\n });\n}\n\n/**\n * Format a 2D array of values into a table string.\n * @param value - Value to format\n * @returns Human-readable string representation\n */\nexport function formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (Array.isArray(value)) {\n return value.map(String).join(\"\\n\");\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value, null, 2);\n }\n return String(value);\n}\n\n/**\n * Format a Date or ISO timestamp string as a human-readable relative time.\n * @param value - Date object, ISO date string, or null\n * @returns Relative time (e.g., \"5 minutes ago\") or \"N/A\" for null/invalid\n */\nexport function humanizeRelativeTime(value: Date | string | null): string {\n if (value === null) {\n return \"N/A\";\n }\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) {\n return typeof value === \"string\" ? value : \"N/A\";\n }\n return formatDistanceToNowStrict(date, { addSuffix: true });\n}\n","import { FunctionExecution_Status } from \"@tailor-proto/tailor/v1/function_resource_pb\";\n\n/**\n * Convert function execution status enum to string.\n * @param status - Function execution status enum value\n * @returns Status string representation\n */\nexport function functionExecutionStatusToString(status: FunctionExecution_Status): string {\n switch (status) {\n case FunctionExecution_Status.RUNNING:\n return \"RUNNING\";\n case FunctionExecution_Status.SUCCESS:\n return \"SUCCESS\";\n case FunctionExecution_Status.FAILED:\n return \"FAILED\";\n default:\n return \"UNSPECIFIED\";\n }\n}\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { durationArg } from \"../args\";\n\ntype ArgsShape = Record<string, z.ZodType>;\n\nexport const nameArgs = {\n name: arg(z.string(), {\n positional: true,\n description: \"Workflow name\",\n }),\n} satisfies ArgsShape;\n\nexport const waitArgs = {\n wait: arg(z.boolean().default(false), {\n alias: \"W\",\n description: \"Wait for execution to complete\",\n }),\n interval: arg(durationArg.default(\"3s\"), {\n alias: \"i\",\n description: \"Polling interval when using --wait (e.g., '3s', '500ms', '1m')\",\n }),\n logs: arg(z.boolean().default(false), {\n alias: \"l\",\n description: \"Display job execution logs after completion (requires --wait)\",\n }),\n} satisfies ArgsShape;\n","import { WorkflowExecution_Status } from \"@tailor-proto/tailor/v1/workflow_resource_pb\";\n\n/**\n * Check if workflow execution status is terminal.\n * @param status - Workflow execution status enum value\n * @returns True if status is terminal\n */\nexport function isWorkflowExecutionTerminalStatus(status: WorkflowExecution_Status): boolean {\n return (\n status === WorkflowExecution_Status.SUCCESS ||\n status === WorkflowExecution_Status.FAILED ||\n status === WorkflowExecution_Status.PENDING_RESUME\n );\n}\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport {\n WorkflowExecution_Status,\n WorkflowJobExecution_Status,\n} from \"@tailor-proto/tailor/v1/workflow_resource_pb\";\nimport type {\n Workflow,\n WorkflowExecution,\n WorkflowJobExecution,\n} from \"@tailor-proto/tailor/v1/workflow_resource_pb\";\n\nexport interface WorkflowListInfo {\n name: string;\n mainJob: string;\n jobFunctions: number;\n updatedAt: Date | null;\n}\n\nexport interface WorkflowInfo {\n name: string;\n id: string;\n mainJob: string;\n jobFunctions: Record<string, string>;\n createdAt: Date | null;\n updatedAt: Date | null;\n}\n\nexport interface WorkflowJobExecutionInfo {\n id: string;\n stackedJobName: string;\n status: string;\n executionId: string;\n startedAt: Date | null;\n finishedAt: Date | null;\n}\n\nexport interface WorkflowExecutionInfo {\n id: string;\n workflowName: string;\n status: string;\n jobExecutions: number;\n startedAt: Date | null;\n finishedAt: Date | null;\n}\n\n/**\n * Convert a workflow execution status enum to a string.\n * @param status - Workflow execution status\n * @returns String representation of the status\n */\nfunction workflowExecutionStatusToString(status: WorkflowExecution_Status): string {\n switch (status) {\n case WorkflowExecution_Status.PENDING:\n return \"PENDING\";\n case WorkflowExecution_Status.PENDING_RESUME:\n return \"PENDING_RESUME\";\n case WorkflowExecution_Status.RUNNING:\n return \"RUNNING\";\n case WorkflowExecution_Status.SUCCESS:\n return \"SUCCESS\";\n case WorkflowExecution_Status.FAILED:\n return \"FAILED\";\n default:\n return \"UNSPECIFIED\";\n }\n}\n\n/**\n * Convert a workflow job execution status enum to a string.\n * @param status - Workflow job execution status\n * @returns String representation of the status\n */\nfunction workflowJobExecutionStatusToString(status: WorkflowJobExecution_Status): string {\n switch (status) {\n case WorkflowJobExecution_Status.RUNNING:\n return \"RUNNING\";\n case WorkflowJobExecution_Status.SUSPEND:\n return \"SUSPEND\";\n case WorkflowJobExecution_Status.SUCCESS:\n return \"SUCCESS\";\n case WorkflowJobExecution_Status.FAILED:\n return \"FAILED\";\n default:\n return \"UNSPECIFIED\";\n }\n}\n\n/**\n * Convert a Workflow proto to CLI-friendly list info.\n * @param workflow - Workflow resource\n * @returns Flattened workflow list info\n */\nexport function toWorkflowListInfo(workflow: Workflow): WorkflowListInfo {\n return {\n name: workflow.name,\n mainJob: workflow.mainJobFunctionName,\n jobFunctions: Object.keys(workflow.jobFunctions).length,\n updatedAt: workflow.updatedAt ? timestampDate(workflow.updatedAt) : null,\n };\n}\n\n/**\n * Convert a Workflow proto to detailed workflow info for CLI output.\n * @param workflow - Workflow resource\n * @returns Detailed workflow info\n */\nexport function toWorkflowInfo(workflow: Workflow): WorkflowInfo {\n const jobFunctions: Record<string, string> = {};\n for (const [name, version] of Object.entries(workflow.jobFunctions)) {\n jobFunctions[name] = version.toString();\n }\n\n return {\n name: workflow.name,\n id: workflow.id,\n mainJob: workflow.mainJobFunctionName,\n jobFunctions: jobFunctions,\n createdAt: workflow.createdAt ? timestampDate(workflow.createdAt) : null,\n updatedAt: workflow.updatedAt ? timestampDate(workflow.updatedAt) : null,\n };\n}\n\n/**\n * Convert a WorkflowJobExecution proto to CLI-friendly job execution info.\n * @param jobExecution - Workflow job execution resource\n * @returns Flattened job execution info\n */\nexport function toWorkflowJobExecutionInfo(\n jobExecution: WorkflowJobExecution,\n): WorkflowJobExecutionInfo {\n return {\n id: jobExecution.id,\n stackedJobName: jobExecution.stackedJobName,\n status: workflowJobExecutionStatusToString(jobExecution.status),\n executionId: jobExecution.executionId,\n startedAt: jobExecution.startedAt ? timestampDate(jobExecution.startedAt) : null,\n finishedAt: jobExecution.finishedAt ? timestampDate(jobExecution.finishedAt) : null,\n };\n}\n\n/**\n * Convert a WorkflowExecution proto to CLI-friendly execution info.\n * @param execution - Workflow execution resource\n * @returns Flattened execution info\n */\nexport function toWorkflowExecutionInfo(execution: WorkflowExecution): WorkflowExecutionInfo {\n return {\n id: execution.id,\n workflowName: execution.workflowName,\n status: workflowExecutionStatusToString(execution.status),\n jobExecutions: execution.jobExecutions.length,\n startedAt: execution.startedAt ? timestampDate(execution.startedAt) : null,\n finishedAt: execution.finishedAt ? timestampDate(execution.finishedAt) : null,\n };\n}\n","import { create } from \"@bufbuild/protobuf\";\nimport {\n Condition_Operator,\n ConditionSchema,\n FilterSchema,\n PageDirection,\n} from \"@tailor-proto/tailor/v1/resource_pb\";\nimport { WorkflowExecution_Status } from \"@tailor-proto/tailor/v1/workflow_resource_pb\";\nimport ora from \"ora\";\nimport { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, parseDuration, withCommonArgs, workspaceArgs } from \"../args\";\nimport { fetchAll, initOperatorClient } from \"../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { formatKeyValueTable } from \"../utils/format\";\nimport { styles, logger } from \"../utils/logger\";\nimport { waitArgs } from \"./args\";\nimport { isWorkflowExecutionTerminalStatus } from \"./status\";\nimport {\n type WorkflowExecutionInfo,\n type WorkflowJobExecutionInfo,\n toWorkflowExecutionInfo,\n toWorkflowJobExecutionInfo,\n} from \"./transform\";\nimport type { FunctionExecution } from \"@tailor-proto/tailor/v1/function_resource_pb\";\n\nexport interface ListWorkflowExecutionsOptions {\n workspaceId?: string;\n profile?: string;\n workflowName?: string;\n status?: string;\n}\n\nexport interface GetWorkflowExecutionOptions {\n executionId: string;\n workspaceId?: string;\n profile?: string;\n interval?: number;\n logs?: boolean;\n}\n\nexport interface WorkflowExecutionDetailInfo extends WorkflowExecutionInfo {\n jobDetails?: (WorkflowJobExecutionInfo & {\n logs?: string;\n result?: string;\n })[];\n}\n\nexport interface GetWorkflowExecutionResult {\n execution: WorkflowExecutionDetailInfo;\n wait: () => Promise<WorkflowExecutionDetailInfo>;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString(\"en-US\", { hour12: false });\n}\n\nfunction colorizeStatus(status: WorkflowExecution_Status): string {\n const statusText = WorkflowExecution_Status[status];\n switch (status) {\n case WorkflowExecution_Status.PENDING:\n return styles.dim(statusText);\n case WorkflowExecution_Status.PENDING_RESUME:\n return styles.warning(statusText);\n case WorkflowExecution_Status.RUNNING:\n return styles.info(statusText);\n case WorkflowExecution_Status.SUCCESS:\n return styles.success(statusText);\n case WorkflowExecution_Status.FAILED:\n return styles.error(statusText);\n default:\n return statusText;\n }\n}\n\nfunction parseStatus(status: string): WorkflowExecution_Status {\n const upperStatus = status.toUpperCase();\n switch (upperStatus) {\n case \"PENDING\":\n return WorkflowExecution_Status.PENDING;\n case \"PENDING_RESUME\":\n return WorkflowExecution_Status.PENDING_RESUME;\n case \"RUNNING\":\n return WorkflowExecution_Status.RUNNING;\n case \"SUCCESS\":\n return WorkflowExecution_Status.SUCCESS;\n case \"FAILED\":\n return WorkflowExecution_Status.FAILED;\n default:\n throw new Error(\n `Invalid status: ${status}. Valid values: PENDING, PENDING_RESUME, RUNNING, SUCCESS, FAILED`,\n );\n }\n}\n\n/**\n * List workflow executions with optional filters.\n * @param options - Workflow execution listing options\n * @returns List of workflow executions\n */\nexport async function listWorkflowExecutions(\n options?: ListWorkflowExecutionsOptions,\n): Promise<WorkflowExecutionInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n const filters: ReturnType<typeof create<typeof FilterSchema>>[] = [];\n\n if (options?.workflowName) {\n filters.push(\n create(FilterSchema, {\n condition: create(ConditionSchema, {\n field: \"workflow_name\",\n operator: Condition_Operator.EQ,\n value: { kind: { case: \"stringValue\", value: options.workflowName } },\n }),\n }),\n );\n }\n\n if (options?.status) {\n const statusValue = parseStatus(options.status);\n filters.push(\n create(FilterSchema, {\n condition: create(ConditionSchema, {\n field: \"status\",\n operator: Condition_Operator.EQ,\n value: { kind: { case: \"numberValue\", value: statusValue } },\n }),\n }),\n );\n }\n\n const filter =\n filters.length > 0\n ? create(FilterSchema, {\n and: filters,\n })\n : undefined;\n\n const executions = await fetchAll(async (pageToken) => {\n const { executions, nextPageToken } = await client.listWorkflowExecutions({\n workspaceId,\n pageToken,\n pageDirection: PageDirection.DESC,\n filter,\n });\n return [executions, nextPageToken];\n });\n\n return executions.map(toWorkflowExecutionInfo);\n}\n\n/**\n * Get a single workflow execution with optional logs.\n * @param options - Workflow execution lookup options\n * @returns Workflow execution with optional logs\n */\nexport async function getWorkflowExecution(\n options: GetWorkflowExecutionOptions,\n): Promise<GetWorkflowExecutionResult> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n async function fetchFunctionExecution(\n functionExecutionId: string,\n ): Promise<FunctionExecution | undefined> {\n try {\n const filter = create(FilterSchema, {\n condition: create(ConditionSchema, {\n field: \"id\",\n operator: Condition_Operator.EQ,\n value: { kind: { case: \"stringValue\", value: functionExecutionId } },\n }),\n });\n\n const response = await client.listFunctionExecutions({\n workspaceId,\n filter,\n pageSize: 1,\n });\n\n return response.executions[0];\n } catch {\n return undefined;\n }\n }\n\n async function fetchExecutionWithLogs(\n executionId: string,\n includeLogs: boolean,\n ): Promise<WorkflowExecutionDetailInfo> {\n const { execution } = await client.getWorkflowExecution({\n workspaceId,\n executionId,\n });\n\n if (!execution) {\n throw new Error(`Execution '${executionId}' not found.`);\n }\n\n const result: WorkflowExecutionDetailInfo = toWorkflowExecutionInfo(execution);\n\n if (includeLogs && execution.jobExecutions.length > 0) {\n result.jobDetails = await Promise.all(\n execution.jobExecutions.map(async (job) => {\n const jobInfo = toWorkflowJobExecutionInfo(job);\n if (job.executionId) {\n const functionExecution = await fetchFunctionExecution(job.executionId);\n if (functionExecution) {\n return {\n ...jobInfo,\n logs: functionExecution.logs || undefined,\n result: functionExecution.result || undefined,\n };\n }\n }\n return jobInfo;\n }),\n );\n }\n\n return result;\n }\n\n async function waitForCompletion(): Promise<WorkflowExecutionDetailInfo> {\n const interval = options.interval ?? 3000;\n\n while (true) {\n const { execution } = await client.getWorkflowExecution({\n workspaceId,\n executionId: options.executionId,\n });\n\n if (!execution) {\n throw new Error(`Execution '${options.executionId}' not found.`);\n }\n\n // Terminal states (SUCCESS, FAILED, PENDING_RESUME)\n if (isWorkflowExecutionTerminalStatus(execution.status)) {\n return await fetchExecutionWithLogs(options.executionId, options.logs ?? false);\n }\n\n await sleep(interval);\n }\n }\n\n const execution = await fetchExecutionWithLogs(options.executionId, options.logs ?? false);\n\n return {\n execution,\n wait: waitForCompletion,\n };\n}\n\nasync function waitWithSpinner(\n waitFn: () => Promise<WorkflowExecutionDetailInfo>,\n interval: number,\n json: boolean,\n): Promise<WorkflowExecutionDetailInfo> {\n const spinner = !json ? ora().start(\"Waiting for workflow to complete...\") : null;\n\n const updateInterval = setInterval(() => {\n if (spinner) {\n const now = formatTime(new Date());\n spinner.text = `Waiting for workflow to complete... (${now})`;\n }\n }, interval);\n\n try {\n const result = await waitFn();\n const coloredStatus = colorizeStatus(\n WorkflowExecution_Status[result.status as keyof typeof WorkflowExecution_Status],\n );\n if (result.status === \"SUCCESS\") {\n spinner?.succeed(`Completed: ${coloredStatus}`);\n } else {\n spinner?.fail(`Completed: ${coloredStatus}`);\n }\n return result;\n } finally {\n clearInterval(updateInterval);\n spinner?.stop();\n }\n}\n\n/**\n * Print a workflow execution and its logs in a human-readable format.\n * @param execution - Workflow execution detail info\n */\nexport function printExecutionWithLogs(execution: WorkflowExecutionDetailInfo): void {\n // Helper to format Date as ISO string or \"N/A\"\n const formatDate = (date: Date | null): string => (date ? date.toISOString() : \"N/A\");\n\n // Print execution summary\n const summaryData: [string, string][] = [\n [\"id\", execution.id],\n [\"workflowName\", execution.workflowName],\n [\"status\", execution.status],\n [\"jobExecutions\", execution.jobExecutions.toString()],\n [\"startedAt\", formatDate(execution.startedAt)],\n [\"finishedAt\", formatDate(execution.finishedAt)],\n ];\n logger.out(formatKeyValueTable(summaryData));\n\n // Print job details with logs\n if (execution.jobDetails && execution.jobDetails.length > 0) {\n logger.log(styles.bold(\"\\nJob Executions:\"));\n for (const job of execution.jobDetails) {\n logger.log(styles.info(`\\n--- ${job.stackedJobName} ---`));\n logger.log(` Status: ${job.status}`);\n logger.log(` Started: ${formatDate(job.startedAt)}`);\n logger.log(` Finished: ${formatDate(job.finishedAt)}`);\n\n if (job.logs) {\n logger.log(styles.warning(\"\\n Logs:\"));\n const logLines = job.logs.split(\"\\n\");\n for (const line of logLines) {\n logger.log(` ${line}`);\n }\n }\n\n if (job.result) {\n logger.log(styles.success(\"\\n Result:\"));\n try {\n const parsed = JSON.parse(job.result);\n logger.log(` ${JSON.stringify(parsed, null, 2).split(\"\\n\").join(\"\\n \")}`);\n } catch {\n logger.log(` ${job.result}`);\n }\n }\n }\n }\n}\n\nexport const executionsCommand = defineCommand({\n name: \"executions\",\n description: \"List or get workflow executions.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n executionId: arg(z.string().optional(), {\n positional: true,\n description: \"Execution ID (if provided, shows details)\",\n }),\n \"workflow-name\": arg(z.string().optional(), {\n alias: \"n\",\n description: \"Filter by workflow name (list mode only)\",\n }),\n status: arg(z.string().optional(), {\n alias: \"s\",\n description: \"Filter by status (list mode only)\",\n }),\n ...waitArgs,\n logs: arg(z.boolean().default(false), {\n description: \"Display job execution logs (detail mode only)\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n if (args.executionId) {\n const interval = parseDuration(args.interval);\n const { execution, wait } = await getWorkflowExecution({\n executionId: args.executionId,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n interval,\n logs: args.logs,\n });\n\n if (!args.json) {\n logger.info(`Execution ID: ${execution.id}`, { mode: \"stream\" });\n }\n\n const result = args.wait ? await waitWithSpinner(wait, interval, args.json) : execution;\n\n if (args.logs && !args.json) {\n printExecutionWithLogs(result);\n } else {\n logger.out(result);\n }\n } else {\n const executions = await listWorkflowExecutions({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n workflowName: args[\"workflow-name\"],\n status: args.status,\n });\n logger.out(executions);\n }\n }),\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, withCommonArgs, workspaceArgs } from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger } from \"../utils/logger\";\nimport { nameArgs } from \"./args\";\nimport { type WorkflowInfo, toWorkflowInfo } from \"./transform\";\n\nexport interface GetWorkflowOptions {\n name: string;\n workspaceId?: string;\n profile?: string;\n}\n\n/**\n * Resolve a workflow definition by name.\n * @param client - Operator client\n * @param workspaceId - Workspace ID\n * @param name - Workflow name\n * @returns Resolved workflow\n */\nexport async function resolveWorkflow(\n client: Awaited<ReturnType<typeof initOperatorClient>>,\n workspaceId: string,\n name: string,\n) {\n const { workflow } = await client.getWorkflowByName({\n workspaceId,\n workflowName: name,\n });\n if (!workflow) {\n throw new Error(`Workflow '${name}' not found.`);\n }\n return workflow;\n}\n\n/**\n * Get a workflow by name and return CLI-friendly info.\n * @param options - Workflow lookup options\n * @returns Workflow information\n */\nexport async function getWorkflow(options: GetWorkflowOptions): Promise<WorkflowInfo> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n try {\n const workflow = await resolveWorkflow(client, workspaceId, options.name);\n return toWorkflowInfo(workflow);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Workflow '${options.name}' not found.`);\n }\n throw error;\n }\n}\n\nexport const getCommand = defineCommand({\n name: \"get\",\n description: \"Get workflow details.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n ...nameArgs,\n }),\n run: withCommonArgs(async (args) => {\n const workflow = await getWorkflow({\n name: args.name,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n logger.out(workflow);\n }),\n});\n","import { create } from \"@bufbuild/protobuf\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport { AuthInvokerSchema } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\nimport {\n WorkflowExecution_Status,\n WorkflowJobExecution_Status,\n} from \"@tailor-proto/tailor/v1/workflow_resource_pb\";\nimport ora from \"ora\";\nimport { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, deploymentArgs, jsonArgs, parseDuration, withCommonArgs } from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadConfig } from \"../config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger, styles } from \"../utils/logger\";\nimport { nameArgs, waitArgs } from \"./args\";\nimport { getWorkflowExecution, printExecutionWithLogs } from \"./executions\";\nimport { resolveWorkflow } from \"./get\";\nimport { type WorkflowExecutionInfo, toWorkflowExecutionInfo } from \"./transform\";\nimport type { WorkflowExecution } from \"@tailor-proto/tailor/v1/workflow_resource_pb\";\nimport type { Jsonifiable } from \"type-fest\";\n\ntype WorkflowLike = {\n name: string;\n mainJob: {\n body: unknown;\n };\n};\n\ntype AuthInvoker<M extends string = string> = {\n namespace: string;\n machineUserName: M;\n};\n\ntype WorkflowInput<W extends WorkflowLike> = W extends WorkflowLike\n ? W[\"mainJob\"][\"body\"] extends (...args: infer Args) => unknown\n ? Args[0]\n : never\n : never;\n\ntype StartWorkflowArgOptionForSingleWorkflow<W extends WorkflowLike> = WorkflowLike extends W\n ? { arg?: Jsonifiable }\n : undefined extends WorkflowInput<W>\n ? { arg?: WorkflowInput<W> }\n : { arg: WorkflowInput<W> };\n\ntype StartWorkflowArgOption<W extends WorkflowLike> = W extends WorkflowLike\n ? StartWorkflowArgOptionForSingleWorkflow<W>\n : never;\n\n/**\n * @deprecated Use StartWorkflowTypedOptions instead.\n */\nexport interface StartWorkflowOptions {\n name: string;\n machineUser: string;\n arg?: Jsonifiable;\n workspaceId?: string;\n profile?: string;\n configPath?: string;\n interval?: number;\n}\n\ntype StartWorkflowTypedBaseOptions<W extends WorkflowLike> = {\n workflow: W;\n authInvoker: AuthInvoker<string>;\n workspaceId?: string;\n profile?: string;\n interval?: number;\n};\n\nexport type StartWorkflowTypedOptions<W extends WorkflowLike = WorkflowLike> =\n W extends WorkflowLike ? StartWorkflowTypedBaseOptions<W> & StartWorkflowArgOption<W> : never;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString(\"en-US\", { hour12: false });\n}\n\nfunction colorizeStatus(status: WorkflowExecution_Status): string {\n const statusText = WorkflowExecution_Status[status];\n switch (status) {\n case WorkflowExecution_Status.PENDING:\n return styles.dim(statusText);\n case WorkflowExecution_Status.PENDING_RESUME:\n return styles.warning(statusText);\n case WorkflowExecution_Status.RUNNING:\n return styles.info(statusText);\n case WorkflowExecution_Status.SUCCESS:\n return styles.success(statusText);\n case WorkflowExecution_Status.FAILED:\n return styles.error(statusText);\n default:\n return statusText;\n }\n}\n\nexport interface WaitForExecutionOptions {\n client: Awaited<ReturnType<typeof initOperatorClient>>;\n workspaceId: string;\n executionId: string;\n interval: number;\n showProgress?: boolean;\n trackJobs?: boolean;\n}\n\n/**\n * Wait for a workflow execution to reach a terminal state, optionally showing progress.\n * @param options - Wait options\n * @returns Final workflow execution info\n */\nexport async function waitForExecution(\n options: WaitForExecutionOptions,\n): Promise<WorkflowExecutionInfo> {\n const { client, workspaceId, executionId, interval, showProgress, trackJobs } = options;\n\n let lastStatus: WorkflowExecution_Status | undefined;\n let lastRunningJobs: string | undefined;\n const spinner = showProgress\n ? ora({\n indent: 2,\n }).start(\"Waiting for workflow to complete...\")\n : null;\n\n try {\n while (true) {\n const { execution } = await client.getWorkflowExecution({\n workspaceId,\n executionId,\n });\n\n if (!execution) {\n spinner?.fail(`Execution '${executionId}' not found.`);\n throw new Error(`Execution '${executionId}' not found.`);\n }\n\n const now = formatTime(new Date());\n const coloredStatus = colorizeStatus(execution.status);\n\n // Show workflow status change (persist previous line)\n if (execution.status !== lastStatus) {\n if (showProgress) {\n spinner?.stop();\n logger.info(`Status: ${coloredStatus}`, {\n mode: \"stream\",\n indent: 2,\n });\n spinner?.start(`Waiting for workflow to complete...`);\n }\n lastStatus = execution.status;\n }\n\n // Show job execution details when running (optional)\n if (trackJobs && execution.status === WorkflowExecution_Status.RUNNING) {\n const runningJobs = getRunningJobs(execution);\n if (runningJobs && runningJobs !== lastRunningJobs) {\n if (showProgress) {\n spinner?.stop();\n logger.info(`Job | ${runningJobs}: ${coloredStatus}`, {\n mode: \"stream\",\n indent: 2,\n });\n spinner?.start(`Waiting for workflow to complete...`);\n }\n lastRunningJobs = runningJobs;\n }\n }\n\n if (spinner) {\n spinner.text = `Waiting for workflow to complete... (${now})`;\n }\n\n // Terminal states: SUCCESS, FAILED, or PENDING_RESUME\n if (isTerminalStatus(execution.status)) {\n if (execution.status === WorkflowExecution_Status.SUCCESS) {\n spinner?.succeed(`Completed: ${coloredStatus}`);\n } else if (execution.status === WorkflowExecution_Status.FAILED) {\n spinner?.fail(`Completed: ${coloredStatus}`);\n } else {\n spinner?.warn(`Completed: ${coloredStatus}`);\n }\n return toWorkflowExecutionInfo(execution);\n }\n\n await sleep(interval);\n }\n } catch (error) {\n spinner?.stop();\n throw error;\n }\n}\n\nfunction getRunningJobs(execution: WorkflowExecution): string {\n return execution.jobExecutions\n .filter((job) => job.status === WorkflowJobExecution_Status.RUNNING)\n .map((job) => job.stackedJobName)\n .join(\", \");\n}\n\nfunction isTerminalStatus(status: WorkflowExecution_Status): boolean {\n return (\n status === WorkflowExecution_Status.SUCCESS ||\n status === WorkflowExecution_Status.FAILED ||\n status === WorkflowExecution_Status.PENDING_RESUME\n );\n}\n\nexport interface WaitOptions {\n showProgress?: boolean;\n}\n\nexport interface StartWorkflowResultWithWait {\n executionId: string;\n wait: (options?: WaitOptions) => Promise<WorkflowExecutionInfo>;\n}\n\ninterface StartWorkflowCoreOptions {\n client: Awaited<ReturnType<typeof initOperatorClient>>;\n workspaceId: string;\n workflowName: string;\n authInvoker: AuthInvoker<string>;\n arg?: unknown;\n interval?: number;\n}\n\nasync function startWorkflowCore(\n options: StartWorkflowCoreOptions,\n): Promise<StartWorkflowResultWithWait> {\n const { client, workspaceId, workflowName } = options;\n\n try {\n const workflow = await resolveWorkflow(client, workspaceId, workflowName);\n const authInvoker = create(AuthInvokerSchema, options.authInvoker);\n const arg =\n options.arg === undefined\n ? undefined\n : typeof options.arg === \"string\"\n ? options.arg\n : JSON.stringify(options.arg);\n\n const { executionId } = await client.testStartWorkflow({\n workspaceId,\n workflowId: workflow.id,\n authInvoker,\n arg,\n });\n\n return {\n executionId,\n wait: (waitOptions?: WaitOptions) =>\n waitForExecution({\n client,\n workspaceId,\n executionId,\n interval: options.interval ?? 3000,\n showProgress: waitOptions?.showProgress,\n trackJobs: true,\n }),\n };\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Workflow '${workflowName}' not found.`);\n }\n throw error;\n }\n}\n\nasync function startWorkflowByName(\n options: StartWorkflowOptions,\n): Promise<StartWorkflowResultWithWait> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n const { config } = await loadConfig(options.configPath);\n const { application } = await client.getApplication({\n workspaceId,\n applicationName: config.name,\n });\n if (!application?.authNamespace) {\n throw new Error(`Application ${config.name} does not have an auth configuration.`);\n }\n\n return await startWorkflowCore({\n client,\n workspaceId,\n workflowName: options.name,\n authInvoker: {\n namespace: application.authNamespace,\n machineUserName: options.machineUser,\n },\n arg: options.arg,\n interval: options.interval,\n });\n}\n\n/**\n * Start a workflow and return a handle to wait for completion.\n * @param options - Start options\n * @returns Start result with wait helper\n */\nexport async function startWorkflow<W extends WorkflowLike>(\n options: StartWorkflowTypedOptions<W>,\n): Promise<StartWorkflowResultWithWait>;\nexport async function startWorkflow(\n options: StartWorkflowOptions,\n): Promise<StartWorkflowResultWithWait>;\nexport async function startWorkflow<W extends WorkflowLike>(\n options: StartWorkflowOptions | StartWorkflowTypedOptions<W>,\n): Promise<StartWorkflowResultWithWait> {\n // Keep backward compatibility: if both legacy and typed keys are present, prefer legacy shape.\n if (\"name\" in options) {\n return await startWorkflowByName(options);\n }\n\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n return await startWorkflowCore({\n client,\n workspaceId,\n workflowName: options.workflow.name,\n authInvoker: options.authInvoker,\n arg: options.arg,\n interval: options.interval,\n });\n}\n\nexport const startCommand = defineCommand({\n name: \"start\",\n description: \"Start a workflow execution.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...deploymentArgs,\n ...nameArgs,\n machineuser: arg(z.string(), {\n alias: \"m\",\n description: \"Machine user name\",\n }),\n arg: arg(z.string().optional(), {\n alias: \"a\",\n description: \"Workflow argument (JSON string)\",\n }),\n ...waitArgs,\n }),\n run: withCommonArgs(async (args) => {\n const { executionId, wait } = await startWorkflowByName({\n name: args.name,\n machineUser: args.machineuser,\n arg: args.arg,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n configPath: args.config,\n interval: parseDuration(args.interval),\n });\n\n logger.info(`Execution ID: ${executionId}`, { mode: \"stream\" });\n\n if (args.wait) {\n const result = await wait({ showProgress: true });\n if (args.logs && !args.json) {\n const { execution } = await getWorkflowExecution({\n executionId,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n logs: true,\n });\n printExecutionWithLogs(execution);\n } else {\n logger.out(result);\n }\n } else {\n logger.out({ executionId });\n }\n }),\n});\n","import { setTimeout } from \"timers/promises\";\nimport { create } from \"@bufbuild/protobuf\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport {\n ExecutorJobStatus,\n ExecutorTargetType,\n} from \"@tailor-proto/tailor/v1/executor_resource_pb\";\nimport { FunctionExecution_Status } from \"@tailor-proto/tailor/v1/function_resource_pb\";\nimport {\n Condition_Operator,\n ConditionSchema,\n FilterSchema,\n PageDirection,\n} from \"@tailor-proto/tailor/v1/resource_pb\";\nimport ora from \"ora\";\nimport { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport {\n commonArgs,\n durationArg,\n jsonArgs,\n parseDuration,\n positiveIntArg,\n withCommonArgs,\n workspaceArgs,\n} from \"../args\";\nimport { fetchAll, initOperatorClient } from \"../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { formatKeyValueTable } from \"../utils/format\";\nimport { functionExecutionStatusToString } from \"../utils/function-execution\";\nimport { logger, styles } from \"../utils/logger\";\nimport { getWorkflowExecution } from \"../workflow/executions\";\nimport { waitForExecution } from \"../workflow/start\";\nimport {\n colorizeExecutorJobStatus,\n colorizeFunctionExecutionStatus,\n executorTargetTypeToString,\n isFunctionExecutionTerminalStatus,\n isExecutorJobTerminalStatus,\n parseExecutorJobStatus,\n} from \"./status\";\nimport {\n type ExecutorJobListInfo,\n type ExecutorJobInfo,\n type ExecutorJobAttemptInfo,\n toExecutorJobListInfo,\n toExecutorJobInfo,\n toExecutorJobAttemptInfo,\n} from \"./transform\";\n\nexport interface ListExecutorJobsOptions {\n executorName: string;\n status?: string;\n limit?: number;\n workspaceId?: string;\n profile?: string;\n}\n\nexport interface GetExecutorJobOptions {\n executorName: string;\n jobId: string;\n attempts?: boolean;\n workspaceId?: string;\n profile?: string;\n}\n\nexport interface WatchExecutorJobOptions {\n executorName: string;\n jobId: string;\n workspaceId?: string;\n profile?: string;\n interval?: number;\n logs?: boolean;\n}\n\nexport interface ExecutorJobDetailInfo extends ExecutorJobInfo {\n attempts?: ExecutorJobAttemptInfo[];\n}\n\nexport interface WorkflowJobLog {\n jobName: string;\n logs?: string;\n result?: string;\n}\n\nexport interface WatchExecutorJobResult {\n job: ExecutorJobDetailInfo;\n targetType: string;\n workflowExecutionId?: string;\n workflowStatus?: string;\n workflowJobLogs?: WorkflowJobLog[];\n functionExecutionId?: string;\n functionStatus?: string;\n functionLogs?: string;\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString(\"en-US\", { hour12: false });\n}\n\n/**\n * List executor jobs for a given executor.\n * @param options - Options for listing executor jobs\n * @returns List of executor job information\n */\nexport async function listExecutorJobs(\n options: ListExecutorJobsOptions,\n): Promise<ExecutorJobListInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n const filters: ReturnType<typeof create<typeof FilterSchema>>[] = [];\n\n if (options.status) {\n const statusValue = parseExecutorJobStatus(options.status);\n filters.push(\n create(FilterSchema, {\n condition: create(ConditionSchema, {\n field: \"status\",\n operator: Condition_Operator.EQ,\n value: { kind: { case: \"numberValue\", value: statusValue } },\n }),\n }),\n );\n }\n\n const filter = filters.length > 0 ? create(FilterSchema, { and: filters }) : undefined;\n\n try {\n const { jobs } = await client.listExecutorJobs({\n workspaceId,\n executorName: options.executorName,\n pageSize: options.limit,\n pageDirection: PageDirection.DESC,\n filter,\n });\n\n return jobs.map(toExecutorJobListInfo);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Executor '${options.executorName}' not found.`);\n }\n throw error;\n }\n}\n\n/**\n * Get details of a specific executor job.\n * @param options - Options for getting executor job details\n * @returns Executor job detail information\n */\nexport async function getExecutorJob(\n options: GetExecutorJobOptions,\n): Promise<ExecutorJobDetailInfo> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n try {\n const { job } = await client.getExecutorJob({\n workspaceId,\n executorName: options.executorName,\n jobId: options.jobId,\n });\n\n if (!job) {\n throw new Error(`Job '${options.jobId}' not found.`);\n }\n\n const jobInfo = toExecutorJobInfo(job);\n\n if (options.attempts) {\n const attempts = await fetchAll(async (pageToken) => {\n const { attempts, nextPageToken } = await client.listExecutorJobAttempts({\n workspaceId,\n jobId: options.jobId,\n pageToken,\n pageDirection: PageDirection.DESC,\n });\n return [attempts, nextPageToken];\n });\n\n return {\n ...jobInfo,\n attempts: attempts.map(toExecutorJobAttemptInfo),\n };\n }\n\n return jobInfo;\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Job '${options.jobId}' not found for executor '${options.executorName}'.`);\n }\n throw error;\n }\n}\n\n/**\n * Watch an executor job until completion, including downstream executions.\n * @param options - Options for watching executor job\n * @returns Result including job details and downstream execution info\n */\nexport async function watchExecutorJob(\n options: WatchExecutorJobOptions,\n): Promise<WatchExecutorJobResult> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n const interval = options.interval ?? 3000;\n const spinner = ora().start(\"Waiting for executor job to complete...\");\n\n try {\n // Get executor details to determine target type\n const { executor } = await client.getExecutorExecutor({\n workspaceId,\n name: options.executorName,\n });\n\n if (!executor) {\n throw new Error(`Executor '${options.executorName}' not found.`);\n }\n\n const targetType = executor.targetType;\n const targetTypeStr = executorTargetTypeToString(targetType);\n\n // Phase 1: Wait for executor job to complete\n let job: Awaited<ReturnType<typeof client.getExecutorJob>>[\"job\"];\n while (true) {\n const response = await client.getExecutorJob({\n workspaceId,\n executorName: options.executorName,\n jobId: options.jobId,\n });\n\n job = response.job;\n if (!job) {\n throw new Error(`Job '${options.jobId}' not found.`);\n }\n\n if (isExecutorJobTerminalStatus(job.status)) {\n break;\n }\n\n spinner.text = `Waiting for executor job... (${formatTime(new Date())})`;\n await setTimeout(interval);\n }\n\n const jobInfo = toExecutorJobInfo(job);\n const coloredStatus = colorizeExecutorJobStatus(jobInfo.status);\n\n if (job.status === ExecutorJobStatus.SUCCESS) {\n spinner.succeed(`Executor job completed: ${coloredStatus}`);\n } else {\n spinner.fail(`Executor job completed: ${coloredStatus}`);\n }\n\n // Get attempts to find operationReference\n const attempts = await fetchAll(async (pageToken) => {\n const { attempts, nextPageToken } = await client.listExecutorJobAttempts({\n workspaceId,\n jobId: options.jobId,\n pageToken,\n pageDirection: PageDirection.DESC,\n });\n return [attempts, nextPageToken];\n });\n\n const attemptInfos = attempts.map(toExecutorJobAttemptInfo);\n const jobDetail: ExecutorJobDetailInfo = {\n ...jobInfo,\n attempts: attemptInfos,\n };\n\n const latestAttempt = attemptInfos[0];\n const operationReference = latestAttempt?.operationReference;\n\n // Phase 2: Based on target type, wait for the downstream execution\n if (operationReference) {\n switch (targetType) {\n case ExecutorTargetType.WORKFLOW: {\n // Wait for workflow execution with progress display\n spinner.stop();\n\n try {\n // Use waitForExecution with progress display (same as workflow start)\n const executionResult = await waitForExecution({\n client,\n workspaceId,\n executionId: operationReference,\n interval,\n showProgress: true,\n trackJobs: true,\n });\n\n // Fetch logs if requested\n let workflowJobLogs: WorkflowJobLog[] | undefined;\n if (options.logs) {\n const { execution: execWithLogs } = await getWorkflowExecution({\n executionId: operationReference,\n workspaceId: options.workspaceId,\n profile: options.profile,\n logs: true,\n });\n if (execWithLogs.jobDetails) {\n workflowJobLogs = execWithLogs.jobDetails\n .filter((job) => job.logs || job.result)\n .map((job) => ({\n jobName: job.stackedJobName || job.id,\n logs: job.logs,\n result: job.result,\n }));\n }\n }\n\n return {\n job: jobDetail,\n targetType: targetTypeStr,\n workflowExecutionId: operationReference,\n workflowStatus: executionResult.status,\n workflowJobLogs,\n };\n } catch (error) {\n logger.warn(\n `Could not track workflow execution: ${error instanceof Error ? error.message : error}`,\n );\n return {\n job: jobDetail,\n targetType: targetTypeStr,\n workflowExecutionId: operationReference,\n };\n }\n }\n\n case ExecutorTargetType.FUNCTION:\n case ExecutorTargetType.JOB_FUNCTION:\n {\n // Wait for function execution\n spinner.start(`Waiting for function execution ${operationReference}...`);\n\n try {\n while (true) {\n const { execution } = await client.getFunctionExecution({\n workspaceId,\n executionId: operationReference,\n });\n\n if (!execution) {\n throw new Error(`Function execution '${operationReference}' not found.`);\n }\n\n if (isFunctionExecutionTerminalStatus(execution.status)) {\n const statusStr = functionExecutionStatusToString(execution.status);\n const coloredFnStatus = colorizeFunctionExecutionStatus(statusStr);\n if (execution.status === FunctionExecution_Status.SUCCESS) {\n spinner.succeed(`Function execution completed: ${coloredFnStatus}`);\n } else {\n spinner.fail(`Function execution completed: ${coloredFnStatus}`);\n }\n return {\n job: jobDetail,\n targetType: targetTypeStr,\n functionExecutionId: operationReference,\n functionStatus: statusStr,\n functionLogs: options.logs ? execution.logs || undefined : undefined,\n };\n }\n\n spinner.text = `Waiting for function execution... (${formatTime(new Date())})`;\n await setTimeout(interval);\n }\n } catch (error) {\n spinner.warn(\n `Could not track function execution: ${error instanceof Error ? error.message : error}`,\n );\n return {\n job: jobDetail,\n targetType: targetTypeStr,\n functionExecutionId: operationReference,\n };\n }\n }\n break;\n default:\n // WEBHOOK, TAILOR_GRAPHQL, or unknown - no downstream execution to track\n break;\n }\n }\n\n return { job: jobDetail, targetType: targetTypeStr };\n } finally {\n spinner.stop();\n }\n}\n\nfunction printJobWithAttempts(job: ExecutorJobDetailInfo): void {\n // Print job summary\n const summaryData: [string, string][] = [\n [\"id\", job.id],\n [\"executorName\", job.executorName],\n [\"status\", job.status],\n [\"scheduledAt\", job.scheduledAt],\n [\"createdAt\", job.createdAt],\n [\"updatedAt\", job.updatedAt],\n ];\n logger.log(formatKeyValueTable(summaryData));\n\n // Print attempts\n if (job.attempts && job.attempts.length > 0) {\n logger.log(styles.bold(\"\\nAttempts:\"));\n for (const attempt of job.attempts) {\n logger.log(styles.info(`\\n--- Attempt ${attempt.id} ---`));\n logger.log(` Status: ${attempt.status}`);\n logger.log(` Started: ${attempt.startedAt}`);\n logger.log(` Finished: ${attempt.finishedAt}`);\n\n if (attempt.error) {\n logger.log(styles.error(\"\\n Error:\"));\n const errorLines = attempt.error.split(\"\\n\");\n for (const line of errorLines) {\n logger.log(` ${line}`);\n }\n }\n }\n }\n}\n\nexport const jobsCommand = defineCommand({\n name: \"jobs\",\n description: \"List or get executor jobs.\",\n examples: [\n {\n cmd: \"my-executor\",\n desc: \"List jobs for an executor (default: 50 jobs)\",\n },\n { cmd: \"my-executor --limit 10\", desc: \"Limit the number of jobs\" },\n { cmd: \"my-executor -s RUNNING\", desc: \"Filter by status\" },\n { cmd: \"my-executor <job-id>\", desc: \"Get job details\" },\n {\n cmd: \"my-executor <job-id> --attempts\",\n desc: \"Get job details with attempts\",\n },\n { cmd: \"my-executor <job-id> -W\", desc: \"Wait for job to complete\" },\n {\n cmd: \"my-executor <job-id> -W -l\",\n desc: \"Wait for job with logs\",\n },\n ],\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n executorName: arg(z.string(), {\n positional: true,\n description: \"Executor name\",\n }),\n jobId: arg(z.string().optional(), {\n positional: true,\n description: \"Job ID (if provided, shows job details)\",\n }),\n status: arg(z.string().optional(), {\n alias: \"s\",\n description:\n \"Filter by status (PENDING, RUNNING, SUCCESS, FAILED, CANCELED) (list mode only)\",\n }),\n attempts: arg(z.boolean().default(false), {\n description: \"Show job attempts (only with job ID) (detail mode only)\",\n }),\n wait: arg(z.boolean().default(false), {\n alias: \"W\",\n description:\n \"Wait for job completion and downstream execution (workflow/function) if applicable (detail mode only)\",\n }),\n interval: arg(durationArg.default(\"3s\"), {\n alias: \"i\",\n description: \"Polling interval when using --wait (e.g., '3s', '500ms', '1m')\",\n }),\n logs: arg(z.boolean().default(false), {\n alias: \"l\",\n description: \"Display function execution logs after completion (requires --wait)\",\n }),\n limit: arg(positiveIntArg.optional(), {\n description: \"Maximum number of jobs to list (default: 50, max: 1000) (list mode only)\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n if (args.jobId) {\n if (args.wait) {\n const result = await watchExecutorJob({\n executorName: args.executorName,\n jobId: args.jobId,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n interval: parseDuration(args.interval),\n logs: args.logs,\n });\n\n // Print result\n if (!args.json) {\n logger.log(styles.bold(`Target Type: ${result.targetType}\\n`));\n printJobWithAttempts(result.job);\n if (result.workflowExecutionId) {\n logger.log(styles.bold(\"\\nWorkflow Execution:\"));\n logger.log(` ID: ${result.workflowExecutionId}`);\n if (result.workflowStatus) {\n logger.log(` Status: ${result.workflowStatus}`);\n }\n if (result.workflowJobLogs && result.workflowJobLogs.length > 0) {\n for (const jobLog of result.workflowJobLogs) {\n logger.log(styles.bold(`\\n Job: ${jobLog.jobName}`));\n if (jobLog.logs) {\n logger.log(styles.dim(\" Logs:\"));\n for (const line of jobLog.logs.split(\"\\n\")) {\n logger.log(` ${line}`);\n }\n }\n if (jobLog.result) {\n logger.log(styles.dim(\" Result:\"));\n try {\n const parsed = JSON.parse(jobLog.result);\n const formatted = JSON.stringify(parsed, null, 2);\n for (const line of formatted.split(\"\\n\")) {\n logger.log(` ${line}`);\n }\n } catch {\n logger.log(` ${jobLog.result}`);\n }\n }\n }\n }\n }\n if (result.functionExecutionId) {\n logger.log(styles.bold(\"\\nFunction Execution:\"));\n logger.log(` ID: ${result.functionExecutionId}`);\n if (result.functionStatus) {\n logger.log(` Status: ${result.functionStatus}`);\n }\n if (result.functionLogs) {\n logger.log(styles.dim(\" Logs:\"));\n for (const line of result.functionLogs.split(\"\\n\")) {\n logger.log(` ${line}`);\n }\n }\n }\n } else {\n logger.out(result);\n }\n return;\n }\n\n const job = await getExecutorJob({\n executorName: args.executorName,\n jobId: args.jobId,\n attempts: args.attempts,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n if (args.attempts && !args.json) {\n printJobWithAttempts(job);\n } else {\n logger.out(job);\n }\n } else {\n if (args.wait) {\n logger.warn(\"--wait flag is ignored in list mode. Specify a job ID to wait.\");\n }\n const jobs = await listExecutorJobs({\n executorName: args.executorName,\n status: args.status,\n limit: args.limit,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n logger.out(jobs);\n }\n }),\n});\n","import { defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, withCommonArgs, workspaceArgs } from \"../args\";\nimport { fetchAll, initOperatorClient } from \"../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger, styles } from \"../utils/logger\";\nimport { type ExecutorListInfo, toExecutorListInfo } from \"./transform\";\n\nexport interface ListExecutorsOptions {\n workspaceId?: string;\n profile?: string;\n}\n\n/**\n * List executors in the workspace and return CLI-friendly info.\n * @param options - Executor listing options\n * @returns List of executors\n */\nexport async function listExecutors(options?: ListExecutorsOptions): Promise<ExecutorListInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n const executors = await fetchAll(async (pageToken) => {\n const { executors, nextPageToken } = await client.listExecutorExecutors({\n workspaceId,\n pageToken,\n });\n return [executors, nextPageToken];\n });\n\n return executors.map((e) => toExecutorListInfo(e));\n}\n\nexport const listCommand = defineCommand({\n name: \"list\",\n description: \"List all executors\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n }),\n run: withCommonArgs(async (args) => {\n const executors = await listExecutors({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (executors.length === 0) {\n logger.info(\"No executors found.\");\n return;\n }\n\n logger.out(executors, {\n display: {\n disabled: (v) => (v ? styles.warning(\"true\") : styles.dim(\"false\")),\n },\n });\n\n // Show hint if there are webhook executors (non-JSON mode only)\n if (!args.json) {\n const hasWebhook = executors.some((e) => e.triggerType === \"webhook\");\n if (hasWebhook) {\n logger.info(\"To see webhook URLs, run: tailor-sdk executor webhook list\");\n }\n }\n }),\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { ExecutorTriggerType } from \"@tailor-proto/tailor/v1/executor_resource_pb\";\nimport { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport {\n commonArgs,\n durationArg,\n jsonArgs,\n parseDuration,\n withCommonArgs,\n workspaceArgs,\n} from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger, styles } from \"../utils/logger\";\nimport { watchExecutorJob } from \"./jobs\";\nimport { executorTriggerTypeToString } from \"./status\";\nimport type { IncomingWebhookTrigger, ScheduleTriggerInput } from \"@/parser/service/executor/types\";\nimport type { JsonObject } from \"@bufbuild/protobuf\";\n\n/**\n * Schema for JSON string validation (object only)\n * Transforms the string to a parsed object\n */\nconst jsonDataArg = z\n .string()\n .transform((val) => {\n try {\n return JSON.parse(val) as unknown;\n } catch {\n throw new Error(`Invalid JSON data: ${val}. Please provide a valid JSON string.`);\n }\n })\n .refine((v): v is JsonObject => typeof v === \"object\" && v !== null && !Array.isArray(v), {\n message: \"JSON data must be an object, not an array or primitive value\",\n });\n\n/**\n * Schema for header string validation (format: \"Key: Value\")\n * Transforms the string to an object with key and value properties\n */\nconst headerArg = z\n .string()\n .superRefine((val, ctx) => {\n if (!val.includes(\":\")) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid header format: '${val}'. Expected format: 'Key: Value'`,\n });\n }\n })\n .transform((val) => {\n const colonIndex = val.indexOf(\":\");\n return {\n key: val.slice(0, colonIndex).trim(),\n value: val.slice(colonIndex + 1).trim(),\n };\n })\n .refine((h) => h.key.length > 0, {\n message: \"Header name cannot be empty\",\n });\n\ntype ManualTrigger = IncomingWebhookTrigger | ScheduleTriggerInput;\n\ntype ManualTriggerExecutor<T extends ManualTrigger = ManualTrigger> = T extends ManualTrigger\n ? {\n name: string;\n trigger: T;\n }\n : never;\n\ntype TriggerExecutorBaseOptions<E extends ManualTriggerExecutor> = {\n executor: E;\n workspaceId?: string;\n profile?: string;\n};\n\n/**\n * @deprecated Use TriggerExecutorTypedOptions instead.\n */\nexport interface TriggerExecutorOptions {\n executorName: string;\n payload?: JsonObject;\n workspaceId?: string;\n profile?: string;\n}\n\nexport type TriggerExecutorTypedOptions<E extends ManualTriggerExecutor = ManualTriggerExecutor> =\n E extends ManualTriggerExecutor<IncomingWebhookTrigger>\n ? TriggerExecutorBaseOptions<E> & { payload?: JsonObject }\n : TriggerExecutorBaseOptions<E> & { payload?: never };\n\nexport interface TriggerExecutorResult {\n jobId?: string;\n}\n\nasync function triggerExecutorByName(\n options: TriggerExecutorOptions,\n): Promise<TriggerExecutorResult> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n try {\n const response = await client.triggerExecutor({\n workspaceId,\n executorName: options.executorName,\n payload: options.payload,\n });\n\n return { jobId: response.jobId };\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Executor '${options.executorName}' not found.`);\n }\n if (error instanceof ConnectError && error.code === Code.InvalidArgument) {\n throw new Error(`Invalid argument: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Trigger an executor and return the job ID.\n * @param options - Options for triggering executor\n * @returns Result containing the job ID if available\n */\nexport async function triggerExecutor<E extends ManualTriggerExecutor>(\n options: TriggerExecutorTypedOptions<E>,\n): Promise<TriggerExecutorResult>;\nexport async function triggerExecutor(\n options: TriggerExecutorOptions,\n): Promise<TriggerExecutorResult>;\nexport async function triggerExecutor<E extends ManualTriggerExecutor>(\n options: TriggerExecutorOptions | TriggerExecutorTypedOptions<E>,\n): Promise<TriggerExecutorResult> {\n // Keep backward compatibility: if both legacy and typed keys are present, prefer legacy shape.\n if (\"executorName\" in options) {\n return await triggerExecutorByName(options);\n }\n\n if (options.executor.trigger.kind !== \"incomingWebhook\" && options.payload !== undefined) {\n throw new Error(\n `Executor '${options.executor.name}' has '${options.executor.trigger.kind}' trigger type. ` +\n `The payload is only available for 'incomingWebhook' trigger type.`,\n );\n }\n\n return await triggerExecutorByName({\n executorName: options.executor.name,\n payload: options.payload,\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n}\n\nexport const triggerCommand = defineCommand({\n name: \"trigger\",\n description: \"Trigger an executor manually.\",\n notes: `Only executors with \\`INCOMING_WEBHOOK\\` or \\`SCHEDULE\\` trigger types can be triggered manually.\nExecutors with \\`EVENT\\` trigger types (such as \\`recordCreated\\`, \\`recordUpdated\\`, \\`recordDeleted\\`) cannot be triggered manually.\n\nThe \\`--data\\` and \\`--header\\` options are only available for \\`INCOMING_WEBHOOK\\` trigger type.\n\n**Downstream Execution Tracking**\n\nWhen using \\`--wait\\`, the CLI tracks not only the executor job but also any downstream executions:\n\n- **Workflow targets**: Waits for the workflow execution to complete (SUCCESS, FAILED, or PENDING_RESUME). Shows real-time status changes and currently running job names during execution (same output as \\`workflow start --wait\\`).\n- **Function targets**: Waits for the function execution to complete\n- **Webhook/GraphQL targets**: Only waits for the executor job itself\n\nThe \\`--logs\\` option displays logs from the downstream execution when available.`,\n examples: [\n { cmd: \"my-executor\", desc: \"Trigger an executor\" },\n {\n cmd: 'my-executor -d \\'{\"message\": \"hello\"}\\'',\n desc: \"Trigger with data\",\n },\n {\n cmd: 'my-executor -d \\'{\"message\": \"hello\"}\\' -H \"X-Custom: value\" -H \"X-Another: value2\"',\n desc: \"Trigger with data and headers\",\n },\n { cmd: \"my-executor -W\", desc: \"Trigger and wait for completion\" },\n { cmd: \"my-executor -W -l\", desc: \"Trigger, wait, and show logs\" },\n ],\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n executorName: arg(z.string(), {\n positional: true,\n description: \"Executor name\",\n }),\n data: arg(jsonDataArg.optional(), {\n alias: \"d\",\n description: \"Request body (JSON string)\",\n }),\n header: arg(headerArg.array().optional(), {\n alias: \"H\",\n overrideBuiltinAlias: true,\n description: \"Request header (format: 'Key: Value', can be specified multiple times)\",\n }),\n wait: arg(z.boolean().default(false), {\n alias: \"W\",\n description:\n \"Wait for job completion and downstream execution (workflow/function) if applicable\",\n }),\n interval: arg(durationArg.default(\"3s\"), {\n alias: \"i\",\n description: \"Polling interval when using --wait (e.g., '3s', '500ms', '1m')\",\n }),\n logs: arg(z.boolean().default(false), {\n alias: \"l\",\n description: \"Display function execution logs after completion (requires --wait)\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n // Validate trigger type before processing\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const { executor } = await client.getExecutorExecutor({\n workspaceId,\n name: args.executorName,\n });\n\n if (!executor) {\n throw new Error(`Executor '${args.executorName}' not found.`);\n }\n\n // EVENT trigger type cannot be triggered manually\n if (executor.triggerType === ExecutorTriggerType.EVENT) {\n throw new Error(\n `Executor '${args.executorName}' has '${executorTriggerTypeToString(executor.triggerType)}' trigger type and cannot be triggered manually. ` +\n `Only executors with 'INCOMING_WEBHOOK' or 'SCHEDULE' triggers can be triggered manually.`,\n );\n }\n\n // SCHEDULE trigger type does not accept --data or --header options\n if (executor.triggerType === ExecutorTriggerType.SCHEDULE && (args.data || args.header)) {\n throw new Error(\n `Executor '${args.executorName}' has 'SCHEDULE' trigger type. ` +\n `The --data and --header options are only available for 'INCOMING_WEBHOOK' trigger type.`,\n );\n }\n\n let payload: JsonObject | undefined;\n\n // Build payload if data or headers are provided\n const body: JsonObject | undefined = args.data;\n const headers: Record<string, string> = {};\n if (args.header) {\n for (const h of args.header) {\n headers[h.key] = h.value;\n }\n }\n\n if (body !== undefined || Object.keys(headers).length > 0) {\n payload = {\n body: body ?? {},\n headers,\n };\n }\n\n const result = await triggerExecutorByName({\n executorName: args.executorName,\n payload,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (!result.jobId) {\n logger.success(`Executor '${args.executorName}' triggered successfully.`);\n if (args.wait) {\n logger.warn(\"Cannot watch: job ID not available. The API may need to be updated.\");\n }\n return;\n }\n\n logger.success(\n `Executor '${args.executorName}' triggered successfully. Job ID: ${result.jobId}`,\n );\n\n if (args.wait) {\n const watchResult = await watchExecutorJob({\n executorName: args.executorName,\n jobId: result.jobId,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n interval: parseDuration(args.interval),\n logs: args.logs,\n });\n\n // Print result\n if (!args.json) {\n logger.log(styles.bold(`\\nTarget Type: ${watchResult.targetType}`));\n logger.log(`Job Status: ${watchResult.job.status}`);\n\n if (watchResult.workflowExecutionId) {\n logger.log(styles.bold(\"\\nWorkflow Execution:\"));\n logger.log(` ID: ${watchResult.workflowExecutionId}`);\n if (watchResult.workflowStatus) {\n logger.log(` Status: ${watchResult.workflowStatus}`);\n }\n if (watchResult.workflowJobLogs && watchResult.workflowJobLogs.length > 0) {\n for (const jobLog of watchResult.workflowJobLogs) {\n logger.log(styles.bold(`\\n Job: ${jobLog.jobName}`));\n if (jobLog.logs) {\n logger.log(styles.dim(\" Logs:\"));\n for (const line of jobLog.logs.split(\"\\n\")) {\n logger.log(` ${line}`);\n }\n }\n if (jobLog.result) {\n logger.log(styles.dim(\" Result:\"));\n try {\n const parsed = JSON.parse(jobLog.result);\n const formatted = JSON.stringify(parsed, null, 2);\n for (const line of formatted.split(\"\\n\")) {\n logger.log(` ${line}`);\n }\n } catch {\n logger.log(` ${jobLog.result}`);\n }\n }\n }\n }\n }\n if (watchResult.functionExecutionId) {\n logger.log(styles.bold(\"\\nFunction Execution:\"));\n logger.log(` ID: ${watchResult.functionExecutionId}`);\n if (watchResult.functionStatus) {\n logger.log(` Status: ${watchResult.functionStatus}`);\n }\n if (watchResult.functionLogs) {\n logger.log(styles.dim(\" Logs:\"));\n for (const line of watchResult.functionLogs.split(\"\\n\")) {\n logger.log(` ${line}`);\n }\n }\n }\n } else {\n logger.out(watchResult);\n }\n }\n }),\n});\n","import { ExecutorTriggerType } from \"@tailor-proto/tailor/v1/executor_resource_pb\";\nimport { defineCommand, runCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, withCommonArgs, workspaceArgs } from \"../args\";\nimport { fetchAll, initOperatorClient, platformBaseUrl } from \"../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger, styles } from \"../utils/logger\";\n\nexport interface WebhookExecutorInfo {\n name: string;\n webhookUrl: string;\n disabled: boolean;\n}\n\nexport interface ListWebhookExecutorsOptions {\n workspaceId?: string;\n profile?: string;\n}\n\n/**\n * Build the webhook URL for an executor.\n * @param workspaceId - Workspace ID\n * @param executorName - Executor name\n * @returns Webhook URL\n */\nfunction buildWebhookUrl(workspaceId: string, executorName: string): string {\n return `${platformBaseUrl}/webhook/v1/${workspaceId}/executor/${executorName}`;\n}\n\n/**\n * List executors with incoming webhook triggers and return CLI-friendly info.\n * @param options - Listing options\n * @returns List of webhook executors with URLs\n */\nexport async function listWebhookExecutors(\n options?: ListWebhookExecutorsOptions,\n): Promise<WebhookExecutorInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n const executors = await fetchAll(async (pageToken) => {\n const { executors, nextPageToken } = await client.listExecutorExecutors({\n workspaceId,\n pageToken,\n });\n return [executors, nextPageToken];\n });\n\n // Filter only incoming webhook triggers\n const webhookExecutors = executors.filter(\n (e) => e.triggerType === ExecutorTriggerType.INCOMING_WEBHOOK,\n );\n\n return webhookExecutors.map((e) => ({\n name: e.name,\n webhookUrl: buildWebhookUrl(workspaceId, e.name),\n disabled: e.disabled,\n }));\n}\n\nconst listWebhookCommand = defineCommand({\n name: \"list\",\n description: \"List executors with incoming webhook triggers\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n }),\n run: withCommonArgs(async (args) => {\n const executors = await listWebhookExecutors({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (executors.length === 0) {\n logger.info(\"No webhook executors found.\");\n return;\n }\n\n logger.out(executors, {\n display: {\n disabled: (v) => (v ? styles.warning(\"true\") : styles.dim(\"false\")),\n },\n });\n\n if (!args.json) {\n logger.info(\n 'To test a webhook, run: tailor-sdk executor trigger <name> -d \\'{\"key\":\"value\"}\\'',\n );\n }\n }),\n});\n\nexport const webhookCommand = defineCommand({\n name: \"webhook\",\n description: \"Manage executor webhooks\",\n subCommands: {\n list: listWebhookCommand,\n },\n async run() {\n await runCommand(listWebhookCommand, []);\n },\n});\n","import { glob } from \"node:fs/promises\";\nimport { watch } from \"chokidar\";\nimport * as madgeModule from \"madge\";\nimport * as path from \"pathe\";\nimport { logger, styles } from \"@/cli/utils/logger\";\nimport type { MadgeLoader } from \"./types\";\n\n/**\n * Types of file change events.\n */\ntype FileChangeEvent = \"add\" | \"change\" | \"unlink\";\n\n/**\n * Definition of a watch group.\n */\ninterface WatchGroup {\n /** Unique identifier of the group. */\n id: string;\n /** File patterns to watch (glob format). */\n patterns: string[];\n /** List of absolute file paths in the group. */\n files: Set<string>;\n}\n\n/**\n * Node in the dependency graph.\n */\ninterface DependencyNode {\n /** Absolute path of the file. */\n filePath: string;\n /** List of files this file depends on. */\n dependencies: Set<string>;\n /** List of files that depend on this file. */\n dependents: Set<string>;\n}\n\n/**\n * Impact analysis result.\n */\ninterface ImpactAnalysisResult {\n /** Changed file. */\n changedFile: string;\n /** List of affected files (all files depending on the changed file). */\n affectedFiles: string[];\n /** List of affected watch groups. */\n affectedGroups: string[];\n}\n\n/**\n * Type of the error handling callback.\n */\ntype ErrorCallback = (error: WatcherError) => void;\n\n/**\n * Options for the watcher system.\n */\ninterface WatcherOptions {\n /** Options for chokidar. */\n chokidarOptions?: Parameters<typeof watch>[1];\n /** Options for madge. */\n madgeOptions?: Parameters<MadgeLoader>[1];\n /** Update interval for the dependency graph (milliseconds). */\n dependencyUpdateInterval?: number;\n /** Debounce duration (milliseconds). */\n debounceTime?: number;\n /** Whether to enable circular dependency detection. */\n detectCircularDependencies?: boolean;\n}\n\n/**\n * Watcher status.\n */\ninterface WatchStatus {\n /** Whether watching is active. */\n isWatching: boolean;\n /** Number of watch groups. */\n groupCount: number;\n /** Number of watched files. */\n fileCount: number;\n /** Number of nodes in the dependency graph. */\n dependencyNodeCount: number;\n}\n\n/**\n * Graph statistics.\n */\ninterface GraphStats {\n /** Number of nodes. */\n nodeCount: number;\n /** Number of edges. */\n edgeCount: number;\n /** Number of circular dependencies. */\n circularDependencyCount: number;\n}\n\n/**\n * Error codes.\n */\nconst WatcherErrorCode = {\n DEPENDENCY_ANALYSIS_FAILED: \"DEPENDENCY_ANALYSIS_FAILED\",\n FILE_WATCH_FAILED: \"FILE_WATCH_FAILED\",\n CIRCULAR_DEPENDENCY_DETECTED: \"CIRCULAR_DEPENDENCY_DETECTED\",\n INVALID_WATCH_GROUP: \"INVALID_WATCH_GROUP\",\n MADGE_INITIALIZATION_FAILED: \"MADGE_INITIALIZATION_FAILED\",\n} as const;\ntype WatcherErrorCode = (typeof WatcherErrorCode)[keyof typeof WatcherErrorCode];\n\n/**\n * Watcher-specific error.\n */\nexport class WatcherError extends Error {\n constructor(\n message: string,\n public readonly code: WatcherErrorCode,\n public readonly filePath?: string,\n public readonly originalError?: Error,\n ) {\n super(message);\n this.name = \"WatcherError\";\n }\n}\n\n/**\n * Dependency graph manager type.\n */\nexport type DependencyGraphManager = {\n buildGraph: (filePaths: string[]) => Promise<void>;\n getDependents: (filePath: string) => string[];\n getDependencies: (filePath: string) => string[];\n findCircularDependencies: () => string[][];\n addNode: (filePath: string) => void;\n removeNode: (filePath: string) => void;\n getGraphStats: () => GraphStats;\n};\n\n/**\n * Creates a dependency graph manager.\n * @param options - Options for madge\n * @returns DependencyGraphManager instance\n */\nexport function createDependencyGraphManager(\n options: Parameters<MadgeLoader>[1] = {},\n): DependencyGraphManager {\n const graph: Map<string, DependencyNode> = new Map();\n let madgeInstance: Awaited<ReturnType<MadgeLoader>> | null = null;\n let madgeLoader: MadgeLoader | null = null;\n\n function getMadgeLoader(): MadgeLoader {\n if (madgeLoader) {\n return madgeLoader;\n }\n\n const defaultExport = (madgeModule as { default?: unknown }).default;\n if (typeof defaultExport === \"function\") {\n madgeLoader = defaultExport as MadgeLoader;\n return madgeLoader;\n }\n\n if (typeof (madgeModule as unknown) === \"function\") {\n madgeLoader = madgeModule as unknown as MadgeLoader;\n return madgeLoader;\n }\n\n throw new WatcherError(\n \"Failed to initialize madge analyzer: module did not export a callable function.\",\n WatcherErrorCode.MADGE_INITIALIZATION_FAILED,\n );\n }\n\n function traverseDependents(filePath: string, visited: Set<string>): string[] {\n if (visited.has(filePath)) return [];\n visited.add(filePath);\n\n const node = graph.get(filePath);\n if (!node) return [];\n\n const result: string[] = [];\n for (const dependent of node.dependents) {\n result.push(dependent);\n result.push(...traverseDependents(dependent, visited));\n }\n\n return result;\n }\n\n function traverseDependencies(filePath: string, visited: Set<string>): string[] {\n if (visited.has(filePath)) return [];\n visited.add(filePath);\n\n const node = graph.get(filePath);\n if (!node) return [];\n\n const result: string[] = [];\n for (const dependency of node.dependencies) {\n result.push(dependency);\n result.push(...traverseDependencies(dependency, visited));\n }\n\n return result;\n }\n\n function addNode(filePath: string): void {\n const absolutePath = path.resolve(filePath);\n if (!graph.has(absolutePath)) {\n graph.set(absolutePath, {\n filePath: absolutePath,\n dependencies: new Set(),\n dependents: new Set(),\n });\n }\n }\n\n function removeNode(filePath: string): void {\n const absolutePath = path.resolve(filePath);\n const node = graph.get(absolutePath);\n if (!node) return;\n\n for (const dep of node.dependencies) {\n const depNode = graph.get(dep);\n if (depNode) {\n depNode.dependents.delete(absolutePath);\n }\n }\n\n for (const dependent of node.dependents) {\n const dependentNode = graph.get(dependent);\n if (dependentNode) {\n dependentNode.dependencies.delete(absolutePath);\n }\n }\n\n graph.delete(absolutePath);\n }\n\n function findCircularDependencies(): string[][] {\n if (!madgeInstance) return [];\n try {\n return madgeInstance.circular();\n } catch (error) {\n logger.warn(`Failed to detect circular dependencies: ${String(error)}`);\n return [];\n }\n }\n\n return {\n async buildGraph(filePaths: string[]): Promise<void> {\n try {\n if (filePaths.length === 0) return;\n\n const madge = getMadgeLoader();\n\n madgeInstance = await madge(filePaths, {\n fileExtensions: [\"ts\", \"js\"],\n excludeRegExp: [/node_modules/],\n baseDir: \".\",\n ...options,\n });\n\n const dependencyObj = madgeInstance.obj() as Record<string, string[]>;\n graph.clear();\n\n for (const filePath of filePaths) {\n addNode(filePath);\n }\n\n for (const [filePath, dependencies] of Object.entries(dependencyObj)) {\n const absoluteFilePath = path.resolve(\".\", filePath);\n const node = graph.get(absoluteFilePath);\n if (!node) continue;\n\n for (const dep of dependencies) {\n const absoluteDepPath = path.resolve(\".\", dep);\n node.dependencies.add(absoluteDepPath);\n\n const depNode = graph.get(absoluteDepPath);\n if (depNode) {\n depNode.dependents.add(absoluteFilePath);\n }\n }\n }\n } catch (error) {\n if (error instanceof WatcherError) {\n throw error;\n }\n throw new WatcherError(\n `Failed to build dependency graph: ${error instanceof Error ? error.message : String(error)}`,\n WatcherErrorCode.DEPENDENCY_ANALYSIS_FAILED,\n undefined,\n error instanceof Error ? error : undefined,\n );\n }\n },\n\n getDependents(filePath: string): string[] {\n const visited = new Set<string>();\n return traverseDependents(path.resolve(filePath), visited);\n },\n\n getDependencies(filePath: string): string[] {\n const visited = new Set<string>();\n return traverseDependencies(path.resolve(filePath), visited);\n },\n\n findCircularDependencies,\n addNode,\n removeNode,\n\n getGraphStats(): GraphStats {\n let edgeCount = 0;\n for (const node of graph.values()) {\n edgeCount += node.dependencies.size;\n }\n\n return {\n nodeCount: graph.size,\n edgeCount,\n circularDependencyCount: findCircularDependencies().length,\n };\n },\n };\n}\n\n/**\n * Dependency watcher type.\n */\nexport type DependencyWatcher = {\n initialize: () => Promise<void>;\n addWatchGroup: (groupId: string, patterns: string[]) => Promise<void>;\n removeWatchGroup: (groupId: string) => Promise<void>;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n onError: (callback: ErrorCallback) => void;\n updateDependencyGraph: () => Promise<void>;\n calculateImpact: (filePath: string) => ImpactAnalysisResult;\n detectCircularDependencies: () => string[][];\n getWatchStatus: () => WatchStatus;\n setRestartCallback: (callback: () => void) => void;\n};\n\n/**\n * Creates a dependency watcher.\n * @param options - Watcher options\n * @returns DependencyWatcher instance\n */\nexport function createDependencyWatcher(options: WatcherOptions = {}): DependencyWatcher {\n let chokidarWatcher: ReturnType<typeof watch> | null = null;\n const watchGroups: Map<string, WatchGroup> = new Map();\n const dependencyGraphManager = createDependencyGraphManager(options.madgeOptions);\n let errorCallback: ErrorCallback | null = null;\n const debounceTimers: Map<string, NodeJS.Timeout> = new Map();\n let isInitialized = false;\n const dependencyCache: Map<string, string[]> = new Map();\n const maxCacheSize = 1000;\n let signalHandlersRegistered = false;\n let restartCallback: (() => void) | null = null;\n\n function validateWatchGroup(groupId: string, patterns: string[]): void {\n if (!groupId || typeof groupId !== \"string\") {\n throw new WatcherError(\n \"Group ID must be a non-empty string\",\n WatcherErrorCode.INVALID_WATCH_GROUP,\n );\n }\n\n if (!Array.isArray(patterns) || patterns.length === 0) {\n throw new WatcherError(\n \"Patterns must be a non-empty array\",\n WatcherErrorCode.INVALID_WATCH_GROUP,\n );\n }\n\n if (watchGroups.has(groupId)) {\n throw new WatcherError(\n `Watch group with ID '${groupId}' already exists`,\n WatcherErrorCode.INVALID_WATCH_GROUP,\n );\n }\n }\n\n function handleError(error: WatcherError): void {\n logger.error(\n `[DependencyWatcher] ${error.message} (code: ${error.code}, filePath: ${error.filePath})`,\n );\n\n if (errorCallback) {\n errorCallback(error);\n }\n }\n\n function setCacheValue(key: string, value: string[]): void {\n if (dependencyCache.size >= maxCacheSize) {\n const firstKey = dependencyCache.keys().next().value;\n if (firstKey) {\n dependencyCache.delete(firstKey);\n }\n }\n dependencyCache.set(key, value);\n }\n\n function findAffectedFiles(changedFile: string): string[] {\n return dependencyGraphManager.getDependents(changedFile);\n }\n\n function findAffectedGroups(affectedFiles: string[]): string[] {\n logger.debug(`Finding affected groups for files: ${affectedFiles.join(\", \")}`);\n const affectedGroupsSet = new Set<string>();\n\n for (const [groupId, group] of watchGroups) {\n for (const affectedFile of affectedFiles) {\n if (group.files.has(affectedFile)) {\n logger.debug(`Group ${groupId} is affected by file: ${affectedFile}`);\n affectedGroupsSet.add(groupId);\n break;\n }\n }\n }\n\n return Array.from(affectedGroupsSet);\n }\n\n function calculateImpact(filePath: string): ImpactAnalysisResult {\n const cacheKey = `impact:${filePath}`;\n let affectedFiles = dependencyCache.get(cacheKey);\n\n if (!affectedFiles) {\n affectedFiles = findAffectedFiles(filePath);\n setCacheValue(cacheKey, affectedFiles);\n }\n\n // Include the changed file itself in the affected files\n const allAffectedFiles = [filePath, ...affectedFiles];\n const affectedGroups = findAffectedGroups(allAffectedFiles);\n\n return {\n changedFile: filePath,\n affectedFiles: allAffectedFiles,\n affectedGroups,\n };\n }\n\n async function updateDependencyGraph(): Promise<void> {\n const allFiles: string[] = [];\n for (const group of watchGroups.values()) {\n allFiles.push(...Array.from(group.files));\n }\n\n await dependencyGraphManager.buildGraph(allFiles);\n dependencyCache.clear();\n\n if (options.detectCircularDependencies) {\n const circularDeps = dependencyGraphManager.findCircularDependencies();\n if (circularDeps.length > 0) {\n logger.warn(`Circular dependencies detected: ${JSON.stringify(circularDeps)}`);\n }\n }\n }\n\n async function handleFileChange(event: FileChangeEvent, filePath: string): Promise<void> {\n try {\n const absolutePath = path.resolve(filePath);\n\n if (event === \"unlink\") {\n dependencyGraphManager.removeNode(absolutePath);\n } else {\n dependencyGraphManager.addNode(absolutePath);\n if (event === \"change\") {\n await updateDependencyGraph();\n }\n }\n\n dependencyCache.clear();\n\n const impactResult = calculateImpact(absolutePath);\n\n // If any groups are affected, trigger restart instead of calling callbacks\n if (impactResult.affectedGroups.length > 0) {\n logger.info(\"File change detected, restarting watch process...\", {\n mode: \"stream\",\n });\n logger.info(`Changed file: ${absolutePath}`, { mode: \"stream\" });\n logger.info(`Affected groups: ${impactResult.affectedGroups.join(\", \")}`, {\n mode: \"stream\",\n });\n\n if (restartCallback) {\n restartCallback();\n }\n } else {\n logger.debug(`No affected groups found for file: ${absolutePath}`);\n }\n } catch (error) {\n handleError(\n new WatcherError(\n `Failed to handle file change: ${error instanceof Error ? error.message : String(error)}`,\n WatcherErrorCode.DEPENDENCY_ANALYSIS_FAILED,\n filePath,\n error instanceof Error ? error : undefined,\n ),\n );\n }\n }\n\n function debounceFileChange(event: FileChangeEvent, filePath: string): void {\n const key = `${event}:${filePath}`;\n\n if (debounceTimers.has(key)) {\n clearTimeout(debounceTimers.get(key));\n }\n\n const timer = setTimeout(() => {\n handleFileChange(event, filePath);\n debounceTimers.delete(key);\n }, options.debounceTime || 100);\n\n debounceTimers.set(key, timer);\n }\n\n async function stop(): Promise<void> {\n if (chokidarWatcher) {\n await chokidarWatcher.close();\n chokidarWatcher = null;\n }\n\n for (const timer of debounceTimers.values()) {\n clearTimeout(timer);\n }\n debounceTimers.clear();\n\n removeSignalHandlers();\n isInitialized = false;\n }\n\n function setupSignalHandlers(): void {\n if (signalHandlersRegistered) return;\n\n const handleSignal = async () => {\n try {\n await stop();\n logger.info(\"Watcher stopped successfully\");\n process.exit(0);\n } catch (error) {\n logger.error(`Error during shutdown: ${String(error)}`);\n process.exit(0);\n }\n };\n\n process.on(\"SIGINT\", () => handleSignal());\n process.on(\"SIGTERM\", () => handleSignal());\n signalHandlersRegistered = true;\n }\n\n function removeSignalHandlers(): void {\n if (!signalHandlersRegistered) return;\n\n process.removeAllListeners(\"SIGINT\");\n process.removeAllListeners(\"SIGTERM\");\n signalHandlersRegistered = false;\n }\n\n async function initialize(): Promise<void> {\n if (isInitialized) return;\n\n try {\n chokidarWatcher = watch([], {\n ignored: /node_modules/,\n persistent: true,\n ignoreInitial: true,\n usePolling: false,\n awaitWriteFinish: {\n stabilityThreshold: 100,\n pollInterval: 100,\n },\n ...options.chokidarOptions,\n });\n\n chokidarWatcher.on(\"add\", (filePath: string) => {\n logger.debug(`File added: ${filePath}`);\n debounceFileChange(\"add\", filePath);\n });\n\n chokidarWatcher.on(\"change\", (filePath: string) => {\n logger.debug(`File changed: ${filePath}`);\n debounceFileChange(\"change\", filePath);\n });\n\n chokidarWatcher.on(\"unlink\", (filePath: string) => {\n logger.debug(`File removed: ${filePath}`);\n debounceFileChange(\"unlink\", filePath);\n });\n\n chokidarWatcher.on(\"error\", (error: unknown) => {\n logger.error(`Watcher error: ${error instanceof Error ? error.message : String(error)}`, {\n mode: \"stream\",\n });\n handleError(\n new WatcherError(\n `File watcher error: ${error instanceof Error ? error.message : String(error)}`,\n WatcherErrorCode.FILE_WATCH_FAILED,\n undefined,\n error instanceof Error ? error : undefined,\n ),\n );\n });\n\n setupSignalHandlers();\n isInitialized = true;\n } catch (error) {\n throw new WatcherError(\n `Failed to initialize watcher: ${error instanceof Error ? error.message : String(error)}`,\n WatcherErrorCode.FILE_WATCH_FAILED,\n undefined,\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n return {\n initialize,\n\n async addWatchGroup(groupId: string, patterns: string[]): Promise<void> {\n validateWatchGroup(groupId, patterns);\n\n if (!isInitialized) {\n await initialize();\n }\n\n const files = new Set<string>();\n for (const pattern of patterns) {\n logger.log(\n `${styles.dim(`Watch pattern for`)} ${styles.dim(groupId + \":\")} ${path.relative(process.cwd(), pattern)}`,\n );\n for await (const file of glob(pattern)) {\n files.add(path.resolve(file));\n }\n }\n\n const watchGroup: WatchGroup = {\n id: groupId,\n patterns,\n files,\n };\n\n watchGroups.set(groupId, watchGroup);\n\n if (chokidarWatcher) {\n const filePaths = Array.from(files);\n chokidarWatcher.add(filePaths);\n }\n\n await updateDependencyGraph();\n },\n\n async removeWatchGroup(groupId: string): Promise<void> {\n const watchGroup = watchGroups.get(groupId);\n if (!watchGroup) return;\n\n if (chokidarWatcher) {\n chokidarWatcher.unwatch(watchGroup.patterns);\n }\n\n for (const filePath of watchGroup.files) {\n dependencyGraphManager.removeNode(filePath);\n }\n\n watchGroups.delete(groupId);\n dependencyCache.clear();\n },\n\n async start(): Promise<void> {\n if (!isInitialized) {\n await initialize();\n }\n await updateDependencyGraph();\n },\n\n stop,\n\n onError(callback: ErrorCallback): void {\n errorCallback = callback;\n },\n\n updateDependencyGraph,\n calculateImpact,\n\n detectCircularDependencies(): string[][] {\n return dependencyGraphManager.findCircularDependencies();\n },\n\n getWatchStatus(): WatchStatus {\n let fileCount = 0;\n for (const group of watchGroups.values()) {\n fileCount += group.files.size;\n }\n\n const stats = dependencyGraphManager.getGraphStats();\n\n return {\n isWatching: isInitialized && chokidarWatcher !== null,\n groupCount: watchGroups.size,\n fileCount,\n dependencyNodeCount: stats.nodeCount,\n };\n },\n\n setRestartCallback(callback: () => void): void {\n restartCallback = callback;\n },\n };\n}\n\nexport { WatcherErrorCode };\n","import { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineApplication, type Application } from \"@/cli/application\";\nimport { createExecutorService } from \"@/cli/application/executor/service\";\nimport { loadConfig } from \"@/cli/config-loader\";\nimport {\n type AnyCodeGenerator,\n type TailorDBNamespaceResult,\n type ResolverNamespaceResult,\n type GeneratorAuthInput,\n type DependencyKind,\n hasDependency,\n} from \"@/cli/generator/types\";\nimport { generateUserTypes } from \"@/cli/type-generator\";\nimport { getDistDir } from \"@/cli/utils/dist-dir\";\nimport { logger, styles } from \"@/cli/utils/logger\";\nimport { type AppConfig } from \"@/parser/app-config\";\nimport { type Generator } from \"@/parser/generator-config\";\nimport { type Executor } from \"@/parser/service/executor\";\nimport { type Resolver } from \"@/parser/service/resolver\";\nimport { PluginManager } from \"@/plugin/manager\";\nimport { commonArgs, withCommonArgs } from \"../args\";\nimport { generatePluginExecutorFiles } from \"./plugin-executor-generator\";\nimport { generatePluginTypeFiles } from \"./plugin-type-generator\";\nimport { createDependencyWatcher, type DependencyWatcher } from \"./watch\";\nimport type { GenerateOptions } from \"./options\";\nimport type { Plugin, PluginAttachment } from \"@/parser/plugin-config/types\";\nimport type { TailorDBType, TypeSourceInfo } from \"@/parser/service/tailordb/types\";\n\nexport type { CodeGenerator } from \"@/cli/generator/types\";\n\ntype TypeInfo = {\n types: Record<string, TailorDBType>;\n sourceInfo: TypeSourceInfo;\n pluginAttachments: ReadonlyMap<string, readonly PluginAttachment[]>;\n};\n\n/**\n * Generation manager type.\n */\nexport type GenerationManager = {\n readonly application: Application;\n readonly baseDir: string;\n readonly generators: Generator[];\n readonly services: {\n tailordb: Record<string, TypeInfo>;\n resolver: Record<string, Record<string, Resolver>>;\n executor: Record<string, Executor>;\n };\n readonly generatorResults: GeneratorResults;\n processGenerator: (gen: AnyCodeGenerator) => Promise<void>;\n processTailorDBNamespace: (\n gen: AnyCodeGenerator,\n namespace: string,\n typeInfo: TypeInfo,\n ) => Promise<void>;\n processResolverNamespace: (\n gen: AnyCodeGenerator,\n namespace: string,\n resolvers: Record<string, Resolver>,\n ) => Promise<void>;\n processExecutors: (gen: AnyCodeGenerator) => Promise<void>;\n aggregate: (gen: AnyCodeGenerator) => Promise<void>;\n generate: (watch: boolean) => Promise<void>;\n watch: () => Promise<void>;\n};\n\ntype GeneratorResults = Record<\n /* generator */ string,\n {\n tailordbResults: Record</* namespace */ string, Record</* type */ string, unknown>>;\n resolverResults: Record</* namespace */ string, Record</* resolver */ string, unknown>>;\n tailordbNamespaceResults: Record</* namespace */ string, unknown>;\n resolverNamespaceResults: Record</* namespace */ string, unknown>;\n executorResults: Record</* executor */ string, unknown>;\n }\n>;\n\n/**\n * Creates a generation manager.\n * @param config - Application configuration\n * @param generators - List of generators\n * @param plugins - List of plugins\n * @param configPath - Path to the configuration file\n * @returns GenerationManager instance\n */\nexport function createGenerationManager(\n config: AppConfig,\n generators: Generator[] = [],\n plugins: Plugin[] = [],\n configPath?: string,\n): GenerationManager {\n // Initialize plugin manager if plugins are provided\n let pluginManager: PluginManager | undefined;\n if (plugins.length > 0) {\n pluginManager = new PluginManager(plugins as unknown as Plugin[]);\n }\n\n const application = defineApplication({ config, pluginManager });\n const baseDir = path.join(getDistDir(), \"generated\");\n fs.mkdirSync(baseDir, { recursive: true });\n\n const services: {\n tailordb: Record<string, TypeInfo>;\n resolver: Record<string, Record<string, Resolver>>;\n executor: Record<string, Executor>;\n } = { tailordb: {}, resolver: {}, executor: {} };\n\n let watcher: DependencyWatcher | null = null;\n const generatorResults: GeneratorResults = {};\n\n // Helper functions for dependency checking\n function getDeps(gen: AnyCodeGenerator): Set<DependencyKind> {\n return new Set(gen.dependencies);\n }\n\n function onlyHas(gen: AnyCodeGenerator, ...required: DependencyKind[]): boolean {\n const deps = getDeps(gen);\n return required.every((r) => deps.has(r)) && deps.size === required.length;\n }\n\n function hasAll(gen: AnyCodeGenerator, ...required: DependencyKind[]): boolean {\n return required.every((r) => getDeps(gen).has(r));\n }\n\n function hasNone(gen: AnyCodeGenerator, ...excluded: DependencyKind[]): boolean {\n return excluded.every((e) => !getDeps(gen).has(e));\n }\n\n function getAuthInput(): GeneratorAuthInput | undefined {\n const authService = application.authService;\n if (!authService) return undefined;\n\n const authConfig = authService.parsedConfig;\n const userProfile = authService.userProfile;\n return {\n name: authConfig.name,\n userProfile: userProfile\n ? {\n typeName: userProfile.type.name,\n namespace: userProfile.namespace,\n usernameField: userProfile.usernameField,\n }\n : undefined,\n machineUsers: authConfig.machineUsers,\n oauth2Clients: authConfig.oauth2Clients,\n idProvider: authConfig.idProvider,\n };\n }\n\n async function processTailorDBNamespace(\n gen: AnyCodeGenerator,\n namespace: string,\n typeInfo: TypeInfo,\n ): Promise<void> {\n const results = generatorResults[gen.id];\n results.tailordbResults[namespace] = {};\n\n // Check if generator has processType method\n if (!gen.processType) {\n return;\n }\n\n const processType = gen.processType;\n await Promise.allSettled(\n Object.entries(typeInfo.types).map(async ([typeName, type]) => {\n try {\n results.tailordbResults[namespace][typeName] = await processType({\n type,\n namespace,\n source: typeInfo.sourceInfo[typeName],\n plugins: typeInfo.pluginAttachments.get(typeName) ?? [],\n });\n } catch (error) {\n logger.error(\n `Error processing type ${styles.bold(typeName)} in ${namespace} with generator ${gen.id}`,\n );\n logger.error(String(error));\n }\n }),\n );\n\n // Process namespace summary if available\n if (\"processTailorDBNamespace\" in gen && typeof gen.processTailorDBNamespace === \"function\") {\n try {\n results.tailordbNamespaceResults[namespace] = await gen.processTailorDBNamespace({\n namespace,\n types: results.tailordbResults[namespace],\n });\n } catch (error) {\n logger.error(\n `Error processing TailorDB namespace ${styles.bold(namespace)} with generator ${gen.id}`,\n );\n logger.error(String(error));\n }\n } else {\n results.tailordbNamespaceResults[namespace] = results.tailordbResults[namespace];\n }\n }\n\n async function processResolverNamespace(\n gen: AnyCodeGenerator,\n namespace: string,\n resolvers: Record<string, Resolver>,\n ): Promise<void> {\n const results = generatorResults[gen.id];\n results.resolverResults[namespace] = {};\n\n // Check if generator has processResolver method\n if (!gen.processResolver) {\n return;\n }\n\n const processResolver = gen.processResolver;\n // Process individual resolvers\n await Promise.allSettled(\n Object.entries(resolvers).map(async ([resolverName, resolver]) => {\n try {\n results.resolverResults[namespace][resolverName] = await processResolver({\n resolver,\n namespace,\n });\n } catch (error) {\n logger.error(\n `Error processing resolver ${styles.bold(resolverName)} in ${namespace} with generator ${gen.id}`,\n );\n logger.error(String(error));\n }\n }),\n );\n\n // Process namespace summary if available\n if (\"processResolverNamespace\" in gen && typeof gen.processResolverNamespace === \"function\") {\n try {\n results.resolverNamespaceResults[namespace] = await gen.processResolverNamespace({\n namespace,\n resolvers: results.resolverResults[namespace],\n });\n } catch (error) {\n logger.error(\n `Error processing Resolver namespace ${styles.bold(namespace)} with generator ${gen.id}`,\n );\n logger.error(String(error));\n }\n } else {\n results.resolverNamespaceResults[namespace] = results.resolverResults[namespace];\n }\n }\n\n async function processExecutors(gen: AnyCodeGenerator): Promise<void> {\n const results = generatorResults[gen.id];\n\n // Check if generator has processExecutor method\n if (!gen.processExecutor) {\n return;\n }\n\n const processExecutor = gen.processExecutor;\n // Process individual executors\n await Promise.allSettled(\n Object.entries(services.executor).map(async ([executorId, executor]) => {\n try {\n results.executorResults[executorId] = await processExecutor(executor);\n } catch (error) {\n logger.error(\n `Error processing executor ${styles.bold(executor.name)} with generator ${gen.id}`,\n );\n logger.error(String(error));\n }\n }),\n );\n }\n\n async function aggregate(gen: AnyCodeGenerator): Promise<void> {\n const results = generatorResults[gen.id];\n\n const tailordbResults: TailorDBNamespaceResult<unknown>[] = [];\n const resolverResults: ResolverNamespaceResult<unknown>[] = [];\n\n // Collect TailorDB namespace results\n for (const [namespace, types] of Object.entries(results.tailordbNamespaceResults)) {\n tailordbResults.push({\n namespace,\n types,\n });\n }\n\n // Collect Resolver namespace results\n for (const [namespace, resolvers] of Object.entries(results.resolverNamespaceResults)) {\n resolverResults.push({\n namespace,\n resolvers,\n });\n }\n\n // Build input based on generator dependencies\n const input: Record<string, unknown> = {\n auth: getAuthInput(),\n };\n\n if (hasDependency(gen, \"tailordb\")) {\n input.tailordb = tailordbResults;\n }\n if (hasDependency(gen, \"resolver\")) {\n input.resolver = resolverResults;\n }\n if (hasDependency(gen, \"executor\")) {\n input.executor = Object.values(results.executorResults);\n }\n\n // Call generator's aggregate method\n const result = await gen.aggregate({\n input: input as Parameters<typeof gen.aggregate>[0][\"input\"],\n baseDir: path.join(baseDir, gen.id),\n configPath: configPath ?? \"tailor.config.ts\",\n });\n\n // Write generated files\n await Promise.all(\n result.files.map(async (file) => {\n fs.mkdirSync(path.dirname(file.path), { recursive: true });\n return new Promise<void>((resolve, reject) => {\n if (file.skipIfExists && fs.existsSync(file.path)) {\n const relativePath = path.relative(process.cwd(), file.path);\n logger.debug(`${gen.id} | skip existing: ${relativePath}`);\n return resolve();\n }\n\n fs.writeFile(file.path, file.content, (err) => {\n if (err) {\n const relativePath = path.relative(process.cwd(), file.path);\n logger.error(`Error writing file ${styles.bold(relativePath)}`);\n logger.error(String(err));\n reject(err);\n } else {\n const relativePath = path.relative(process.cwd(), file.path);\n logger.log(`${gen.id} | generate: ${styles.success(relativePath)}`);\n // Set executable permission if requested\n if (file.executable) {\n fs.chmod(file.path, 0o755, (chmodErr) => {\n if (chmodErr) {\n const relativePath = path.relative(process.cwd(), file.path);\n logger.error(\n `Error setting executable permission on ${styles.bold(relativePath)}`,\n );\n logger.error(String(chmodErr));\n reject(chmodErr);\n } else {\n resolve();\n }\n });\n } else {\n resolve();\n }\n }\n });\n });\n }),\n );\n }\n\n async function processGenerator(gen: AnyCodeGenerator): Promise<void> {\n generatorResults[gen.id] = {\n tailordbResults: {},\n resolverResults: {},\n tailordbNamespaceResults: {},\n resolverNamespaceResults: {},\n executorResults: {},\n };\n\n // Process TailorDB if generator has tailordb dependency\n if (hasDependency(gen, \"tailordb\")) {\n for (const [namespace, types] of Object.entries(services.tailordb)) {\n await processTailorDBNamespace(gen, namespace, types);\n }\n }\n\n // Process Resolver if generator has resolver dependency\n if (hasDependency(gen, \"resolver\")) {\n for (const [namespace, resolvers] of Object.entries(services.resolver)) {\n await processResolverNamespace(gen, namespace, resolvers);\n }\n }\n\n // Process Executors if generator has executor dependency\n if (hasDependency(gen, \"executor\")) {\n await processExecutors(gen);\n }\n\n // Aggregate all results\n await aggregate(gen);\n }\n\n async function runGenerators(gens: Generator[], watch: boolean): Promise<void> {\n await Promise.allSettled(\n gens.map(async (gen) => {\n try {\n await processGenerator(gen as AnyCodeGenerator);\n } catch (error) {\n logger.error(`Error processing generator ${styles.bold(gen.id)}`);\n logger.error(String(error));\n if (!watch) {\n throw error;\n }\n }\n }),\n );\n }\n\n async function restartWatchProcess(): Promise<void> {\n logger.newline();\n logger.info(\"Restarting watch process to clear module cache...\", {\n mode: \"stream\",\n });\n logger.newline();\n\n // Clean up watcher first\n if (watcher) {\n await watcher.stop();\n }\n\n // Spawn a new process with the same arguments\n const args = process.argv.slice(2);\n const env = {\n ...process.env,\n TAILOR_WATCH_GENERATION: (\n parseInt(process.env.TAILOR_WATCH_GENERATION || \"0\", 10) + 1\n ).toString(),\n };\n\n const child = spawn(process.argv[0], [process.argv[1], ...args], {\n stdio: \"inherit\",\n env,\n detached: false,\n });\n\n // Forward signals to child\n const forwardSignal = (signal: NodeJS.Signals) => {\n child.kill(signal);\n };\n\n process.on(\"SIGINT\", forwardSignal);\n process.on(\"SIGTERM\", forwardSignal);\n\n // Wait for child to exit, then exit parent\n child.on(\"exit\", (code) => {\n process.exit(code || 0);\n });\n\n // Don't exit immediately - let child handle everything\n }\n\n return {\n application,\n baseDir,\n generators,\n services,\n generatorResults,\n processGenerator,\n processTailorDBNamespace,\n processResolverNamespace,\n processExecutors,\n aggregate,\n\n async generate(watch: boolean): Promise<void> {\n logger.newline();\n logger.log(`Generation for application: ${styles.highlight(application.config.name)}`);\n\n const app = application;\n\n // Phase 1: Load TailorDB\n for (const db of app.tailorDBServices) {\n const namespace = db.namespace;\n\n try {\n await db.loadTypes();\n\n // Process namespace plugins after loading types\n // These plugins generate types without requiring a source type\n await db.processNamespacePlugins();\n\n services.tailordb[namespace] = {\n types: db.getTypes(),\n sourceInfo: db.getTypeSourceInfo(),\n pluginAttachments: db.getPluginAttachments(),\n };\n } catch (error) {\n logger.error(`Error loading types for TailorDB service ${styles.bold(namespace)}`);\n logger.error(String(error));\n if (!watch) {\n throw error;\n }\n }\n }\n\n // Phase 1.5: Generate plugin type and executor TypeScript files\n // This must happen after TailorDB types are loaded since plugins process during type loading\n const pluginOutputDir = path.join(getDistDir(), \"plugin\");\n\n // First, generate plugin type files\n const pluginTypes = pluginManager?.getPluginGeneratedTypes() ?? [];\n const typeGenerationResult = generatePluginTypeFiles(pluginTypes, pluginOutputDir);\n\n // Collect source type file paths from TailorDB services\n const sourceTypeInfoMap = new Map<string, { filePath: string; exportName: string }>();\n for (const db of app.tailorDBServices) {\n const typeSourceInfo = db.getTypeSourceInfo();\n for (const [typeName, sourceInfo] of Object.entries(typeSourceInfo)) {\n if (sourceInfo.filePath) {\n sourceTypeInfoMap.set(typeName, {\n filePath: sourceInfo.filePath,\n exportName: sourceInfo.exportName,\n });\n }\n }\n }\n\n // Then, generate plugin executor files with type information\n const pluginExecutors = pluginManager?.getPluginGeneratedExecutorsWithImportPath() ?? [];\n const generatedExecutorFiles = generatePluginExecutorFiles(\n pluginExecutors,\n pluginOutputDir,\n typeGenerationResult,\n sourceTypeInfoMap,\n configPath,\n );\n const executorService =\n application.executorService ??\n (generatedExecutorFiles.length > 0\n ? createExecutorService({ config: { files: [] }, pluginManager })\n : undefined);\n\n // Phase 2: Auth resolveNamespaces (depends on TailorDB)\n if (app.authService) {\n await app.authService.resolveNamespaces();\n }\n\n // Add blank line after TailorDB types loaded\n if (app.tailorDBServices.length > 0 || generatedExecutorFiles.length > 0) {\n logger.newline();\n }\n\n // Phase 3: Run TailorDB-only generators\n const tailordbOnlyGens = generators.filter((g) => onlyHas(g as AnyCodeGenerator, \"tailordb\"));\n if (tailordbOnlyGens.length > 0) {\n await runGenerators(tailordbOnlyGens, watch);\n logger.newline();\n }\n\n // Phase 4: Load Resolvers (can now import generated files)\n for (const resolverService of app.resolverServices) {\n const namespace = resolverService.namespace;\n try {\n await resolverService.loadResolvers();\n services.resolver[namespace] = {};\n Object.entries(resolverService.getResolvers()).forEach(([_, resolver]) => {\n services.resolver[namespace][resolver.name] = resolver;\n });\n } catch (error) {\n logger.error(`Error loading resolvers for Resolver service ${styles.bold(namespace)}`);\n logger.error(String(error));\n if (!watch) {\n throw error;\n }\n }\n }\n\n // Phase 5: Run non-executor generators (resolver-dependent but not executor-dependent)\n const nonExecutorGens = generators.filter(\n (g) => !tailordbOnlyGens.includes(g) && hasNone(g as AnyCodeGenerator, \"executor\"),\n );\n if (nonExecutorGens.length > 0) {\n await runGenerators(nonExecutorGens, watch);\n logger.newline();\n }\n\n // Phase 6: Load Executors (can now import generated files)\n await executorService?.loadExecutors();\n // Load plugin-generated executors from generated TypeScript files\n if (generatedExecutorFiles.length > 0) {\n await executorService?.loadPluginExecutorFiles(generatedExecutorFiles);\n }\n // Get all executors (file-based and plugin-generated)\n const allExecutors = executorService?.getExecutors() ?? {};\n Object.entries(allExecutors).forEach(([key, executor]) => {\n services.executor[key] = executor as Executor;\n });\n\n // Phase 7: Run executor-dependent generators\n const executorGens = generators.filter((g) => hasAll(g as AnyCodeGenerator, \"executor\"));\n if (executorGens.length > 0) {\n await runGenerators(executorGens, watch);\n logger.newline();\n }\n },\n\n async watch(): Promise<void> {\n watcher = createDependencyWatcher();\n\n // Set up restart callback\n watcher.setRestartCallback(() => {\n restartWatchProcess();\n });\n\n // Watch config file if available\n if (configPath) {\n await watcher.addWatchGroup(\"Config\", [configPath]);\n }\n\n // Watch application services\n const app = application;\n\n // Watch TailorDB services\n for (const db of app.tailorDBServices) {\n const dbNamespace = db.namespace;\n await watcher?.addWatchGroup(`TailorDB/${dbNamespace}`, db.config.files);\n }\n\n // Watch Resolver services\n for (const resolverService of app.resolverServices) {\n const resolverNamespace = resolverService.namespace;\n await watcher?.addWatchGroup(\n `Resolver/${resolverNamespace}`,\n resolverService[\"config\"].files,\n );\n }\n\n // Keep the process running\n await new Promise(() => {});\n },\n };\n}\n\n/**\n * Run code generation using the Tailor configuration and generators.\n * @param options - Generation options\n * @returns Promise that resolves when generation (and watch, if enabled) completes\n */\nexport async function generate(options?: GenerateOptions) {\n // Load and validate options\n const { config, generators, plugins } = await loadConfig(options?.configPath);\n const watch = options?.watch ?? false;\n\n // Generate user types from loaded config\n await generateUserTypes({ config, configPath: config.path });\n const manager = createGenerationManager(config, generators, plugins, config.path);\n await manager.generate(watch);\n if (watch) {\n await manager.watch();\n }\n}\n\nexport const generateCommand = defineCommand({\n name: \"generate\",\n description: \"Generate files using Tailor configuration.\",\n args: z.object({\n ...commonArgs,\n config: arg(z.string().default(\"tailor.config.ts\"), {\n alias: \"c\",\n description: \"Path to SDK config file\",\n }),\n watch: arg(z.boolean().default(false), {\n alias: \"W\",\n description: \"Watch for type/resolver changes and regenerate\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n await generate({\n configPath: args.config,\n watch: args.watch,\n });\n }),\n});\n","import { toJson } from \"@bufbuild/protobuf\";\nimport { timestampDate, ValueSchema } from \"@bufbuild/protobuf/wkt\";\nimport { defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, deploymentArgs, jsonArgs, withCommonArgs } from \"../args\";\nimport { fetchAll, initOperatorClient } from \"../client\";\nimport { loadConfig } from \"../config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger } from \"../utils/logger\";\nimport type { MachineUser } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\n\nexport interface ListMachineUsersOptions {\n workspaceId?: string;\n profile?: string;\n configPath?: string;\n}\n\nexport interface MachineUserInfo {\n name: string;\n clientId: string;\n clientSecret: string;\n createdAt: Date | null;\n updatedAt: Date | null;\n attributes: Record<string, unknown>;\n}\n\n/**\n * Map a MachineUser protobuf message to CLI-friendly info.\n * @param user - Machine user resource\n * @returns Flattened machine user info\n */\nfunction machineUserInfo(user: MachineUser): MachineUserInfo {\n return {\n name: user.name,\n clientId: user.clientId,\n clientSecret: user.clientSecret,\n createdAt: user.createdAt ? timestampDate(user.createdAt) : null,\n updatedAt: user.updatedAt ? timestampDate(user.updatedAt) : null,\n attributes: Object.fromEntries(\n Object.entries(user.attributeMap).map(([key, value]) => [key, toJson(ValueSchema, value)]),\n ),\n };\n}\n\n/**\n * List machine users for the current application.\n * @param options - Machine user listing options\n * @returns List of machine users\n */\nexport async function listMachineUsers(\n options?: ListMachineUsersOptions,\n): Promise<MachineUserInfo[]> {\n // Load and validate options\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n // Get application\n const { config } = await loadConfig(options?.configPath);\n const { application } = await client.getApplication({\n workspaceId,\n applicationName: config.name,\n });\n if (!application?.authNamespace) {\n throw new Error(`Application ${config.name} does not have an auth configuration.`);\n }\n\n // Fetch all machine users\n const machineUsers = await fetchAll(async (pageToken) => {\n const { machineUsers, nextPageToken } = await client.listAuthMachineUsers({\n workspaceId,\n pageToken,\n authNamespace: application.authNamespace,\n });\n return [machineUsers, nextPageToken];\n });\n\n return machineUsers.map(machineUserInfo);\n}\n\nexport const listCommand = defineCommand({\n name: \"list\",\n description: \"List all machine users in the application.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...deploymentArgs,\n }),\n run: withCommonArgs(async (args) => {\n // Execute machineuser list logic\n const machineUsers = await listMachineUsers({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n configPath: args.config,\n });\n\n // Show machine users info\n logger.out(machineUsers, { display: { createdAt: null, updatedAt: null } });\n }),\n});\n","import { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, deploymentArgs, jsonArgs, withCommonArgs } from \"../args\";\nimport { fetchMachineUserToken, initOperatorClient } from \"../client\";\nimport { loadConfig } from \"../config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger } from \"../utils/logger\";\n\nexport interface GetMachineUserTokenOptions {\n name: string;\n workspaceId?: string;\n profile?: string;\n configPath?: string;\n}\n\nexport interface MachineUserTokenInfo {\n accessToken: string;\n tokenType: string;\n expiresAt: string;\n}\n\n/**\n * Get a machine user access token for the current application.\n * @param options - Token retrieval options\n * @returns Machine user token info\n */\nexport async function getMachineUserToken(\n options: GetMachineUserTokenOptions,\n): Promise<MachineUserTokenInfo> {\n // Load and validate options\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n // Get application\n const { config } = await loadConfig(options.configPath);\n const { application } = await client.getApplication({\n workspaceId,\n applicationName: config.name,\n });\n if (!application?.authNamespace) {\n throw new Error(`Application ${config.name} does not have an auth configuration.`);\n }\n\n // Get machine user\n const { machineUser } = await client.getAuthMachineUser({\n workspaceId,\n authNamespace: application.authNamespace,\n name: options.name,\n });\n if (!machineUser) {\n throw new Error(`Machine user ${options.name} not found.`);\n }\n\n // Fetch machine user token\n const resp = await fetchMachineUserToken(\n application.url,\n machineUser.clientId,\n machineUser.clientSecret,\n );\n const expiresAt = new Date();\n expiresAt.setSeconds(expiresAt.getSeconds() + resp.expires_in);\n\n return {\n accessToken: resp.access_token,\n tokenType: resp.token_type,\n expiresAt: expiresAt.toISOString(),\n };\n}\n\nexport const tokenCommand = defineCommand({\n name: \"token\",\n description: \"Get an access token for a machine user.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...deploymentArgs,\n name: arg(z.string(), {\n positional: true,\n description: \"Machine user name\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n // Execute machineuser token logic\n const token = await getMachineUserToken({\n name: args.name,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n configPath: args.config,\n });\n\n // Show machine user token info\n // TODO: remove this transformation\n const tokenInfo = {\n access_token: token.accessToken,\n token_type: token.tokenType,\n expires_at: token.expiresAt,\n };\n logger.out(tokenInfo);\n }),\n});\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport {\n type AuthOAuth2Client,\n AuthOAuth2Client_GrantType,\n} from \"@tailor-proto/tailor/v1/auth_resource_pb\";\n\nconst grantTypeToString = (grantType: AuthOAuth2Client_GrantType): string => {\n switch (grantType) {\n case AuthOAuth2Client_GrantType.AUTHORIZATION_CODE:\n return \"authorization_code\";\n case AuthOAuth2Client_GrantType.REFRESH_TOKEN:\n return \"refresh_token\";\n default:\n return \"unknown\";\n }\n};\n\nexport interface OAuth2ClientInfo {\n name: string;\n description: string;\n clientId: string;\n grantTypes: string[];\n redirectUris: string[];\n createdAt: Date | null;\n}\n\nexport interface OAuth2ClientCredentials {\n name: string;\n description: string;\n clientId: string;\n clientSecret: string;\n grantTypes: string[];\n redirectUris: string[];\n createdAt: Date | null;\n}\n\n/**\n * Transform an AuthOAuth2Client into CLI-friendly OAuth2 client info.\n * @param client - OAuth2 client resource\n * @returns Flattened OAuth2 client info\n */\nexport function toOAuth2ClientInfo(client: AuthOAuth2Client): OAuth2ClientInfo {\n return {\n name: client.name,\n description: client.description,\n clientId: client.clientId,\n grantTypes: client.grantTypes.map(grantTypeToString),\n redirectUris: client.redirectUris,\n createdAt: client.createdAt ? timestampDate(client.createdAt) : null,\n };\n}\n\n/**\n * Transform an AuthOAuth2Client into OAuth2 client credentials info.\n * @param client - OAuth2 client resource\n * @returns OAuth2 client credentials\n */\nexport function toOAuth2ClientCredentials(client: AuthOAuth2Client): OAuth2ClientCredentials {\n return {\n name: client.name,\n description: client.description,\n clientId: client.clientId,\n clientSecret: client.clientSecret,\n grantTypes: client.grantTypes.map(grantTypeToString),\n redirectUris: client.redirectUris,\n createdAt: client.createdAt ? timestampDate(client.createdAt) : null,\n };\n}\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, deploymentArgs, jsonArgs, withCommonArgs } from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadConfig } from \"../config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger } from \"../utils/logger\";\nimport { type OAuth2ClientCredentials, toOAuth2ClientCredentials } from \"./transform\";\n\nexport interface GetOAuth2ClientOptions {\n name: string;\n workspaceId?: string;\n profile?: string;\n configPath?: string;\n}\n\n/**\n * Get OAuth2 client credentials for the current application.\n * @param options - OAuth2 client lookup options\n * @returns OAuth2 client credentials\n */\nexport async function getOAuth2Client(\n options: GetOAuth2ClientOptions,\n): Promise<OAuth2ClientCredentials> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n const { config } = await loadConfig(options.configPath);\n const { application } = await client.getApplication({\n workspaceId,\n applicationName: config.name,\n });\n if (!application?.authNamespace) {\n throw new Error(`Application ${config.name} does not have an auth configuration.`);\n }\n\n try {\n const { oauth2Client } = await client.getAuthOAuth2Client({\n workspaceId,\n namespaceName: application.authNamespace,\n name: options.name,\n });\n\n return toOAuth2ClientCredentials(oauth2Client!);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`OAuth2 client '${options.name}' not found.`);\n }\n throw error;\n }\n}\n\nexport const getCommand = defineCommand({\n name: \"get\",\n description: \"Get OAuth2 client credentials (including client secret).\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...deploymentArgs,\n name: arg(z.string(), {\n positional: true,\n description: \"OAuth2 client name\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n const credentials = await getOAuth2Client({\n name: args.name,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n configPath: args.config,\n });\n\n logger.out(credentials);\n }),\n});\n","import { defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, deploymentArgs, jsonArgs, withCommonArgs } from \"../args\";\nimport { fetchAll, initOperatorClient } from \"../client\";\nimport { loadConfig } from \"../config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger } from \"../utils/logger\";\nimport { type OAuth2ClientInfo, toOAuth2ClientInfo } from \"./transform\";\n\nexport interface ListOAuth2ClientsOptions {\n workspaceId?: string;\n profile?: string;\n configPath?: string;\n}\n\n/**\n * List OAuth2 clients for the current application.\n * @param options - OAuth2 client listing options\n * @returns List of OAuth2 clients\n */\nexport async function listOAuth2Clients(\n options?: ListOAuth2ClientsOptions,\n): Promise<OAuth2ClientInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n const { config } = await loadConfig(options?.configPath);\n const { application } = await client.getApplication({\n workspaceId,\n applicationName: config.name,\n });\n if (!application?.authNamespace) {\n throw new Error(`Application ${config.name} does not have an auth configuration.`);\n }\n\n const oauth2Clients = await fetchAll(async (pageToken) => {\n const { oauth2Clients, nextPageToken } = await client.listAuthOAuth2Clients({\n workspaceId,\n pageToken,\n namespaceName: application.authNamespace,\n });\n return [oauth2Clients, nextPageToken];\n });\n\n return oauth2Clients.map(toOAuth2ClientInfo);\n}\n\nexport const listCommand = defineCommand({\n name: \"list\",\n description: \"List all OAuth2 clients in the application.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...deploymentArgs,\n }),\n run: withCommonArgs(async (args) => {\n const oauth2Clients = await listOAuth2Clients({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n configPath: args.config,\n });\n\n logger.out(oauth2Clients);\n }),\n});\n","import ml from \"multiline-ts\";\nimport { defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { type Application, defineApplication } from \"@/cli/application\";\nimport { type PlanContext } from \"@/cli/apply\";\nimport { applyApplication, planApplication } from \"@/cli/apply/services/application\";\nimport { applyAuth, planAuth } from \"@/cli/apply/services/auth\";\nimport { applyExecutor, planExecutor } from \"@/cli/apply/services/executor\";\nimport { applyIdP, planIdP } from \"@/cli/apply/services/idp\";\nimport { applyPipeline, planPipeline } from \"@/cli/apply/services/resolver\";\nimport { applyStaticWebsite, planStaticWebsite } from \"@/cli/apply/services/staticwebsite\";\nimport { applyTailorDB, planTailorDB } from \"@/cli/apply/services/tailordb\";\nimport { loadConfig, type LoadedConfig } from \"@/cli/config-loader\";\nimport { applyFunctionRegistry, planFunctionRegistry } from \"./apply/services/function-registry\";\nimport { applyWorkflow, planWorkflow } from \"./apply/services/workflow\";\nimport { commonArgs, confirmationArgs, deploymentArgs, withCommonArgs } from \"./args\";\nimport { initOperatorClient, type OperatorClient } from \"./client\";\nimport { loadAccessToken, loadWorkspaceId } from \"./context\";\nimport { logger } from \"./utils/logger\";\n\nexport interface RemoveOptions {\n workspaceId?: string;\n profile?: string;\n configPath?: string;\n}\n\nasync function loadOptions(options?: RemoveOptions) {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n const { config } = await loadConfig(options?.configPath);\n const application = defineApplication({ config });\n return {\n client,\n workspaceId,\n application,\n config,\n };\n}\n\nasync function execRemove(\n client: OperatorClient,\n workspaceId: string,\n application: Application,\n config: LoadedConfig,\n confirm?: () => Promise<void>,\n) {\n // Plan all resources with forRemoval=true\n const ctx: PlanContext = {\n client,\n workspaceId,\n application,\n forRemoval: true,\n config,\n };\n const tailorDB = await planTailorDB(ctx);\n const staticWebsite = await planStaticWebsite(ctx);\n const idp = await planIdP(ctx);\n const auth = await planAuth(ctx);\n const pipeline = await planPipeline(ctx);\n const app = await planApplication(ctx);\n const executor = await planExecutor(ctx);\n const workflow = await planWorkflow(client, workspaceId, application.name, {}, {});\n const functionRegistry = await planFunctionRegistry(client, workspaceId, application.name, []);\n\n if (\n tailorDB.changeSet.service.deletes.length === 0 &&\n staticWebsite.changeSet.deletes.length === 0 &&\n idp.changeSet.service.deletes.length === 0 &&\n auth.changeSet.service.deletes.length === 0 &&\n pipeline.changeSet.service.deletes.length === 0 &&\n app.deletes.length === 0 &&\n executor.changeSet.deletes.length === 0 &&\n workflow.changeSet.deletes.length === 0 &&\n functionRegistry.changeSet.deletes.length === 0\n ) {\n return;\n }\n\n // Confirm deletion\n if (confirm) {\n await confirm();\n }\n\n // Apply deletions in reverse order of dependencies\n await applyWorkflow(client, workflow, \"delete\");\n await applyExecutor(client, executor, \"delete\");\n await applyStaticWebsite(client, staticWebsite, \"delete\");\n await applyApplication(client, app, \"delete\");\n await applyPipeline(client, pipeline, \"delete-resources\");\n await applyPipeline(client, pipeline, \"delete-services\");\n await applyAuth(client, auth, \"delete-resources\");\n await applyAuth(client, auth, \"delete-services\");\n await applyIdP(client, idp, \"delete-resources\");\n await applyIdP(client, idp, \"delete-services\");\n await applyTailorDB(client, tailorDB, \"delete-resources\");\n await applyTailorDB(client, tailorDB, \"delete-services\");\n await applyFunctionRegistry(client, workspaceId, functionRegistry, \"delete\");\n}\n\n/**\n * Remove all resources managed by the current application.\n * @param options - Remove options\n * @returns Promise that resolves when removal completes\n */\nexport async function remove(options?: RemoveOptions): Promise<void> {\n const { client, workspaceId, application, config } = await loadOptions(options);\n await execRemove(client, workspaceId, application, config);\n}\n\nexport const removeCommand = defineCommand({\n name: \"remove\",\n description: \"Remove all resources managed by the application from the workspace.\",\n args: z.object({\n ...commonArgs,\n ...deploymentArgs,\n ...confirmationArgs,\n }),\n run: withCommonArgs(async (args) => {\n const { client, workspaceId, application, config } = await loadOptions({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n configPath: args.config,\n });\n\n logger.info(`Planning removal of resources managed by \"${application.name}\"...`);\n logger.newline();\n\n await execRemove(client, workspaceId, application, config, async () => {\n if (!args.yes) {\n const confirmed = await logger.prompt(\"Are you sure you want to remove all resources?\", {\n type: \"confirm\",\n initial: false,\n });\n if (!confirmed) {\n throw new Error(ml`\n Remove cancelled. No resources were deleted.\n To override, run again and confirm, or use --yes flag.\n `);\n }\n } else {\n logger.success(\"Removing all resources (--yes flag specified)...\");\n }\n });\n\n logger.success(`Successfully removed all resources managed by \"${application.name}\".`);\n }),\n});\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, deploymentArgs, jsonArgs, withCommonArgs } from \"./args\";\nimport { initOperatorClient } from \"./client\";\nimport { loadConfig } from \"./config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"./context\";\nimport { logger } from \"./utils/logger\";\nimport type { Application } from \"@tailor-proto/tailor/v1/application_resource_pb\";\n\nexport interface ShowOptions {\n workspaceId?: string;\n profile?: string;\n configPath?: string;\n}\n\nexport interface WorkspaceInfo {\n workspaceId: string;\n workspaceName: string;\n workspaceRegion?: string;\n}\n\nexport interface ApplicationInfo {\n name: string;\n domain: string;\n url: string;\n auth: string;\n cors: string[];\n allowedIpAddresses: string[];\n disableIntrospection: boolean;\n createdAt: Date | null;\n updatedAt: Date | null;\n}\n\nexport interface ShowInfo extends ApplicationInfo, WorkspaceInfo {}\n\nfunction applicationInfo(app: Application): ApplicationInfo {\n return {\n name: app.name,\n domain: app.domain,\n url: app.url,\n auth: app.authNamespace,\n cors: app.cors,\n allowedIpAddresses: app.allowedIpAddresses,\n disableIntrospection: app.disableIntrospection,\n createdAt: app.createTime ? timestampDate(app.createTime) : null,\n updatedAt: app.updateTime ? timestampDate(app.updateTime) : null,\n };\n}\n\n/**\n * Show applied application information for the current workspace.\n * @param options - Show options\n * @returns Application information\n */\nexport async function show(options?: ShowOptions): Promise<ShowInfo> {\n // Load and validate options\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n const { config } = await loadConfig(options?.configPath);\n const [workspaceResp, resp] = await Promise.all([\n client.getWorkspace({\n workspaceId,\n }),\n client.getApplication({\n workspaceId,\n applicationName: config.name,\n }),\n ]);\n const { name, ...appInfo } = applicationInfo(resp.application!);\n\n return {\n name,\n workspaceId,\n workspaceName: workspaceResp.workspace?.name ?? \"\",\n workspaceRegion: workspaceResp.workspace?.region ?? \"\",\n ...appInfo,\n };\n}\n\nexport const showCommand = defineCommand({\n name: \"show\",\n description: \"Show information about the deployed application.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...deploymentArgs,\n }),\n run: withCommonArgs(async (args) => {\n // Execute show logic\n const appInfo = await show({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n configPath: args.config,\n });\n\n logger.out(appInfo);\n }),\n});\n","import { logger } from \"./logger\";\n\n/**\n * Warn that a feature is in beta.\n * @param {string} featureName - Name of the beta feature (e.g., \"tailordb erd\", \"tailordb migration\")\n */\nexport function logBetaWarning(featureName: string): void {\n logger.warn(\n `The '${featureName}' command is a beta feature and may introduce breaking changes in future releases.`,\n );\n logger.newline();\n}\n","/**\n * DB types generator for TailorDB migrations\n *\n * Generates db.ts file containing Kysely Transaction types\n * based on the schema snapshot at a specific migration point.\n */\n\nimport * as fs from \"node:fs/promises\";\nimport {\n getMigrationFilePath,\n type SchemaSnapshot,\n type SnapshotFieldConfig,\n type SnapshotType,\n} from \"./snapshot\";\nimport type { MigrationDiff } from \"./diff-calculator\";\n\n/**\n * Information about enum value changes\n */\ninterface EnumValueChange {\n /** Allowed values before the change */\n beforeValues: string[];\n /** Allowed values after the change */\n afterValues: string[];\n}\n\n/**\n * Information about breaking change fields that need special handling\n */\ninterface BreakingChangeFieldInfo {\n /** Map of typeName -> Set of fieldNames that are changing from optional to required */\n optionalToRequired: Map<string, Set<string>>;\n /** Map of typeName -> Map of fieldName -> SnapshotFieldConfig for newly added required fields */\n addedRequiredFields: Map<string, Map<string, SnapshotFieldConfig>>;\n /** Map of typeName -> Map of fieldName -> EnumValueChange for enum value changes */\n enumValueChanges: Map<string, Map<string, EnumValueChange>>;\n}\n\n/**\n * Extract breaking change field information from diff\n * @param {MigrationDiff} diff - Migration diff\n * @returns {BreakingChangeFieldInfo} Breaking change field information\n */\nfunction extractBreakingChangeFields(diff: MigrationDiff): BreakingChangeFieldInfo {\n const optionalToRequired = new Map<string, Set<string>>();\n const addedRequiredFields = new Map<string, Map<string, SnapshotFieldConfig>>();\n const enumValueChanges = new Map<string, Map<string, EnumValueChange>>();\n\n for (const change of diff.changes) {\n if (change.kind === \"field_modified\" && change.fieldName) {\n const before = change.before as SnapshotFieldConfig | undefined;\n const after = change.after as SnapshotFieldConfig | undefined;\n\n // Check if this is an optional -> required change\n if (before && after && !before.required && after.required) {\n if (!optionalToRequired.has(change.typeName)) {\n optionalToRequired.set(change.typeName, new Set());\n }\n optionalToRequired.get(change.typeName)!.add(change.fieldName);\n }\n\n // Check if this is an enum value change\n if (\n before &&\n after &&\n before.type === \"enum\" &&\n after.type === \"enum\" &&\n before.allowedValues &&\n after.allowedValues\n ) {\n // Check if there are any differences in allowed values\n const beforeValues = before.allowedValues.map((v) => v.value);\n const afterValues = after.allowedValues.map((v) => v.value);\n const beforeSet = new Set(beforeValues);\n const afterSet = new Set(afterValues);\n const hasChanges =\n beforeValues.some((v) => !afterSet.has(v)) || afterValues.some((v) => !beforeSet.has(v));\n\n if (hasChanges) {\n if (!enumValueChanges.has(change.typeName)) {\n enumValueChanges.set(change.typeName, new Map());\n }\n enumValueChanges.get(change.typeName)!.set(change.fieldName, {\n beforeValues,\n afterValues,\n });\n }\n }\n } else if (change.kind === \"field_added\" && change.fieldName) {\n const after = change.after as SnapshotFieldConfig | undefined;\n\n // Required field added is a breaking change - add it as optional in db.ts\n // so migration script can set values for existing records\n if (after && after.required) {\n if (!addedRequiredFields.has(change.typeName)) {\n addedRequiredFields.set(change.typeName, new Map());\n }\n addedRequiredFields.get(change.typeName)!.set(change.fieldName, after);\n }\n }\n }\n\n return { optionalToRequired, addedRequiredFields, enumValueChanges };\n}\n\n/**\n * Generate the complete db.ts file content from a schema snapshot\n * @param {SchemaSnapshot} snapshot - Schema snapshot to generate types from\n * @param {MigrationDiff} [diff] - Optional migration diff for breaking change info\n * @returns {string} Generated db.ts file contents\n */\nfunction generateDbTypesFromSnapshot(snapshot: SchemaSnapshot, diff?: MigrationDiff): string {\n const types = Object.values(snapshot.types);\n if (types.length === 0) {\n return generateEmptyDbTypes(snapshot.namespace);\n }\n\n // Extract breaking change field information\n const breakingChangeFields = diff\n ? extractBreakingChangeFields(diff)\n : {\n optionalToRequired: new Map(),\n addedRequiredFields: new Map(),\n enumValueChanges: new Map(),\n };\n\n // Track which utility types are used\n const usedUtilityTypes = new Set<\"Timestamp\" | \"Serial\">();\n\n // Generate type definitions\n const typeDefinitions: string[] = [];\n for (const type of types) {\n const result = generateTableType(type, breakingChangeFields);\n if (result.usedTimestamp) usedUtilityTypes.add(\"Timestamp\");\n typeDefinitions.push(result.typeDef);\n }\n\n // Build imports\n // ColumnType is always needed for Generated and Timestamp utility types\n const imports: string[] = [\"type ColumnType\", \"type Transaction as KyselyTransaction\"];\n\n // Build utility type declarations\n const utilityTypeDeclarations: string[] = [];\n if (usedUtilityTypes.has(\"Timestamp\")) {\n utilityTypeDeclarations.push(\n \"type Timestamp = ColumnType<Date, Date | string, Date | string>;\",\n );\n }\n utilityTypeDeclarations.push(\n \"type Generated<T> = T extends ColumnType<infer S, infer I, infer U>\\n ? ColumnType<S, I | undefined, U>\\n : ColumnType<T, T | undefined, T>;\",\n );\n if (usedUtilityTypes.has(\"Serial\")) {\n utilityTypeDeclarations.push(\"type Serial<T = string | number> = ColumnType<T, never, never>;\");\n }\n\n // Build output\n const lines: string[] = [\n \"/**\",\n \" * Auto-generated Kysely types for migration script.\",\n \" * These types reflect the database schema state at this migration point.\",\n \" *\",\n \" * DO NOT EDIT - This file is auto-generated by the migration system.\",\n \" */\",\n \"\",\n `import { ${imports.join(\", \")} } from \"@tailor-platform/sdk/kysely\";`,\n \"\",\n ...utilityTypeDeclarations,\n \"\",\n \"interface Database {\",\n ...typeDefinitions,\n \"}\",\n \"\",\n \"export type Transaction = KyselyTransaction<Database>;\",\n ];\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Generate an empty db.ts file for migrations with no types\n * @param {string} namespace - Namespace name\n * @returns {string} Empty db.ts file contents\n */\nfunction generateEmptyDbTypes(namespace: string): string {\n return (\n [\n \"/**\",\n \" * Auto-generated Kysely types for migration script.\",\n ` * Namespace: ${namespace}`,\n \" *\",\n \" * DO NOT EDIT - This file is auto-generated by the migration system.\",\n \" */\",\n \"\",\n 'import { type Transaction as KyselyTransaction } from \"@tailor-platform/sdk/kysely\";',\n \"\",\n \"// eslint-disable-next-line @typescript-eslint/no-empty-object-type\",\n \"interface Database {}\",\n \"\",\n \"export type Transaction = KyselyTransaction<Database>;\",\n ].join(\"\\n\") + \"\\n\"\n );\n}\n\n/**\n * Generate table type definition from a snapshot type\n * @param {SnapshotType} type - Snapshot type\n * @param {BreakingChangeFieldInfo} breakingChangeFields - Breaking change field info\n * @returns {{ typeDef: string; usedTimestamp: boolean; usedColumnType: boolean }} Generated type and utility type usage\n */\nfunction generateTableType(\n type: SnapshotType,\n breakingChangeFields: BreakingChangeFieldInfo,\n): {\n typeDef: string;\n usedTimestamp: boolean;\n usedColumnType: boolean;\n} {\n const fieldLines: string[] = [];\n let usedTimestamp = false;\n let usedColumnType = false;\n\n // Add id field first\n fieldLines.push(\" id: Generated<string>;\");\n\n // Get fields that are changing from optional to required for this type\n const optionalToRequiredFields =\n breakingChangeFields.optionalToRequired.get(type.name) || new Set();\n\n // Get newly added required fields for this type\n const addedRequiredFields = breakingChangeFields.addedRequiredFields.get(type.name) || new Map();\n\n // Get enum value changes for this type\n const enumValueChangesForType = breakingChangeFields.enumValueChanges.get(type.name) || new Map();\n\n for (const [fieldName, fieldConfig] of Object.entries(type.fields)) {\n if (fieldName === \"id\") continue;\n\n const isOptionalToRequired = optionalToRequiredFields.has(fieldName);\n const enumValueChange = enumValueChangesForType.get(fieldName);\n const result = generateFieldType(fieldConfig, isOptionalToRequired, enumValueChange);\n fieldLines.push(` ${fieldName}: ${result.type};`);\n usedTimestamp = usedTimestamp || result.usedTimestamp;\n usedColumnType = usedColumnType || result.usedColumnType;\n }\n\n // Add newly added required fields with ColumnType (same as optional→required)\n // These fields are added as nullable in pre-migration, then become required in post-migration\n for (const [fieldName, fieldConfig] of addedRequiredFields) {\n // Treat as optional→required change (isOptionalToRequired: true)\n const result = generateFieldType(fieldConfig, true, undefined);\n fieldLines.push(` ${fieldName}: ${result.type};`);\n usedTimestamp = usedTimestamp || result.usedTimestamp;\n usedColumnType = usedColumnType || result.usedColumnType;\n }\n\n const typeDef = ` ${type.name}: {\\n${fieldLines.join(\"\\n\")}\\n }`;\n\n return { typeDef, usedTimestamp, usedColumnType };\n}\n\nfunction mapToTsType(fieldType: string): {\n type: string;\n usedTimestamp: boolean;\n} {\n switch (fieldType) {\n case \"uuid\":\n case \"string\":\n return { type: \"string\", usedTimestamp: false };\n case \"integer\":\n case \"float\":\n case \"number\":\n return { type: \"number\", usedTimestamp: false };\n case \"date\":\n case \"datetime\":\n return { type: \"Timestamp\", usedTimestamp: true };\n case \"bool\":\n case \"boolean\":\n return { type: \"boolean\", usedTimestamp: false };\n default:\n return { type: \"string\", usedTimestamp: false };\n }\n}\n\nfunction formatEnumUnion(values: string[]): string {\n return values.map((v) => `\"${v}\"`).join(\" | \");\n}\n\nfunction generateEnumChangeColumnType(\n enumValueChange: EnumValueChange,\n config: SnapshotFieldConfig,\n): string {\n const allValues = [...new Set([...enumValueChange.beforeValues, ...enumValueChange.afterValues])];\n const selectType = formatEnumUnion(allValues);\n const afterType = formatEnumUnion(enumValueChange.afterValues);\n\n if (config.array && !config.required) {\n return `ColumnType<(${selectType})[] | null, (${afterType})[] | null, (${afterType})[] | null>`;\n }\n if (config.array) {\n return `ColumnType<(${selectType})[], (${afterType})[], (${afterType})[]>`;\n }\n if (!config.required) {\n return `ColumnType<(${selectType}) | null, (${afterType}) | null, (${afterType}) | null>`;\n }\n return `ColumnType<${selectType}, ${afterType}, ${afterType}>`;\n}\n\n/**\n * Generate field type from snapshot field config\n * @param {SnapshotFieldConfig} config - Field configuration\n * @param {boolean} isOptionalToRequired - Whether this field is changing from optional to required\n * @param {EnumValueChange} [enumValueChange] - Enum value change info if applicable\n * @returns {{ type: string; usedTimestamp: boolean; usedColumnType: boolean }} Generated type string and utility type usage\n */\nfunction generateFieldType(\n config: SnapshotFieldConfig,\n isOptionalToRequired: boolean,\n enumValueChange?: EnumValueChange,\n): {\n type: string;\n usedTimestamp: boolean;\n usedColumnType: boolean;\n} {\n // Handle enum value changes specially\n if (enumValueChange) {\n return {\n type: generateEnumChangeColumnType(enumValueChange, config),\n usedTimestamp: false,\n usedColumnType: true,\n };\n }\n\n // Get base type\n let baseType: string;\n let usedTimestamp = false;\n\n if (config.type === \"enum\") {\n const enumValues = config.allowedValues?.map((v) => v.value) ?? [];\n baseType = enumValues.length > 0 ? formatEnumUnion(enumValues) : \"string\";\n } else {\n const mapped = mapToTsType(config.type);\n baseType = mapped.type;\n usedTimestamp = mapped.usedTimestamp;\n }\n\n // Apply array modifier\n let type = baseType;\n if (config.array) {\n const needsParens =\n config.type === \"enum\" && config.allowedValues && config.allowedValues.length > 0;\n type = needsParens ? `(${baseType})[]` : `${baseType}[]`;\n }\n\n // Handle nullable/required modifiers\n if (isOptionalToRequired) {\n // For fields changing from optional to required:\n // SELECT returns T | null (existing data might be null)\n // INSERT/UPDATE requires T (must provide a value)\n return {\n type: `ColumnType<${type} | null, ${type}, ${type}>`,\n usedTimestamp,\n usedColumnType: true,\n };\n }\n\n if (!config.required) {\n type = `${type} | null`;\n }\n\n return { type, usedTimestamp, usedColumnType: false };\n}\n\n/**\n * Write db.ts file for a migration\n * @param {SchemaSnapshot} snapshot - Schema snapshot to generate types from\n * @param {string} migrationsDir - Migrations directory path\n * @param {number} migrationNumber - Migration number\n * @param {MigrationDiff} [diff] - Optional migration diff for breaking change info\n * @returns {Promise<string>} Path to the written file\n */\nexport async function writeDbTypesFile(\n snapshot: SchemaSnapshot,\n migrationsDir: string,\n migrationNumber: number,\n diff?: MigrationDiff,\n): Promise<string> {\n const content = generateDbTypesFromSnapshot(snapshot, diff);\n const filePath = getMigrationFilePath(migrationsDir, migrationNumber, \"db\");\n await fs.writeFile(filePath, content);\n return filePath;\n}\n","/**\n * Template generator for TailorDB migrations\n *\n * Generates migration files in directory structure:\n * - XXXX/schema.json - Full schema snapshot (initial migration 0000)\n * - XXXX/diff.json - Schema diff (subsequent migrations 0001+)\n * - XXXX/migrate.ts - Data migration script (when breaking changes exist)\n * - XXXX/db.ts - Generated types for migration script\n */\n\nimport * as fs from \"node:fs/promises\";\nimport { writeDbTypesFile } from \"./db-types-generator\";\nimport {\n getMigrationDirPath,\n getMigrationFilePath,\n type SchemaSnapshot,\n type SnapshotFieldConfig,\n} from \"./snapshot\";\nimport type { MigrationDiff, DiffChange } from \"./diff-calculator\";\n\n/**\n * Check if a file exists\n * @param {string} filePath - Path to check\n * @returns {Promise<boolean>} True if file exists\n */\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Ensure a file does not already exist, throwing an error if it does\n * @param {string} filePath - Path to check\n * @throws {Error} If file already exists\n */\nasync function ensureFileNotExists(filePath: string): Promise<void> {\n if (await fileExists(filePath)) {\n throw new Error(`Migration file already exists: ${filePath}`);\n }\n}\n\ninterface GenerateSchemaResult {\n filePath: string;\n migrationNumber: number;\n}\n\ninterface GenerateDiffResult {\n diffFilePath: string;\n migrateFilePath?: string;\n dbTypesFilePath?: string;\n migrationNumber: number;\n}\n\n/**\n * Generate the initial schema snapshot file\n * @param {SchemaSnapshot} snapshot - Schema snapshot to save\n * @param {string} migrationsDir - Migrations directory path\n * @param {number} migrationNumber - Migration number\n * @returns {Promise<GenerateSchemaResult>} Generated file info\n */\nexport async function generateSchemaFile(\n snapshot: SchemaSnapshot,\n migrationsDir: string,\n migrationNumber: number,\n): Promise<GenerateSchemaResult> {\n // Create migration directory\n const migrationDir = getMigrationDirPath(migrationsDir, migrationNumber);\n await fs.mkdir(migrationDir, { recursive: true });\n\n const filePath = getMigrationFilePath(migrationsDir, migrationNumber, \"schema\");\n\n // Check if file already exists to prevent accidental overwrite\n await ensureFileNotExists(filePath);\n\n await fs.writeFile(filePath, JSON.stringify(snapshot, null, 2));\n\n return {\n filePath,\n migrationNumber,\n };\n}\n\n/**\n * Generate diff and optional migration script files\n * @param {MigrationDiff} diff - Migration diff to save\n * @param {string} migrationsDir - Migrations directory path\n * @param {number} migrationNumber - Migration number\n * @param {SchemaSnapshot} previousSnapshot - Previous schema snapshot (for db.ts generation)\n * @param {string} [description] - Optional description for the migration\n * @returns {Promise<GenerateDiffResult>} Generated file info\n */\nexport async function generateDiffFiles(\n diff: MigrationDiff,\n migrationsDir: string,\n migrationNumber: number,\n previousSnapshot: SchemaSnapshot,\n description?: string,\n): Promise<GenerateDiffResult> {\n // Create migration directory\n const migrationDir = getMigrationDirPath(migrationsDir, migrationNumber);\n await fs.mkdir(migrationDir, { recursive: true });\n\n // Build file paths\n const diffFilePath = getMigrationFilePath(migrationsDir, migrationNumber, \"diff\");\n const migrateFilePath = getMigrationFilePath(migrationsDir, migrationNumber, \"migrate\");\n const dbTypesFilePath = getMigrationFilePath(migrationsDir, migrationNumber, \"db\");\n\n // Check if files already exist to prevent accidental overwrite\n await ensureFileNotExists(diffFilePath);\n if (diff.requiresMigrationScript) {\n await ensureFileNotExists(migrateFilePath);\n await ensureFileNotExists(dbTypesFilePath);\n }\n\n // Add description if provided\n if (description) {\n diff = { ...diff, description };\n }\n\n // Write diff file\n await fs.writeFile(diffFilePath, JSON.stringify(diff, null, 2));\n\n const result: GenerateDiffResult = {\n diffFilePath,\n migrationNumber,\n };\n\n // Generate migration script and db types only if migration script is required\n if (diff.requiresMigrationScript) {\n const scriptContent = generateMigrationScript(diff);\n await fs.writeFile(migrateFilePath, scriptContent);\n result.migrateFilePath = migrateFilePath;\n\n // Generate db.ts with types based on the PREVIOUS schema state\n // (the state before this migration runs)\n // Pass diff to generate ColumnType for optional->required fields\n await writeDbTypesFile(previousSnapshot, migrationsDir, migrationNumber, diff);\n result.dbTypesFilePath = dbTypesFilePath;\n }\n\n return result;\n}\n\n/**\n * Generate migration script content based on diff\n * @param {MigrationDiff} diff - Migration diff\n * @returns {string} Migration script content\n */\nfunction generateMigrationScript(diff: MigrationDiff): string {\n const updates: string[] = [];\n\n for (const change of diff.changes) {\n const script = generateChangeScript(change);\n if (script) {\n updates.push(script);\n }\n }\n\n if (updates.length === 0) {\n updates.push(` // No data migration needed for this schema change\n // Add custom data transformations if required`);\n }\n\n return `/**\n * Migration script for ${diff.namespace}\n *\n * This script handles data migration for breaking schema changes.\n * Edit this file to implement your data migration logic.\n *\n * The transaction is managed by the apply command.\n * If any operation fails, all changes will be rolled back.\n */\n\nimport type { Transaction } from \"./db\";\n\nexport async function main(trx: Transaction): Promise<void> {\n${updates.join(\"\\n\\n\")}\n}\n`;\n}\n\n/**\n * Generate script for a single change\n * @param {DiffChange} change - Diff change to generate script for\n * @returns {string | null} Script content or null if no script needed\n */\nfunction generateChangeScript(change: DiffChange): string | null {\n if (change.kind === \"field_added\") {\n const field = change.after as SnapshotFieldConfig;\n if (field.required) {\n return ` // Populate ${change.fieldName} for existing ${change.typeName} records\n await trx\n .updateTable(\"${change.typeName}\")\n .set({\n ${change.fieldName}: null, // TODO: Set appropriate default value\n })\n .execute();`;\n }\n return null;\n }\n\n if (change.kind !== \"field_modified\") {\n // No data migration needed for type_added, type_removed, or field_removed\n return null;\n }\n\n const before = change.before as SnapshotFieldConfig;\n const after = change.after as SnapshotFieldConfig;\n\n // Note: Type change is rejected as unsupported in generate.ts\n // No script generation needed here\n\n // Optional to required\n if (!before.required && after.required) {\n return ` // Set ${change.fieldName} for ${change.typeName} records where it is null\n await trx\n .updateTable(\"${change.typeName}\")\n .set({\n ${change.fieldName}: null, // TODO: Set appropriate default value\n })\n .where(\"${change.fieldName}\", \"is\", null)\n .execute();`;\n }\n\n // Note: Array to single value change is rejected in generate.ts\n // No script generation needed here\n\n // Unique constraint added\n if (!(before.unique ?? false) && (after.unique ?? false)) {\n return ` // Ensure ${change.fieldName} values are unique before adding constraint\n const duplicates = await trx\n .selectFrom(\"${change.typeName}\")\n .select([\"${change.fieldName}\"])\n .groupBy(\"${change.fieldName}\")\n .having((eb) => eb.fn.count(\"id\"), \">\", 1)\n .execute();\n for (const dup of duplicates) {\n // Keep first record, add suffix to others\n const records = await trx\n .selectFrom(\"${change.typeName}\")\n .select([\"id\", \"${change.fieldName}\"])\n .where(\"${change.fieldName}\", \"=\", dup.${change.fieldName})\n .execute();\n for (let i = 1; i < records.length; i++) {\n await trx\n .updateTable(\"${change.typeName}\")\n .set({ ${change.fieldName}: \\`\\${records[i].${change.fieldName}}_\\${i}\\` }) // TODO: Set appropriate unique value\n .where(\"id\", \"=\", records[i].id)\n .execute();\n }\n }`;\n }\n\n // Enum values removed\n if (before.type === \"enum\" && after.type === \"enum\") {\n const beforeValues = before.allowedValues ?? [];\n const afterValues = after.allowedValues ?? [];\n const removedValues = beforeValues.filter((v) => !afterValues.includes(v));\n if (removedValues.length > 0) {\n const defaultValue = afterValues[0] ?? \"NEW_VALUE\";\n return ` // Migrate records with removed enum values: ${removedValues.join(\", \")}\n await trx\n .updateTable(\"${change.typeName}\")\n .set({ ${change.fieldName}: \"${defaultValue}\" }) // TODO: Set appropriate value\n .where(\"${change.fieldName}\", \"in\", [${removedValues.map((v) => `\"${v}\"`).join(\", \")}])\n .execute();`;\n }\n }\n\n // Foreign key relationship changed\n if (\n before.foreignKeyType &&\n after.foreignKeyType &&\n before.foreignKeyType !== after.foreignKeyType\n ) {\n return ` // Migrate ${change.fieldName} references from ${before.foreignKeyType} to ${after.foreignKeyType}\n // Find records that don't have a valid reference in the new target table\n const orphanedRecords = await trx\n .selectFrom(\"${change.typeName}\")\n .leftJoin(\"${after.foreignKeyType}\", \"${change.typeName}.${change.fieldName}\", \"${after.foreignKeyType}.id\")\n .select([\"${change.typeName}.id\", \"${change.typeName}.${change.fieldName}\"])\n .where(\"${after.foreignKeyType}.id\", \"is\", null)\n .where(\"${change.typeName}.${change.fieldName}\", \"is not\", null)\n .execute();\n for (const record of orphanedRecords) {\n await trx\n .updateTable(\"${change.typeName}\")\n .set({ ${change.fieldName}: null }) // TODO: Set appropriate new reference\n .where(\"id\", \"=\", record.id)\n .execute();\n }`;\n }\n\n return null;\n}\n\n/**\n * Check if a migration script exists for a given migration number\n * @param {string} migrationsDir - Migrations directory path\n * @param {number} migrationNumber - Migration number\n * @returns {Promise<boolean>} True if script exists\n */\nexport async function migrationScriptExists(\n migrationsDir: string,\n migrationNumber: number,\n): Promise<boolean> {\n const filePath = getMigrationFilePath(migrationsDir, migrationNumber, \"migrate\");\n return fileExists(filePath);\n}\n\n/**\n * Get the migration script path for a given migration number\n * @param {string} migrationsDir - Migrations directory path\n * @param {number} migrationNumber - Migration number\n * @returns {string} Full path to migration script\n */\nexport function getMigrationScriptPath(migrationsDir: string, migrationNumber: number): string {\n return getMigrationFilePath(migrationsDir, migrationNumber, \"migrate\");\n}\n","/**\n * Generate command for TailorDB migrations\n *\n * Generates migration files based on local schema snapshots:\n * - First run: Creates initial schema snapshot (0000/schema.json)\n * - Subsequent runs: Creates diff from previous snapshot (0001/diff.json, etc.)\n */\n\nimport { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as path from \"pathe\";\nimport { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { PluginManager } from \"@/plugin/manager\";\nimport { commonArgs, confirmationArgs, withCommonArgs } from \"../../args\";\nimport { loadConfig } from \"../../config-loader\";\nimport { logBetaWarning } from \"../../utils/beta\";\nimport { logger, styles } from \"../../utils/logger\";\nimport { getNamespacesWithMigrations, type NamespaceWithMigrations } from \"./config\";\nimport {\n formatMigrationDiff,\n formatBreakingChanges,\n formatDiffSummary,\n hasChanges,\n} from \"./diff-calculator\";\nimport {\n createSnapshotFromLocalTypes,\n reconstructSnapshotFromMigrations,\n compareSnapshots,\n getNextMigrationNumber,\n assertValidMigrationFiles,\n INITIAL_SCHEMA_NUMBER,\n type SchemaSnapshot,\n} from \"./snapshot\";\nimport { generateSchemaFile, generateDiffFiles } from \"./template-generator\";\nimport type { Plugin } from \"@/parser/plugin-config\";\n\nexport interface GenerateOptions {\n configPath?: string;\n name?: string;\n yes?: boolean;\n init?: boolean;\n}\n\n/**\n * Handle --init option: delete existing migrations directories\n * @param {NamespaceWithMigrations[]} namespaces - Namespaces with migrations\n * @param {boolean} skipConfirmation - Whether to skip confirmation prompt\n * @returns {Promise<void>}\n */\nasync function handleInitOption(\n namespaces: NamespaceWithMigrations[],\n skipConfirmation?: boolean,\n): Promise<void> {\n // Find directories that exist\n const existingDirs = namespaces.filter(({ migrationsDir }) => fs.existsSync(migrationsDir));\n\n if (existingDirs.length === 0) {\n logger.info(\"No existing migration directories found.\");\n return;\n }\n\n // Show warning\n logger.newline();\n logger.warn(\"This will DELETE all existing migration files:\");\n for (const { namespace, migrationsDir } of existingDirs) {\n logger.log(` - ${namespace}: ${migrationsDir}`);\n }\n logger.newline();\n\n // Confirmation prompt\n if (!skipConfirmation) {\n const confirmation = await logger.prompt(\n \"Are you sure you want to delete these directories and start fresh?\",\n {\n type: \"confirm\",\n initial: false,\n },\n );\n\n if (!confirmation) {\n logger.info(\"Operation cancelled.\");\n process.exit(0);\n }\n logger.newline();\n }\n\n // Delete directories\n for (const { namespace, migrationsDir } of existingDirs) {\n try {\n await fsPromises.rm(migrationsDir, { recursive: true, force: true });\n logger.success(`Deleted migration directory for ${styles.bold(namespace)}`);\n } catch (error) {\n logger.error(`Failed to delete ${migrationsDir}: ${error}`);\n throw error;\n }\n }\n\n logger.newline();\n logger.info(\"Migration directories cleared. Generating initial snapshot...\");\n logger.newline();\n}\n\n/**\n * Generate migration files for TailorDB schema changes\n * @param {GenerateOptions} options - Generation options\n * @returns {Promise<void>} Promise that resolves when generation is complete\n */\nexport async function generate(options: GenerateOptions): Promise<void> {\n logBetaWarning(\"tailordb migration\");\n\n // Load configuration\n const { config, plugins } = await loadConfig(options.configPath);\n const configDir = path.dirname(config.path);\n\n // Get namespaces with migrations config\n const namespacesWithMigrations: NamespaceWithMigrations[] = getNamespacesWithMigrations(\n config,\n configDir,\n );\n\n if (namespacesWithMigrations.length === 0) {\n logger.warn(\"No TailorDB namespaces with migrations config found.\");\n logger.info(\n 'Add \"migration: { directory: \\\\\"./migrations\\\\\" }\" to your db config to enable migrations.',\n );\n return;\n }\n\n // Handle --init option: delete existing migrations directory\n if (options.init) {\n await handleInitOption(namespacesWithMigrations, options.yes);\n }\n\n // Initialize plugin manager if plugins are provided\n let pluginManager: PluginManager | undefined;\n if (plugins.length > 0) {\n pluginManager = new PluginManager(plugins as unknown as Plugin[]);\n }\n\n // Load application and all types\n const { defineApplication } = await import(\"../../application\");\n const application = defineApplication({ config, pluginManager });\n\n // Process each namespace\n for (const { namespace, migrationsDir } of namespacesWithMigrations) {\n logger.info(`Processing namespace: ${styles.bold(namespace)}`);\n\n // Validate existing migration files before generating new ones\n assertValidMigrationFiles(migrationsDir, namespace);\n\n // Find the TailorDB service for this namespace\n const tailordbService = application.tailorDBServices.find((s) => s.namespace === namespace);\n if (!tailordbService) {\n logger.warn(`No TailorDB service found for namespace \"${namespace}\"`);\n continue;\n }\n\n // Load types for this service\n await tailordbService.loadTypes();\n await tailordbService.processNamespacePlugins();\n\n const localTypesObj = tailordbService.getTypes();\n\n // Create snapshot from current local types\n const currentSnapshot = createSnapshotFromLocalTypes(localTypesObj, namespace);\n\n // Check if migrations directory exists and has snapshots\n let previousSnapshot: SchemaSnapshot | null = null;\n try {\n previousSnapshot = reconstructSnapshotFromMigrations(migrationsDir);\n } catch {\n // No previous migrations - this is fine\n }\n\n if (!previousSnapshot) {\n // First migration - generate initial schema snapshot\n await generateInitialSnapshot(currentSnapshot, migrationsDir);\n } else {\n // Compare with previous snapshot and generate diff\n await generateDiffFromSnapshot(previousSnapshot, currentSnapshot, migrationsDir, options);\n }\n }\n}\n\n/**\n * Generate the initial schema snapshot\n * @param {SchemaSnapshot} snapshot - Schema snapshot to save\n * @param {string} migrationsDir - Migrations directory path\n * @returns {Promise<void>} Promise that resolves when snapshot is generated\n */\nasync function generateInitialSnapshot(\n snapshot: SchemaSnapshot,\n migrationsDir: string,\n): Promise<void> {\n const result = await generateSchemaFile(snapshot, migrationsDir, INITIAL_SCHEMA_NUMBER);\n\n logger.success(`Generated initial schema snapshot`);\n logger.info(` File: ${result.filePath}`);\n logger.info(` Types: ${Object.keys(snapshot.types).length}`);\n\n logger.log(\"\\nThis is the baseline schema. Future changes will be tracked as diffs.\");\n}\n\n/**\n * Generate diff from previous snapshot\n * @param {SchemaSnapshot} previousSnapshot - Previous schema snapshot\n * @param {SchemaSnapshot} currentSnapshot - Current schema snapshot\n * @param {string} migrationsDir - Migrations directory path\n * @param {GenerateOptions} options - Generate options\n * @returns {Promise<void>} Promise that resolves when diff is generated\n */\nasync function generateDiffFromSnapshot(\n previousSnapshot: SchemaSnapshot,\n currentSnapshot: SchemaSnapshot,\n migrationsDir: string,\n options: GenerateOptions,\n): Promise<void> {\n // Calculate diff\n const diff = compareSnapshots(previousSnapshot, currentSnapshot);\n\n // Check if there are any changes\n if (!hasChanges(diff)) {\n logger.info(\"No schema differences detected.\");\n return;\n }\n\n // Display diff\n logger.newline();\n logger.log(formatMigrationDiff(diff));\n logger.newline();\n logger.info(`Summary: ${formatDiffSummary(diff)}`);\n\n // Check for unsupported changes\n const unsupportedChanges = diff.breakingChanges.filter((change) => change.unsupported);\n if (unsupportedChanges.length > 0) {\n for (const change of unsupportedChanges) {\n logger.newline();\n logger.error(`Unsupported change: ${change.typeName}.${change.fieldName}`);\n logger.error(` ${change.reason}`);\n }\n\n // Show 3-step migration hint if any unsupported change requires it\n if (unsupportedChanges.some((change) => change.showThreeStepHint)) {\n logger.newline();\n logger.info(\"These changes require a manual 3-step migration process:\");\n logger.info(\" Migration 1: Add a new field with the desired structure\");\n logger.info(\" and migrate data from old field to new field\");\n logger.info(\" Migration 2: Remove the old field\");\n logger.info(\" Migration 3: Add the field with the original name and new structure,\");\n logger.info(\" migrate data from temporary field, then remove temporary field\");\n }\n\n const details = unsupportedChanges\n .map((c) => ` - ${c.typeName}.${c.fieldName}: ${c.reason}`)\n .join(\"\\n\");\n throw new Error(`Unsupported schema changes detected:\\n${details}`);\n }\n\n // Warn about breaking changes\n if (diff.hasBreakingChanges) {\n logger.newline();\n logger.warn(formatBreakingChanges(diff.breakingChanges));\n\n if (!options.yes) {\n const confirmation = await logger.prompt(\"Continue generating migration?\", {\n type: \"confirm\",\n initial: true,\n cancel: \"symbol\",\n });\n\n if (confirmation !== true) {\n logger.info(\"Migration generation cancelled.\");\n return;\n }\n logger.newline();\n }\n }\n\n // Get next migration number\n const migrationNumber = getNextMigrationNumber(migrationsDir);\n\n // Generate diff and optional migration script (pass previousSnapshot for db.ts generation)\n const result = await generateDiffFiles(\n diff,\n migrationsDir,\n migrationNumber,\n previousSnapshot,\n options.name,\n );\n\n logger.success(\n `Generated migration ${styles.bold(result.migrationNumber.toString().padStart(4, \"0\"))}`,\n );\n logger.info(` Diff file: ${result.diffFilePath}`);\n\n if (result.migrateFilePath) {\n logger.info(` Migration script: ${result.migrateFilePath}`);\n if (result.dbTypesFilePath) {\n logger.info(` DB types: ${result.dbTypesFilePath}`);\n }\n logger.newline();\n logger.log(\"A migration script was generated for breaking changes.\");\n logger.log(\"Please review and edit the script before running 'tailor-sdk apply'.\");\n\n // Open script file in editor if EDITOR is set\n await openInEditor(result.migrateFilePath);\n }\n}\n\n/**\n * Open a file in the user's preferred editor\n * @param {string} filePath - Path to file to open\n * @returns {Promise<void>} Promise that resolves when editor closes\n */\nasync function openInEditor(filePath: string): Promise<void> {\n const editor = process.env.EDITOR;\n if (!editor) {\n return;\n }\n\n try {\n await fsPromises.access(filePath);\n } catch {\n return;\n }\n\n // Parse editor command and arguments\n const [command, ...args] = editor.trim().split(/\\s+/);\n\n logger.newline();\n logger.info(`Opening ${path.basename(filePath)} in ${editor}...`);\n\n // Spawn editor with parsed command and arguments\n const child = spawn(command, [...args, filePath], {\n stdio: \"inherit\",\n detached: false,\n });\n\n // Wait for editor to close\n await new Promise<void>((resolve) => {\n child.on(\"close\", () => resolve());\n child.on(\"error\", () => resolve());\n });\n}\n\n/**\n * CLI command definition for generate\n */\nexport const generateCommand = defineCommand({\n name: \"generate\",\n description:\n \"Generate migration files by detecting schema differences between current local types and the previous migration snapshot.\",\n args: z.object({\n ...commonArgs,\n ...confirmationArgs,\n config: arg(z.string().default(\"tailor.config.ts\"), {\n alias: \"c\",\n description: \"Path to SDK config file\",\n }),\n name: arg(z.string().optional(), {\n alias: \"n\",\n description: \"Optional description for the migration\",\n }),\n init: arg(z.boolean().default(false), {\n description: \"Delete existing migrations and start fresh\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n await generate({\n configPath: args.config,\n name: args.name,\n yes: args.yes,\n init: args.init,\n });\n }),\n});\n","import { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, confirmationArgs, deploymentArgs, withCommonArgs } from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadConfig } from \"../config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger } from \"../utils/logger\";\n\nexport interface TruncateOptions {\n workspaceId?: string;\n profile?: string;\n configPath?: string;\n all?: boolean;\n namespace?: string;\n types?: string[];\n}\n\ninterface InternalTruncateOptions extends TruncateOptions {\n yes?: boolean;\n}\n\ninterface TruncateSingleTypeOptions {\n workspaceId: string;\n namespaceName: string;\n typeName: string;\n}\n\nasync function truncateSingleType(\n options: TruncateSingleTypeOptions,\n client: Awaited<ReturnType<typeof initOperatorClient>>,\n): Promise<void> {\n await client.truncateTailorDBType({\n workspaceId: options.workspaceId,\n namespaceName: options.namespaceName,\n tailordbTypeName: options.typeName,\n });\n\n logger.success(`Truncated type \"${options.typeName}\" in namespace \"${options.namespaceName}\"`);\n}\n\nasync function truncateNamespace(\n workspaceId: string,\n namespaceName: string,\n client: Awaited<ReturnType<typeof initOperatorClient>>,\n): Promise<void> {\n await client.truncateTailorDBTypes({\n workspaceId,\n namespaceName,\n });\n\n logger.success(`Truncated all types in namespace \"${namespaceName}\"`);\n}\n\nasync function getAllNamespaces(configPath?: string): Promise<string[]> {\n const { config } = await loadConfig(configPath);\n const namespaces = new Set<string>();\n\n // Collect namespace names from db configuration\n if (config.db) {\n for (const [namespaceName] of Object.entries(config.db)) {\n namespaces.add(namespaceName);\n }\n }\n\n return Array.from(namespaces);\n}\n\nasync function getTypeNamespace(\n workspaceId: string,\n typeName: string,\n client: Awaited<ReturnType<typeof initOperatorClient>>,\n configPath?: string,\n): Promise<string | null> {\n const namespaces = await getAllNamespaces(configPath);\n\n // Try to find the type in each namespace\n for (const namespace of namespaces) {\n try {\n const { tailordbTypes } = await client.listTailorDBTypes({\n workspaceId,\n namespaceName: namespace,\n });\n\n if (tailordbTypes.some((type) => type.name === typeName)) {\n return namespace;\n }\n } catch {\n // Continue to next namespace if error occurs\n continue;\n }\n }\n\n return null;\n}\n\n/**\n * Truncate TailorDB data based on the given options.\n * @param options - Truncate options (all, namespace, or types)\n * @returns Promise that resolves when truncation completes\n */\nexport async function truncate(options?: TruncateOptions): Promise<void> {\n return await $truncate({ ...options, yes: true });\n}\n\nasync function $truncate(options?: InternalTruncateOptions): Promise<void> {\n // Load and validate options\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n // Validate arguments\n const hasTypes = options?.types && options.types.length > 0;\n const hasNamespace = !!options?.namespace;\n const hasAll = !!options?.all;\n\n // All options are mutually exclusive\n const optionCount = [hasAll, hasNamespace, hasTypes].filter(Boolean).length;\n if (optionCount === 0) {\n throw new Error(\"Please specify one of: --all, --namespace <name>, or type names\");\n }\n if (optionCount > 1) {\n throw new Error(\n \"Options --all, --namespace, and type names are mutually exclusive. Please specify only one.\",\n );\n }\n\n // Validate config and get namespaces before confirmation\n const namespaces = await getAllNamespaces(options?.configPath);\n\n // Handle --all flag\n if (hasAll) {\n if (namespaces.length === 0) {\n logger.warn(\"No namespaces found in config file.\");\n return;\n }\n\n if (!options?.yes) {\n const namespaceList = namespaces.join(\", \");\n const confirmation = await logger.prompt(\n `This will truncate ALL tables in the following namespaces: ${namespaceList}. Continue? (yes/no)`,\n {\n type: \"confirm\",\n initial: false,\n },\n );\n if (!confirmation) {\n logger.info(\"Truncate cancelled.\");\n return;\n }\n }\n\n for (const namespace of namespaces) {\n await truncateNamespace(workspaceId, namespace, client);\n }\n logger.success(\"Truncated all tables in all namespaces\");\n return;\n }\n\n // Handle --namespace flag\n if (hasNamespace && options?.namespace) {\n const namespace = options.namespace;\n\n // Validate namespace exists in config\n if (!namespaces.includes(namespace)) {\n throw new Error(\n `Namespace \"${namespace}\" not found in config. Available namespaces: ${namespaces.join(\", \")}`,\n );\n }\n\n if (!options.yes) {\n const confirmation = await logger.prompt(\n `This will truncate ALL tables in namespace \"${namespace}\". Continue? (yes/no)`,\n {\n type: \"confirm\",\n initial: false,\n },\n );\n if (!confirmation) {\n logger.info(\"Truncate cancelled.\");\n return;\n }\n }\n\n await truncateNamespace(workspaceId, namespace, client);\n return;\n }\n\n // Handle specific types\n if (hasTypes && options?.types) {\n const typeNames = options.types;\n\n // Validate all types exist and get their namespaces before confirmation\n const typeNamespaceMap = new Map<string, string>();\n const notFoundTypes: string[] = [];\n\n for (const typeName of typeNames) {\n const namespace = await getTypeNamespace(workspaceId, typeName, client, options.configPath);\n\n if (namespace) {\n typeNamespaceMap.set(typeName, namespace);\n } else {\n notFoundTypes.push(typeName);\n }\n }\n\n if (notFoundTypes.length > 0) {\n throw new Error(\n `The following types were not found in any namespace: ${notFoundTypes.join(\", \")}`,\n );\n }\n\n if (!options.yes) {\n const typeList = typeNames.join(\", \");\n const confirmation = await logger.prompt(\n `This will truncate the following types: ${typeList}. Continue? (yes/no)`,\n {\n type: \"confirm\",\n initial: false,\n },\n );\n if (!confirmation) {\n logger.info(\"Truncate cancelled.\");\n return;\n }\n }\n\n for (const typeName of typeNames) {\n const namespace = typeNamespaceMap.get(typeName);\n if (!namespace) {\n continue;\n }\n\n await truncateSingleType(\n {\n workspaceId,\n namespaceName: namespace,\n typeName,\n },\n client,\n );\n }\n }\n}\n\nexport const truncateCommand = defineCommand({\n name: \"truncate\",\n description: \"Truncate (delete all records from) TailorDB tables.\",\n args: z.object({\n ...commonArgs,\n ...deploymentArgs,\n ...confirmationArgs,\n types: arg(z.string().array().optional(), {\n positional: true,\n description: \"Type names to truncate\",\n }),\n all: arg(z.boolean().default(false), {\n alias: \"a\",\n description: \"Truncate all tables in all namespaces\",\n }),\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description: \"Truncate all tables in specified namespace\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n const types = args.types && args.types.length > 0 ? args.types : undefined;\n await $truncate({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n configPath: args.config,\n all: args.all,\n namespace: args.namespace,\n types,\n yes: args.yes,\n });\n }),\n});\n","import { defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, withCommonArgs, workspaceArgs } from \"../args\";\nimport { fetchAll, initOperatorClient } from \"../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger } from \"../utils/logger\";\nimport { type WorkflowListInfo, toWorkflowListInfo } from \"./transform\";\n\nexport interface ListWorkflowsOptions {\n workspaceId?: string;\n profile?: string;\n}\n\n/**\n * List workflows in the workspace and return CLI-friendly info.\n * @param options - Workflow listing options\n * @returns List of workflows\n */\nexport async function listWorkflows(options?: ListWorkflowsOptions): Promise<WorkflowListInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n const workflows = await fetchAll(async (pageToken) => {\n const { workflows, nextPageToken } = await client.listWorkflows({\n workspaceId,\n pageToken,\n });\n return [workflows, nextPageToken];\n });\n\n return workflows.map(toWorkflowListInfo);\n}\n\nexport const listCommand = defineCommand({\n name: \"list\",\n description: \"List all workflows in the workspace.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n }),\n run: withCommonArgs(async (args) => {\n const workflows = await listWorkflows({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (workflows.length === 0 && !args.json) {\n logger.info(\"No workflows found.\");\n return;\n }\n logger.out(workflows);\n }),\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, parseDuration, withCommonArgs, workspaceArgs } from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { logger } from \"../utils/logger\";\nimport { waitArgs } from \"./args\";\nimport { getWorkflowExecution, printExecutionWithLogs } from \"./executions\";\nimport { waitForExecution, type WaitOptions } from \"./start\";\nimport { type WorkflowExecutionInfo } from \"./transform\";\n\nexport interface ResumeWorkflowOptions {\n executionId: string;\n workspaceId?: string;\n profile?: string;\n interval?: number;\n}\n\nexport interface ResumeWorkflowResultWithWait {\n executionId: string;\n wait: (options?: WaitOptions) => Promise<WorkflowExecutionInfo>;\n}\n\n/**\n * Resume a suspended workflow execution and return a handle to wait for completion.\n * @param options - Resume options\n * @returns Resume result with wait helper\n */\nexport async function resumeWorkflow(\n options: ResumeWorkflowOptions,\n): Promise<ResumeWorkflowResultWithWait> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n try {\n const { executionId } = await client.testResumeWorkflow({\n workspaceId,\n executionId: options.executionId,\n });\n\n return {\n executionId,\n wait: (waitOptions?: WaitOptions) =>\n waitForExecution({\n client,\n workspaceId,\n executionId,\n interval: options.interval ?? 3000,\n showProgress: waitOptions?.showProgress,\n }),\n };\n } catch (error) {\n if (error instanceof ConnectError) {\n if (error.code === Code.NotFound) {\n throw new Error(`Execution '${options.executionId}' not found.`);\n }\n if (error.code === Code.FailedPrecondition) {\n throw new Error(`Execution '${options.executionId}' is not in a resumable state.`);\n }\n }\n throw error;\n }\n}\n\nexport const resumeCommand = defineCommand({\n name: \"resume\",\n description: \"Resume a failed or pending workflow execution.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n executionId: arg(z.string(), {\n positional: true,\n description: \"Failed execution ID\",\n }),\n ...waitArgs,\n }),\n run: withCommonArgs(async (args) => {\n const { executionId, wait } = await resumeWorkflow({\n executionId: args.executionId,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n interval: parseDuration(args.interval),\n });\n\n if (!args.json) {\n logger.info(`Execution ID: ${executionId}`, { mode: \"stream\" });\n }\n\n if (args.wait) {\n const result = await wait({ showProgress: !args.json });\n if (args.logs && !args.json) {\n const { execution } = await getWorkflowExecution({\n executionId,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n logs: true,\n });\n printExecutionWithLogs(execution);\n } else {\n logger.out(result);\n }\n } else {\n logger.out({ executionId });\n }\n }),\n});\n","import {\n type GetApplicationSchemaHealthResponse,\n GetApplicationSchemaHealthResponse_ApplicationSchemaHealthStatus,\n} from \"@tailor-proto/tailor/v1/application_pb\";\nimport { ApplicationSchemaUpdateAttemptStatus } from \"@tailor-proto/tailor/v1/application_resource_pb\";\nimport { formatTimestamp } from \"../../utils/format\";\nimport type { Application } from \"@tailor-proto/tailor/v1/application_resource_pb\";\n\nexport interface AppInfo {\n name: string;\n domain: string;\n authNamespace: string;\n createdAt: Date | null;\n updatedAt: Date | null;\n}\n\nexport interface AppHealthInfo {\n name: string;\n status: string;\n currentServingSchemaUpdatedAt: Date | null;\n lastAttemptStatus: string;\n lastAttemptAt: Date | null;\n lastAttemptError: string;\n}\n\nconst statusToString = (\n status: GetApplicationSchemaHealthResponse_ApplicationSchemaHealthStatus,\n): string => {\n switch (status) {\n case GetApplicationSchemaHealthResponse_ApplicationSchemaHealthStatus.OK:\n return \"ok\";\n case GetApplicationSchemaHealthResponse_ApplicationSchemaHealthStatus.COMPOSITION_ERROR:\n return \"composition_error\";\n default:\n return \"unknown\";\n }\n};\n\nconst attemptStatusToString = (status: ApplicationSchemaUpdateAttemptStatus): string => {\n switch (status) {\n case ApplicationSchemaUpdateAttemptStatus.SUCCEEDED:\n return \"success\";\n case ApplicationSchemaUpdateAttemptStatus.FAILED:\n return \"failure\";\n default:\n return \"unknown\";\n }\n};\n\nexport const appInfo = (app: Application): AppInfo => {\n return {\n name: app.name,\n domain: app.domain,\n authNamespace: app.authNamespace,\n createdAt: formatTimestamp(app.createTime),\n updatedAt: formatTimestamp(app.updateTime),\n };\n};\n\nexport const appHealthInfo = (\n name: string,\n health: GetApplicationSchemaHealthResponse,\n): AppHealthInfo => {\n const attempt = health.lastSchemaUpdateAttempt;\n return {\n name,\n status: statusToString(health.status),\n currentServingSchemaUpdatedAt: formatTimestamp(health.currentServingSchemaUpdateTime),\n lastAttemptStatus: attempt ? attemptStatusToString(attempt.status) : \"N/A\",\n lastAttemptAt: formatTimestamp(attempt?.attemptTime),\n lastAttemptError: attempt?.error ?? \"\",\n };\n};\n","import { arg, defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, withCommonArgs, workspaceArgs } from \"../../args\";\nimport { initOperatorClient } from \"../../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../../context\";\nimport { humanizeRelativeTime } from \"../../utils/format\";\nimport { logger } from \"../../utils/logger\";\nimport { appHealthInfo, type AppHealthInfo } from \"./transform\";\n\nconst healthOptionsSchema = z.object({\n workspaceId: z.uuid({ message: \"workspace-id must be a valid UUID\" }).optional(),\n profile: z.string().optional(),\n name: z.string().min(1, { message: \"name is required\" }),\n});\n\nexport type HealthOptions = z.input<typeof healthOptionsSchema>;\n\nasync function loadOptions(options: HealthOptions) {\n const result = healthOptionsSchema.safeParse(options);\n if (!result.success) {\n throw new Error(result.error.issues[0].message);\n }\n\n const accessToken = await loadAccessToken();\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: result.data.workspaceId,\n profile: result.data.profile,\n });\n\n return {\n client,\n workspaceId,\n name: result.data.name,\n };\n}\n\n/**\n * Get application schema health status.\n * @param options - Health check options\n * @returns Application health information\n */\nexport async function getAppHealth(options: HealthOptions): Promise<AppHealthInfo> {\n const { client, workspaceId, name } = await loadOptions(options);\n\n const response = await client.getApplicationSchemaHealth({\n workspaceId,\n applicationName: name,\n });\n\n return appHealthInfo(name, response);\n}\n\nexport const healthCommand = defineCommand({\n name: \"health\",\n description: \"Check application schema health\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n name: arg(z.string(), {\n description: \"Application name\",\n alias: \"n\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n const health = await getAppHealth({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n name: args.name,\n });\n\n const formattedHealth = args.json\n ? health\n : {\n ...health,\n currentServingSchemaUpdatedAt: humanizeRelativeTime(health.currentServingSchemaUpdatedAt),\n lastAttemptAt: humanizeRelativeTime(health.lastAttemptAt),\n };\n\n logger.out(formattedHealth);\n }),\n});\n","import { arg, defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, positiveIntArg, withCommonArgs, workspaceArgs } from \"../../args\";\nimport { initOperatorClient } from \"../../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../../context\";\nimport { humanizeRelativeTime } from \"../../utils/format\";\nimport { logger } from \"../../utils/logger\";\nimport { appInfo, type AppInfo } from \"./transform\";\n\nconst listAppsOptionsSchema = z.object({\n workspaceId: z.uuid({ message: \"workspace-id must be a valid UUID\" }).optional(),\n profile: z.string().optional(),\n limit: z.coerce.number().int().positive().optional(),\n});\n\nexport type ListAppsOptions = z.input<typeof listAppsOptionsSchema>;\n\nasync function loadOptions(options: ListAppsOptions) {\n const result = listAppsOptionsSchema.safeParse(options);\n if (!result.success) {\n throw new Error(result.error.issues[0].message);\n }\n\n const accessToken = await loadAccessToken();\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: result.data.workspaceId,\n profile: result.data.profile,\n });\n\n return {\n client,\n workspaceId,\n limit: result.data.limit,\n };\n}\n\n/**\n * List applications in a workspace with an optional limit.\n * @param options - Application listing options\n * @returns List of applications\n */\nexport async function listApps(options: ListAppsOptions): Promise<AppInfo[]> {\n const { client, workspaceId, limit } = await loadOptions(options);\n const hasLimit = limit !== undefined;\n\n const results: AppInfo[] = [];\n let pageToken = \"\";\n\n while (true) {\n if (hasLimit && results.length >= limit!) {\n break;\n }\n\n const remaining = hasLimit ? limit! - results.length : undefined;\n const pageSize = remaining !== undefined && remaining > 0 ? remaining : undefined;\n\n const { applications, nextPageToken } = await client.listApplications({\n workspaceId,\n pageToken,\n ...(pageSize !== undefined ? { pageSize } : {}),\n });\n\n const mapped = applications.map(appInfo);\n\n if (remaining !== undefined && mapped.length > remaining) {\n results.push(...mapped.slice(0, remaining));\n } else {\n results.push(...mapped);\n }\n\n if (!nextPageToken) {\n break;\n }\n pageToken = nextPageToken;\n }\n\n return results;\n}\n\nexport const listCommand = defineCommand({\n name: \"list\",\n description: \"List applications in a workspace\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n limit: arg(positiveIntArg.optional(), {\n alias: \"l\",\n description: \"Maximum number of applications to list\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n const apps = await listApps({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n limit: args.limit,\n });\n\n const formattedApps = args.json\n ? apps\n : apps.map(({ updatedAt: _, createdAt, ...rest }) => ({\n ...rest,\n createdAt: humanizeRelativeTime(createdAt),\n }));\n\n logger.out(formattedApps);\n }),\n});\n","import { formatTimestamp } from \"../utils/format\";\nimport type { Workspace } from \"@tailor-proto/tailor/v1/workspace_resource_pb\";\n\nexport interface WorkspaceInfo {\n id: string;\n name: string;\n region: string;\n createdAt: Date | null;\n updatedAt: Date | null;\n}\n\nexport interface WorkspaceDetails extends WorkspaceInfo {\n deleteProtection: boolean;\n organizationId: string;\n folderId: string;\n}\n\nexport const workspaceInfo = (workspace: Workspace): WorkspaceInfo => {\n return {\n id: workspace.id,\n name: workspace.name,\n region: workspace.region,\n createdAt: formatTimestamp(workspace.createTime),\n updatedAt: formatTimestamp(workspace.updateTime),\n };\n};\n\nexport const workspaceDetails = (workspace: Workspace): WorkspaceDetails => {\n return {\n ...workspaceInfo(workspace),\n deleteProtection: workspace.deleteProtection,\n organizationId: workspace.organizationId,\n folderId: workspace.folderId,\n };\n};\n","import { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, withCommonArgs } from \"../args\";\nimport { initOperatorClient, type OperatorClient } from \"../client\";\nimport {\n loadAccessToken,\n loadFolderId,\n loadOrganizationId,\n readPlatformConfig,\n writePlatformConfig,\n} from \"../context\";\nimport { logger } from \"../utils/logger\";\nimport { workspaceInfo, type WorkspaceInfo } from \"./transform\";\nimport type { ProfileInfo } from \"../profile\";\n\n/**\n * Schema for workspace creation options\n * - name: 3-63 chars, lowercase alphanumeric and hyphens, cannot start/end with hyphen\n * - organizationId, folderId: optional UUIDs\n */\nconst createWorkspaceOptionsSchema = z.object({\n name: z\n .string()\n .min(3, \"Name must be at least 3 characters\")\n .max(63, \"Name must be at most 63 characters\")\n .regex(/^[a-z0-9-]+$/, \"Name can only contain lowercase letters, numbers, and hyphens\")\n .refine(\n (n) => !n.startsWith(\"-\") && !n.endsWith(\"-\"),\n \"Name cannot start or end with a hyphen\",\n ),\n region: z.string(),\n deleteProtection: z.boolean().optional(),\n organizationId: z.uuid().optional(),\n folderId: z.uuid().optional(),\n});\n\nexport type CreateWorkspaceOptions = z.input<typeof createWorkspaceOptionsSchema>;\n\nconst validateRegion = async (region: string, client: OperatorClient) => {\n const availableRegions = await client.listAvailableWorkspaceRegions({});\n if (!availableRegions.regions.includes(region)) {\n throw new Error(`Region must be one of: ${availableRegions.regions.join(\", \")}.`);\n }\n};\n\n/**\n * Create a new workspace with the given options.\n * @param options - Workspace creation options\n * @returns Created workspace info\n */\nexport async function createWorkspace(options: CreateWorkspaceOptions): Promise<WorkspaceInfo> {\n // Validate options with zod schema\n const result = createWorkspaceOptionsSchema.safeParse(options);\n if (!result.success) {\n throw new Error(result.error.issues[0].message);\n }\n const validated = result.data;\n\n // Load client and validate region\n const accessToken = await loadAccessToken();\n const client = await initOperatorClient(accessToken);\n await validateRegion(validated.region, client);\n\n // Resolve organization and folder IDs from options or environment variables\n const organizationId = loadOrganizationId(validated.organizationId);\n const folderId = loadFolderId(validated.folderId);\n\n // Create workspace\n const resp = await client.createWorkspace({\n workspaceName: validated.name,\n workspaceRegion: validated.region,\n deleteProtection: validated.deleteProtection ?? false,\n organizationId,\n folderId,\n });\n\n return workspaceInfo(resp.workspace!);\n}\n\nexport const createCommand = defineCommand({\n name: \"create\",\n description: \"Create a new Tailor Platform workspace.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n name: arg(z.string(), {\n alias: \"n\",\n description: \"Workspace name\",\n }),\n region: arg(z.string(), {\n alias: \"r\",\n description: \"Workspace region (us-west, asia-northeast)\",\n }),\n \"delete-protection\": arg(z.boolean().default(false), {\n alias: \"d\",\n description: \"Enable delete protection\",\n }),\n \"organization-id\": arg(z.string().optional(), {\n alias: \"o\",\n description: \"Organization ID to workspace associate with\",\n }),\n \"folder-id\": arg(z.string().optional(), {\n alias: \"f\",\n description: \"Folder ID to workspace associate with\",\n }),\n \"profile-name\": arg(z.string().optional(), {\n alias: \"p\",\n description: \"Profile name to create\",\n }),\n \"profile-user\": arg(z.string().optional(), {\n description: \"User email for the profile (defaults to current user)\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n // Execute workspace create logic\n const workspace = await createWorkspace({\n name: args.name,\n region: args.region,\n deleteProtection: args[\"delete-protection\"],\n organizationId: args[\"organization-id\"],\n folderId: args[\"folder-id\"],\n });\n\n let profileInfo: ProfileInfo | undefined;\n const profileName = args[\"profile-name\"];\n if (profileName) {\n const config = readPlatformConfig();\n if (config.profiles[profileName]) {\n throw new Error(`Profile \"${profileName}\" already exists.`);\n }\n\n const profileUser = args[\"profile-user\"] || config.current_user;\n if (!profileUser) {\n throw new Error(\n \"Current user not found. Please login or specify --profile-user to create a profile.\",\n );\n }\n\n if (!config.users[profileUser]) {\n throw new Error(\n `User \"${profileUser}\" not found.\\nPlease verify your user name and login using 'tailor-sdk login' command.`,\n );\n }\n config.profiles[profileName] = {\n user: profileUser,\n workspace_id: workspace.id,\n };\n writePlatformConfig(config);\n profileInfo = {\n name: profileName,\n user: profileUser,\n workspaceId: workspace.id,\n };\n\n if (!args.json) {\n logger.success(`Profile \"${profileName}\" created successfully.`);\n }\n }\n\n if (!args.json) {\n logger.success(`Workspace \"${args.name}\" created successfully.`);\n }\n\n if (args.json && profileInfo) {\n logger.out({ ...workspace, profile: profileInfo });\n return;\n }\n\n logger.out(workspace);\n if (profileInfo) {\n logger.out(\"Profile:\");\n logger.out(profileInfo);\n }\n }),\n});\n","import { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, confirmationArgs, withCommonArgs } from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadAccessToken, readPlatformConfig, writePlatformConfig } from \"../context\";\nimport { logger } from \"../utils/logger\";\n\nconst deleteWorkspaceOptionsSchema = z.object({\n workspaceId: z.uuid({ message: \"workspace-id must be a valid UUID\" }),\n});\n\nexport type DeleteWorkspaceOptions = z.input<typeof deleteWorkspaceOptionsSchema>;\n\nasync function loadOptions(options: DeleteWorkspaceOptions) {\n // Validate options with zod schema\n const result = deleteWorkspaceOptionsSchema.safeParse(options);\n if (!result.success) {\n throw new Error(result.error.issues[0].message);\n }\n\n const accessToken = await loadAccessToken();\n const client = await initOperatorClient(accessToken);\n\n return {\n client,\n workspaceId: result.data.workspaceId,\n };\n}\n\n/**\n * Delete a workspace by ID.\n * @param options - Workspace deletion options\n * @returns Promise that resolves when deletion completes\n */\nexport async function deleteWorkspace(options: DeleteWorkspaceOptions): Promise<void> {\n // Load and validate options\n const { client, workspaceId } = await loadOptions(options);\n\n // Delete workspace\n await client.deleteWorkspace({\n workspaceId,\n });\n}\n\nexport const deleteCommand = defineCommand({\n name: \"delete\",\n description: \"Delete a Tailor Platform workspace.\",\n args: z.object({\n ...commonArgs,\n \"workspace-id\": arg(z.string(), {\n alias: \"w\",\n description: \"Workspace ID\",\n }),\n ...confirmationArgs,\n }),\n run: withCommonArgs(async (args) => {\n // Load and validate options\n const { client, workspaceId } = await loadOptions({\n workspaceId: args[\"workspace-id\"],\n });\n\n // Check if workspace exists\n let workspace;\n try {\n workspace = await client.getWorkspace({\n workspaceId,\n });\n } catch {\n throw new Error(`Workspace \"${workspaceId}\" not found.`);\n }\n\n // Confirm deletion if not forced\n if (!args.yes) {\n const confirmation = await logger.prompt(\n `Enter the workspace name to confirm deletion (${workspace.workspace?.name}):`,\n {\n type: \"text\",\n },\n );\n if (confirmation !== workspace.workspace?.name) {\n logger.info(\"Workspace deletion cancelled.\");\n return;\n }\n }\n\n // Delete workspace\n await client.deleteWorkspace({\n workspaceId,\n });\n\n // Remove profiles associated with the deleted workspace\n const pfConfig = readPlatformConfig();\n const profilesToDelete = Object.entries(pfConfig.profiles).filter(\n ([, profile]) => profile?.workspace_id === workspaceId,\n );\n if (profilesToDelete.length > 0) {\n for (const [profileName] of profilesToDelete) {\n delete pfConfig.profiles[profileName];\n }\n writePlatformConfig(pfConfig);\n }\n\n // Show success message\n if (profilesToDelete.length > 0) {\n logger.success(\n `Workspace \"${args[\"workspace-id\"]}\" and ${profilesToDelete.length} associated profile(s) deleted successfully.`,\n );\n } else {\n logger.success(`Workspace \"${args[\"workspace-id\"]}\" deleted successfully.`);\n }\n }),\n});\n","import { defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, withCommonArgs, workspaceArgs } from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../context\";\nimport { humanizeRelativeTime } from \"../utils/format\";\nimport { logger } from \"../utils/logger\";\nimport { workspaceDetails, type WorkspaceDetails } from \"./transform\";\n\nconst getWorkspaceOptionsSchema = z.object({\n workspaceId: z.uuid({ message: \"workspace-id must be a valid UUID\" }).optional(),\n profile: z.string().optional(),\n});\n\nexport type GetWorkspaceOptions = z.input<typeof getWorkspaceOptionsSchema>;\n\nasync function loadOptions(options: GetWorkspaceOptions) {\n const result = getWorkspaceOptionsSchema.safeParse(options);\n if (!result.success) {\n throw new Error(result.error.issues[0].message);\n }\n\n const accessToken = await loadAccessToken();\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: result.data.workspaceId,\n profile: result.data.profile,\n });\n\n return {\n client,\n workspaceId,\n };\n}\n\n/**\n * Get detailed information about a workspace.\n * @param options - Workspace get options\n * @returns Workspace details\n */\nexport async function getWorkspace(options: GetWorkspaceOptions): Promise<WorkspaceDetails> {\n const { client, workspaceId } = await loadOptions(options);\n\n const response = await client.getWorkspace({\n workspaceId,\n });\n\n if (!response.workspace) {\n throw new Error(`Workspace \"${workspaceId}\" not found.`);\n }\n\n return workspaceDetails(response.workspace);\n}\n\nexport const getCommand = defineCommand({\n name: \"get\",\n description: \"Show detailed information about a workspace\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n }),\n run: withCommonArgs(async (args) => {\n const workspace = await getWorkspace({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const formattedWorkspace = args.json\n ? workspace\n : {\n ...workspace,\n createdAt: humanizeRelativeTime(workspace.createdAt),\n updatedAt: humanizeRelativeTime(workspace.updatedAt),\n };\n\n logger.out(formattedWorkspace);\n }),\n});\n","import { defineCommand, arg } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, positiveIntArg, withCommonArgs } from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadAccessToken } from \"../context\";\nimport { logger } from \"../utils/logger\";\nimport { workspaceInfo, type WorkspaceInfo } from \"./transform\";\n\nexport interface ListWorkspacesOptions {\n limit?: number;\n}\n\n/**\n * List workspaces with an optional limit.\n * @param options - Workspace listing options\n * @returns List of workspaces\n */\nexport async function listWorkspaces(options?: ListWorkspacesOptions): Promise<WorkspaceInfo[]> {\n const limit = options?.limit;\n const hasLimit = limit !== undefined;\n\n // Load and validate options\n const accessToken = await loadAccessToken();\n const client = await initOperatorClient(accessToken);\n\n const results: WorkspaceInfo[] = [];\n let pageToken = \"\";\n\n // Fetch workspaces with optional limit using pageSize\n // If limit is undefined, this behaves like an unbounded listing.\n // If limit is set, we request up to the remaining number on each page\n // and stop once we have collected enough or the server has no more pages.\n\n while (true) {\n if (hasLimit && results.length >= limit!) {\n break;\n }\n\n const remaining = hasLimit ? limit! - results.length : undefined;\n const pageSize = remaining !== undefined && remaining > 0 ? remaining : undefined;\n\n const { workspaces, nextPageToken } = await client.listWorkspaces({\n pageToken,\n ...(pageSize !== undefined ? { pageSize } : {}),\n });\n\n const mapped = workspaces.map(workspaceInfo);\n\n if (remaining !== undefined && mapped.length > remaining) {\n results.push(...mapped.slice(0, remaining));\n } else {\n results.push(...mapped);\n }\n\n if (!nextPageToken) {\n break;\n }\n pageToken = nextPageToken;\n }\n\n return results;\n}\n\nexport const listCommand = defineCommand({\n name: \"list\",\n description: \"List all Tailor Platform workspaces.\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n limit: arg(positiveIntArg.optional(), {\n alias: \"l\",\n description: \"Maximum number of workspaces to list\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n const workspaces = await listWorkspaces({ limit: args.limit });\n logger.out(workspaces, { display: { updatedAt: null } });\n }),\n});\n","import { arg, defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, confirmationArgs, withCommonArgs } from \"../args\";\nimport { initOperatorClient } from \"../client\";\nimport { loadAccessToken } from \"../context\";\nimport { logger } from \"../utils/logger\";\n\nconst restoreWorkspaceOptionsSchema = z.object({\n workspaceId: z.uuid({ message: \"workspace-id must be a valid UUID\" }),\n});\n\nexport type RestoreWorkspaceOptions = z.input<typeof restoreWorkspaceOptionsSchema>;\n\nasync function loadOptions(options: RestoreWorkspaceOptions) {\n const result = restoreWorkspaceOptionsSchema.safeParse(options);\n if (!result.success) {\n throw new Error(result.error.issues[0].message);\n }\n\n const accessToken = await loadAccessToken();\n const client = await initOperatorClient(accessToken);\n\n return {\n client,\n workspaceId: result.data.workspaceId,\n };\n}\n\n/**\n * Restore a deleted workspace by ID.\n * @param options - Workspace restore options\n * @returns Promise that resolves when restoration completes\n */\nexport async function restoreWorkspace(options: RestoreWorkspaceOptions): Promise<void> {\n const { client, workspaceId } = await loadOptions(options);\n\n await client.restoreWorkspace({\n workspaceId,\n });\n}\n\nexport const restoreCommand = defineCommand({\n name: \"restore\",\n description: \"Restore a deleted workspace\",\n args: z.object({\n ...commonArgs,\n \"workspace-id\": arg(z.string(), {\n alias: \"w\",\n description: \"Workspace ID\",\n }),\n ...confirmationArgs,\n }),\n run: withCommonArgs(async (args) => {\n const { client, workspaceId } = await loadOptions({\n workspaceId: args[\"workspace-id\"],\n });\n\n if (!args.yes) {\n const confirmation = await logger.prompt(\n `Are you sure you want to restore workspace \"${workspaceId}\"? (yes/no):`,\n {\n type: \"text\",\n },\n );\n if (confirmation !== \"yes\") {\n logger.info(\"Workspace restoration cancelled.\");\n return;\n }\n }\n\n await client.restoreWorkspace({\n workspaceId,\n });\n\n logger.success(`Workspace \"${workspaceId}\" restored successfully.`);\n }),\n});\n","import { WorkspacePlatformUserRole } from \"@tailor-proto/tailor/v1/workspace_resource_pb\";\nimport type { WorkspacePlatformUser } from \"@tailor-proto/tailor/v1/workspace_resource_pb\";\n\nexport interface UserInfo {\n userId: string;\n email: string;\n role: string;\n}\n\nconst roleToString = (role: WorkspacePlatformUserRole): string => {\n switch (role) {\n case WorkspacePlatformUserRole.ADMIN:\n return \"admin\";\n case WorkspacePlatformUserRole.EDITOR:\n return \"editor\";\n case WorkspacePlatformUserRole.VIEWER:\n return \"viewer\";\n default:\n return \"unknown\";\n }\n};\n\nexport const stringToRole = (role: string): WorkspacePlatformUserRole => {\n switch (role.toLowerCase()) {\n case \"admin\":\n return WorkspacePlatformUserRole.ADMIN;\n case \"editor\":\n return WorkspacePlatformUserRole.EDITOR;\n case \"viewer\":\n return WorkspacePlatformUserRole.VIEWER;\n default:\n throw new Error(`Invalid role: ${role}. Valid roles: admin, editor, viewer`);\n }\n};\n\nexport const userInfo = (user: WorkspacePlatformUser): UserInfo => {\n return {\n userId: user.platformUser?.userId ?? \"\",\n email: user.platformUser?.email ?? \"\",\n role: roleToString(user.role),\n };\n};\n\nexport const validRoles = [\"admin\", \"editor\", \"viewer\"] as const;\n","import { arg, defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, withCommonArgs, workspaceArgs } from \"../../args\";\nimport { initOperatorClient } from \"../../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../../context\";\nimport { logger } from \"../../utils/logger\";\nimport { stringToRole, validRoles } from \"./transform\";\n\nconst inviteUserOptionsSchema = z.object({\n workspaceId: z.uuid({ message: \"workspace-id must be a valid UUID\" }).optional(),\n profile: z.string().optional(),\n email: z.email({ message: \"email must be a valid email address\" }),\n role: z.enum(validRoles, { message: `role must be one of: ${validRoles.join(\", \")}` }),\n});\n\nexport type InviteUserOptions = z.input<typeof inviteUserOptionsSchema>;\n\nasync function loadOptions(options: InviteUserOptions) {\n const result = inviteUserOptionsSchema.safeParse(options);\n if (!result.success) {\n throw new Error(result.error.issues[0].message);\n }\n\n const accessToken = await loadAccessToken();\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: result.data.workspaceId,\n profile: result.data.profile,\n });\n\n return {\n client,\n workspaceId,\n email: result.data.email,\n role: stringToRole(result.data.role),\n };\n}\n\n/**\n * Invite a user to a workspace.\n * @param options - User invite options\n * @returns Promise that resolves when invitation is sent\n */\nexport async function inviteUser(options: InviteUserOptions): Promise<void> {\n const { client, workspaceId, email, role } = await loadOptions(options);\n\n await client.inviteWorkspacePlatformUser({\n workspaceId,\n email,\n role,\n });\n}\n\nexport const inviteCommand = defineCommand({\n name: \"invite\",\n description: \"Invite a user to a workspace\",\n args: z.object({\n ...commonArgs,\n ...workspaceArgs,\n email: arg(z.email(), {\n description: \"Email address of the user to invite\",\n }),\n role: arg(z.enum(validRoles), {\n description: `Role to assign (${validRoles.join(\", \")})`,\n alias: \"r\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n await inviteUser({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n email: args.email,\n role: args.role as (typeof validRoles)[number],\n });\n\n logger.success(`User \"${args.email}\" invited successfully with role \"${args.role}\".`);\n }),\n});\n","import { arg, defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, jsonArgs, positiveIntArg, withCommonArgs, workspaceArgs } from \"../../args\";\nimport { initOperatorClient } from \"../../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../../context\";\nimport { logger } from \"../../utils/logger\";\nimport { userInfo, type UserInfo } from \"./transform\";\n\nconst listUsersOptionsSchema = z.object({\n workspaceId: z.uuid({ message: \"workspace-id must be a valid UUID\" }).optional(),\n profile: z.string().optional(),\n limit: z.coerce.number().int().positive().optional(),\n});\n\nexport type ListUsersOptions = z.input<typeof listUsersOptionsSchema>;\n\nasync function loadOptions(options: ListUsersOptions) {\n const result = listUsersOptionsSchema.safeParse(options);\n if (!result.success) {\n throw new Error(result.error.issues[0].message);\n }\n\n const accessToken = await loadAccessToken();\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: result.data.workspaceId,\n profile: result.data.profile,\n });\n\n return {\n client,\n workspaceId,\n limit: result.data.limit,\n };\n}\n\n/**\n * List users in a workspace with an optional limit.\n * @param options - User listing options\n * @returns List of workspace users\n */\nexport async function listUsers(options: ListUsersOptions): Promise<UserInfo[]> {\n const { client, workspaceId, limit } = await loadOptions(options);\n const hasLimit = limit !== undefined;\n\n const results: UserInfo[] = [];\n let pageToken = \"\";\n\n while (true) {\n if (hasLimit && results.length >= limit!) {\n break;\n }\n\n const remaining = hasLimit ? limit! - results.length : undefined;\n const pageSize = remaining !== undefined && remaining > 0 ? remaining : undefined;\n\n const { workspacePlatformUsers, nextPageToken } = await client.listWorkspacePlatformUsers({\n workspaceId,\n pageToken,\n ...(pageSize !== undefined ? { pageSize } : {}),\n });\n\n const mapped = workspacePlatformUsers.map(userInfo);\n\n if (remaining !== undefined && mapped.length > remaining) {\n results.push(...mapped.slice(0, remaining));\n } else {\n results.push(...mapped);\n }\n\n if (!nextPageToken) {\n break;\n }\n pageToken = nextPageToken;\n }\n\n return results;\n}\n\nexport const listCommand = defineCommand({\n name: \"list\",\n description: \"List users in a workspace\",\n args: z.object({\n ...commonArgs,\n ...jsonArgs,\n ...workspaceArgs,\n limit: arg(positiveIntArg.optional(), {\n alias: \"l\",\n description: \"Maximum number of users to list\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n const users = await listUsers({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n limit: args.limit,\n });\n\n logger.out(users);\n }),\n});\n","import { arg, defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, confirmationArgs, withCommonArgs, workspaceArgs } from \"../../args\";\nimport { initOperatorClient } from \"../../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../../context\";\nimport { logger } from \"../../utils/logger\";\n\nconst removeUserOptionsSchema = z.object({\n workspaceId: z.uuid({ message: \"workspace-id must be a valid UUID\" }).optional(),\n profile: z.string().optional(),\n email: z.string().email({ message: \"email must be a valid email address\" }),\n});\n\nexport type RemoveUserOptions = z.input<typeof removeUserOptionsSchema>;\n\nasync function loadOptions(options: RemoveUserOptions) {\n const result = removeUserOptionsSchema.safeParse(options);\n if (!result.success) {\n throw new Error(result.error.issues[0].message);\n }\n\n const accessToken = await loadAccessToken();\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: result.data.workspaceId,\n profile: result.data.profile,\n });\n\n return {\n client,\n workspaceId,\n email: result.data.email,\n };\n}\n\n/**\n * Remove a user from a workspace.\n * @param options - User remove options\n * @returns Promise that resolves when removal completes\n */\nexport async function removeUser(options: RemoveUserOptions): Promise<void> {\n const { client, workspaceId, email } = await loadOptions(options);\n\n await client.removeWorkspacePlatformUser({\n workspaceId,\n email,\n });\n}\n\nexport const removeCommand = defineCommand({\n name: \"remove\",\n description: \"Remove a user from a workspace\",\n args: z.object({\n ...commonArgs,\n ...workspaceArgs,\n email: arg(z.email(), {\n description: \"Email address of the user to remove\",\n }),\n ...confirmationArgs,\n }),\n run: withCommonArgs(async (args) => {\n if (!args.yes) {\n const confirmation = await logger.prompt(\n `Are you sure you want to remove user \"${args.email}\" from the workspace? (yes/no):`,\n {\n type: \"text\",\n },\n );\n if (confirmation !== \"yes\") {\n logger.info(\"User removal cancelled.\");\n return;\n }\n }\n\n await removeUser({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n email: args.email,\n });\n\n logger.success(`User \"${args.email}\" removed from workspace.`);\n }),\n});\n","import { arg, defineCommand } from \"politty\";\nimport { z } from \"zod\";\nimport { commonArgs, withCommonArgs, workspaceArgs } from \"../../args\";\nimport { initOperatorClient } from \"../../client\";\nimport { loadAccessToken, loadWorkspaceId } from \"../../context\";\nimport { logger } from \"../../utils/logger\";\nimport { stringToRole, validRoles } from \"./transform\";\n\nconst updateUserOptionsSchema = z.object({\n workspaceId: z.uuid({ message: \"workspace-id must be a valid UUID\" }).optional(),\n profile: z.string().optional(),\n email: z.string().email({ message: \"email must be a valid email address\" }),\n role: z.enum(validRoles, { message: `role must be one of: ${validRoles.join(\", \")}` }),\n});\n\nexport type UpdateUserOptions = z.input<typeof updateUserOptionsSchema>;\n\nasync function loadOptions(options: UpdateUserOptions) {\n const result = updateUserOptionsSchema.safeParse(options);\n if (!result.success) {\n throw new Error(result.error.issues[0].message);\n }\n\n const accessToken = await loadAccessToken();\n const client = await initOperatorClient(accessToken);\n const workspaceId = loadWorkspaceId({\n workspaceId: result.data.workspaceId,\n profile: result.data.profile,\n });\n\n return {\n client,\n workspaceId,\n email: result.data.email,\n role: stringToRole(result.data.role),\n };\n}\n\n/**\n * Update a user's role in a workspace.\n * @param options - User update options\n * @returns Promise that resolves when update completes\n */\nexport async function updateUser(options: UpdateUserOptions): Promise<void> {\n const { client, workspaceId, email, role } = await loadOptions(options);\n\n await client.updateWorkspacePlatformUser({\n workspaceId,\n email,\n role,\n });\n}\n\nexport const updateCommand = defineCommand({\n name: \"update\",\n description: \"Update a user's role in a workspace\",\n args: z.object({\n ...commonArgs,\n ...workspaceArgs,\n email: arg(z.email(), {\n description: \"Email address of the user to update\",\n }),\n role: arg(z.enum(validRoles), {\n description: `New role to assign (${validRoles.join(\", \")})`,\n alias: \"r\",\n }),\n }),\n run: withCommonArgs(async (args) => {\n await updateUser({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n email: args.email,\n role: args.role as (typeof validRoles)[number],\n });\n\n logger.success(`User \"${args.email}\" updated to role \"${args.role}\".`);\n }),\n});\n"],"mappings":"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"}
|