{"version":3,"sources":["../../src/iac/graph.ts","../../src/iac/compiler.ts","../../src/iac/change-set.ts","../../src/core/errors.ts","../../src/core/logger.ts","../../src/core/config.ts","../../src/core/version.ts","../../src/core/graphql-client.ts","../../src/iac/client.ts","../../src/iac/sdk.ts","../../src/iac/evaluator.ts","../../src/iac/project.ts","../../src/iac/typegen.ts","../../src/iac/runner.ts","../../src/iac/bin.ts"],"names":["path","databaseRegion","print","Kind","parse","createHash","url","pathToFileURL","fs","names","process"],"mappings":"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","file":"bin.cjs","sourcesContent":["import type {\n  BucketConfig,\n  BuildConfig,\n  DeployConfig,\n  EnvironmentConfig,\n  ServiceConfig,\n  ServiceNetworking,\n  ServiceSource,\n  VariableConfig,\n  VolumeConfig,\n  VolumeMount,\n} from \"./schema.js\";\n\nexport const RAILWAY_GRAPH_VERSION = 1 as const;\n\nexport type GraphVersion = typeof RAILWAY_GRAPH_VERSION;\nexport type ResourceType = \"service\" | \"database\" | \"volume\" | \"bucket\" | \"group\";\nexport type ResourceAddress = `${ResourceType}.${string}`;\n\nexport interface RailwayGraph {\n  version: GraphVersion;\n  project: ProjectNode;\n  environments: EnvironmentNode[];\n  resources: ResourceNode[];\n  edges: Edge[];\n}\n\nexport interface ProjectNode {\n  name: string;\n}\n\nexport interface EnvironmentNode {\n  name: string;\n}\n\nexport interface GraphResourceBase {\n  /** Deterministic graph handle. Remote Railway IDs live in bindings/lock state. */\n  address: ResourceAddress;\n  type: ResourceType;\n  name: string;\n  groupId?: string;\n}\n\nexport type ResourceNode = ServiceNode | DatabaseNode | VolumeNode | BucketNode | GroupNode;\n\nexport type ServiceKind = \"empty\" | \"github\" | \"docker-image\" | \"database\" | \"function\" | \"template\";\n\nexport interface SourceConfig extends ServiceSource {\n  type: \"github\" | \"image\" | \"empty\" | \"template\";\n  repo?: string | null;\n  image?: string | null;\n  template?: string | null;\n}\n\nexport interface ServiceNode extends GraphResourceBase {\n  address: `service.${string}`;\n  type: \"service\";\n  kind: ServiceKind;\n  source?: SourceConfig;\n  build?: BuildConfig;\n  deploy?: DeployConfig;\n  networking?: ServiceNetworking;\n  variables?: Record<string, VariableValue>;\n  volumeMounts?: Record<string, VolumeMount | null>;\n  configFile?: string;\n  parentServiceId?: string;\n  groupId?: string;\n  clusterRole?: ServiceConfig[\"clusterRole\"];\n  replicaConfig?: ServiceConfig[\"replicaConfig\"];\n  clusterDisplay?: ServiceConfig[\"clusterDisplay\"];\n}\n\nexport interface DatabaseNode extends Omit<ServiceNode, \"address\" | \"id\" | \"type\" | \"kind\"> {\n  address: `database.${string}`;\n  type: \"database\";\n  kind: \"database\";\n  engine: \"postgres\" | \"mysql\" | \"redis\" | \"mongo\" | \"private\";\n  image: string;\n  output: string;\n  defaultMountPath?: string;\n}\n\nexport interface VolumeNode extends GraphResourceBase {\n  address: `volume.${string}`;\n  type: \"volume\";\n  config?: VolumeConfig;\n}\n\nexport interface BucketNode extends GraphResourceBase {\n  address: `bucket.${string}`;\n  type: \"bucket\";\n  config?: BucketConfig;\n}\n\nexport interface GroupNode extends GraphResourceBase {\n  address: `group.${string}`;\n  type: \"group\";\n  color?: string;\n  icon?: string;\n  isCollapsed?: boolean;\n}\n\nexport type VariableValue =\n  | ({ type: \"literal\" } & VariableConfig)\n  | { type: \"reference\"; resource: ResourceAddress; output: string }\n  | { type: \"preserve\" }\n  | { type: \"raw\"; value: VariableConfig };\n\nexport interface Edge {\n  from: ResourceAddress;\n  to: ResourceAddress;\n  type: \"variable\" | \"mount\" | \"group\";\n  key?: string;\n}\n\nexport type ProjectResourceInput = ResourceNode | ResourceNode[];\n\nexport interface ProjectDefinition {\n  name: string;\n  environments?: string[];\n  resources?: ProjectResourceInput[];\n  /** @deprecated Use resources instead. */\n  services?: ProjectResourceInput[];\n}\n\nexport interface GraphCompileOptions {\n  serviceIdsByName?: Record<string, string>;\n  existingServiceIds?: string[];\n  volumeIdsByServiceName?: Record<string, string>;\n  bucketIdsByName?: Record<string, string>;\n}\n\nexport interface CompileResult {\n  graph: RailwayGraph;\n  desiredConfig: EnvironmentConfig;\n}\n\nexport interface GraphIndex {\n  byAddress: Map<ResourceAddress, ResourceNode>;\n  byTypeAndName: Map<`${ResourceType}:${string}`, ResourceNode>;\n}\n\nexport function resourceAddress(type: ResourceType, name: string): ResourceAddress {\n  return `${type}.${name}` as ResourceAddress;\n}\n\nexport function indexGraph(graph: RailwayGraph): GraphIndex {\n  const byAddress = new Map<ResourceAddress, ResourceNode>();\n  const byTypeAndName = new Map<`${ResourceType}:${string}`, ResourceNode>();\n\n  for (const resource of graph.resources) {\n    byAddress.set(resource.address, resource);\n    byTypeAndName.set(`${resource.type}:${resource.name}`, resource);\n  }\n\n  return { byAddress, byTypeAndName };\n}\n\nexport function validateGraph(graph: RailwayGraph): string[] {\n  const errors: string[] = [];\n  if (graph.version !== RAILWAY_GRAPH_VERSION) errors.push(`Unsupported graph version: ${graph.version}`);\n\n  const addresses = new Set<ResourceAddress>();\n  for (const resource of graph.resources) {\n    if (addresses.has(resource.address)) errors.push(`Duplicate resource address: ${resource.address}`);\n    addresses.add(resource.address);\n  }\n\n  for (const edge of graph.edges) {\n    if (!addresses.has(edge.from)) errors.push(`Edge references missing source: ${edge.from}`);\n    if (!addresses.has(edge.to)) errors.push(`Edge references missing target: ${edge.to}`);\n  }\n\n  return errors;\n}\n","import { RAILWAY_GRAPH_VERSION, resourceAddress } from \"./graph.js\";\nimport type {\n  DatabaseNode,\n  Edge,\n  GraphCompileOptions,\n  ProjectDefinition,\n  RailwayGraph,\n  ResourceNode,\n  ServiceNode,\n  VariableValue,\n} from \"./graph.js\";\nimport type { DeployConfig, EnvironmentConfig, ServiceConfig, ServiceNetworking, VariableConfig, VariableValues } from \"./schema.js\";\n\nexport function projectDefinitionToGraph(definition: ProjectDefinition): RailwayGraph {\n  const resources = (definition.resources ?? definition.services ?? []).flat();\n  const edges: Edge[] = [];\n  for (const resource of resources) {\n    if (resource.type !== \"service\" && resource.type !== \"database\") continue;\n    for (const [key, value] of Object.entries(resource.variables ?? {})) {\n      if (value.type !== \"reference\") continue;\n      edges.push({ from: resource.address, to: value.resource as Edge[\"to\"], type: \"variable\", key });\n    }\n  }\n  return {\n    version: RAILWAY_GRAPH_VERSION,\n    project: { name: definition.name },\n    environments: (definition.environments ?? []).map(name => ({ name })),\n    resources: resources.map(stripRuntimeHelpers),\n    edges,\n  };\n}\n\nfunction stripRuntimeHelpers<T>(value: T): T {\n  if (Array.isArray(value)) return value.map(stripRuntimeHelpers) as T;\n  if (value == null || typeof value !== \"object\") return value;\n  return Object.fromEntries(\n    Object.entries(value as Record<string, unknown>)\n      .filter(([, child]) => typeof child !== \"function\")\n      .map(([key, child]) => [key, stripRuntimeHelpers(child)]),\n  ) as T;\n}\n\nexport function graphToEnvironmentConfig(graph: RailwayGraph, options: GraphCompileOptions = {}): EnvironmentConfig {\n  const config: EnvironmentConfig = { services: {} };\n  const resourceNamesById = Object.fromEntries(graph.resources.map(resource => [resource.address, resource.name]));\n  const existingServiceIds = new Set(options.existingServiceIds ?? []);\n\n  for (const resource of graph.resources) {\n    if (resource.type === \"service\" || resource.type === \"database\") {\n      const serviceKey = options.serviceIdsByName?.[resource.name] ?? resource.name;\n      config.services![serviceKey] =\n        resource.type === \"database\"\n          ? databaseToEnvironmentConfig(resource, {\n              isNew: !existingServiceIds.has(serviceKey),\n              ...(options.volumeIdsByServiceName?.[resource.name]\n                ? { volumeId: options.volumeIdsByServiceName[resource.name] }\n                : {}),\n            })\n          : serviceToEnvironmentConfig(resource, resourceNamesById, {\n              isNew: !existingServiceIds.has(serviceKey),\n            });\n\n      const volumeId = options.volumeIdsByServiceName?.[resource.name];\n      if (resource.type === \"database\" && volumeId != null) {\n        const region = databaseRegion(resource);\n        config.volumes = config.volumes ?? {};\n        config.volumes[volumeId] = { isCreated: true, ...(region ? { region } : {}) };\n      }\n      continue;\n    }\n\n    if (resource.type === \"volume\") {\n      config.volumes = config.volumes ?? {};\n      config.volumes[resource.name] = { isCreated: true, ...resource.config };\n      continue;\n    }\n\n    if (resource.type === \"bucket\") {\n      const existingBucketId = options.bucketIdsByName?.[resource.name];\n      const bucketKey = existingBucketId ?? resource.name;\n      config.buckets = config.buckets ?? {};\n      config.buckets[bucketKey] = { ...(existingBucketId ? {} : { isCreated: true }), ...resource.config, ...(resource.groupId ? { groupId: resource.groupId } : {}) };\n      continue;\n    }\n\n    if (resource.type === \"group\") {\n      config.groups = config.groups ?? {};\n      config.groups[resource.name] = pruneEmpty({\n        isCreated: true,\n        name: resource.name,\n        color: resource.color,\n        icon: resource.icon,\n        isCollapsed: resource.isCollapsed,\n      }) as NonNullable<EnvironmentConfig[\"groups\"]>[string];\n    }\n  }\n\n  return pruneEmpty(config);\n}\n\nexport function environmentConfigToGraph(\n  config: EnvironmentConfig,\n  options: { projectName?: string; serviceNamesById?: Record<string, string>; bucketNamesById?: Record<string, string>; customDomainsByServiceId?: Record<string, Record<string, { port?: number }>> } = {},\n): RailwayGraph {\n  const resources: ResourceNode[] = [];\n  const groupNamesById = Object.fromEntries(\n    Object.entries(config.groups ?? {}).map(([groupId, groupConfig]) => [groupId, groupConfig?.name ?? groupId]),\n  );\n\n  for (const [groupId, groupConfig] of Object.entries(config.groups ?? {})) {\n    if (groupConfig == null || groupConfig.isDeleted) continue;\n    const name = groupConfig.name ?? groupId;\n    const parentGroupId = (groupConfig as { groupId?: string | null }).groupId;\n    resources.push(pruneEmpty({\n      address: resourceAddress(\"group\", name) as `group.${string}`,\n      type: \"group\",\n      name,\n      color: groupConfig.color,\n      icon: groupConfig.icon,\n      isCollapsed: groupConfig.isCollapsed,\n      ...(parentGroupId ? { groupId: groupNamesById[parentGroupId] ?? parentGroupId } : {}),\n    }) as ResourceNode);\n  }\n\n  for (const [serviceId, serviceConfig] of Object.entries(config.services ?? {})) {\n    if (serviceConfig == null || serviceConfig.isDeleted) continue;\n    const name = options.serviceNamesById?.[serviceId] ?? serviceId;\n    const imageName = serviceConfig.source?.image;\n    const looksLikeDatabase = imageName?.includes(\"postgres\") || imageName?.includes(\"mysql\") || imageName?.includes(\"redis\") || imageName?.includes(\"mongo\");\n    if (looksLikeDatabase) {\n      const engine = imageName?.includes(\"mysql\") ? \"mysql\" : imageName?.includes(\"redis\") ? \"redis\" : imageName?.includes(\"mongo\") ? \"mongo\" : \"postgres\";\n      resources.push(pruneEmpty({\n        address: resourceAddress(\"database\", name) as `database.${string}`,\n        type: \"database\",\n        kind: \"database\",\n        engine,\n        name,\n        image: imageName ?? \"postgres:16\",\n        output: engine === \"redis\" ? \"REDIS_URL\" : engine === \"mysql\" ? \"MYSQL_URL\" : engine === \"mongo\" ? \"MONGO_URL\" : \"DATABASE_URL\",\n        defaultMountPath: Object.keys(serviceConfig.volumeMounts ?? {}).length > 0 ? serviceConfig.deploy?.requiredMountPath : undefined,\n        ...(serviceConfig.deploy ? { deploy: serviceConfig.deploy } : {}),\n        ...(serviceConfig.volumeMounts ? { volumeMounts: serviceConfig.volumeMounts } : {}),\n        ...(serviceConfig.groupId ? { groupId: groupNamesById[serviceConfig.groupId] ?? serviceConfig.groupId } : {}),\n      }) as ResourceNode);\n      continue;\n    }\n    resources.push({\n      address: resourceAddress(\"service\", name) as `service.${string}`,\n      type: \"service\",\n      kind: serviceConfig.source?.repo ? \"github\" : serviceConfig.source?.image ? \"docker-image\" : serviceConfig.deploy?.cronSchedule ? \"function\" : \"empty\",\n      name,\n      ...(serviceConfig.source ? { source: { type: serviceConfig.source.image ? \"image\" : \"github\", ...serviceConfig.source } } : {}),\n      ...(serviceConfig.build ? { build: serviceConfig.build } : {}),\n      ...(serviceConfig.deploy ? { deploy: serviceConfig.deploy } : {}),\n      ...(serviceConfig.variables ? { variables: variablesFromEnvironmentConfig(serviceConfig.variables) } : {}),\n      ...(serviceConfig.networking || options.customDomainsByServiceId?.[serviceId] ? { networking: pruneEmpty({ ...serviceConfig.networking, customDomains: options.customDomainsByServiceId?.[serviceId] ?? serviceConfig.networking?.customDomains }) as ServiceNetworking } : {}),\n      ...(serviceConfig.volumeMounts ? { volumeMounts: serviceConfig.volumeMounts } : {}),\n      ...(serviceConfig.configFile ? { configFile: serviceConfig.configFile } : {}),\n      ...(serviceConfig.groupId ? { groupId: groupNamesById[serviceConfig.groupId] ?? serviceConfig.groupId } : {}),\n    });\n  }\n\n  for (const [bucketId, bucketConfig] of Object.entries(config.buckets ?? {})) {\n    if (bucketConfig == null || bucketConfig.isDeleted) continue;\n    const name = options.bucketNamesById?.[bucketId] ?? bucketId;\n    const groupId = (bucketConfig as { groupId?: string | null }).groupId;\n    resources.push({\n      address: resourceAddress(\"bucket\", name) as `bucket.${string}`,\n      type: \"bucket\",\n      name,\n      config: bucketConfig,\n      ...(groupId ? { groupId: groupNamesById[groupId] ?? groupId } : {}),\n    });\n  }\n\n  return projectDefinitionToGraph({\n    name: options.projectName ?? \"imported-project\",\n    resources,\n  });\n}\n\nexport function composePatch({ currentConfig, desiredConfig }: { currentConfig: EnvironmentConfig; desiredConfig: EnvironmentConfig }): EnvironmentConfig {\n  return pruneEmpty(addDeletionMarkers({ currentConfig, desiredConfig }));\n}\n\nfunction addDeletionMarkers({ currentConfig, desiredConfig }: { currentConfig: EnvironmentConfig; desiredConfig: EnvironmentConfig }): EnvironmentConfig {\n  const next: EnvironmentConfig = structuredClone(desiredConfig);\n  for (const [serviceId, currentService] of Object.entries(currentConfig.services ?? {})) {\n    if (currentService == null || currentService.isDeleted) continue;\n    const desiredService = desiredConfig.services?.[serviceId];\n    if (desiredService == null) {\n      next.services = next.services ?? {};\n      next.services[serviceId] = { isDeleted: true };\n      continue;\n    }\n    for (const [variableName, currentVariable] of Object.entries(currentService.variables ?? {})) {\n      if (currentVariable == null) continue;\n      if (desiredService.variables?.[variableName] != null) continue;\n      next.services = next.services ?? {};\n      next.services[serviceId] = next.services[serviceId] ?? {};\n      next.services[serviceId]!.variables = next.services[serviceId]!.variables ?? {};\n      next.services[serviceId]!.variables![variableName] = null;\n    }\n  }\n  return next;\n}\n\nfunction databaseRegion(database: DatabaseNode): string | undefined {\n  const regions = Object.entries(database.deploy?.multiRegionConfig ?? {}).filter(([, config]) => config != null);\n  if (regions.length !== 1) return undefined;\n  return regions[0]?.[0];\n}\n\nfunction databaseDeploy(database: DatabaseNode, requiredMountPath: string): DeployConfig {\n  return {\n    requiredMountPath,\n    ...(database.deploy?.multiRegionConfig ? { multiRegionConfig: database.deploy.multiRegionConfig } : {}),\n  };\n}\n\nfunction databaseToEnvironmentConfig(database: DatabaseNode, options: { isNew: boolean; volumeId?: string }): ServiceConfig {\n  if (database.engine !== \"postgres\") {\n    return pruneEmpty({\n      ...(options.isNew ? { isCreated: true } : {}),\n      source: { image: database.image },\n      ...(database.defaultMountPath ? { deploy: databaseDeploy(database, database.defaultMountPath) } : {}),\n      ...(options.volumeId && database.defaultMountPath ? { volumeMounts: { [options.volumeId]: { mountPath: database.defaultMountPath } } } : {}),\n    });\n  }\n  return pruneEmpty({\n    ...(options.isNew ? { isCreated: true } : {}),\n    source: { image: database.image },\n    deploy: databaseDeploy(database, \"/var/lib/postgresql/data\"),\n    variables: {\n      PGDATA: { value: \"/var/lib/postgresql/data/pgdata\" },\n      PGHOST: { value: \"${{RAILWAY_PRIVATE_DOMAIN}}\" },\n      PGPORT: { value: \"5432\" },\n      PGUSER: { value: \"${{POSTGRES_USER}}\" },\n      PGDATABASE: { value: \"${{POSTGRES_DB}}\" },\n      PGPASSWORD: { value: \"${{POSTGRES_PASSWORD}}\" },\n      POSTGRES_DB: { value: \"railway\" },\n      DATABASE_URL: { value: \"postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{PGDATABASE}}\" },\n      POSTGRES_USER: { value: \"postgres\" },\n      SSL_CERT_DAYS: { value: \"820\" },\n      POSTGRES_PASSWORD: { generator: 'secret(32, \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\")' },\n      DATABASE_PUBLIC_URL: { value: \"postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}/${{PGDATABASE}}\" },\n      RAILWAY_DEPLOYMENT_DRAINING_SECONDS: { value: \"60\" },\n    },\n    networking: { tcpProxies: { \"5432\": {} } },\n    ...(options.volumeId ? { volumeMounts: { [options.volumeId]: { mountPath: \"/var/lib/postgresql/data\" } } } : {}),\n  });\n}\n\nfunction serviceToEnvironmentConfig(service: ServiceNode, resourceNamesById: Record<string, string>, options: { isNew: boolean }): ServiceConfig {\n  const config: ServiceConfig = { ...(options.isNew ? { isCreated: true } : {}) };\n  if (service.source) {\n    const source = pruneEmpty({\n      repo: service.source.type === \"github\" ? service.source.repo : undefined,\n      branch: service.source.type === \"github\" ? service.source.branch : undefined,\n      image: service.source.type === \"image\" ? service.source.image : undefined,\n      rootDirectory: service.source.rootDirectory,\n      commitSha: service.source.commitSha,\n      upstreamUrl: service.source.upstreamUrl,\n      checkSuites: service.source.checkSuites,\n      autoUpdates: service.source.autoUpdates,\n    }) as ServiceConfig[\"source\"];\n    if (source) config.source = source;\n  }\n  if (service.build) config.build = service.build;\n  if (service.deploy) config.deploy = service.deploy;\n  if (service.variables) config.variables = variablesToEnvironmentConfig(service.variables, resourceNamesById);\n  if (service.networking) config.networking = service.networking;\n  if (service.volumeMounts) config.volumeMounts = service.volumeMounts;\n  if (service.configFile) config.configFile = service.configFile;\n  if (service.parentServiceId) config.parentServiceId = service.parentServiceId;\n  if (service.groupId) config.groupId = service.groupId;\n  if (service.clusterRole) config.clusterRole = service.clusterRole;\n  if (service.replicaConfig) config.replicaConfig = service.replicaConfig;\n  if (service.clusterDisplay) config.clusterDisplay = service.clusterDisplay;\n  return pruneEmpty(config);\n}\n\nfunction variablesToEnvironmentConfig(variables: Record<string, VariableValue>, resourceNamesById: Record<string, string>): VariableValues {\n  return Object.fromEntries(\n    Object.entries(variables)\n      .filter((entry): entry is [string, Exclude<VariableValue, { type: \"preserve\" }>] => entry[1].type !== \"preserve\")\n      .map(([key, value]) => [\n        key,\n        value.type === \"literal\" ? literalVariable(value) : value.type === \"raw\" ? value.value : referenceVariable(value, resourceNamesById),\n      ]),\n  );\n}\n\nfunction referenceVariable(value: Extract<VariableValue, { type: \"reference\" }>, resourceNamesById: Record<string, string>): VariableConfig {\n  return { value: `\\${{${resourceNamesById[value.resource] ?? value.resource}.${value.output}}}` };\n}\n\nfunction literalVariable(value: Extract<VariableValue, { type: \"literal\" }>): VariableConfig {\n  const { type: _type, ...variable } = value;\n  return variable;\n}\n\nfunction variablesFromEnvironmentConfig(variables: VariableValues): Record<string, VariableValue> {\n  return Object.fromEntries(Object.entries(variables).filter(([, value]) => value != null).map(([key, value]) => [key, value?.value == null || value.value === \"\" ? { type: \"preserve\" } : { type: \"literal\", value: value.value }]));\n}\n\nfunction pruneEmpty<T>(value: T, path: string[] = []): T {\n  if (Array.isArray(value)) return value.map(child => pruneEmpty(child, path)) as T;\n  if (value == null || typeof value !== \"object\") return value;\n  return Object.fromEntries(\n    Object.entries(value)\n      .map(([key, child]) => [key, pruneEmpty(child, [...path, key])])\n      .filter(([, child]) => {\n        if (child == null) return false;\n        if (typeof child === \"object\" && !Array.isArray(child)) {\n          if ([\"customDomains\", \"serviceDomains\", \"tcpProxies\"].includes(path[path.length - 1] ?? \"\")) return true;\n          return Object.keys(child).length > 0;\n        }\n        return true;\n      }),\n  ) as T;\n}\n","import { composePatch, graphToEnvironmentConfig } from \"./compiler.js\";\nimport type { GraphCompileOptions, RailwayGraph, ResourceAddress, ResourceNode, VariableValue } from \"./graph.js\";\nimport type { EnvironmentConfig } from \"./schema.js\";\n\nexport const RAILWAY_CHANGE_SET_VERSION = 0 as const;\n\nexport type RailwayChangeSetVersion = typeof RAILWAY_CHANGE_SET_VERSION;\nexport type ChangeSeverity = \"safe\" | \"destructive\";\nexport type ChangeDeployEffect = \"none\" | \"deploy\" | \"unknown\";\n\nexport interface RailwayChangeSet {\n  version: RailwayChangeSetVersion;\n  changes: RailwayChange[];\n  diagnostics: ChangeDiagnostic[];\n}\n\nexport type RailwayChange =\n  | CreateResourceChange\n  | DeleteResourceChange\n  | UpdateResourceChange\n  | SetVariableChange\n  | DeleteVariableChange\n  | CreateDomainChange;\n\nexport interface ChangeBase {\n  kind: string;\n  path: string;\n  summary: string;\n  severity: ChangeSeverity;\n  deployEffect: ChangeDeployEffect;\n}\n\nexport interface CreateResourceChange extends ChangeBase {\n  kind: \"resource.create\";\n  address: ResourceAddress;\n  resource: ResourceNode;\n}\n\nexport interface DeleteResourceChange extends ChangeBase {\n  kind: \"resource.delete\";\n  address: ResourceAddress;\n  previous: ResourceNode;\n}\n\nexport interface UpdateResourceChange extends ChangeBase {\n  kind: \"resource.update\";\n  address: ResourceAddress;\n  field: string;\n  before: unknown;\n  after: unknown;\n  details?: string[];\n}\n\nexport interface SetVariableChange extends ChangeBase {\n  kind: \"variable.set\";\n  address: ResourceAddress;\n  variable: string;\n  before?: VariableValue | undefined;\n  after: VariableValue;\n  details?: string[];\n}\n\nexport interface DeleteVariableChange extends ChangeBase {\n  kind: \"variable.delete\";\n  address: ResourceAddress;\n  variable: string;\n  previous: VariableValue;\n}\n\nexport interface CreateDomainChange extends ChangeBase {\n  kind: \"domain.create\";\n  address: ResourceAddress;\n  domain: string;\n  targetPort?: number;\n}\n\nexport interface ChangeDiagnostic {\n  severity: \"warning\" | \"error\";\n  path: string;\n  message: string;\n}\n\nexport function diffGraphs({ current, desired }: { current: RailwayGraph; desired: RailwayGraph }): RailwayChangeSet {\n  const changes: RailwayChange[] = [];\n  const diagnostics: ChangeDiagnostic[] = [];\n  const currentByAddress = new Map(current.resources.map(resource => [resource.address, resource]));\n  const desiredByAddress = new Map(desired.resources.map(resource => [resource.address, resource]));\n\n  for (const resource of desired.resources) {\n    const previous = currentByAddress.get(resource.address);\n    if (previous && isManagedByRepoConfig(previous)) {\n      diagnostics.push({\n        severity: \"error\",\n        path: `resources.${resource.address}.configFile`,\n        message: `${previous.name} is already managed by ${String((previous as { configFile?: string }).configFile)}. Remove or migrate the repo config before managing this service from .railway/railway.ts.`,\n      });\n      continue;\n    }\n    if (!previous) {\n      changes.push({\n        kind: \"resource.create\",\n        address: resource.address,\n        resource,\n        path: `resources.${resource.address}`,\n        summary: `Create ${resource.type} ${resource.name}`,\n        severity: \"safe\",\n        deployEffect: resource.type === \"service\" || resource.type === \"database\" ? \"deploy\" : \"none\",\n      });\n      continue;\n    }\n\n    if (previous.name !== resource.name) {\n      changes.push(update(resource.address, \"name\", previous.name, resource.name, `Rename ${resource.type} ${previous.name} to ${resource.name}`));\n    }\n\n    diffVariables({ previous, resource, changes, resourcesByAddress: desiredByAddress });\n    diffTopLevelField({ previous, resource, field: \"source\", changes });\n    diffTopLevelField({ previous, resource, field: \"build\", changes });\n    if (previous.type === \"database\" && resource.type === \"database\" && databaseRegion(previous) !== databaseRegion(resource)) {\n      changes.push(update(\n        resource.address,\n        \"deploy\",\n        previous.deploy,\n        resource.deploy,\n        `Move database ${resource.name} to ${databaseRegion(resource) ?? \"default region\"}`,\n        changedLeafPaths(normalizeForDiff(\"deploy\", previous.deploy), normalizeForDiff(\"deploy\", resource.deploy), \"deploy\"),\n        \"destructive\",\n      ));\n    } else {\n      diffTopLevelField({ previous, resource, field: \"deploy\", changes });\n    }\n    diffTopLevelField({ previous, resource, field: \"groupId\", changes });\n    diffNetworking({ previous, resource, changes });\n    // Volume lifecycle is not part of v0 authoring. Never plan an accidental unmount just\n    // because imported config omitted a Railway-owned volume id.\n    if (previous.type === \"bucket\" && resource.type === \"bucket\" && bucketRegion(previous) !== bucketRegion(resource)) {\n      diagnostics.push({\n        severity: \"error\",\n        path: `resources.${resource.address}.config.region`,\n        message: `Bucket region cannot be changed after creation. Create a new bucket in ${bucketRegion(resource) ?? \"the desired region\"} and migrate data instead.`,\n      });\n    } else {\n      diffTopLevelField({ previous, resource, field: \"config\", changes });\n    }\n    // Database mount paths are product/template defaults in v0. Do not churn or attempt\n    // mount-path updates after creation; Backboard owns the database realization details.\n  }\n\n  for (const resource of current.resources) {\n    if (desiredByAddress.has(resource.address)) continue;\n    changes.push({\n      kind: \"resource.delete\",\n      address: resource.address,\n      previous: resource,\n      path: `resources.${resource.address}`,\n      summary: `Delete ${resource.type} ${resource.name}`,\n      severity: \"destructive\",\n      deployEffect: resource.type === \"service\" || resource.type === \"database\" ? \"deploy\" : \"none\",\n    });\n  }\n\n  return { version: RAILWAY_CHANGE_SET_VERSION, changes, diagnostics };\n}\n\nexport function changeSetToGraph({ current, changeSet }: { current: RailwayGraph; changeSet: RailwayChangeSet }): RailwayGraph {\n  const next = structuredClone(current) as RailwayGraph;\n  const resources = new Map<ResourceAddress, ResourceNode>(next.resources.map(resource => [resource.address, resource]));\n\n  for (const change of changeSet.changes) {\n    if (change.kind === \"resource.create\") {\n      resources.set(change.address, structuredClone(change.resource) as ResourceNode);\n      continue;\n    }\n\n    if (change.kind === \"resource.delete\") {\n      resources.delete(change.address);\n      continue;\n    }\n\n    const resource = resources.get(change.address);\n    if (!resource) continue;\n\n    if (change.kind === \"domain.create\") {\n      continue;\n    }\n\n    if (change.kind === \"resource.update\") {\n      (resource as unknown as Record<string, unknown>)[change.field] = structuredClone(change.after);\n      continue;\n    }\n\n    if (change.kind === \"variable.set\") {\n      const serviceLike = resource as ResourceNode & { variables?: Record<string, VariableValue> };\n      serviceLike.variables = serviceLike.variables ?? {};\n      serviceLike.variables[change.variable] = structuredClone(change.after) as VariableValue;\n      continue;\n    }\n\n    if (change.kind === \"variable.delete\" && \"variables\" in resource) {\n      delete resource.variables?.[change.variable];\n    }\n  }\n\n  next.resources = [...resources.values()];\n  next.edges = next.edges.filter(edge => resources.has(edge.from) && resources.has(edge.to));\n  return next;\n}\n\nexport function changeSetToEnvironmentPatch({\n  currentGraph,\n  currentConfig,\n  changeSet,\n  compileOptions = {},\n}: {\n  currentGraph: RailwayGraph;\n  currentConfig: EnvironmentConfig;\n  changeSet: RailwayChangeSet;\n  compileOptions?: GraphCompileOptions;\n}): EnvironmentConfig {\n  const desiredGraph = changeSetToGraph({ current: currentGraph, changeSet });\n  const desiredConfig = graphToEnvironmentConfig(desiredGraph, compileOptions);\n  return composePatch({ currentConfig, desiredConfig });\n}\n\nexport function validateChangeSet(changeSet: RailwayChangeSet): ChangeDiagnostic[] {\n  const diagnostics: ChangeDiagnostic[] = [];\n  if (changeSet.version !== RAILWAY_CHANGE_SET_VERSION) {\n    diagnostics.push({ severity: \"error\", path: \"version\", message: `Unsupported change set version: ${changeSet.version}` });\n  }\n\n  for (const [index, change] of changeSet.changes.entries()) {\n    if (!change.path) diagnostics.push({ severity: \"error\", path: `changes.${index}.path`, message: \"Change path is required\" });\n    if (!change.summary) diagnostics.push({ severity: \"error\", path: `changes.${index}.summary`, message: \"Change summary is required\" });\n    if (change.kind === \"resource.delete\" && change.severity !== \"destructive\") {\n      diagnostics.push({ severity: \"warning\", path: `changes.${index}.severity`, message: \"Resource deletion should be marked destructive\" });\n    }\n  }\n\n  return diagnostics;\n}\n\nexport function renderChangeSet(changeSet: RailwayChangeSet): string {\n  if (changeSet.changes.length === 0) return \"No changes.\";\n  return changeSet.changes.map(change => `${marker(change)} ${change.summary}`).join(\"\\n\");\n}\n\nfunction diffVariables({ previous, resource, changes, resourcesByAddress }: { previous: ResourceNode; resource: ResourceNode; changes: RailwayChange[]; resourcesByAddress: Map<ResourceAddress, ResourceNode> }) {\n  if (!(\"variables\" in previous) && !(\"variables\" in resource)) return;\n  const before = \"variables\" in previous ? previous.variables ?? {} : {};\n  const after = \"variables\" in resource ? resource.variables ?? {} : {};\n  for (const [key, value] of Object.entries(after)) {\n    if (isPreservedVariable(value) || isPreservedVariable(before[key]) || isUnknownImportedVariable(before[key])) continue;\n    if (stableStringify(normalizeVariableForDiff(before[key], resourcesByAddress)) === stableStringify(normalizeVariableForDiff(value, resourcesByAddress))) continue;\n    changes.push({\n      kind: \"variable.set\",\n      address: resource.address,\n      variable: key,\n      before: before[key],\n      after: value,\n      path: `resources.${resource.address}.variables.${key}`,\n      summary: `${before[key] ? \"Update\" : \"Set\"} variable ${resource.name}.${key}`,\n      details: [`${resource.name}.${key} (${formatVariableDiffValue(before[key], resourcesByAddress)} → ${formatVariableDiffValue(value, resourcesByAddress)})`],\n      severity: \"safe\",\n      deployEffect: \"deploy\",\n    });\n  }\n  for (const [key, value] of Object.entries(before)) {\n    if (key in after) continue;\n    changes.push({\n      kind: \"variable.delete\",\n      address: resource.address,\n      variable: key,\n      previous: value,\n      path: `resources.${resource.address}.variables.${key}`,\n      summary: `Delete variable ${resource.name}.${key}`,\n      severity: \"destructive\",\n      deployEffect: \"deploy\",\n    });\n  }\n}\n\nfunction diffNetworking({ previous, resource, changes }: { previous: ResourceNode; resource: ResourceNode; changes: RailwayChange[] }) {\n  const before = \"networking\" in previous ? previous.networking : undefined;\n  const after = \"networking\" in resource ? resource.networking : undefined;\n  const beforeDomains = before?.customDomains ?? {};\n  const afterDomains = after?.customDomains ?? {};\n\n  for (const [domain, config] of Object.entries(afterDomains)) {\n    if (beforeDomains[domain]) continue;\n    changes.push({\n      kind: \"domain.create\",\n      address: resource.address,\n      domain,\n      ...(config?.port !== undefined && config.port !== null ? { targetPort: config.port } : {}),\n      path: `resources.${resource.address}.domains.${domain}`,\n      summary: `Create custom domain ${resource.name}.${domain}`,\n      severity: \"safe\",\n      deployEffect: \"none\",\n    });\n  }\n\n  const normalizedBefore = normalizeForDiff(\"networking\", { ...before, customDomains: undefined, serviceDomains: undefined });\n  const normalizedAfter = normalizeForDiff(\"networking\", { ...after, customDomains: undefined, serviceDomains: undefined });\n  if (stableStringify(normalizedBefore) !== stableStringify(normalizedAfter)) {\n    changes.push(update(resource.address, \"networking\", before, after, `Update ${resource.name} networking`));\n  }\n}\n\nfunction diffTopLevelField({ previous, resource, field, changes }: { previous: ResourceNode; resource: ResourceNode; field: string; changes: RailwayChange[] }) {\n  const before = (previous as unknown as Record<string, unknown>)[field];\n  const after = (resource as unknown as Record<string, unknown>)[field];\n  if (field === \"source\" && previous.type === \"database\" && isEquivalentDatabaseSource(previous, after)) return;\n  const normalizedBefore = normalizeForDiff(field, before);\n  const normalizedAfter = normalizeForDiff(field, after);\n  if (stableStringify(normalizedBefore) === stableStringify(normalizedAfter)) return;\n  changes.push(update(resource.address, field, before, after, summaryForField(resource, field, normalizedBefore, normalizedAfter), changedLeafPaths(normalizedBefore, normalizedAfter, field)));\n}\n\nfunction summaryForField(resource: ResourceNode, field: string, before: unknown, after: unknown): string {\n  const details = changedLeafPaths(before, after, field);\n  if (details.length > 0) {\n    const shown = details.slice(0, 3).map(detailPathForSummary).join(\", \");\n    const remaining = details.length - 3;\n    return `Update ${resource.name} ${shown}${remaining > 0 ? ` and ${remaining} more` : \"\"}`;\n  }\n\n  if (field === \"networking\") {\n    const beforeDomains = Object.keys(((before as { customDomains?: Record<string, unknown> } | undefined)?.customDomains) ?? {});\n    const afterDomains = Object.keys(((after as { customDomains?: Record<string, unknown> } | undefined)?.customDomains) ?? {});\n    const created = afterDomains.filter(domain => !beforeDomains.includes(domain));\n    if (created.length === 1) return `Create custom domain ${resource.name}.${created[0]}`;\n    if (created.length > 1) return `Create ${created.length} custom domains for ${resource.name}`;\n  }\n  return `Update ${resource.name} ${field}`;\n}\n\nfunction detailPathForSummary(detail: string): string {\n  return detail.replace(/ \\(.+\\)$/, \"\");\n}\n\nfunction changedLeafPaths(before: unknown, after: unknown, prefix: string): string[] {\n  const beforeFlat = flattenForDiff(before);\n  const afterFlat = flattenForDiff(after);\n  const changed = [...new Set([...Object.keys(beforeFlat), ...Object.keys(afterFlat)])]\n    .filter(key => stableStringify(beforeFlat[key]) !== stableStringify(afterFlat[key]))\n    .sort();\n  return changed\n    .filter(key => key !== \"\" || changed.length === 1)\n    .filter(key => key === \"\" || !changed.some(other => other !== key && other.startsWith(`${key}.`)))\n    .map(key => {\n      const path = key ? `${prefix}.${key}` : prefix;\n      const beforeValue = beforeFlat[key];\n      const afterValue = afterFlat[key];\n      return `${friendlyPath(path)} (${formatDiffValue(beforeValue)} → ${formatDiffValue(afterValue)})`;\n    });\n}\n\nfunction friendlyPath(path: string): string {\n  const region = /^deploy\\.multiRegionConfig\\.([^.]+)\\.numReplicas$/.exec(path);\n  if (region) return `regions.${region[1]}`;\n  return path;\n}\n\nfunction formatDiffValue(value: unknown): string {\n  if (value === undefined) return \"unset\";\n  if (value === null) return \"null\";\n  if (typeof value === \"string\") return JSON.stringify(value);\n  return JSON.stringify(value);\n}\n\nfunction flattenForDiff(value: unknown, prefix = \"\"): Record<string, unknown> {\n  if (value == null || typeof value !== \"object\" || Array.isArray(value)) return { [prefix]: value };\n  const entries = Object.entries(value as Record<string, unknown>);\n  if (entries.length === 0) return { [prefix]: value };\n  return Object.fromEntries(entries.flatMap(([key, child]) => Object.entries(flattenForDiff(child, prefix ? `${prefix}.${key}` : key))));\n}\n\nfunction update(address: ResourceAddress, field: string, before: unknown, after: unknown, summary: string, details?: string[], severity: ChangeSeverity = \"safe\"): UpdateResourceChange {\n  return {\n    kind: \"resource.update\",\n    address,\n    field,\n    before,\n    after,\n    ...(details && details.length > 0 ? { details } : {}),\n    path: `resources.${address}.${field}`,\n    summary,\n    severity,\n    deployEffect: field === \"config\" || field === \"groupId\" ? \"none\" : \"deploy\",\n  };\n}\n\nfunction marker(change: RailwayChange): string {\n  if (change.kind === \"resource.create\" || change.kind === \"domain.create\") return \"+\";\n  if (change.kind === \"resource.delete\") return \"-\";\n  return \"~\";\n}\n\nfunction formatVariableDiffValue(value: VariableValue | undefined, resourcesByAddress: Map<ResourceAddress, ResourceNode>): string {\n  if (value === undefined) return \"unset\";\n  if (value.type === \"preserve\") return \"preserve()\";\n  if (value.type === \"literal\") return formatDiffValue(value.value);\n  if (value.type === \"reference\") {\n    const name = resourcesByAddress.get(value.resource)?.name ?? value.resource.split(\".\").slice(1).join(\".\") ?? value.resource;\n    return `${name}.${value.output}`;\n  }\n  return formatDiffValue(normalizeVariableForDiff(value, resourcesByAddress));\n}\n\nfunction normalizeVariableForDiff(value: VariableValue | undefined, resourcesByAddress: Map<ResourceAddress, ResourceNode>): unknown {\n  if (value?.type !== \"reference\") return value;\n  const name = resourcesByAddress.get(value.resource)?.name ?? value.resource.split(\".\").slice(1).join(\".\") ?? value.resource;\n  return { type: \"literal\", value: `\\${{${name}.${value.output}}}` };\n}\n\nfunction isManagedByRepoConfig(resource: ResourceNode): boolean {\n  if (resource.type !== \"service\" && resource.type !== \"database\") return false;\n  const configFile = (resource as { configFile?: string | null }).configFile;\n  return typeof configFile === \"string\" && /railway\\.(json|toml)$/i.test(configFile);\n}\n\nfunction bucketRegion(resource: ResourceNode): string | undefined {\n  if (resource.type !== \"bucket\") return undefined;\n  const config = (resource as ResourceNode & { config?: { region?: string | null } }).config;\n  return config?.region ?? undefined;\n}\n\nfunction databaseRegion(resource: ResourceNode): string | undefined {\n  if (resource.type !== \"database\") return undefined;\n  const regions = Object.entries(resource.deploy?.multiRegionConfig ?? {}).filter(([, config]) => config != null);\n  if (regions.length !== 1) return undefined;\n  return regions[0]?.[0];\n}\n\nfunction isEquivalentDatabaseSource(previous: ResourceNode, after: unknown): boolean {\n  if (previous.type !== \"database\" || after == null || typeof after !== \"object\") return false;\n  const source = after as Record<string, unknown>;\n  return source.type === \"image\" && normalizeImageTag(String(source.image)) === normalizeImageTag(previous.image);\n}\n\nfunction isPreservedVariable(value: VariableValue | undefined): boolean {\n  return value?.type === \"preserve\";\n}\n\nfunction isUnknownImportedVariable(value: VariableValue | undefined): boolean {\n  return value?.type === \"literal\" && value.value === \"\";\n}\n\nfunction normalizeForDiff(field: string, value: unknown): unknown {\n  if (value == null || typeof value !== \"object\") return value;\n  const copy = structuredClone(value) as Record<string, unknown>;\n\n  if (field === \"source\") {\n    if (copy.checkSuites === false) delete copy.checkSuites;\n    if (copy.branch === \"main\") delete copy.branch;\n    delete copy.commitSha;\n    delete copy.upstreamUrl;\n    if (copy.rootDirectory === \"\") delete copy.rootDirectory;\n    if (typeof copy.image === \"string\") copy.image = normalizeImageTag(copy.image);\n  }\n\n  if (field === \"build\") {\n    if (copy.builder === \"RAILPACK\") delete copy.builder;\n    if (copy.buildEnvironment === \"V3\") delete copy.buildEnvironment;\n  }\n\n  if (field === \"deploy\") {\n    if (copy.useLegacyStacker === false) delete copy.useLegacyStacker;\n    if (copy.ipv6EgressEnabled === false) delete copy.ipv6EgressEnabled;\n    if (copy.runtime === \"V2\") delete copy.runtime;\n    copy.multiRegionConfig = normalizeMultiRegionConfig(copy.multiRegionConfig);\n    if (isDefaultMultiRegionConfig(copy.multiRegionConfig)) delete copy.multiRegionConfig;\n    if (copy.multiRegionConfig != null && typeof copy.multiRegionConfig === \"object\" && !Array.isArray(copy.multiRegionConfig) && Object.keys(copy.multiRegionConfig).length === 0) delete copy.multiRegionConfig;\n  }\n\n  return Object.keys(copy).length === 0 ? undefined : copy;\n}\n\nfunction normalizeMultiRegionConfig(value: unknown): unknown {\n  if (value == null || typeof value !== \"object\" || Array.isArray(value)) return value;\n  const entries = Object.entries(value as Record<string, unknown>)\n    .filter(([, config]) => {\n      if (config == null || typeof config !== \"object\" || Array.isArray(config)) return true;\n      const replicas = (config as Record<string, unknown>).numReplicas;\n      return replicas !== null && replicas !== undefined;\n    });\n  return Object.fromEntries(entries);\n}\n\nfunction isDefaultMultiRegionConfig(value: unknown): boolean {\n  if (value == null || typeof value !== \"object\" || Array.isArray(value)) return false;\n  const entries = Object.entries(value as Record<string, unknown>);\n  if (entries.length !== 1) return false;\n  const config = entries[0]?.[1];\n  if (config == null || typeof config !== \"object\" || Array.isArray(config)) return false;\n  const regionConfig = config as Record<string, unknown>;\n  return Object.entries(regionConfig).every(([key, child]) =>\n    (key === \"numReplicas\" && child === 1) ||\n    (key === \"stackerAssignment\" && child == null)\n  );\n}\n\nfunction normalizeImageTag(image: string): string {\n  const match = /^(?:railwayapp\\/|ghcr\\.io\\/railwayapp-templates\\/)?(redis|mysql|mongo|postgres)(?:-ssl)?:(\\d+)(?:\\.\\d+)*$/.exec(image);\n  if (!match) return image;\n  return `${match[1]}:${match[2]}`;\n}\n\nfunction stableStringify(value: unknown): string {\n  return JSON.stringify(sortForJson(value));\n}\n\nfunction sortForJson(value: unknown): unknown {\n  if (Array.isArray(value)) return value.map(sortForJson);\n  if (value == null || typeof value !== \"object\") return value;\n  return Object.fromEntries(\n    Object.entries(value as Record<string, unknown>)\n      .sort(([left], [right]) => left.localeCompare(right))\n      .map(([key, child]) => [key, sortForJson(child)]),\n  );\n}\n","export interface RailwayGraphQLErrorItem {\n  message: string;\n  path?: readonly (string | number)[];\n  extensions?: Record<string, unknown>;\n  [key: string]: unknown;\n}\n\nexport class RailwayError extends Error {\n  constructor(message: string, options?: ErrorOptions) {\n    super(message, options);\n    this.name = new.target.name;\n  }\n}\n\nexport class RailwayAuthError extends RailwayError {\n  readonly variable: string;\n\n  constructor(variable: string) {\n    super(\n      `Missing Railway credential. Set ${variable} or pass it explicitly.`,\n    );\n    this.variable = variable;\n  }\n}\n\n/** A WebSocket or network transport failure. */\nexport class RailwayConnectionError extends RailwayError {\n  readonly closeCode: number | undefined;\n\n  constructor(args: { message: string; closeCode?: number; cause?: unknown }) {\n    super(\n      args.message,\n      args.cause === undefined ? undefined : { cause: args.cause },\n    );\n    this.closeCode = args.closeCode;\n  }\n}\n\nexport class RailwayGraphQLError extends RailwayError {\n  readonly status: number;\n  readonly errors: readonly RailwayGraphQLErrorItem[];\n  readonly responseBody: unknown;\n\n  constructor(args: {\n    message: string;\n    status: number;\n    errors?: readonly RailwayGraphQLErrorItem[];\n    responseBody?: unknown;\n  }) {\n    super(args.message);\n    this.status = args.status;\n    this.errors = args.errors ?? [];\n    this.responseBody = args.responseBody;\n  }\n}\n","/**\n * Opt-in verbose logging. A no-op unless enabled, so call sites stay\n * branch-free: `config.log(...)` does nothing when verbose is off.\n */\nexport type Logger = (message: string) => void;\n\nconst NOOP: Logger = () => {};\n\n/**\n * Returns a logger that writes `[railway] <message>` lines to stderr, or a\n * no-op when `verbose` is false. `console.error` exists in Node, browsers, and\n * edge runtimes, so this is safe to call anywhere.\n */\nexport function createLogger(verbose: boolean): Logger {\n  if (!verbose) return NOOP;\n  return message => console.error(`[railway] ${message}`);\n}\n","import { RailwayAuthError, RailwayConnectionError } from \"./errors.js\";\nimport { createLogger, type Logger } from \"./logger.js\";\n\nexport const DEFAULT_RAILWAY_GRAPHQL_ENDPOINT =\n  \"https://backboard.railway.com/graphql/v2\";\n\nconst RAILWAY_TOKEN_ENV = \"RAILWAY_API_TOKEN\";\nconst RAILWAY_ENVIRONMENT_ENV = \"RAILWAY_ENVIRONMENT_ID\";\nconst RAILWAY_ENDPOINT_ENV = \"RAILWAY_GRAPHQL_ENDPOINT\";\nconst RAILWAY_TCP_PROXY_WS_ENV = \"RAILWAY_TCP_PROXY_WS_ENDPOINT\";\nconst RAILWAY_VERBOSE_ENV = \"RAILWAY_VERBOSE\";\n\nconst TCP_PROXY_WS_PORT = \"2226\";\nconst TCP_PROXY_WS_PATH = \"/ws/exec\";\n\nexport type RailwayAuthType = \"bearer\" | \"project-token\";\n\nexport interface RailwayClientConfig {\n  token?: string;\n  authType?: RailwayAuthType;\n  endpoint?: string;\n  /** Alias used by IaC flows. Prefer endpoint for the stable SDK surface. */\n  graphqlEndpoint?: string;\n  fetch?: typeof fetch;\n  /**\n   * WebSocket constructor used to stream exec output. Defaults to the global\n   * `WebSocket` (available in Node >= 22, browsers, Deno, and edge runtimes);\n   * pass an implementation (e.g. the `ws` package) where no global exists.\n   */\n  webSocketImpl?: WebSocketConstructor;\n  /**\n   * tcp-proxy exec WebSocket endpoint. Defaults to the value derived from\n   * `endpoint` (`backboard.<host>` → `wss://ssh.<host>:2226/ws/exec`);\n   * override for non-standard deployments.\n   */\n  tcpProxyWsEndpoint?: string;\n  /**\n   * Print human-readable progress to stderr (requests, polling, lifecycle).\n   * Also enabled by `RAILWAY_VERBOSE`. Tokens and env values are never logged.\n   */\n  verbose?: boolean;\n}\n\n/** Structural constructor type satisfied by native WebSocket and the `ws` package. */\nexport type WebSocketConstructor = new (\n  url: string,\n  protocols?: string | string[],\n) => unknown;\n\nexport interface NormalizedRailwayClientConfig {\n  token: string;\n  authType: RailwayAuthType;\n  endpoint: string;\n  fetch: typeof fetch;\n  webSocketImpl?: WebSocketConstructor | undefined;\n  tcpProxyWsEndpoint: string;\n  log: Logger;\n}\n\n/**\n * Resolves credentials and transport with explicit values winning over\n * environment variables. Reading from env keeps the happy path config-free;\n * passing an explicit value lets callers source it from any variable they like.\n */\nexport function normalizeRailwayClientConfig(\n  config: RailwayClientConfig = {},\n): NormalizedRailwayClientConfig {\n  const token = firstNonEmpty(config.token, readEnv(RAILWAY_TOKEN_ENV));\n  if (!token) throw new RailwayAuthError(RAILWAY_TOKEN_ENV);\n\n  const fetchImpl = config.fetch ?? globalThis.fetch;\n  if (!fetchImpl) {\n    throw new Error(\"No fetch implementation found. Pass `fetch` in the config.\");\n  }\n\n  const endpoint =\n    firstNonEmpty(\n      config.endpoint,\n      config.graphqlEndpoint,\n      readEnv(RAILWAY_ENDPOINT_ENV),\n    ) ?? DEFAULT_RAILWAY_GRAPHQL_ENDPOINT;\n\n  const tcpProxyWsEndpoint =\n    firstNonEmpty(config.tcpProxyWsEndpoint, readEnv(RAILWAY_TCP_PROXY_WS_ENV)) ??\n    deriveTcpProxyWsEndpoint(endpoint);\n\n  const verbose = config.verbose ?? isTruthyEnv(readEnv(RAILWAY_VERBOSE_ENV));\n  const normalized: NormalizedRailwayClientConfig = {\n    token,\n    authType: config.authType ?? \"bearer\",\n    endpoint,\n    fetch: fetchImpl,\n    webSocketImpl: config.webSocketImpl,\n    tcpProxyWsEndpoint,\n    log: createLogger(verbose),\n  };\n  normalized.log(\n    `config resolved: endpoint=${endpoint} authType=${normalized.authType}`,\n  );\n  return normalized;\n}\n\n/**\n * Derives the tcp-proxy exec WebSocket endpoint from the GraphQL endpoint:\n * the host's leading `backboard.` label becomes `ssh.` (or `ssh.` is\n * prepended), scheme `wss`, port 2226, path `/ws/exec`. e.g.\n * `https://backboard.railway.com/graphql/v2` → `wss://ssh.railway.com:2226/ws/exec`.\n */\nexport function deriveTcpProxyWsEndpoint(endpoint: string): string {\n  const url = new URL(endpoint);\n  const host = url.hostname.startsWith(\"backboard.\")\n    ? `ssh.${url.hostname.slice(\"backboard.\".length)}`\n    : `ssh.${url.hostname}`;\n  return `wss://${host}:${TCP_PROXY_WS_PORT}${TCP_PROXY_WS_PATH}`;\n}\n\nexport function resolveWebSocketImpl(\n  config: NormalizedRailwayClientConfig,\n): WebSocketConstructor {\n  const impl =\n    config.webSocketImpl ??\n    (globalThis as { WebSocket?: WebSocketConstructor }).WebSocket;\n  if (!impl) {\n    throw new RailwayConnectionError({\n      message:\n        \"No WebSocket implementation found. Pass `webSocketImpl` in the config \" +\n        \"(e.g. the `ws` package) to stream exec output.\",\n    });\n  }\n  return impl;\n}\n\nexport function resolveEnvironmentId(explicit?: string): string {\n  const environmentId = firstNonEmpty(\n    explicit,\n    readEnv(RAILWAY_ENVIRONMENT_ENV),\n  );\n  if (!environmentId) throw new RailwayAuthError(RAILWAY_ENVIRONMENT_ENV);\n  return environmentId;\n}\n\n/**\n * Reads an environment variable without assuming a Node runtime, so the SDK is\n * safe to import in browsers, Deno, and edge runtimes where `process` is absent.\n */\nfunction readEnv(name: string): string | undefined {\n  if (typeof process === \"undefined\") return undefined;\n  return process.env?.[name];\n}\n\n/** Treats `1`/`true`/`yes` as on so `RAILWAY_VERBOSE=0` doesn't accidentally enable. */\nfunction isTruthyEnv(value: string | undefined): boolean {\n  if (value === undefined) return false;\n  const normalized = value.trim().toLowerCase();\n  return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\";\n}\n\nfunction firstNonEmpty(...values: (string | undefined)[]): string | undefined {\n  for (const value of values) {\n    if (value !== undefined && value.trim().length > 0) return value;\n  }\n  return undefined;\n}\n","// Injected by tsup at build time from package.json; falls back when running\n// unbundled (vitest/tsx).\ndeclare const __RAILWAY_SDK_VERSION__: string | undefined;\n\nconst SDK_VERSION =\n  typeof __RAILWAY_SDK_VERSION__ !== \"undefined\"\n    ? __RAILWAY_SDK_VERSION__\n    : \"0.0.0-dev\";\n\nexport const USER_AGENT = `railway-ts-sdk/${SDK_VERSION}`;\n","import type { TypedDocumentNode } from \"@graphql-typed-document-node/core\";\nimport { Kind, print, type DocumentNode } from \"graphql\";\n\nimport type { NormalizedRailwayClientConfig } from \"./config.js\";\nimport {\n  RailwayGraphQLError,\n  type RailwayGraphQLErrorItem,\n} from \"./errors.js\";\nimport { USER_AGENT } from \"./version.js\";\n\ninterface GraphQLResponse<TResult> {\n  data?: TResult;\n  errors?: RailwayGraphQLErrorItem[];\n}\n\nexport async function requestGraphQL<TResult, TVariables>(\n  config: NormalizedRailwayClientConfig,\n  document: TypedDocumentNode<TResult, TVariables>,\n  variables: TVariables,\n): Promise<TResult> {\n  const operation = operationName(document as DocumentNode);\n  const start = Date.now();\n  config.log(`→ ${operation} POST ${config.endpoint}`);\n\n  const response = await config.fetch(config.endpoint, {\n    method: \"POST\",\n    headers: {\n      Accept: \"application/json\",\n      ...authHeader(config),\n      \"Content-Type\": \"application/json\",\n      \"User-Agent\": USER_AGENT,\n    },\n    body: JSON.stringify({\n      query: print(document as DocumentNode),\n      variables,\n    }),\n  });\n\n  const body = await parseGraphQLResponse<TResult>(response);\n  const errors = body?.errors ?? [];\n  const elapsed = Date.now() - start;\n\n  if (!response.ok || errors.length > 0) {\n    config.log(\n      `← ${operation} failed http=${response.status} errors=${errors.length} in ${elapsed}ms`,\n    );\n    throw new RailwayGraphQLError({\n      message:\n        errors[0]?.message ??\n        `Railway GraphQL request failed with HTTP ${response.status}.`,\n      status: response.status,\n      errors,\n      responseBody: body,\n    });\n  }\n\n  if (!body?.data) {\n    config.log(`← ${operation} returned no data`);\n    throw new RailwayGraphQLError({\n      message: \"Railway GraphQL response did not include data.\",\n      status: response.status,\n      responseBody: body,\n    });\n  }\n\n  config.log(`← ${operation} ok in ${elapsed}ms`);\n  return body.data;\n}\n\nfunction operationName(document: DocumentNode): string {\n  for (const definition of document.definitions) {\n    if (definition.kind === Kind.OPERATION_DEFINITION) {\n      return definition.name?.value ?? \"anonymous\";\n    }\n  }\n  return \"operation\";\n}\n\nfunction authHeader(config: NormalizedRailwayClientConfig): Record<string, string> {\n  if (config.authType === \"project-token\") return { \"project-access-token\": config.token };\n  return { Authorization: `Bearer ${config.token}` };\n}\n\nasync function parseGraphQLResponse<TResult>(\n  response: Response,\n): Promise<GraphQLResponse<TResult> | undefined> {\n  try {\n    return (await response.json()) as GraphQLResponse<TResult>;\n  } catch {\n    return undefined;\n  }\n}\n","import { parse } from \"graphql\";\nimport type { TypedDocumentNode } from \"@graphql-typed-document-node/core\";\nimport { normalizeRailwayClientConfig, type RailwayClientConfig, type NormalizedRailwayClientConfig } from \"../core/config.js\";\nimport { requestGraphQL } from \"../core/graphql-client.js\";\nimport type {\n  BucketCreateInput,\n  ServiceCreateInput,\n  VolumeCreateInput,\n} from \"../generated/graphql.js\";\nimport type { RailwayChangeSet } from \"./change-set.js\";\nimport type { RailwayGraph, ResourceNode } from \"./graph.js\";\nimport type { EnvironmentConfig } from \"./schema.js\";\n\nexport interface CurrentEnvironmentResult {\n  projectId?: string | undefined;\n  projectName?: string | undefined;\n  environmentId: string;\n  environmentName?: string | undefined;\n  config: EnvironmentConfig;\n  serviceNamesById: Record<string, string>;\n  bucketNamesById: Record<string, string>;\n  customDomainsByServiceId: Record<string, Record<string, { port?: number }>>;\n}\n\nexport interface StagedPatchResult {\n  id: string;\n  status: string;\n  patch: EnvironmentConfig;\n  meta?: unknown;\n}\n\nexport interface ChangeOperationResult {\n  kind: string;\n  path?: string | null;\n  summary?: string | null;\n  status: string;\n  outputs?: unknown;\n}\n\nexport interface ChangeSetPreviewResult {\n  changeSet: RailwayChangeSet;\n  diagnostics: unknown[];\n  effects: unknown[];\n}\n\nexport interface ChangeSetApplyResult {\n  id: string;\n  status: string;\n  changes: ChangeOperationResult[];\n  diagnostics: unknown[];\n  deploymentId?: string | null;\n  stagedPatchId?: string | null;\n}\n\nexport interface ProjectService { id: string; name: string }\nexport interface ProjectVolume { id: string; name?: string | null; serviceId?: string | null }\nexport interface ProjectBucket { id: string; name: string }\n\nexport interface EnsuredGraphResources {\n  serviceIdsByName: Record<string, string>;\n  volumeIdsByServiceName: Record<string, string>;\n  bucketIdsByName: Record<string, string>;\n}\n\nexport class IacClient {\n  readonly #config: NormalizedRailwayClientConfig;\n\n  constructor(config: RailwayClientConfig) {\n    this.#config = normalizeRailwayClientConfig(config);\n  }\n\n  async getCurrentEnvironment(environmentId: string, options: { decryptVariables?: boolean } = {}): Promise<CurrentEnvironmentResult> {\n    const data = await gql<{\n      environment: { id: string; name?: string; projectId?: string; config: EnvironmentConfig };\n    }, { environmentId: string; decryptVariables: boolean }>(this.#config, `query IacEnvironmentConfig($environmentId: String!, $decryptVariables: Boolean) {\n      environment(id: $environmentId) { id name projectId config(decryptVariables: $decryptVariables) }\n    }`, { environmentId, decryptVariables: options.decryptVariables ?? false });\n\n    const projectName = data.environment.projectId ? await this.getProjectName(data.environment.projectId) : undefined;\n    const services = data.environment.projectId ? await this.getProjectServices(data.environment.projectId) : [];\n    const buckets = data.environment.projectId ? await this.getProjectBuckets(data.environment.projectId) : [];\n    const customDomainsByServiceId = data.environment.projectId ? await this.getEnvironmentCustomDomains(data.environment.projectId, environmentId, services) : {};\n    return {\n      projectId: data.environment.projectId,\n      projectName,\n      environmentId: data.environment.id,\n      environmentName: data.environment.name,\n      config: data.environment.config ?? {},\n      serviceNamesById: Object.fromEntries(services.map(service => [service.id, service.name])),\n      bucketNamesById: Object.fromEntries(buckets.map(bucket => [bucket.id, bucket.name])),\n      customDomainsByServiceId,\n    };\n  }\n\n  async getStagedPatch(environmentId: string, options: { decryptVariables?: boolean } = {}): Promise<StagedPatchResult> {\n    const data = await gql<{ environmentStagedChanges: StagedPatchResult }, { environmentId: string; decryptVariables: boolean }>(this.#config, `query IacStagedPatch($environmentId: String!, $decryptVariables: Boolean) {\n      environmentStagedChanges(environmentId: $environmentId) { id status patch(decryptVariables: $decryptVariables) meta }\n    }`, { environmentId, decryptVariables: options.decryptVariables ?? false });\n    return data.environmentStagedChanges;\n  }\n\n  async getProjectName(projectId: string): Promise<string | undefined> {\n    const data = await gql<{ project: { name?: string | null } }, { projectId: string }>(this.#config, `query IacProjectName($projectId: String!) {\n      project(id: $projectId) { name }\n    }`, { projectId });\n    return data.project.name ?? undefined;\n  }\n\n  async getProjectServices(projectId: string): Promise<ProjectService[]> {\n    const data = await gql<{ project: { services: { edges: Array<{ node: ProjectService }> } } }, { projectId: string }>(this.#config, `query IacProjectServices($projectId: String!) {\n      project(id: $projectId) { services(first: 1000) { edges { node { id name } } } }\n    }`, { projectId });\n    return data.project.services.edges.map(edge => edge.node);\n  }\n\n  async getProjectBuckets(projectId: string): Promise<ProjectBucket[]> {\n    const data = await gql<{ project: { buckets: { edges: Array<{ node: ProjectBucket }> } } }, { projectId: string }>(this.#config, `query IacProjectBuckets($projectId: String!) {\n      project(id: $projectId) { buckets(first: 1000) { edges { node { id name } } } }\n    }`, { projectId });\n    return data.project.buckets.edges.map(edge => edge.node);\n  }\n\n  async getEnvironmentCustomDomains(projectId: string, environmentId: string, services: ProjectService[]): Promise<Record<string, Record<string, { port?: number }>>> {\n    const entries = await Promise.all(services.map(async service => {\n      const data = await gql<{ domains: { customDomains: Array<{ domain: string; targetPort?: number | null }> } }, { projectId: string; environmentId: string; serviceId: string }>(this.#config, `query IacServiceDomains($projectId: String!, $environmentId: String!, $serviceId: String!) {\n        domains(projectId: $projectId, environmentId: $environmentId, serviceId: $serviceId) { customDomains { domain targetPort } }\n      }`, { projectId, environmentId, serviceId: service.id }).catch(() => ({ domains: { customDomains: [] } }));\n      return [service.id, Object.fromEntries(data.domains.customDomains.map(domain => [domain.domain, domain.targetPort == null ? {} : { port: domain.targetPort }]))] as const;\n    }));\n    return Object.fromEntries(entries.filter(([, domains]) => Object.keys(domains).length > 0));\n  }\n\n  async ensureGraphResources({ projectId, environmentId, graph, currentConfig }: {\n    projectId: string;\n    environmentId: string;\n    graph: RailwayGraph;\n    currentConfig?: EnvironmentConfig;\n  }): Promise<EnsuredGraphResources> {\n    const existing = await this.getProjectServices(projectId);\n    const serviceIdsByName = Object.fromEntries(existing.map(service => [service.name, service.id]));\n    const volumeIdsByServiceName = extractVolumeIdsByServiceName({ ...(currentConfig ? { currentConfig } : {}), serviceIdsByName });\n\n    for (const resource of graph.resources) {\n      if (resource.type !== \"service\" && resource.type !== \"database\") continue;\n      if (!serviceIdsByName[resource.name]) {\n        const service = await this.createServiceForResource({ projectId, environmentId, resource });\n        serviceIdsByName[resource.name] = service.id;\n      }\n      if (resource.type === \"database\" && resource.defaultMountPath && !volumeIdsByServiceName[resource.name]) {\n        const volume = await this.createVolumeForService({ projectId, environmentId, serviceId: serviceIdsByName[resource.name]! });\n        volumeIdsByServiceName[resource.name] = volume.id;\n      }\n    }\n\n    const bucketIdsByName = await this.ensureGraphBuckets({ projectId, graph });\n    return { serviceIdsByName, volumeIdsByServiceName, bucketIdsByName };\n  }\n\n  async stageEnvironmentChanges({ environmentId, patch, merge = true }: { environmentId: string; patch: EnvironmentConfig; merge?: boolean }): Promise<{ id: string }> {\n    const data = await gql<{ environmentStageChanges: { id: string } }, { environmentId: string; payload: EnvironmentConfig; merge: boolean }>(this.#config, `mutation IacStageEnvironmentChanges($environmentId: String!, $payload: EnvironmentConfig!, $merge: Boolean) {\n      environmentStageChanges(environmentId: $environmentId, input: $payload, merge: $merge) { id }\n    }`, { environmentId, payload: patch, merge });\n    return data.environmentStageChanges;\n  }\n\n  async previewChangeSet({ environmentId, changeSet }: { environmentId: string; changeSet: RailwayChangeSet }): Promise<ChangeSetPreviewResult> {\n    const data = await gql<{ environmentPreviewChangeSet: ChangeSetPreviewResult }, { environmentId: string; input: RailwayChangeSet }>(this.#config, `mutation IacPreviewChangeSet($environmentId: String!, $input: JSON!) {\n      environmentPreviewChangeSet(environmentId: $environmentId, input: $input) { changeSet diagnostics effects }\n    }`, { environmentId, input: changeSet });\n    return data.environmentPreviewChangeSet;\n  }\n\n  async applyChangeSet({ environmentId, changeSet, commitMessage }: { environmentId: string; changeSet: RailwayChangeSet; commitMessage?: string }): Promise<ChangeSetApplyResult> {\n    const variables: { environmentId: string; input: RailwayChangeSet; commitMessage?: string } = { environmentId, input: changeSet };\n    if (commitMessage !== undefined) variables.commitMessage = commitMessage;\n    const data = await gql<{ environmentApplyChangeSet: ChangeSetApplyResult }, typeof variables>(this.#config, `mutation IacApplyChangeSet($environmentId: String!, $input: JSON!, $commitMessage: String) {\n      environmentApplyChangeSet(environmentId: $environmentId, input: $input, commitMessage: $commitMessage) { id status deploymentId stagedPatchId diagnostics changes { kind path summary status outputs } }\n    }`, variables);\n    return data.environmentApplyChangeSet;\n  }\n\n  async commitStagedPatch({ environmentId, message, skipDeploys }: { environmentId: string; message?: string; skipDeploys?: boolean }): Promise<string> {\n    const variables: { environmentId: string; message?: string; skipDeploys?: boolean } = { environmentId };\n    if (message !== undefined) variables.message = message;\n    if (skipDeploys !== undefined) variables.skipDeploys = skipDeploys;\n    const data = await gql<{ environmentPatchCommitStaged: string }, { environmentId: string; message?: string; skipDeploys?: boolean }>(this.#config, `mutation IacCommitStagedPatch($environmentId: String!, $message: String, $skipDeploys: Boolean) {\n      environmentPatchCommitStaged(environmentId: $environmentId, commitMessage: $message, skipDeploys: $skipDeploys)\n    }`, variables);\n    return data.environmentPatchCommitStaged;\n  }\n\n  private async ensureGraphBuckets({ projectId, graph }: { projectId: string; graph: RailwayGraph }): Promise<Record<string, string>> {\n    const existing = await this.getProjectBuckets(projectId);\n    const idsByName = Object.fromEntries(existing.map(bucket => [bucket.name, bucket.id]));\n    for (const resource of graph.resources) {\n      if (resource.type !== \"bucket\" || idsByName[resource.name]) continue;\n      const bucket = await this.createBucketForResource({ projectId, name: resource.name });\n      idsByName[resource.name] = bucket.id;\n    }\n    return idsByName;\n  }\n\n  private async createBucketForResource({ projectId, name }: { projectId: string; name?: string }): Promise<ProjectBucket> {\n    const input: BucketCreateInput = { projectId, environmentId: null };\n    if (name !== undefined) input.name = name;\n    const data = await gql<{ bucketCreate: ProjectBucket }, { input: BucketCreateInput }>(this.#config, `mutation IacBucketCreate($input: BucketCreateInput!) {\n      bucketCreate(input: $input) { id name }\n    }`, { input });\n    return data.bucketCreate;\n  }\n\n  private async createVolumeForService({ projectId, serviceId }: { projectId: string; environmentId: string; serviceId: string }): Promise<ProjectVolume> {\n    const input: VolumeCreateInput = { projectId, environmentId: null, serviceId, mountPath: \"/var/lib/postgresql/data\" };\n    const data = await gql<{ volumeCreate: ProjectVolume }, { input: VolumeCreateInput }>(this.#config, `mutation IacVolumeCreate($input: VolumeCreateInput!) {\n      volumeCreate(input: $input) { id name }\n    }`, { input });\n    return data.volumeCreate;\n  }\n\n  private async createServiceForResource({ projectId, resource }: { projectId: string; environmentId: string; resource: Extract<ResourceNode, { type: \"service\" | \"database\" }> }): Promise<ProjectService> {\n    const source = resource.type === \"database\"\n      ? { image: resource.image }\n      : resource.source?.type === \"image\" && resource.source.image\n        ? { image: resource.source.image }\n        : resource.source?.type === \"github\" && resource.source.repo\n          ? { repo: resource.source.repo }\n          : undefined;\n    const input: ServiceCreateInput = {\n      name: resource.name,\n      projectId,\n      environmentId: null,\n    };\n    if (source) (input as { source?: ServiceCreateInput[\"source\"] }).source = source as ServiceCreateInput[\"source\"];\n    if (resource.type === \"service\" && resource.source?.type === \"github\" && resource.source.branch) {\n      input.branch = resource.source.branch;\n    }\n    const data = await gql<{ serviceCreate: ProjectService }, { input: ServiceCreateInput }>(this.#config, `mutation IacServiceCreate($input: ServiceCreateInput!) {\n      serviceCreate(input: $input) { id name }\n    }`, { input });\n    return data.serviceCreate;\n  }\n}\n\nasync function gql<TResult, TVariables>(config: NormalizedRailwayClientConfig, source: string, variables: TVariables): Promise<TResult> {\n  return requestGraphQL(config, parse(source) as TypedDocumentNode<TResult, TVariables>, variables);\n}\n\nfunction extractVolumeIdsByServiceName({ currentConfig, serviceIdsByName }: { currentConfig?: EnvironmentConfig; serviceIdsByName: Record<string, string> }): Record<string, string> {\n  const volumeIdsByServiceName: Record<string, string> = {};\n  for (const [serviceName, serviceId] of Object.entries(serviceIdsByName)) {\n    const volumeId = Object.keys(currentConfig?.services?.[serviceId]?.volumeMounts ?? {})[0];\n    if (volumeId) volumeIdsByServiceName[serviceName] = volumeId;\n  }\n  return volumeIdsByServiceName;\n}\n","import { createHash } from \"node:crypto\";\nimport { resourceAddress } from \"./graph.js\";\nimport type {\n  BucketNode,\n  DatabaseNode,\n  GroupNode,\n  ProjectDefinition,\n  ProjectResourceInput,\n  ResourceNode,\n  ServiceNode,\n  SourceConfig,\n  VariableValue,\n  VolumeNode,\n} from \"./graph.js\";\nimport type {\n  BucketConfig,\n  BuildConfig,\n  DeployConfig,\n  ServiceConfig,\n  ServiceNetworking,\n  VariableConfig,\n  VolumeConfig,\n  VolumeMount,\n} from \"./schema.js\";\n\nexport interface RailwayContextInput {\n  command?: string;\n  projectId?: string;\n  projectName?: string;\n  environmentId?: string;\n  environment?: string;\n  environmentName?: string;\n}\n\nexport interface RailwayContext extends RailwayContextInput {\n  randomString: (label?: string, bytes?: number) => string;\n  isEnvironment: (name: string) => boolean;\n}\n\nexport type RailwayProgram = (\n  ctx: RailwayContext,\n  project: (name: string, definition: Omit<ProjectDefinition, \"name\">) => ProjectDefinition,\n) => ProjectDefinition | Promise<ProjectDefinition>;\n\nexport function defineRailway(program: RailwayProgram): RailwayProgram {\n  return program;\n}\n\nexport const define = defineRailway;\n\nexport function project(name: string, definition: Omit<ProjectDefinition, \"name\">): ProjectDefinition {\n  const resources = (definition.resources ?? definition.services ?? []).flat();\n  return { name, ...definition, resources };\n}\n\nexport function createRailwayContext(input: RailwayContextInput = {}): RailwayContext {\n  const environment = input.environment ?? input.environmentName;\n  return {\n    ...input,\n    ...(environment ? { environment, environmentName: environment } : {}),\n    randomString: (label = \"random\", bytes = 12) =>\n      createHash(\"sha256\").update(`railway-iac:${environment ?? \"default\"}:${label}`).digest(\"hex\").slice(0, bytes * 2),\n    isEnvironment: (name: string) => environment === name,\n  };\n}\n\nexport type RegionConfig = number | { count?: number; replicas?: number; stacker?: string | null };\n\nexport interface IntentServiceConfig {\n  source?: SourceConfig | Omit<SourceConfig, \"type\">;\n  root?: string;\n  rootDirectory?: string;\n  build?: string | BuildConfig;\n  deploy?: DeployConfig;\n  run?: { command?: string; preDeploy?: string | string[]; healthcheck?: string; healthcheckTimeout?: number };\n  start?: string;\n  startCommand?: string;\n  preDeploy?: string | string[];\n  preDeployCommand?: string | string[];\n  healthcheck?: string;\n  healthcheckPath?: string;\n  healthcheckTimeout?: number;\n  replicas?: number | Record<string, RegionConfig>;\n  regions?: Record<string, RegionConfig>;\n  networking?: ServiceNetworking;\n  domains?: Array<string | { domain: string; port?: number }>;\n  tcp?: Array<string | number>;\n  tcpProxies?: string[];\n  env?: Record<string, string | VariableConfig | VariableValue>;\n  variables?: Record<string, string | VariableConfig | VariableValue>;\n  volumeMounts?: Record<string, VolumeMount | null>;\n  configFile?: string;\n  parentServiceId?: string;\n  groupId?: string;\n  clusterRole?: ServiceConfig[\"clusterRole\"];\n  replicaConfig?: ServiceConfig[\"replicaConfig\"];\n  clusterDisplay?: ServiceConfig[\"clusterDisplay\"];\n}\n\nexport type ServiceConfigInput = IntentServiceConfig;\n\nexport type RailwayProvidedVariable =\n  | \"RAILWAY_PUBLIC_DOMAIN\"\n  | \"RAILWAY_PRIVATE_DOMAIN\"\n  | \"RAILWAY_TCP_PROXY_DOMAIN\"\n  | \"RAILWAY_TCP_PROXY_PORT\"\n  | \"RAILWAY_DEPLOYMENT_ID\"\n  | \"RAILWAY_DEPLOYMENT_DRAINING_SECONDS\"\n  | \"RAILWAY_ENVIRONMENT\"\n  | \"RAILWAY_ENVIRONMENT_ID\"\n  | \"RAILWAY_PROJECT_ID\"\n  | \"RAILWAY_PROJECT_NAME\"\n  | \"RAILWAY_SERVICE_ID\"\n  | \"RAILWAY_SERVICE_NAME\"\n  | \"RAILWAY_REPLICA_ID\"\n  | \"PORT\";\n\nexport type PostgresVariable = RailwayProvidedVariable | \"DATABASE_PUBLIC_URL\" | \"DATABASE_URL\" | \"PGDATA\" | \"PGDATABASE\" | \"PGHOST\" | \"PGPASSWORD\" | \"PGPORT\" | \"PGUSER\" | \"POSTGRES_DB\" | \"POSTGRES_PASSWORD\" | \"POSTGRES_USER\" | \"SSL_CERT_DAYS\";\nexport type RedisVariable = RailwayProvidedVariable | \"REDIS_PASSWORD\" | \"REDIS_PUBLIC_URL\" | \"REDIS_URL\" | \"REDISHOST\" | \"REDISPASSWORD\" | \"REDISPORT\" | \"REDISUSER\";\nexport type MongoVariable = RailwayProvidedVariable | \"MONGO_INITDB_ROOT_PASSWORD\" | \"MONGO_INITDB_ROOT_USERNAME\" | \"MONGO_PUBLIC_URL\" | \"MONGO_URL\" | \"MONGOHOST\" | \"MONGOPASSWORD\" | \"MONGOPORT\" | \"MONGOUSER\";\nexport type MySqlVariable = RailwayProvidedVariable | \"MYSQL_DATABASE\" | \"MYSQL_PUBLIC_URL\" | \"MYSQL_ROOT_PASSWORD\" | \"MYSQL_URL\" | \"MYSQLDATABASE\" | \"MYSQLHOST\" | \"MYSQLPASSWORD\" | \"MYSQLPORT\" | \"MYSQLUSER\";\nexport type DatabaseVariable<E extends DatabaseNode[\"engine\"]> = E extends \"postgres\" ? PostgresVariable : E extends \"redis\" ? RedisVariable : E extends \"mongo\" ? MongoVariable : E extends \"mysql\" ? MySqlVariable : RailwayProvidedVariable | string;\nexport type ServiceVariableRef<K extends string = RailwayProvidedVariable | string> = { readonly [P in K]: VariableValue };\nexport type ReferencableServiceNode<K extends string = RailwayProvidedVariable | string> = ServiceNode & { readonly env: ServiceVariableRef<K> };\nexport type ReferencableDatabaseNode<E extends DatabaseNode[\"engine\"]> = DatabaseNode & { readonly env: ServiceVariableRef<DatabaseVariable<E>> };\n\nexport function github(repo: string, options: Omit<SourceConfig, \"type\" | \"repo\" | \"image\"> = {}): SourceConfig {\n  return { type: \"github\", repo, branch: options.branch ?? \"main\", ...options };\n}\n\nexport function image(imageName: string, options: Pick<SourceConfig, \"rootDirectory\" | \"autoUpdates\"> = {}): SourceConfig {\n  return { type: \"image\", image: imageName, ...options };\n}\n\nexport function template(templateName: string, options: Omit<SourceConfig, \"type\" | \"template\"> = {}): SourceConfig {\n  return { type: \"template\", template: templateName, ...options };\n}\n\nexport function empty(): SourceConfig {\n  return { type: \"empty\" };\n}\n\nexport function service<const Env extends Record<string, string | VariableConfig | VariableValue> = {}>(name: string, config: Omit<ServiceConfigInput, \"env\" | \"variables\"> & { env?: Env; variables?: Env } = {}): ReferencableServiceNode<RailwayProvidedVariable | Extract<keyof Env, string>> {\n  const source = normalizeSource(config.source, config.root ?? config.rootDirectory);\n  const node = pruneEmpty({\n    address: resourceAddress(\"service\", name) as `service.${string}`,\n    type: \"service\",\n    kind: source?.type === \"github\" ? \"github\" : source?.type === \"image\" ? \"docker-image\" : source?.type === \"template\" ? \"template\" : \"empty\",\n    name,\n    ...(source ? { source } : {}),\n    build: normalizeBuild(config),\n    deploy: normalizeDeploy(config),\n    networking: normalizeNetworking(config),\n    ...(config.env || config.variables ? { variables: normalizeVariables({ ...(config.variables ?? {}), ...(config.env ?? {}) }) } : {}),\n    ...(config.volumeMounts ? { volumeMounts: config.volumeMounts } : {}),\n    ...(config.configFile ? { configFile: config.configFile } : {}),\n    ...(config.parentServiceId ? { parentServiceId: config.parentServiceId } : {}),\n    ...(config.groupId ? { groupId: config.groupId } : {}),\n    ...(config.clusterRole ? { clusterRole: config.clusterRole } : {}),\n    ...(config.replicaConfig ? { replicaConfig: config.replicaConfig } : {}),\n    ...(config.clusterDisplay ? { clusterDisplay: config.clusterDisplay } : {}),\n  }) as ServiceNode;\n  return withVariableRefs(node) as ReferencableServiceNode<RailwayProvidedVariable | Extract<keyof Env, string>>;\n}\n\nexport function fn<const Env extends Record<string, string | VariableConfig | VariableValue> = {}>(name: string, config: Omit<ServiceConfigInput, \"env\" | \"variables\"> & { env?: Env; variables?: Env } = {}): ReferencableServiceNode<RailwayProvidedVariable | Extract<keyof Env, string>> {\n  return withVariableRefs({ ...service(name, config), kind: \"function\" } as ServiceNode) as ReferencableServiceNode<RailwayProvidedVariable | Extract<keyof Env, string>>;\n}\n\nexport interface DatabaseConfig {\n  region?: string;\n}\n\nexport function postgres(name: string, config: DatabaseConfig = {}): ReferencableDatabaseNode<\"postgres\"> {\n  return database(name, \"postgres\", {\n    image: \"ghcr.io/railwayapp-templates/postgres-ssl:18\",\n    output: \"DATABASE_URL\",\n    defaultMountPath: \"/var/lib/postgresql/data\",\n    ...config,\n  });\n}\n\nexport function mysql(name: string, config: DatabaseConfig = {}): ReferencableDatabaseNode<\"mysql\"> {\n  return database(name, \"mysql\", { image: \"mysql:9\", output: \"MYSQL_URL\", defaultMountPath: \"/var/lib/mysql\", ...config });\n}\n\nexport function redis(name: string, config: DatabaseConfig = {}): ReferencableDatabaseNode<\"redis\"> {\n  return database(name, \"redis\", { image: \"railwayapp/redis:8.2\", output: \"REDIS_URL\", defaultMountPath: \"/bitnami\", ...config });\n}\n\nexport function mongo(name: string, config: DatabaseConfig = {}): ReferencableDatabaseNode<\"mongo\"> {\n  return database(name, \"mongo\", { image: \"mongo:8\", output: \"MONGO_URL\", defaultMountPath: \"/data/db\", ...config });\n}\n\nexport function database<E extends DatabaseNode[\"engine\"]>(\n  name: string,\n  engine: E,\n  options: { image: string; output?: string; defaultMountPath?: string; region?: string },\n): ReferencableDatabaseNode<E> {\n  const output = options.output ?? \"DATABASE_URL\";\n  const node = {\n    address: resourceAddress(\"database\", name) as `database.${string}`,\n    type: \"database\",\n    kind: \"database\",\n    engine,\n    name,\n    image: options.image,\n    output,\n    defaultMountPath: options.defaultMountPath,\n    source: image(options.image),\n    ...(options.region ? { deploy: { multiRegionConfig: { [options.region]: { numReplicas: 1 } } } } : {}),\n  } as DatabaseNode;\n  return withVariableRefs(node) as ReferencableDatabaseNode<E>;\n}\n\nexport function volume(name: string, config: VolumeConfig = {}): VolumeNode {\n  return { address: resourceAddress(\"volume\", name) as `volume.${string}`, type: \"volume\", name, config };\n}\n\nexport function bucket(name: string, config: BucketConfig = {}): BucketNode {\n  return { address: resourceAddress(\"bucket\", name) as `bucket.${string}`, type: \"bucket\", name, config };\n}\n\nexport function group(name: string, resources: ProjectResourceInput[], options?: Omit<GroupNode, \"address\" | \"type\" | \"name\">): ResourceNode[];\nexport function group(name: string, options?: Omit<GroupNode, \"address\" | \"type\" | \"name\">): GroupNode;\nexport function group(\n  name: string,\n  resourcesOrOptions: ProjectResourceInput[] | Omit<GroupNode, \"address\" | \"type\" | \"name\"> = {},\n  maybeOptions: Omit<GroupNode, \"address\" | \"type\" | \"name\"> = {},\n): GroupNode | ResourceNode[] {\n  const resources = Array.isArray(resourcesOrOptions) ? resourcesOrOptions.flat() : undefined;\n  const options = Array.isArray(resourcesOrOptions) ? maybeOptions : resourcesOrOptions;\n  const node: GroupNode = { address: resourceAddress(\"group\", name) as `group.${string}`, type: \"group\", name, ...options };\n  if (!resources) return node;\n  return [node, ...resources.map(resource => ({ ...resource, groupId: name }))];\n}\n\nexport function ref(resource: ResourceNode, output: string): VariableValue {\n  return variableReference(resource, output);\n}\n\nexport function preserve(): VariableValue {\n  return { type: \"preserve\" };\n}\n\nfunction variableReference(resource: ResourceNode, output: string): VariableValue {\n  return { type: \"reference\", resource: resource.address, output };\n}\n\nfunction createVariableRefAccessor(resource: ResourceNode): ServiceVariableRef<string> {\n  return new Proxy({} as ServiceVariableRef<string>, {\n    get(_target, property) {\n      if (typeof property !== \"string\") return undefined;\n      return variableReference(resource, property);\n    },\n  });\n}\n\nfunction withVariableRefs<T extends ServiceNode | DatabaseNode>(node: T): T {\n  Object.defineProperty(node, \"env\", { enumerable: false, value: createVariableRefAccessor(node) });\n  return node;\n}\n\nfunction normalizeSource(source: ServiceConfigInput[\"source\"], rootDirectory?: string): SourceConfig | undefined {\n  if (source == null) return rootDirectory ? { type: \"empty\", rootDirectory } : undefined;\n  if (\"type\" in source && source.type) return pruneEmpty({ ...source, rootDirectory: source.rootDirectory ?? rootDirectory }) as SourceConfig;\n  if (\"repo\" in source && source.repo) return pruneEmpty({ type: \"github\", repo: source.repo, branch: source.branch ?? \"main\", rootDirectory }) as SourceConfig;\n  if (\"image\" in source && source.image) return pruneEmpty({ type: \"image\", image: source.image, rootDirectory }) as SourceConfig;\n  return rootDirectory ? { type: \"empty\", rootDirectory } : undefined;\n}\n\nfunction normalizeBuild(config: ServiceConfigInput): BuildConfig | undefined {\n  if (typeof config.build === \"string\") return { buildCommand: config.build };\n  return pruneEmpty({ ...config.build });\n}\n\nfunction normalizeDeploy(config: ServiceConfigInput): DeployConfig | undefined {\n  const preDeployCommand = config.preDeploy ?? config.preDeployCommand ?? config.run?.preDeploy;\n  return pruneEmpty({\n    ...config.deploy,\n    startCommand: config.start ?? config.startCommand ?? config.run?.command ?? config.deploy?.startCommand,\n    preDeployCommand: Array.isArray(preDeployCommand) ? preDeployCommand : preDeployCommand ? [preDeployCommand] : config.deploy?.preDeployCommand,\n    healthcheckPath: config.healthcheck ?? config.healthcheckPath ?? config.run?.healthcheck ?? config.deploy?.healthcheckPath,\n    healthcheckTimeout: config.healthcheckTimeout ?? config.run?.healthcheckTimeout ?? config.deploy?.healthcheckTimeout,\n    multiRegionConfig: normalizeReplicas(config.replicas, config.regions) ?? config.deploy?.multiRegionConfig,\n  }) as DeployConfig | undefined;\n}\n\nfunction normalizeReplicas(replicas: ServiceConfigInput[\"replicas\"], regions: ServiceConfigInput[\"regions\"]): DeployConfig[\"multiRegionConfig\"] | undefined {\n  if (typeof replicas === \"number\") return normalizeRegions({ \"us-west2\": replicas });\n  if (replicas) return normalizeRegions(replicas);\n  if (regions) return normalizeRegions(regions);\n  return undefined;\n}\n\nfunction normalizeRegions(regions: Record<string, RegionConfig>): DeployConfig[\"multiRegionConfig\"] {\n  return Object.fromEntries(\n    Object.entries(regions).map(([region, value]) => [\n      region,\n      typeof value === \"number\"\n        ? { numReplicas: value }\n        : (pruneEmpty({ numReplicas: value.count ?? value.replicas, stackerAssignment: value.stacker }) ?? {}),\n    ]),\n  ) as DeployConfig[\"multiRegionConfig\"];\n}\n\nfunction normalizeNetworking(config: ServiceConfigInput): ServiceNetworking | undefined {\n  const customDomains = config.domains\n    ? Object.fromEntries(config.domains.map(domain => (typeof domain === \"string\" ? [domain, { port: 8080 }] : [domain.domain, { port: domain.port ?? 8080 }])))\n    : undefined;\n  const tcpProxies = config.tcp\n    ? Object.fromEntries(config.tcp.map(port => [String(port), {}]))\n    : config.tcpProxies\n      ? Object.fromEntries(config.tcpProxies.map(port => [port, {}]))\n      : undefined;\n  return pruneEmpty({ ...config.networking, customDomains, tcpProxies }) as ServiceNetworking | undefined;\n}\n\nfunction normalizeVariables(variables: Record<string, string | VariableConfig | VariableValue>): Record<string, VariableValue> {\n  return Object.fromEntries(\n    Object.entries(variables).map(([key, value]) => {\n      if (typeof value === \"string\") return [key, { type: \"literal\", value }];\n      if (\"type\" in value) return [key, value];\n      return [key, { type: \"raw\", value }];\n    }),\n  );\n}\n\nfunction pruneEmpty<T>(value: T): T | undefined {\n  if (value == null || typeof value !== \"object\") return value;\n  const entries = Object.entries(value).filter(([, child]) => child != null);\n  if (entries.length === 0) return undefined;\n  return Object.fromEntries(entries) as T;\n}\n","import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { graphToEnvironmentConfig, projectDefinitionToGraph } from \"./compiler.js\";\nimport type { CompileResult, GraphCompileOptions, ProjectDefinition } from \"./graph.js\";\nimport { createRailwayContext, project as projectFactory, type RailwayContextInput, type RailwayProgram } from \"./sdk.js\";\n\nexport async function evaluateRailwayFile(filePath: string, options: GraphCompileOptions & { context?: RailwayContextInput } = {}): Promise<CompileResult> {\n  const absolutePath = path.resolve(filePath);\n  const mod = await importRailwayFile(absolutePath) as {\n    default?: RailwayProgram | ProjectDefinition;\n  };\n  const exported = (mod.default ?? mod) as RailwayProgram | ProjectDefinition;\n  const definition = await resolveDefinition(exported, options.context);\n  const graph = projectDefinitionToGraph(definition);\n  const desiredConfig = graphToEnvironmentConfig(graph, options);\n  return { graph, desiredConfig };\n}\n\nasync function importRailwayFile(absolutePath: string): Promise<unknown> {\n  const url = `${pathToFileURL(absolutePath).toString()}?t=${Date.now()}`;\n  if (/\\.[cm]?tsx?$/.test(absolutePath)) {\n    const { tsImport } = await import(\"tsx/esm/api\");\n    return tsImport(url, import.meta.url);\n  }\n  return import(url);\n}\n\nasync function resolveDefinition(exported: RailwayProgram | ProjectDefinition, context: RailwayContextInput = {}): Promise<ProjectDefinition> {\n  if (typeof exported === \"function\") return exported(createRailwayContext(context), projectFactory);\n  return exported;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { graphToEnvironmentConfig } from \"./compiler.js\";\nimport { evaluateRailwayFile } from \"./evaluator.js\";\nimport type {\n  BucketNode,\n  DatabaseNode,\n  GraphCompileOptions,\n  RailwayGraph,\n  ResourceNode,\n  ServiceNode,\n  VolumeNode,\n} from \"./graph.js\";\nimport type { EnvironmentConfig } from \"./schema.js\";\nimport type { RailwayContextInput } from \"./sdk.js\";\n\nexport interface RailwayIacServiceMap {}\nexport interface RailwayIacDatabaseMap {}\nexport interface RailwayIacBucketMap {}\nexport interface RailwayIacVolumeMap {}\nexport interface RailwayIacResourceMap {}\n\ntype KnownName<T> = [keyof T] extends [never] ? string : Extract<keyof T, string>;\n\nexport type RailwayServiceName = KnownName<RailwayIacServiceMap>;\nexport type RailwayDatabaseName = KnownName<RailwayIacDatabaseMap>;\nexport type RailwayBucketName = KnownName<RailwayIacBucketMap>;\nexport type RailwayVolumeName = KnownName<RailwayIacVolumeMap>;\nexport type RailwayResourceName = KnownName<RailwayIacResourceMap>;\n\nexport interface EvaluatedRailwayProjectOptions extends GraphCompileOptions {\n  file?: string;\n  cwd?: string;\n  context?: RailwayContextInput;\n}\n\nexport interface EvaluatedRailwayProjectSnapshot {\n  file: string;\n  graph: RailwayGraph;\n  desiredConfig: EnvironmentConfig;\n}\n\nexport async function evaluateRailwayProject(\n  options: EvaluatedRailwayProjectOptions = {},\n): Promise<EvaluatedRailwayProject> {\n  const file = options.file ? path.resolve(options.file) : findRailwayFile(options.cwd);\n  const { graph, desiredConfig } = await evaluateRailwayFile(file, options);\n  return new EvaluatedRailwayProject({ file, graph, desiredConfig });\n}\n\nexport function findRailwayFile(cwd = process.cwd()): string {\n  let current = path.resolve(cwd);\n  while (true) {\n    const candidate = path.join(current, \".railway\", \"railway.ts\");\n    if (fs.existsSync(candidate)) return candidate;\n\n    const parent = path.dirname(current);\n    if (parent === current) {\n      throw new Error(\n        `Could not find .railway/railway.ts from ${path.resolve(cwd)}. Pass { file } explicitly.`,\n      );\n    }\n    current = parent;\n  }\n}\n\nexport class EvaluatedRailwayProject {\n  readonly file: string;\n  readonly graph: RailwayGraph;\n  readonly desiredConfig: EnvironmentConfig;\n\n  constructor(snapshot: EvaluatedRailwayProjectSnapshot) {\n    this.file = snapshot.file;\n    this.graph = snapshot.graph;\n    this.desiredConfig = snapshot.desiredConfig;\n  }\n\n  get name(): string {\n    return this.graph.project.name;\n  }\n\n  get resources(): ResourceNode[] {\n    return this.graph.resources;\n  }\n\n  get services(): Array<ServiceNode | DatabaseNode> {\n    return this.graph.resources.filter(\n      (resource): resource is ServiceNode | DatabaseNode =>\n        resource.type === \"service\" || resource.type === \"database\",\n    );\n  }\n\n  resource(name: RailwayResourceName): ResourceNode {\n    const resource = this.graph.resources.find(candidate => candidate.name === name);\n    if (!resource) throw new Error(`Railway resource not found: ${name}`);\n    return resource;\n  }\n\n  service(name: RailwayServiceName): ServiceNode | DatabaseNode {\n    const resource = this.graph.resources.find(\n      (candidate): candidate is ServiceNode | DatabaseNode =>\n        candidate.name === name &&\n        (candidate.type === \"service\" || candidate.type === \"database\"),\n    );\n    if (!resource) throw new Error(`Railway service not found: ${name}`);\n    return resource;\n  }\n\n  database(name: RailwayDatabaseName): DatabaseNode {\n    const resource = this.graph.resources.find(\n      (candidate): candidate is DatabaseNode =>\n        candidate.name === name && candidate.type === \"database\",\n    );\n    if (!resource) throw new Error(`Railway database not found: ${name}`);\n    return resource;\n  }\n\n  bucket(name: RailwayBucketName): BucketNode {\n    const resource = this.graph.resources.find(\n      (candidate): candidate is BucketNode =>\n        candidate.name === name && candidate.type === \"bucket\",\n    );\n    if (!resource) throw new Error(`Railway bucket not found: ${name}`);\n    return resource;\n  }\n\n  volume(name: RailwayVolumeName): VolumeNode {\n    const resource = this.graph.resources.find(\n      (candidate): candidate is VolumeNode =>\n        candidate.name === name && candidate.type === \"volume\",\n    );\n    if (!resource) throw new Error(`Railway volume not found: ${name}`);\n    return resource;\n  }\n\n  config(options: GraphCompileOptions = {}): EnvironmentConfig {\n    return graphToEnvironmentConfig(this.graph, options);\n  }\n\n  toJSON(): EvaluatedRailwayProjectSnapshot {\n    return {\n      file: this.file,\n      graph: this.graph,\n      desiredConfig: this.desiredConfig,\n    };\n  }\n}\n","import type { RailwayGraph, ResourceNode } from \"./graph.js\";\n\nexport function renderRailwayGraphTypes(graph: RailwayGraph): string {\n  const services = names(\n    graph.resources.filter(\n      resource => resource.type === \"service\" || resource.type === \"database\",\n    ),\n  );\n  const databases = names(graph.resources.filter(resource => resource.type === \"database\"));\n  const buckets = names(graph.resources.filter(resource => resource.type === \"bucket\"));\n  const volumes = names(graph.resources.filter(resource => resource.type === \"volume\"));\n  const resources = names(graph.resources);\n\n  return `// Generated by Railway IaC. Do not edit by hand.\n// Provides autocomplete for evaluated graph resource lookups.\n\nimport \"railway/iac\";\n\ndeclare module \"railway/iac\" {\n  interface RailwayIacServiceMap ${mapBody(services)}\n  interface RailwayIacDatabaseMap ${mapBody(databases)}\n  interface RailwayIacBucketMap ${mapBody(buckets)}\n  interface RailwayIacVolumeMap ${mapBody(volumes)}\n  interface RailwayIacResourceMap ${mapBody(resources)}\n}\n`;\n}\n\nfunction names(resources: ResourceNode[]): string[] {\n  return [...new Set(resources.map(resource => resource.name))].sort();\n}\n\nfunction mapBody(names: string[]): string {\n  if (names.length === 0) return \"{}\";\n  return `{\n${names.map(name => `    ${JSON.stringify(name)}: true;`).join(\"\\n\")}\n  }`;\n}\n","import { diffGraphs, renderChangeSet, type RailwayChangeSet } from \"./change-set.js\";\nimport { environmentConfigToGraph } from \"./compiler.js\";\nimport { IacClient, type ChangeSetApplyResult, type ChangeSetPreviewResult, type CurrentEnvironmentResult } from \"./client.js\";\nimport { validateGraph, type RailwayGraph } from \"./graph.js\";\nimport { evaluateRailwayProject, findRailwayFile } from \"./project.js\";\nimport { renderRailwayGraphTypes } from \"./typegen.js\";\nimport type { EnvironmentConfig } from \"./schema.js\";\nimport type { RailwayAuthType } from \"../core/config.js\";\nimport type { RailwayContextInput } from \"./sdk.js\";\n\nexport interface RailwayIacRunnerRequest {\n  command?: \"evaluate\" | \"typegen\" | \"current\" | \"plan\" | \"stage\" | \"apply\";\n  cwd?: string;\n  file?: string;\n  includeTypes?: boolean;\n  pretty?: boolean;\n  context?: RailwayContextInput;\n  backboard?: RailwayIacBackboardContext;\n}\n\nexport interface RailwayIacBackboardContext {\n  endpoint?: string;\n  token?: string;\n  authType?: RailwayAuthType;\n  projectId?: string;\n  environmentId?: string;\n  decryptVariables?: boolean;\n  merge?: boolean;\n}\n\nexport interface RailwayIacRunnerDiagnostic {\n  severity: \"warning\" | \"error\";\n  path: string;\n  message: string;\n}\n\nexport interface RailwayIacEvaluateResponse {\n  ok: boolean;\n  command: \"evaluate\";\n  file: string;\n  graph?: RailwayGraph;\n  graphTypes?: string;\n  diagnostics: RailwayIacRunnerDiagnostic[];\n}\n\nexport interface RailwayIacTypegenResponse {\n  ok: boolean;\n  command: \"typegen\";\n  file: string;\n  graphTypes?: string;\n  diagnostics: RailwayIacRunnerDiagnostic[];\n}\n\nexport interface RailwayIacCurrentResponse {\n  ok: boolean;\n  command: \"current\";\n  file: string;\n  mode: \"real\";\n  currentGraph?: RailwayGraph;\n  currentConfig?: EnvironmentConfig;\n  currentEnvironment?: Omit<CurrentEnvironmentResult, \"config\">;\n  graphTypes?: string;\n  diagnostics: RailwayIacRunnerDiagnostic[];\n}\n\nexport interface RailwayIacPlanResponse {\n  ok: boolean;\n  command: \"plan\";\n  file: string;\n  mode: \"real\";\n  currentGraph?: RailwayGraph;\n  desiredGraph?: RailwayGraph;\n  currentConfig?: EnvironmentConfig;\n  currentEnvironment?: Omit<CurrentEnvironmentResult, \"config\">;\n  changeSet?: RailwayChangeSet;\n  preview?: ChangeSetPreviewResult;\n  diff?: string;\n  graphTypes?: string;\n  diagnostics: RailwayIacRunnerDiagnostic[];\n}\n\nexport interface RailwayIacStageResponse extends Omit<RailwayIacPlanResponse, \"command\"> {\n  command: \"stage\";\n}\n\nexport interface RailwayIacApplyResponse extends Omit<RailwayIacStageResponse, \"command\"> {\n  command: \"apply\";\n  applyResult?: ChangeSetApplyResult;\n  deploymentId?: string;\n  stagedPatchId?: string;\n}\n\nexport type RailwayIacRunnerResponse = RailwayIacEvaluateResponse | RailwayIacTypegenResponse | RailwayIacCurrentResponse | RailwayIacPlanResponse | RailwayIacStageResponse | RailwayIacApplyResponse;\n\ntype RunnerCommand = NonNullable<RailwayIacRunnerRequest[\"command\"]>;\n\ninterface EvaluatedCommandInput {\n  request: RailwayIacRunnerRequest;\n  file: string;\n  graph: RailwayGraph;\n  diagnostics: RailwayIacRunnerDiagnostic[];\n}\n\nexport async function runRailwayIac(request: RailwayIacRunnerRequest = {}): Promise<RailwayIacRunnerResponse> {\n  const command = request.command ?? \"evaluate\";\n  const cwd = request.cwd ?? process.cwd();\n  const file = request.file ?? await findRailwayFile(cwd);\n\n  try {\n    const evaluated = await evaluateRailwayProject({ file, context: runnerContext(request, command) });\n    const input = {\n      request,\n      file: evaluated.file,\n      graph: evaluated.graph,\n      diagnostics: graphDiagnostics(evaluated.graph),\n    };\n    return await runEvaluatedCommand(command, input);\n  } catch (error) {\n    return errorResponse(command, file, error);\n  }\n}\n\nasync function runEvaluatedCommand(command: RunnerCommand, input: EvaluatedCommandInput): Promise<RailwayIacRunnerResponse> {\n  switch (command) {\n    case \"typegen\":\n      return typegenRailwayIac(input);\n    case \"evaluate\":\n      return evaluateRailwayIac(input);\n    case \"current\":\n      return currentRailwayIac(input);\n    case \"plan\":\n      return planRailwayIac(input);\n    case \"stage\":\n      return stageRailwayIac(input);\n    case \"apply\":\n      return applyRailwayIac(input);\n  }\n}\n\nfunction typegenRailwayIac({ file, graph, diagnostics }: EvaluatedCommandInput): RailwayIacTypegenResponse {\n  return {\n    ok: hasNoErrors(diagnostics),\n    command: \"typegen\",\n    file,\n    graphTypes: renderRailwayGraphTypes(graph),\n    diagnostics,\n  };\n}\n\nfunction evaluateRailwayIac({ request, file, graph, diagnostics }: EvaluatedCommandInput): RailwayIacEvaluateResponse {\n  return {\n    ok: hasNoErrors(diagnostics),\n    command: \"evaluate\",\n    file,\n    graph,\n    ...(request.includeTypes ? { graphTypes: renderRailwayGraphTypes(graph) } : {}),\n    diagnostics,\n  };\n}\n\nasync function currentRailwayIac({ file, graph: desiredGraph, request, diagnostics }: EvaluatedCommandInput): Promise<RailwayIacCurrentResponse> {\n  const context = requireBackboardContext(request.backboard, \"plan\");\n  const client = new IacClient(clientConfig(context));\n  const current = await readCurrentEnvironment(client, context);\n  const currentGraph = graphFromCurrentEnvironment(current, desiredGraph);\n  const { config: _config, ...currentEnvironment } = current;\n\n  return {\n    ok: hasNoErrors(diagnostics),\n    command: \"current\",\n    file,\n    mode: \"real\",\n    currentGraph,\n    currentConfig: current.config,\n    currentEnvironment,\n    ...(request.includeTypes ? { graphTypes: renderRailwayGraphTypes(currentGraph) } : {}),\n    diagnostics,\n  };\n}\n\nasync function planRailwayIac({ file, graph: desiredGraph, request, diagnostics }: EvaluatedCommandInput): Promise<RailwayIacPlanResponse> {\n  const context = requireBackboardContext(request.backboard, \"plan\");\n  const client = new IacClient(clientConfig(context));\n  const current = await readCurrentEnvironment(client, context);\n  const currentGraph = graphFromCurrentEnvironment(current, desiredGraph);\n  const changeSet = diffGraphs({ current: currentGraph, desired: desiredGraph });\n  const allDiagnostics = [...diagnostics, ...changeSetDiagnostics(changeSet)];\n  const { config: _config, ...currentEnvironment } = current;\n  const hasErrors = !hasNoErrors(allDiagnostics);\n  const preview = !hasErrors && changeSet.changes.length > 0\n    ? await client.previewChangeSet({ environmentId: context.environmentId, changeSet })\n    : undefined;\n\n  return {\n    ok: !hasErrors,\n    command: \"plan\",\n    file,\n    mode: \"real\",\n    currentGraph,\n    desiredGraph,\n    currentConfig: current.config,\n    currentEnvironment,\n    changeSet,\n    ...(preview ? { preview } : {}),\n    diff: renderChangeSet(changeSet),\n    ...(request.includeTypes ? { graphTypes: renderRailwayGraphTypes(desiredGraph) } : {}),\n    diagnostics: allDiagnostics,\n  };\n}\n\nasync function stageRailwayIac(input: EvaluatedCommandInput): Promise<RailwayIacStageResponse> {\n  const planned = await planRailwayIac(input);\n  if (!planned.ok || !planned.changeSet || planned.changeSet.changes.length === 0) {\n    return { ...planned, command: \"stage\" };\n  }\n  requireBackboardContext(input.request.backboard, \"stage\");\n  return { ...planned, command: \"stage\" };\n}\n\nasync function applyRailwayIac(input: EvaluatedCommandInput): Promise<RailwayIacApplyResponse> {\n  const planned = await planRailwayIac(input);\n  if (!planned.ok || !planned.changeSet || planned.changeSet.changes.length === 0) {\n    return { ...planned, command: \"apply\" };\n  }\n\n  const context = requireBackboardContext(input.request.backboard, \"apply\");\n  const client = new IacClient(clientConfig(context));\n  const applyResult = await client.applyChangeSet({\n    environmentId: context.environmentId,\n    changeSet: planned.changeSet,\n    commitMessage: \"Apply Railway configuration\",\n  });\n\n  return {\n    ...planned,\n    command: \"apply\",\n    applyResult,\n    ...(applyResult.deploymentId ? { deploymentId: applyResult.deploymentId } : {}),\n    ...(applyResult.stagedPatchId ? { stagedPatchId: applyResult.stagedPatchId } : {}),\n  };\n}\n\nasync function readCurrentEnvironment(\n  client: IacClient,\n  context: Required<Pick<RailwayIacBackboardContext, \"token\" | \"environmentId\">> & RailwayIacBackboardContext,\n): Promise<CurrentEnvironmentResult> {\n  return client.getCurrentEnvironment(\n    context.environmentId,\n    context.decryptVariables === undefined ? {} : { decryptVariables: context.decryptVariables },\n  );\n}\n\nfunction graphFromCurrentEnvironment(current: CurrentEnvironmentResult, desiredGraph: RailwayGraph): RailwayGraph {\n  return environmentConfigToGraph(current.config, {\n    projectName: current.projectName ?? desiredGraph.project.name,\n    serviceNamesById: current.serviceNamesById,\n    bucketNamesById: current.bucketNamesById,\n    customDomainsByServiceId: current.customDomainsByServiceId,\n  });\n}\n\nfunction changeSetDiagnostics(changeSet: RailwayChangeSet): RailwayIacRunnerDiagnostic[] {\n  return changeSet.diagnostics.map(diagnostic => ({\n    severity: diagnostic.severity,\n    path: diagnostic.path,\n    message: diagnostic.message,\n  } satisfies RailwayIacRunnerDiagnostic));\n}\n\nfunction runnerContext(request: RailwayIacRunnerRequest, command: string): RailwayContextInput {\n  const environment = request.context?.environment ?? request.context?.environmentName;\n  const projectId = request.context?.projectId ?? request.backboard?.projectId;\n  const environmentId = request.context?.environmentId ?? request.backboard?.environmentId;\n  return {\n    ...request.context,\n    command,\n    ...(projectId ? { projectId } : {}),\n    ...(environmentId ? { environmentId } : {}),\n    ...(environment ? { environment, environmentName: environment } : {}),\n  };\n}\n\nfunction requireBackboardContext(context: RailwayIacBackboardContext | undefined, command: \"plan\" | \"stage\" | \"apply\"): Required<Pick<RailwayIacBackboardContext, \"token\" | \"environmentId\">> & RailwayIacBackboardContext {\n  if (!context?.token) throw new Error(`Backboard token is required for ${command}.`);\n  if (!context.environmentId) throw new Error(`Backboard environmentId is required for ${command}.`);\n  return context as Required<Pick<RailwayIacBackboardContext, \"token\" | \"environmentId\">> & RailwayIacBackboardContext;\n}\n\nfunction clientConfig(context: RailwayIacBackboardContext & { token: string }) {\n  return { token: context.token, ...(context.authType ? { authType: context.authType } : {}), ...(context.endpoint ? { graphqlEndpoint: context.endpoint } : {}) };\n}\n\nfunction graphDiagnostics(graph: RailwayGraph): RailwayIacRunnerDiagnostic[] {\n  return validateGraph(graph).map(message => ({ severity: \"error\", path: \"graph\", message }));\n}\n\nfunction hasNoErrors(diagnostics: RailwayIacRunnerDiagnostic[]): boolean {\n  return diagnostics.every(diagnostic => diagnostic.severity !== \"error\");\n}\n\nfunction errorResponse(command: RunnerCommand, file: string, error: unknown): RailwayIacRunnerResponse {\n  return {\n    ok: false,\n    command,\n    file,\n    ...(command === \"plan\" || command === \"stage\" || command === \"apply\" || command === \"current\" ? { mode: \"real\" as const } : {}),\n    diagnostics: [{ severity: \"error\", path: \"\", message: error instanceof Error ? error.message : String(error) }],\n  } as RailwayIacRunnerResponse;\n}\n","#!/usr/bin/env node\nimport process from \"node:process\";\nimport { runRailwayIac, type RailwayIacRunnerRequest } from \"./runner.js\";\n\nmain().catch(error => {\n  process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n  process.exit(1);\n});\n\nasync function main() {\n  const request = await readRequest(process.argv.slice(2));\n  const response = await runRailwayIac(request);\n  const pretty = request.pretty ?? true;\n\n  await writeStdout(`${JSON.stringify(response, null, pretty ? 2 : 0)}\\n`);\n  process.exitCode = response.ok ? 0 : 1;\n}\n\nasync function writeStdout(payload: string): Promise<void> {\n  await new Promise<void>((resolve, reject) => {\n    process.stdout.write(payload, error => {\n      if (error) reject(error);\n      else resolve();\n    });\n  });\n}\n\nasync function readRequest(argv: string[]): Promise<RailwayIacRunnerRequest> {\n  const args = parseArgs(argv);\n  const stdin = await readStdinJson();\n  return mergeRequest(stdin, args);\n}\n\nasync function readStdinJson(): Promise<RailwayIacRunnerRequest> {\n  if (process.stdin.isTTY) return {};\n  const chunks: Buffer[] = [];\n  for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));\n  const raw = Buffer.concat(chunks).toString(\"utf8\").trim();\n  if (!raw) return {};\n  return JSON.parse(raw) as RailwayIacRunnerRequest;\n}\n\nfunction parseArgs(argv: string[]): RailwayIacRunnerRequest {\n  const parsed: RailwayIacRunnerRequest = {};\n  const backboard: NonNullable<RailwayIacRunnerRequest[\"backboard\"]> = {};\n\n  for (let i = 0; i < argv.length; i += 1) {\n    const arg = argv[i]!;\n    const consumed = applyFlag(arg, argv[i + 1], parsed, backboard);\n    if (consumed) i += consumed - 1;\n  }\n\n  if (Object.keys(backboard).length > 0) parsed.backboard = backboard;\n  return parsed;\n}\n\nfunction applyFlag(\n  arg: string,\n  value: string | undefined,\n  parsed: RailwayIacRunnerRequest,\n  backboard: NonNullable<RailwayIacRunnerRequest[\"backboard\"]>,\n): number {\n  if (isRunnerCommand(arg)) {\n    parsed.command = arg;\n    return 1;\n  }\n\n  if (setBooleanFlag(arg, parsed, backboard)) return 1;\n  return setValueFlag(arg, value, parsed, backboard);\n}\n\nfunction isRunnerCommand(arg: string): arg is NonNullable<RailwayIacRunnerRequest[\"command\"]> {\n  return arg === \"evaluate\" || arg === \"typegen\" || arg === \"current\" || arg === \"plan\" || arg === \"stage\" || arg === \"apply\";\n}\n\nfunction setBooleanFlag(\n  arg: string,\n  parsed: RailwayIacRunnerRequest,\n  backboard: NonNullable<RailwayIacRunnerRequest[\"backboard\"]>,\n): boolean {\n  switch (arg) {\n    case \"--include-types\":\n      parsed.includeTypes = true;\n      return true;\n    case \"--compact\":\n      parsed.pretty = false;\n      return true;\n    case \"--pretty\":\n      parsed.pretty = true;\n      return true;\n    case \"--decrypt-variables\":\n      backboard.decryptVariables = true;\n      return true;\n    case \"--replace\":\n      backboard.merge = false;\n      return true;\n    case \"--merge\":\n      backboard.merge = true;\n      return true;\n    default:\n      return false;\n  }\n}\n\nfunction setValueFlag(\n  arg: string,\n  value: string | undefined,\n  parsed: RailwayIacRunnerRequest,\n  backboard: NonNullable<RailwayIacRunnerRequest[\"backboard\"]>,\n): number {\n  if (!value) return 1;\n\n  switch (arg) {\n    case \"--cwd\":\n      parsed.cwd = value;\n      return 2;\n    case \"--file\":\n      parsed.file = value;\n      return 2;\n    case \"--endpoint\":\n      backboard.endpoint = value;\n      return 2;\n    case \"--token\":\n      backboard.token = value;\n      return 2;\n    case \"--auth-type\":\n      if (value === \"bearer\" || value === \"project-token\") backboard.authType = value;\n      return 2;\n    case \"--project-id\":\n      backboard.projectId = value;\n      return 2;\n    case \"--environment-id\":\n      backboard.environmentId = value;\n      return 2;\n    default:\n      return 1;\n  }\n}\n\nfunction mergeRequest(stdin: RailwayIacRunnerRequest, args: RailwayIacRunnerRequest): RailwayIacRunnerRequest {\n  const merged: RailwayIacRunnerRequest = { ...stdin, ...args };\n  if (stdin.backboard || args.backboard) merged.backboard = { ...stdin.backboard, ...args.backboard };\n  return merged;\n}\n"]}