{"version":3,"sources":["../src/workflows.ts"],"sourcesContent":["import {\n  createFarmRequestBodyErrorResponse,\n  readFarmRequestBody,\n  resolveFarmServerConfig,\n  type FarmServerConfig,\n  type ResolvedFarmServerConfig,\n} from \"./server-http\";\nimport { searchParamsToObject } from \"./search-params\";\nimport { farmSecretsMatch } from \"./secret-compare\";\nimport { isFarmDeployedRuntime, readFarmEnvironmentValue } from \"./utils/runtime-env\";\nimport { decodeRouteSegment } from \"./utils/decode\";\nimport { toPosixPath } from \"./utils\";\nimport { validateConfigRouteSource } from \"./plugins/route-pattern\";\nimport {\n  isAbsolute as isAbsolutePath,\n  normalize as normalizePath,\n  relative as relativeFilePath,\n  resolve as resolvePath,\n  sep as pathSeparator,\n} from \"node:path\";\n\nexport type FarmWorkflowSchedule = string | string[];\n\nexport interface FarmWorkflowsUserConfig {\n  /** Enable or disable Farm workflow discovery. Enabled by default. */\n  enabled?: boolean;\n  /** Directory or directories to scan for workflow modules. */\n  dir?: string | string[];\n  /** Alias for dir. */\n  dirs?: string[];\n  /** HTTP route used for manual and URL-based cron invocation. */\n  route?: string;\n  /** Environment variable that stores the optional runner secret. */\n  secretEnv?: string;\n  /** Inline runner secret. Prefer secretEnv for deployed apps. */\n  secret?: string;\n  /**\n   * Serve the workflow route without a secret in a deployed runtime.\n   * Defaults to false: without a secret the route is public, so production\n   * requests are rejected unless this is explicitly enabled.\n   */\n  allowUnsecured?: boolean;\n}\n\nexport interface FarmWorkflowsResolvedConfig {\n  enabled: boolean;\n  dirs: string[];\n  route: string;\n  secretEnv: string;\n  secret?: string;\n  allowUnsecured?: boolean;\n}\n\nexport interface FarmWorkflowLogger {\n  info: (...args: unknown[]) => void;\n  warn: (...args: unknown[]) => void;\n  error: (...args: unknown[]) => void;\n}\n\nexport interface FarmWorkflowRunContext<TPayload = unknown> {\n  id: string;\n  name: string;\n  payload: TPayload;\n  scheduledTime?: number | string;\n  request?: Request;\n  event?: unknown;\n  env: Record<string, string | undefined>;\n  data: Map<string, unknown>;\n  log: FarmWorkflowLogger;\n}\n\nexport interface FarmWorkflowDefinition<TPayload = unknown, TResult = unknown> {\n  kind?: \"farm-workflow\";\n  id?: string;\n  description?: string;\n  schedule?: FarmWorkflowSchedule;\n  timezone?: string;\n  run: (ctx: FarmWorkflowRunContext<TPayload>) => TResult | Promise<TResult>;\n}\n\nexport interface FarmCronDefinition<\n  TPayload = unknown,\n  TResult = unknown,\n> extends FarmWorkflowDefinition<TPayload, TResult> {\n  schedule: FarmWorkflowSchedule;\n}\n\nexport interface FarmDiscoveredWorkflow {\n  id: string;\n  filePath: string;\n  description?: string;\n  schedule: string[];\n  timezone?: string;\n  routePath: string;\n}\n\nexport interface PreparedFarmWorkflows {\n  workflows: FarmDiscoveredWorkflow[];\n  tasks: Record<string, { handler: string; description: string }>;\n  scheduledTasks: Record<string, string | string[]>;\n  handlerPath?: string;\n  manifestPath?: string;\n}\n\nexport interface FarmWorkflowHTTPHandlerOptions {\n  workflows: FarmDiscoveredWorkflow[];\n  config: FarmWorkflowsResolvedConfig;\n  loadModule: (workflow: FarmDiscoveredWorkflow) => Promise<Record<string, any>>;\n  server?: FarmServerConfig | ResolvedFarmServerConfig;\n}\n\nexport const DEFAULT_FARM_WORKFLOW_DIRS = [\"src/jobs\", \"src/workflows\", \"src/cron\"];\nexport const DEFAULT_FARM_WORKFLOW_ROUTE = \"/api/_farm/workflows\";\nexport const DEFAULT_FARM_WORKFLOW_SECRET_ENV = \"CRON_SECRET\";\nconst MISSING_FARM_WORKFLOW_SECRET_ERROR =\n  \"Workflow route requires a secret. Set the CRON_SECRET environment variable, configure workflows.secret, or set workflows.allowUnsecured to true.\";\n\nexport function defineWorkflow<const TPayload = unknown, TResult = unknown>(\n  definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n  return {\n    ...definition,\n    kind: \"farm-workflow\",\n  };\n}\n\nexport function defineTask<const TPayload = unknown, TResult = unknown>(\n  definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n  return defineWorkflow(definition);\n}\n\n/**\n * @deprecated Configure `cron` in `farm.config.ts` and point it at an API route.\n */\nexport function defineCron<const TPayload = unknown, TResult = unknown>(\n  definition: FarmCronDefinition<TPayload, TResult>,\n): FarmCronDefinition<TPayload, TResult> {\n  return {\n    ...definition,\n    kind: \"farm-workflow\",\n  };\n}\n\nexport function resolveWorkflowsConfig(\n  workflows: FarmWorkflowsUserConfig | boolean | undefined,\n): FarmWorkflowsResolvedConfig {\n  if (workflows === false) {\n    return {\n      enabled: false,\n      dirs: [...DEFAULT_FARM_WORKFLOW_DIRS],\n      route: DEFAULT_FARM_WORKFLOW_ROUTE,\n      secretEnv: DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n    };\n  }\n\n  const options = workflows && typeof workflows === \"object\" ? workflows : {};\n  const dirs = normalizeWorkflowDirs(options);\n\n  return {\n    enabled: options.enabled ?? true,\n    dirs,\n    route: normalizeWorkflowRoute(options.route || DEFAULT_FARM_WORKFLOW_ROUTE),\n    secretEnv: options.secretEnv || DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n    secret: options.secret,\n    allowUnsecured: options.allowUnsecured === true,\n  };\n}\n\nexport async function discoverFarmWorkflows(\n  config: {\n    root?: string;\n    workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;\n  },\n  options: {\n    loadModule?: (filePath: string) => Promise<Record<string, any>>;\n  } = {},\n): Promise<FarmDiscoveredWorkflow[]> {\n  const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n    ? config.workflows\n    : resolveWorkflowsConfig(config.workflows);\n  if (!workflowConfig.enabled) return [];\n\n  const root = config.root || process.cwd();\n  const files = await findWorkflowFiles(root, workflowConfig.dirs);\n  const workflows: FarmDiscoveredWorkflow[] = [];\n  const seenIds = new Map<string, string>();\n\n  for (const filePath of files) {\n    const module = options.loadModule\n      ? await options.loadModule(filePath)\n      : await loadWorkflowModule(filePath, root);\n    const definition = resolveWorkflowDefinition(module);\n    if (!definition) continue;\n\n    const id = normalizeWorkflowId(\n      definition.id || workflowIdFromFile(root, workflowConfig.dirs, filePath),\n    );\n    const previousPath = seenIds.get(id);\n    if (previousPath) {\n      throw new Error(\n        `Duplicate Farm workflow id \"${id}\" found in ${relativePath(root, previousPath)} and ${relativePath(root, filePath)}.`,\n      );\n    }\n    seenIds.set(id, filePath);\n\n    workflows.push({\n      id,\n      filePath,\n      description: definition.description,\n      schedule: normalizeSchedule(definition.schedule),\n      timezone: definition.timezone,\n      routePath: joinRoute(workflowConfig.route, encodeURIComponent(id)),\n    });\n  }\n\n  return workflows;\n}\n\nexport function createFarmWorkflowRequestHandler(options: FarmWorkflowHTTPHandlerOptions) {\n  const workflowsById = new Map(options.workflows.map((workflow) => [workflow.id, workflow]));\n\n  return async function handleFarmWorkflowRequest(request: Request): Promise<Response | null> {\n    const url = new URL(request.url);\n    const route = normalizeWorkflowRoute(options.config.route);\n    if (url.pathname !== route && !url.pathname.startsWith(`${route}/`)) {\n      return null;\n    }\n\n    if (url.pathname === route) {\n      const secretError = verifyWorkflowSecret(request, options.config);\n      if (secretError) return secretError;\n\n      return Response.json({\n        workflows: options.workflows.map(toWorkflowMetadata),\n      });\n    }\n\n    const id = decodeRouteSegment(url.pathname.slice(route.length + 1));\n\n    // Verify the secret before consulting the workflow id map so the\n    // existing-vs-missing distinction is not disclosed to callers without\n    // the secret (a 401 for unknown ids would otherwise become a 404 oracle).\n    const secretError = verifyWorkflowSecret(request, options.config);\n    if (secretError) return secretError;\n\n    const workflow = workflowsById.get(id);\n    if (!workflow) {\n      return Response.json({ error: `Workflow \"${id}\" was not found.` }, { status: 404 });\n    }\n\n    let payload: unknown;\n    try {\n      payload = await readWorkflowPayload(\n        request,\n        resolveFarmServerConfig(options.server).bodySizeLimit,\n      );\n    } catch (error) {\n      const response = createFarmRequestBodyErrorResponse(error);\n      if (response) return response;\n      if (error instanceof SyntaxError) {\n        return Response.json({ error: \"Invalid workflow request body.\" }, { status: 400 });\n      }\n      throw error;\n    }\n    const module = await options.loadModule(workflow);\n    const result = await runFarmWorkflowModule(module, {\n      id: workflow.id,\n      name: workflow.id,\n      payload,\n      request,\n      scheduledTime: readScheduledTime(payload),\n    });\n\n    return Response.json({\n      id: workflow.id,\n      ok: true,\n      result: result ?? null,\n    });\n  };\n}\n\nexport async function runFarmWorkflowModule(\n  module: Record<string, any>,\n  context: {\n    id: string;\n    name?: string;\n    payload?: unknown;\n    scheduledTime?: number | string;\n    request?: Request;\n    event?: unknown;\n    env?: Record<string, string | undefined>;\n  },\n): Promise<unknown> {\n  const definition = resolveWorkflowDefinition(module);\n  if (!definition) {\n    throw new Error(`Farm workflow \"${context.id}\" does not export a workflow definition.`);\n  }\n\n  return await definition.run({\n    id: context.id,\n    name: context.name || context.id,\n    payload: context.payload,\n    scheduledTime: context.scheduledTime,\n    request: context.request,\n    event: context.event,\n    env: context.env || process.env,\n    data: new Map<string, unknown>(),\n    log: console,\n  });\n}\n\nexport async function prepareFarmWorkflowsForNitro(config: {\n  root?: string;\n  distDir?: string;\n  workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;\n  server?: FarmServerConfig | ResolvedFarmServerConfig;\n}): Promise<PreparedFarmWorkflows> {\n  const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n    ? config.workflows\n    : resolveWorkflowsConfig(config.workflows);\n  const root = config.root || process.cwd();\n  const distDir = config.distDir || \".farm\";\n  const fs = await import(\"fs/promises\");\n  const path = await import(\"path\");\n  const generatedDir = path.join(root, distDir, \".nitro\", \"farm-workflows\");\n  const workflows = await discoverFarmWorkflows({\n    root,\n    workflows: workflowConfig,\n  });\n\n  if (workflows.length === 0) {\n    await fs.rm(generatedDir, { recursive: true, force: true });\n    return {\n      workflows,\n      tasks: {},\n      scheduledTasks: {},\n    };\n  }\n\n  await fs.rm(generatedDir, { recursive: true, force: true });\n  await fs.mkdir(generatedDir, { recursive: true });\n\n  const tasks: PreparedFarmWorkflows[\"tasks\"] = {};\n  const scheduledTasks = createScheduledTasks(workflows);\n\n  const wrapperNames = resolveWorkflowWrapperFileNames(workflows.map((workflow) => workflow.id));\n  for (const workflow of workflows) {\n    const wrapperPath = toPosixPath(\n      path.join(generatedDir, `${wrapperNames.get(workflow.id)}.mjs`),\n    );\n    await fs.writeFile(wrapperPath, createNitroTaskWrapper(workflow), \"utf8\");\n    tasks[workflow.id] = {\n      handler: wrapperPath,\n      description: workflow.description || `Farm workflow ${workflow.id}`,\n    };\n  }\n\n  const handlerPath = toPosixPath(path.join(generatedDir, \"http-handler.mjs\"));\n  await fs.writeFile(\n    handlerPath,\n    createNitroWorkflowHTTPHandler(\n      workflowConfig,\n      workflows,\n      resolveFarmServerConfig(config.server),\n    ),\n    \"utf8\",\n  );\n\n  const manifestPath = path.join(generatedDir, \"manifest.json\");\n  await fs.writeFile(\n    manifestPath,\n    JSON.stringify(\n      {\n        route: workflowConfig.route,\n        secretEnv: workflowConfig.secretEnv,\n        trigger: {\n          method: \"GET\",\n          authorization: `Bearer $${workflowConfig.secretEnv}`,\n        },\n        workflows: workflows.map(toWorkflowMetadata),\n      },\n      null,\n      2,\n    ),\n    \"utf8\",\n  );\n\n  return {\n    workflows,\n    tasks,\n    scheduledTasks,\n    handlerPath,\n    manifestPath,\n  };\n}\n\nexport function createFarmWorkflowVercelCrons(\n  workflows: FarmDiscoveredWorkflow[],\n): Array<{ path: string; schedule: string }> {\n  return workflows.flatMap((workflow) =>\n    workflow.schedule.map((schedule) => ({\n      path: workflow.routePath,\n      schedule,\n    })),\n  );\n}\n\nexport function applyFarmWorkflowVercelCrons(\n  vercelConfig: Record<string, any>,\n  workflows: FarmDiscoveredWorkflow[],\n): Record<string, any> {\n  const crons = createFarmWorkflowVercelCrons(workflows);\n  if (crons.length === 0) return vercelConfig;\n\n  const existingCrons = Array.isArray(vercelConfig.crons) ? vercelConfig.crons : [];\n  const seen = new Set(existingCrons.map((cron) => `${cron.path}:${cron.schedule}`));\n  const nextCrons = [...existingCrons];\n  for (const cron of crons) {\n    const key = `${cron.path}:${cron.schedule}`;\n    if (seen.has(key)) continue;\n    seen.add(key);\n    nextCrons.push(cron);\n  }\n  return {\n    ...vercelConfig,\n    crons: nextCrons,\n  };\n}\n\nfunction isResolvedWorkflowConfig(value: unknown): value is FarmWorkflowsResolvedConfig {\n  return (\n    !!value &&\n    typeof value === \"object\" &&\n    \"dirs\" in value &&\n    Array.isArray((value as FarmWorkflowsResolvedConfig).dirs) &&\n    typeof (value as FarmWorkflowsResolvedConfig).route === \"string\"\n  );\n}\n\nfunction normalizeWorkflowDirs(options: FarmWorkflowsUserConfig): string[] {\n  const rawDirs =\n    options.dirs ||\n    (Array.isArray(options.dir) ? options.dir : options.dir ? [options.dir] : undefined);\n  const dirs = rawDirs && rawDirs.length > 0 ? rawDirs : DEFAULT_FARM_WORKFLOW_DIRS;\n  return [...new Set(dirs.map(normalizeWorkflowDir).filter(Boolean))];\n}\n\nfunction normalizeWorkflowDir(value: string): string {\n  const dir = value.trim();\n  if (!dir) return \"\";\n  return isAbsolutePath(dir) ? normalizePath(dir) : trimSlashes(dir);\n}\n\nfunction normalizeWorkflowRoute(route: string): string {\n  const trimmed = route.trim();\n  if (!trimmed || trimmed === \"/\") return DEFAULT_FARM_WORKFLOW_ROUTE;\n  const normalized = `/${trimSlashes(trimmed)}`;\n  validateConfigRouteSource(normalized, \"workflows.route\");\n  return normalized;\n}\n\nfunction normalizeWorkflowId(id: string): string {\n  const normalized = id\n    .replace(/\\\\/g, \"/\")\n    .replace(/\\.(tsx?|jsx?|mjs|cjs)$/, \"\")\n    .replace(/\\/index$/, \"\")\n    .replace(/[^a-zA-Z0-9._/-]+/g, \"-\")\n    .replace(/^\\/+|\\/+$/g, \"\")\n    .replace(/\\/+/g, \"/\");\n  return normalized || \"workflow\";\n}\n\nfunction normalizeSchedule(schedule: FarmWorkflowSchedule | undefined): string[] {\n  if (!schedule) return [];\n  return (Array.isArray(schedule) ? schedule : [schedule])\n    .map((value) => value.trim())\n    .filter(Boolean);\n}\n\nfunction resolveWorkflowDefinition(\n  module: Record<string, any>,\n): FarmWorkflowDefinition | FarmCronDefinition | null {\n  const candidates = [module.default, module.workflow, module.cron, module.task, module.job];\n  for (const candidate of candidates) {\n    if (candidate && typeof candidate === \"object\" && typeof candidate.run === \"function\") {\n      return candidate as FarmWorkflowDefinition;\n    }\n  }\n  return null;\n}\n\nasync function findWorkflowFiles(root: string, dirs: string[]): Promise<string[]> {\n  const path = await import(\"path\");\n  const files: string[] = [];\n\n  for (const dir of dirs) {\n    const absoluteDir = path.isAbsolute(dir) ? dir : path.join(root, dir);\n    if (!(await pathExists(absoluteDir))) continue;\n    await walkWorkflowDir(absoluteDir, files);\n  }\n\n  return files.sort();\n}\n\nasync function walkWorkflowDir(dir: string, files: string[]): Promise<void> {\n  const fs = await import(\"fs/promises\");\n  const path = await import(\"path\");\n  const entries = await fs.readdir(dir, { withFileTypes: true });\n  for (const entry of entries) {\n    const filePath = path.join(dir, entry.name);\n    if (entry.isDirectory()) {\n      if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) continue;\n      await walkWorkflowDir(filePath, files);\n      continue;\n    }\n    if (isWorkflowFile(entry.name)) {\n      files.push(filePath);\n    }\n  }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n  const fs = await import(\"fs/promises\");\n  return fs\n    .access(filePath)\n    .then(() => true)\n    .catch(() => false);\n}\n\nfunction isWorkflowFile(fileName: string): boolean {\n  return /\\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(fileName) && !/\\.d\\.[cm]?ts$/.test(fileName);\n}\n\nasync function loadWorkflowModule(filePath: string, root: string): Promise<Record<string, any>> {\n  const fs = await import(\"fs/promises\");\n  const path = await import(\"path\");\n  const { pathToFileURL } = await import(\"url\");\n  const { build } = await import(\"esbuild\");\n  const outDir = path.join(root, \".farm\", \".workflow-loader\");\n  await fs.mkdir(outDir, { recursive: true });\n  const outfile = path.join(\n    outDir,\n    `workflow-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n  );\n\n  await build({\n    absWorkingDir: root,\n    entryPoints: [filePath],\n    outfile,\n    bundle: true,\n    format: \"esm\",\n    platform: \"node\",\n    target: `node${process.versions.node.split(\".\")[0]}`,\n    packages: \"external\",\n    external: [\"@farm.js/core\", \"@farm.js/core/*\", \"nitro\", \"nitro/*\"],\n    jsx: \"automatic\",\n    logLevel: \"silent\",\n    sourcemap: \"inline\",\n  });\n\n  try {\n    return await import(/* @vite-ignore */ `${pathToFileURL(outfile).href}?t=${Date.now()}`);\n  } finally {\n    await fs.unlink(outfile).catch(() => undefined);\n  }\n}\n\nfunction workflowIdFromFile(root: string, dirs: string[], filePath: string): string {\n  for (const dir of dirs) {\n    const scanRoot = isAbsolutePath(dir) ? dir : resolvePath(root, dir);\n    const candidate = relativeFilePath(scanRoot, filePath);\n    if (candidate && candidate !== \"..\" && !candidate.startsWith(`..${pathSeparator}`)) {\n      return normalizeWorkflowId(candidate);\n    }\n  }\n\n  return normalizeWorkflowId(relativeFilePath(root, filePath));\n}\n\nfunction createScheduledTasks(\n  workflows: FarmDiscoveredWorkflow[],\n): Record<string, string | string[]> {\n  const scheduleMap = new Map<string, string[]>();\n  for (const workflow of workflows) {\n    for (const schedule of workflow.schedule) {\n      const taskIds = scheduleMap.get(schedule) || [];\n      taskIds.push(workflow.id);\n      scheduleMap.set(schedule, taskIds);\n    }\n  }\n\n  return Object.fromEntries(\n    [...scheduleMap.entries()].map(([schedule, taskIds]) => [\n      schedule,\n      taskIds.length === 1 ? taskIds[0] : taskIds,\n    ]),\n  );\n}\n\nfunction createNitroTaskWrapper(workflow: FarmDiscoveredWorkflow): string {\n  const normalizedPath = workflow.filePath.replace(/\\\\/g, \"/\");\n  return `\nimport { defineTask } from \"nitro/runtime\";\nimport { runFarmWorkflowModule } from \"@farm.js/core/workflows\";\nimport * as workflowModule from ${JSON.stringify(normalizedPath)};\n\nexport default defineTask({\n  meta: {\n    description: ${JSON.stringify(workflow.description || `Farm workflow ${workflow.id}`)}\n  },\n  async run(event) {\n    const payload = event?.payload || {};\n    const env = event?.context?.cloudflare?.env || event?.context?.env || process.env;\n    return await runFarmWorkflowModule(workflowModule, {\n      id: ${JSON.stringify(workflow.id)},\n      name: event?.name || ${JSON.stringify(workflow.id)},\n      payload,\n      scheduledTime: payload.scheduledTime,\n      request: event?.context?.request,\n      event,\n      env\n    });\n  }\n});\n`.trim();\n}\n\nfunction createNitroWorkflowHTTPHandler(\n  config: FarmWorkflowsResolvedConfig,\n  workflows: FarmDiscoveredWorkflow[],\n  server: ResolvedFarmServerConfig,\n): string {\n  return `\nimport { H3 } from \"h3\";\nimport { runTask } from \"nitro/runtime\";\nimport {\n  createFarmRequestBodyErrorResponse,\n  farmSecretsMatch,\n  readFarmRequestBody,\n  searchParamsToObject\n} from \"@farm.js/core/internal/production-runtime\";\n\nconst route = ${JSON.stringify(config.route)};\nconst secretEnv = ${JSON.stringify(config.secretEnv)};\nconst inlineSecret = ${JSON.stringify(config.secret || \"\")};\nconst allowUnsecured = ${JSON.stringify(config.allowUnsecured === true)};\nconst bodySizeLimit = ${JSON.stringify(server.bodySizeLimit)};\nconst workflows = ${JSON.stringify(workflows.map(toWorkflowMetadata))};\nconst workflowIds = new Set(workflows.map((workflow) => workflow.id));\n\nfunction json(value, status = 200) {\n  return new Response(JSON.stringify(value), {\n    status,\n    headers: { \"content-type\": \"application/json\" }\n  });\n}\n\nfunction decodeRouteSegment(segment) {\n  try {\n    return decodeURIComponent(segment);\n  } catch {\n    return segment;\n  }\n}\n\nfunction getHeader(event, name) {\n  return event.req.headers.get(name);\n}\n\nfunction getSecret() {\n  // Match the dev-path verifyWorkflowSecret's resolution (readFarmEnvironmentValue):\n  // runtime bindings on globalThis.__env__ first, then process.env. Reading\n  // process.env alone misses a Cloudflare Workers secret, so a correctly\n  // configured deployment would see no secret and reject every request with 401.\n  const runtimeBindings = globalThis.__env__;\n  const runtimeSecret =\n    runtimeBindings && typeof runtimeBindings === \"object\" ? runtimeBindings[secretEnv] : undefined;\n  const resolved =\n    typeof runtimeSecret === \"string\"\n      ? runtimeSecret\n      : typeof process !== \"undefined\"\n        ? process.env?.[secretEnv]\n        : undefined;\n  return inlineSecret || resolved || \"\";\n}\n\nfunction verifySecret(event) {\n  const secret = getSecret();\n  if (!secret) {\n    if (allowUnsecured) return null;\n    return json({ error: ${JSON.stringify(MISSING_FARM_WORKFLOW_SECRET_ERROR)} }, 401);\n  }\n  const authorization = getHeader(event, \"authorization\") || \"\";\n  const headerSecret = getHeader(event, \"x-farm-workflow-secret\") || \"\";\n  const bearer = authorization.match(/^Bearer\\\\s+(.+)$/i)?.[1] || \"\";\n  if (farmSecretsMatch(headerSecret, secret) || farmSecretsMatch(bearer, secret)) return null;\n  return json({ error: \"Unauthorized workflow request.\" }, 401);\n}\n\nasync function readPayload(event) {\n  if (event.req.method === \"GET\" || event.req.method === \"HEAD\") {\n    return searchParamsToObject(event.url.searchParams);\n  }\n  const bytes = await readFarmRequestBody(event.req, bodySizeLimit);\n  const text = new TextDecoder().decode(bytes);\n  if (!text) return {};\n  const contentType = (getHeader(event, \"content-type\") || \"\").split(\";\", 1)[0].trim().toLowerCase();\n  if (\n    contentType === \"application/json\" ||\n    (contentType.startsWith(\"application/\") && contentType.endsWith(\"+json\"))\n  ) {\n    return JSON.parse(text);\n  }\n  return { text };\n}\n\nexport default new H3()\n  .get(route, (event) => {\n    const unauthorized = verifySecret(event);\n    if (unauthorized) return unauthorized;\n    return { workflows };\n  })\n  .all(route + \"/:id\", async (event) => {\n    const id = decodeRouteSegment(event.context.params?.id || \"\");\n\n    // Verify the secret before consulting the workflow id map so the\n    // existing-vs-missing distinction is not disclosed to callers without\n    // the secret (a 401 for unknown ids would otherwise become a 404 oracle).\n    const unauthorized = verifySecret(event);\n    if (unauthorized) return unauthorized;\n\n    if (!workflowIds.has(id)) {\n      return json({ error: \"Workflow \" + id + \" was not found.\" }, 404);\n    }\n\n    let payload;\n    try {\n      payload = await readPayload(event);\n    } catch (error) {\n      const response = createFarmRequestBodyErrorResponse(error);\n      if (response) return response;\n      if (error instanceof SyntaxError) return json({ error: \"Invalid workflow request body.\" }, 400);\n      throw error;\n    }\n    const result = await runTask(id, {\n      payload,\n      context: {\n        source: \"http\",\n        request: event.req,\n        route,\n        url: event.url.href,\n        method: event.req.method\n      }\n    });\n    return {\n      id,\n      ok: true,\n      result: result ?? null\n    };\n  });\n`.trim();\n}\n\nfunction toWorkflowMetadata(workflow: FarmDiscoveredWorkflow) {\n  return {\n    id: workflow.id,\n    description: workflow.description || null,\n    schedule: workflow.schedule,\n    timezone: workflow.timezone || null,\n    path: workflow.routePath,\n  };\n}\n\nasync function readWorkflowPayload(request: Request, bodySizeLimit: number): Promise<unknown> {\n  const url = new URL(request.url);\n  if (request.method === \"GET\" || request.method === \"HEAD\") {\n    return searchParamsToObject(url.searchParams);\n  }\n\n  const bytes = await readFarmRequestBody(request, bodySizeLimit);\n  const text = new TextDecoder().decode(bytes);\n  if (!text) return {};\n  const contentType = (request.headers.get(\"content-type\") || \"\")\n    .split(\";\", 1)[0]\n    .trim()\n    .toLowerCase();\n  if (\n    contentType === \"application/json\" ||\n    (contentType.startsWith(\"application/\") && contentType.endsWith(\"+json\"))\n  ) {\n    return JSON.parse(text);\n  }\n\n  return { text };\n}\n\nfunction readScheduledTime(payload: unknown): number | string | undefined {\n  return payload && typeof payload === \"object\" && \"scheduledTime\" in payload\n    ? (payload as { scheduledTime?: number | string }).scheduledTime\n    : undefined;\n}\n\nfunction verifyWorkflowSecret(\n  request: Request,\n  config: FarmWorkflowsResolvedConfig,\n): Response | null {\n  const secret = config.secret || readFarmEnvironmentValue(config.secretEnv) || \"\";\n  if (!secret) {\n    // No secret configured. Local development stays convenient, but a deployed\n    // runtime must not expose a route that lists and executes workflows to\n    // anonymous callers. Opt back in explicitly with .\n    if (config.allowUnsecured === true || !isFarmDeployedRuntime()) return null;\n    return Response.json(\n      {\n        error: MISSING_FARM_WORKFLOW_SECRET_ERROR,\n      },\n      { status: 401 },\n    );\n  }\n\n  const authorization = request.headers.get(\"authorization\") || \"\";\n  const bearer = authorization.match(/^Bearer\\s+(.+)$/i)?.[1] || \"\";\n  const headerSecret = request.headers.get(\"x-farm-workflow-secret\") || \"\";\n  if (farmSecretsMatch(bearer, secret) || farmSecretsMatch(headerSecret, secret)) return null;\n\n  return Response.json({ error: \"Unauthorized workflow request.\" }, { status: 401 });\n}\n\nfunction joinRoute(...parts: string[]): string {\n  return `/${parts\n    .map((part) => trimSlashes(part))\n    .filter(Boolean)\n    .join(\"/\")}`;\n}\n\nfunction trimSlashes(value: string): string {\n  return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Wrapper file names for a set of workflow ids.\n *\n * `safeFileName` is not injective: it maps `a/b` and `a-b` onto the same string,\n * and macOS and Windows additionally fold `Daily` onto `daily` on their default\n * case-insensitive filesystems. Two workflows would then share one generated\n * wrapper and both run whichever was written last. Only ids that actually\n * collide are disambiguated, so ordinary ids keep a readable wrapper; every id\n * in a colliding group gets a digest of the exact id appended, which keeps the\n * result independent of discovery order.\n */\nfunction resolveWorkflowWrapperFileNames(ids: readonly string[]): Map<string, string> {\n  const groups = new Map<string, number>();\n  for (const id of ids) {\n    const key = safeFileName(id).toLowerCase();\n    groups.set(key, (groups.get(key) ?? 0) + 1);\n  }\n\n  const resolved = new Map<string, string>();\n  const claimed = new Map<string, string>();\n  for (const id of ids) {\n    const base = safeFileName(id);\n    const key = base.toLowerCase();\n    const fileName = (groups.get(key) ?? 0) > 1 ? `${key}-${workflowIdFingerprint(id)}` : base;\n    const claimedBy = claimed.get(fileName.toLowerCase());\n    if (claimedBy !== undefined) {\n      throw new Error(\n        `Farm workflows ${JSON.stringify(claimedBy)} and ${JSON.stringify(id)} generate the same wrapper file ${JSON.stringify(`${fileName}.mjs`)}. Rename one of them.`,\n      );\n    }\n    claimed.set(fileName.toLowerCase(), id);\n    resolved.set(id, fileName);\n  }\n  return resolved;\n}\n\n/**\n * FNV-1a. This module is bundled into server runtimes that do not provide\n * node:crypto, and the digest only needs to separate file names.\n */\nfunction workflowIdFingerprint(value: string): string {\n  let hash = 0x811c9dc5;\n  for (let index = 0; index < value.length; index += 1) {\n    hash ^= value.charCodeAt(index);\n    hash = Math.imul(hash, 0x01000193);\n  }\n  return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\nfunction safeFileName(value: string): string {\n  return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\") || \"workflow\";\n}\n\nfunction relativePath(root: string, filePath: string): string {\n  return filePath.replace(/\\\\/g, \"/\").replace(`${root.replace(/\\\\/g, \"/\")}/`, \"\");\n}\n"],"mappings":"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","names":["secretError"]}