{"version":3,"sources":["../src/core/image-registry.ts","../src/utils/logger.ts","../src/utils/process.ts","../src/utils/registry.ts","../src/core/docker.ts","../src/core/registry.ts","../src/utils/image-correlation.ts","../src/utils/kubectl-stream.ts","../src/utils/file-watch.ts","../src/utils/pod-watcher.ts","../src/core/sync-state.ts","../src/core/catchup-sync.ts","../src/core/ignore-patterns.ts","../src/utils/live-update-errors.ts","../src/core/live-update.ts","../src/core/k8s-contexts.ts","../src/core/live-update-manager.ts","../src/utils/resource-tracker.ts","../src/utils/yaml-wrapper.ts","../src/core/wet-repository.ts","../src/utils/wet-repo-utils.ts","../src/utils/wet-repo-state.ts","../src/core/k8s-defaults.ts","../src/core/k8s-simple.ts","../src/core/k8s.ts","../src/helpers/steps.ts","../src/helpers/ConfigMap.ts","../src/helpers/Secret.ts","../src/index.ts","../src/core/tiltfile-hooks.ts"],"names":["imageRegistry","path","fs","logs","SeverityNumber","resolve","spawn","fs2","fs3","path2","set","path3","fs4","crypto","path4","fs5","path5","dirKey","watcher","matches","path6","fs6","EventEmitter","path7","fs7","ignore","fg","crypto2","builtImage","buildTime","YAML","path8","path9","fs8","mkdir","writeFile","path10","YAML2","chalk","fs9","path11","fs10","yaml","fs11","path12","yaml2","path13","fs12"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { LiveStep, BuiltImage } from \"../types/index\";\nimport type { RegistryConfig } from \"./registry\";\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Registry entry for a built image\n */\nexport type ImageRegistryEntry = {\n  builtImage: BuiltImage;\n  registryConfig?: RegistryConfig;\n};\n\n/**\n * Global registry to track built images and their live update configurations\n */\nclass ImageRegistry {\n  private images = new Map<string, ImageRegistryEntry>();\n  private stateFile: string;\n\n  constructor() {\n    const sessionId = process.env.TILT_TS_SESSION_ID || 'default';\n    this.stateFile = path.join(process.cwd(), '.tilt-ts', `image-registry-${sessionId}.json`);\n    this.loadState();\n  }\n\n  private saveState(): void {\n    const stateDir = path.dirname(this.stateFile);\n    if (!fs.existsSync(stateDir)) {\n      fs.mkdirSync(stateDir, { recursive: true });\n    }\n\n    const serializedImages: Array<[string, ImageRegistryEntry]> = [];\n    for (const [key, entry] of this.images) {\n      serializedImages.push([key, entry]);\n    }\n\n    fs.writeFileSync(this.stateFile, JSON.stringify(serializedImages, null, 2));\n  }\n\n  private loadState(): void {\n    if (!fs.existsSync(this.stateFile)) {\n      return;\n    }\n\n    try {\n      const serializedImages = JSON.parse(fs.readFileSync(this.stateFile, 'utf8'));\n      \n      this.images.clear();\n      for (const [key, entry] of serializedImages || []) {\n        this.images.set(key, entry);\n      }\n    } catch (error) {\n      // Silently ignore state loading errors - just start fresh\n    }\n  }\n\n  /**\n   * Register a built image with its logical name and live update config\n   */\n  register(logicalName: string, builtImage: BuiltImage, registryConfig?: RegistryConfig): void {\n    this.images.set(logicalName, {\n      builtImage,\n      registryConfig,\n    });\n    this.saveState();\n  }\n\n  /**\n   * Get a registered image by logical name\n   */\n  get(logicalName: string): ImageRegistryEntry | undefined {\n    return this.images.get(logicalName);\n  }\n\n  /**\n   * Get all registered images\n   */\n  getAll(): ImageRegistryEntry[] {\n    return Array.from(this.images.values());\n  }\n\n  /**\n   * Check if a logical name is registered\n   */\n  has(logicalName: string): boolean {\n    return this.images.has(logicalName);\n  }\n\n  /**\n   * Clear all registered images (useful for testing)\n   */\n  clear(): void {\n    this.images.clear();\n  }\n\n  /**\n   * Force reload state from disk (useful when called from different module contexts)\n   */\n  forceReloadState(sessionId?: string): void {\n    this.images.clear();\n    \n    // If sessionId is provided, update the state file path\n    if (sessionId) {\n      this.stateFile = path.join(process.cwd(), '.tilt-ts', `image-registry-${sessionId}.json`);\n    }\n    \n    this.loadState();\n  }\n\n  /**\n   * Clean up state file (call at session end)\n   */\n  cleanup(): void {\n    if (fs.existsSync(this.stateFile)) {\n      fs.unlinkSync(this.stateFile);\n    }\n  }\n\n  /**\n   * Get all images that have live update configurations\n   */\n  getLiveUpdateImages(): ImageRegistryEntry[] {\n    return this.getAll().filter(entry => entry.builtImage.live_update && entry.builtImage.live_update.length > 0);\n  }\n}\n\n// Global singleton instance\nexport const imageRegistry = new ImageRegistry();","import { logs, SeverityNumber } from \"@opentelemetry/api-logs\";\n\n\nclass Logger {\n  private logger = logs.getLogger(\"tilt-ts\", \"1.0.0\");\n\n  debug(message: string, attributes?: Record<string, any>) {\n    this.logger.emit({\n      severityText: \"DEBUG\",\n      severityNumber: SeverityNumber.DEBUG,\n      body: message,\n      attributes,\n    });\n  }\n\n  info(message: string, attributes?: Record<string, any>) {\n    this.logger.emit({\n      severityText: \"INFO\",\n      severityNumber: SeverityNumber.INFO,\n      body: message,\n      attributes,\n    });\n  }\n\n  warn(message: string, attributes?: Record<string, any>) {\n    this.logger.emit({\n      severityText: \"WARN\",\n      severityNumber: SeverityNumber.WARN,\n      body: message,\n      attributes,\n    });\n  }\n\n  error(message: string, attributes?: Record<string, any>) {\n    this.logger.emit({\n      severityText: \"ERROR\",\n      severityNumber: SeverityNumber.ERROR,\n      body: message,\n      attributes,\n    });\n  }\n}\n\nexport const logger = new Logger();\n","import { spawn } from \"child_process\";\nimport type { RunOpts } from \"../types/index\";\nimport { logger } from \"./logger\";\n\nexport async function exec(cmd: string[], opts: RunOpts = {}) {\n  // Only log non-kubectl commands to reduce noise\n  if (!cmd[0]?.includes('kubectl')) {\n    logger.info('Running command', { command: cmd.join(' '), cwd: opts.cwd });\n  }\n  \n  return new Promise<void>((resolve, reject) => {\n    const [command, ...args] = cmd;\n    const proc = spawn(command!, args, {\n      cwd: opts.cwd,\n      env: { ...process.env, ...(opts.env || {}) },\n      stdio: [\n        opts.stdin === \"inherit\" ? \"inherit\" : \"ignore\",\n        \"inherit\",\n        \"inherit\"\n      ],\n    });\n    \n    proc.on('close', (code) => {\n      if (code !== 0) {\n        reject(new Error(`command failed ${code}: ${cmd.join(\" \")}`));\n      } else {\n        resolve();\n      }\n    });\n    \n    proc.on('error', (err) => {\n      reject(new Error(`command error: ${err.message}`));\n    });\n  });\n}\n\nexport async function execCapture(cmd: string[], opts: Omit<RunOpts, \"stdin\"> = {}) {\n  // Only log non-kubectl commands to reduce noise\n  if (!cmd[0]?.includes('kubectl')) {\n    logger.info('Running command (capture)', { command: cmd.join(' '), cwd: opts.cwd });\n  }\n  \n  return new Promise<string>((resolve, reject) => {\n    const [command, ...args] = cmd;\n    const proc = spawn(command!, args, {\n      cwd: opts.cwd,\n      env: { ...process.env, ...(opts.env || {}) },\n      stdio: ['ignore', 'pipe', 'pipe'],\n    });\n    \n    let stdout = '';\n    let stderr = '';\n    \n    if (proc.stdout) {\n      proc.stdout.on('data', (data) => {\n        stdout += data.toString();\n      });\n    }\n    \n    if (proc.stderr) {\n      proc.stderr.on('data', (data) => {\n        stderr += data.toString();\n      });\n    }\n    \n    proc.on('close', (code) => {\n      if (code !== 0) {\n        reject(new Error(`command failed ${code}: ${cmd.join(\" \")}\\n${stderr || stdout}`));\n      } else {\n        resolve(stdout);\n      }\n    });\n    \n    proc.on('error', (err) => {\n      reject(new Error(`command error: ${err.message}`));\n    });\n  });\n}","export function nowTag() {\n  return Math.floor(Date.now() / 1000).toString();\n}\n\nexport function registryRef(registry: string | undefined, image: string, tag: string) {\n  const reg = registry || \"localhost:36269\";\n  const repo = image.includes(\"/\") ? image : `dev/${image}`;\n  return `${reg}/${repo}:${tag}`;\n}","import type { DockerBuildOpts, BuiltImage } from \"../types/index\";\nimport { exec, execCapture } from \"../utils/process\";\nimport { registryRef } from \"../utils/registry\";\nimport { logger } from \"../utils/logger\";\nimport { imageRegistry } from \"./image-registry\";\nimport { get_default_registry } from \"./registry\";\nimport { liveUpdateManager } from \"./live-update-manager\";\nimport { resourceTracker } from \"../utils/resource-tracker\";\nimport { SyncStateManager } from \"./sync-state\";\nimport * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport fg from \"fast-glob\";\nimport ignore from \"ignore\";\n\n/**\n * Merge registry configuration with defaults\n */\nfunction getRegistryConfig(opts: DockerBuildOpts) {\n  const defaultRegistry = get_default_registry();\n  const registry = {\n    hostUrl: opts.registry?.hostUrl || defaultRegistry?.hostUrl || \"localhost:36269\",\n    clusterUrl: opts.registry?.clusterUrl || defaultRegistry?.clusterUrl,\n    username: opts.registry?.username || defaultRegistry?.username,\n    password: opts.registry?.password || defaultRegistry?.password,\n  };\n  \n  registry.clusterUrl = registry.clusterUrl || registry.hostUrl;\n  return registry;\n}\n\n/**\n * Debug logging for Docker build context structure\n */\nfunction logBuildContextStructure(includedFiles: string[]): void {\n  const folders = new Set<string>();\n  includedFiles.forEach(file => {\n    const parts = file.split('/');\n    let currentPath = '';\n    parts.forEach((part, index) => {\n      if (index < parts.length - 1) { // Skip the filename itself\n        currentPath = currentPath ? `${currentPath}/${part}` : part;\n        folders.add(currentPath);\n      }\n    });\n  });\n  \n  console.log(`Docker build context structure (${includedFiles.length} files in ${folders.size} folders):`);\n  \n  // Build tree structure\n  const tree = new Map<string, Set<string>>();\n  folders.forEach(folder => {\n    const parts = folder.split('/');\n    const parent = parts.slice(0, -1).join('/') || '/';\n    if (!tree.has(parent)) {\n      tree.set(parent, new Set());\n    }\n    tree.get(parent)!.add(folder);\n  });\n  \n  // Show tree recursively\n  function showTree(path: string, indent: string = '') {\n    const children = tree.get(path);\n    if (children) {\n      const sortedChildren = Array.from(children).sort();\n      sortedChildren.forEach((child, index) => {\n        const isLast = index === sortedChildren.length - 1;\n        const branch = isLast ? '└── ' : '├── ';\n        const childName = child.split('/').pop();\n        console.log(`${indent}${branch}📁 ${childName}/`);\n        showTree(child, indent + (isLast ? '    ' : '│   '));\n      });\n    }\n  }\n  \n  // Show root-level folders\n  showTree('/');\n  \n  // Show root-level files\n  const rootFiles = includedFiles.filter(file => !file.includes('/'));\n  if (rootFiles.length > 0) {\n    console.log('Root files:');\n    rootFiles.sort().forEach((file, index) => {\n      const isLast = index === rootFiles.length - 1;\n      const branch = isLast ? '└── ' : '├── ';\n      console.log(`${branch}📄 ${file}`);\n    });\n  }\n}\n\n/**\n * Generate content hash for build context using .dockerignore\n */\nfunction getBuildContextHash(contextDir: string, opts: DockerBuildOpts): string {\n  const dockerfile = opts.dockerfile || \"Dockerfile\";\n  const dockerfilePath = path.join(contextDir, dockerfile);\n  const dockerignorePath = path.join(contextDir, \".dockerignore\");\n  \n  // Read dockerfile content\n  const dockerfileContent = fs.existsSync(dockerfilePath) \n    ? fs.readFileSync(dockerfilePath, \"utf8\")\n    : \"\";\n  \n  // Create ignore instance and load .dockerignore if it exists\n  const ig = ignore();\n  if (fs.existsSync(dockerignorePath)) {\n    const dockerignoreContent = fs.readFileSync(dockerignorePath, \"utf8\");\n    ig.add(dockerignoreContent);\n  }\n  \n  // Add common exclusions even if no .dockerignore\n  ig.add([\".git\", \".dockerignore\", dockerfile]);\n  \n  console.log(\"Scanning files for docker context\")\n\n  // Get all files in context directory\n  const allFiles = fg.sync(\"**/*\", { \n    cwd: contextDir, \n    dot: true,\n    onlyFiles: true \n  });\n  \n  // Filter out ignored files\n  const includedFiles = ig.filter(allFiles);\n  \n  // Debug: log directory structure as tree (can be disabled for production)\n  logBuildContextStructure(includedFiles);\n  \n  // Create hash\n  const hash = crypto.createHash('sha256');\n  \n  // Add dockerfile content\n  hash.update(`dockerfile:${dockerfile}:${dockerfileContent}`);\n  \n  // Add build args\n  if (opts.args) {\n    hash.update(`args:${JSON.stringify(opts.args, Object.keys(opts.args).sort())}`);\n  }\n  \n  // Add target\n  if (opts.target) {\n    hash.update(`target:${opts.target}`);\n  }\n  \n  // Add file contents in deterministic order\n  for (const file of includedFiles.sort()) {\n    const filePath = path.join(contextDir, file);\n    if (fs.existsSync(filePath)) {\n      const content = fs.readFileSync(filePath);\n      hash.update(`file:${file}:${content}`);\n    }\n  }\n  \n  return hash.digest('hex').substring(0, 12);\n}\n\n/**\n * Check if image exists in registry\n */\nasync function imageExistsInRegistry(imageRef: string): Promise<boolean> {\n  try {\n    await execCapture([\"docker\", \"manifest\", \"inspect\", imageRef]);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Login to Docker registry if credentials are provided\n */\nasync function dockerLogin(registry: { hostUrl: string; username?: string; password?: string }): Promise<void> {\n  if (registry.username && registry.password) {\n    logger.info('Logging in to Docker registry', { hostUrl: registry.hostUrl, username: registry.username });\n    await exec([\"docker\", \"login\", registry.hostUrl, \"-u\", registry.username, \"-p\", registry.password], {\n      stdin: \"null\",\n    });\n    logger.info('Docker registry login successful', { hostUrl: registry.hostUrl, username: registry.username });\n  }\n}\n\nexport async function docker_build(\n  logicalName: string,\n  contextDir: string,\n  opts: DockerBuildOpts = {}\n): Promise<BuiltImage> {\n  // Start tracking this build\n  const resourceId = resourceTracker.trackDockerBuild(logicalName, contextDir);\n  const buildStartTime = Date.now();\n  \n  // Initialize sync state manager\n  const syncStateManager = new SyncStateManager();\n  \n  try {\n    const registry = getRegistryConfig(opts);\n    \n    // Generate content-based tag\n    const contextHash = getBuildContextHash(contextDir, opts);\n    const tag = `dev-${contextHash}`;\n    \n    const imageRef = registryRef(registry.hostUrl, logicalName, tag);\n    const clusterImageName = registryRef(registry.clusterUrl, logicalName, tag);\n    \n    // Login to registry if credentials are provided\n    await dockerLogin(registry);\n  \n    // Check if image already exists in registry (if caching enabled)\n    const cache = opts.cache !== false; // default to true\n    if (cache) {\n      const imageExists = await imageExistsInRegistry(imageRef);\n      if (imageExists) {\n        logger.info('Build context unchanged, using cached image', { \n          logicalName,\n          imageRef,\n          clusterImageName,\n          contextHash,\n          operation: 'docker_build_cached'\n        });\n        \n        const builtImage: BuiltImage = { \n          logicalName, \n          imageRef, \n          clusterImageName, \n          live_update: opts.live_update \n        };\n        \n        // Register the cached image for automatic correlation with k8s resources\n        imageRegistry.register(logicalName, builtImage, registry);\n        \n        // Register with live update manager (important for cache hits!)\n        liveUpdateManager.registerImage(builtImage);\n        \n        // Track successful cache hit\n        const buildTime = Date.now() - buildStartTime;\n        resourceTracker.completeBuild(resourceId, imageRef, buildTime);\n        \n        // Track image in sync state (cache hit - no new build, but establish baseline)\n        syncStateManager.trackImageBuild(imageRef, contextHash);\n        \n        return builtImage;\n      }\n    }\n\n  const args = [\n    \"buildx\",\n    \"build\",\n    contextDir,\n    \"--tag\",\n    imageRef,\n    \"--push\",\n    \"--progress=plain\",\n  ];\n  if (opts.dockerfile) args.push(\"--file\", opts.dockerfile);\n  if (opts.target) args.push(\"--target\", opts.target);\n  if (opts.args)\n    for (const [k, v] of Object.entries(opts.args))\n      args.push(\"--build-arg\", `${k}=${v}`);\n\n    // Mark build as started\n    resourceTracker.startBuild(resourceId);\n\n    logger.info('Building Docker image', { \n      logicalName, \n      imageRef,\n      clusterImageName, \n      contextDir, \n      contextHash,\n      dockerfile: opts.dockerfile,\n      target: opts.target,\n      hostUrl: registry.hostUrl,\n      clusterUrl: registry.clusterUrl,\n      operation: 'docker_build'\n    });\n\n    await exec([\"docker\", ...args], {\n      env: { DOCKER_BUILDKIT: \"1\", BUILDKIT_PROGRESS: \"plain\" },\n      stdin: \"null\",\n    });\n\n    logger.info('Docker build completed', { logicalName, imageRef, clusterImageName, contextHash });\n    \n    const builtImage: BuiltImage = { \n      logicalName, \n      imageRef, \n      clusterImageName, \n      live_update: opts.live_update \n    };\n    \n    // Register the built image for automatic correlation with k8s resources\n    imageRegistry.register(logicalName, builtImage, registry);\n    \n    // Register with live update manager\n    liveUpdateManager.registerImage(builtImage);\n    \n    // Track successful build completion\n    const buildTime = Date.now() - buildStartTime;\n    resourceTracker.completeBuild(resourceId, imageRef, buildTime);\n    \n    // Track new image build in sync state (resets file sync history)\n    syncStateManager.trackImageBuild(imageRef, contextHash);\n    \n    return builtImage;\n    \n  } catch (error) {\n    // Track build failure\n    const errorMessage = error instanceof Error ? error.message : String(error);\n    resourceTracker.markError(resourceId, errorMessage);\n    throw error;\n  }\n}","import { logger } from \"../utils/logger\";\n\n/**\n * Registry configuration for mapping between host and cluster URLs\n */\nexport type RegistryConfig = {\n  /** URL used for pushing images from the host (e.g., \"localhost:36269\") */\n  hostUrl: string;\n  /** URL used by the cluster to pull images (e.g., \"k3d-registry:5000\") */\n  clusterUrl?: string;\n  /** Registry username for authentication */\n  username?: string;\n  /** Registry password for authentication */\n  password?: string;\n};\n\n/**\n * Global default registry configuration\n */\nlet globalRegistry: RegistryConfig | null = null;\n\n/**\n * Sets the default registry configuration for docker_build operations\n *\n * @param config - Registry configuration with host and cluster URLs\n * @returns The registry configuration for chaining\n *\n * @example\n * ```typescript\n * // Set up registry for k3d environment\n * default_registry({\n *   hostUrl: \"localhost:36269\",\n *   clusterUrl: \"k3d-registry:5000\"\n * });\n *\n * // Now docker_build will use this registry by default\n * const built = await docker_build(\"my-app\", \"./context\", {\n *   dockerfile: \"./Dockerfile\"\n * });\n *\n * // Use the cluster image name directly\n * await k8s_yaml(\"./deploy.yaml\")\n *   .updateImages(() => built.clusterImageName)\n *   .apply();\n * ```\n */\nexport function default_registry(config: RegistryConfig): RegistryConfig {\n  config.clusterUrl = config.clusterUrl ?? config.hostUrl;\n\n  globalRegistry = config;\n\n  logger.info(\"🏗️ Set default registry configuration\", {\n    hostUrl: config.hostUrl,\n    clusterUrl: config.clusterUrl,\n    operation: \"default_registry\",\n  });\n\n  return config;\n}\n\n/**\n * Gets the current default registry configuration\n */\nexport function get_default_registry(): RegistryConfig | null {\n  return globalRegistry;\n}\n\n/**\n * Resets the default registry configuration (useful for testing)\n */\nexport function reset_default_registry(): void {\n  globalRegistry = null;\n  logger.info(\"🔄 Reset default registry configuration\", {\n    operation: \"reset_default_registry\",\n  });\n}\n","import { imageRegistry, type ImageRegistryEntry } from \"../core/image-registry\";\nimport { live_update } from \"../core/live-update\";\nimport { logger } from \"./logger\";\nimport { k8s_namespace } from \"../core/k8s-contexts\";\nimport { get_default_registry } from \"../core/registry\";\nimport type { ResourceSelector } from \"../types/index\";\n\n/**\n * Represents a correlated image found in Kubernetes YAML\n */\nexport type CorrelatedImage = {\n  logicalName: string;\n  registryEntry: ImageRegistryEntry;\n  kubernetesResources: KubernetesResourceMatch[];\n};\n\n/**\n * Represents a Kubernetes resource that uses a correlated image\n */\nexport type KubernetesResourceMatch = {\n  kind: string;\n  name: string;\n  namespace: string;\n  containers: string[];\n};\n\n/**\n * Scans Kubernetes resources for image references and correlates them with built images\n * \n * @param resources - Array of Kubernetes resource objects from parsed YAML\n * @returns Array of correlated images with their matching Kubernetes resources\n */\nexport async function correlateImages(resources: any[]): Promise<CorrelatedImage[]> {\n  const correlations: CorrelatedImage[] = [];\n  const registeredImages = imageRegistry.getAll();\n  const currentNamespace = await k8s_namespace();\n\n  logger.debug('🔍 Starting image correlation', {\n    registeredImageCount: registeredImages.length,\n    registeredImages: registeredImages.map(img => img.logicalName),\n    resourceCount: resources.length,\n    resourceKinds: resources.map(r => r.kind).filter(Boolean),\n    currentNamespace,\n  });\n\n  for (const registryEntry of registeredImages) {\n    const matches: KubernetesResourceMatch[] = [];\n\n    logger.debug('🔍 Searching for correlations', {\n      logicalName: registryEntry.builtImage.logicalName,\n      searchingInResources: resources.length,\n    });\n\n    for (const resource of resources) {\n      const match = findImageInResource(resource, registryEntry.builtImage.logicalName, currentNamespace, registryEntry.registryConfig);\n      if (match) {\n        logger.debug('✅ Found image correlation', {\n          logicalName: registryEntry.builtImage.logicalName,\n          resource: `${match.kind}/${match.name}`,\n          namespace: match.namespace,\n          containers: match.containers,\n        });\n        matches.push(match);\n      }\n    }\n\n    if (matches.length > 0) {\n      correlations.push({\n        logicalName: registryEntry.builtImage.logicalName,\n        registryEntry,\n        kubernetesResources: matches,\n      });\n    } else {\n      logger.debug('❌ No correlations found for image', {\n        logicalName: registryEntry.builtImage.logicalName,\n      });\n    }\n  }\n\n  return correlations;\n}\n\n/**\n * Finds if a Kubernetes resource uses a specific logical image name\n */\nfunction findImageInResource(resource: any, logicalName: string, currentNamespace: string, registryConfig?: RegistryConfig): KubernetesResourceMatch | null {\n  if (!resource.kind || !resource.metadata?.name) {\n    return null;\n  }\n\n  const containers = findContainersWithImage(resource, logicalName, registryConfig);\n  if (containers.length === 0) {\n    return null;\n  }\n\n  return {\n    kind: resource.kind,\n    name: resource.metadata.name,\n    namespace: resource.metadata?.namespace || currentNamespace,\n    containers,\n  };\n}\n\n/**\n * Checks if a container image reference matches the logical name\n * Handles registry prefixes, namespaces, and tags\n */\nfunction imageMatches(containerImage: string, logicalName: string, registryConfig?: RegistryConfig): boolean {\n  // Use provided registry config or fall back to default\n  const registry = registryConfig || get_default_registry();\n  \n  // Debug logging\n  console.log(`🔍 Image matching: \"${containerImage}\" vs \"${logicalName}\"`);\n  \n  // Normalize the container image by replacing cluster registry with host registry\n  // This allows us to compare images consistently\n  let normalizedImage = containerImage;\n  if (registry && registry.clusterUrl && registry.hostUrl) {\n    if (containerImage.startsWith(registry.clusterUrl)) {\n      normalizedImage = containerImage.replace(registry.clusterUrl, registry.hostUrl);\n      console.log(`   Normalized cluster image: \"${containerImage}\" -> \"${normalizedImage}\"`);\n    }\n  }\n  \n  // Remove tag if present (everything after the last :)\n  const lastColonIndex = normalizedImage.lastIndexOf(':');\n  let imageWithoutTag = normalizedImage;\n  \n  if (lastColonIndex !== -1) {\n    // Check if what comes after the colon looks like a tag (not a port)\n    const afterColon = normalizedImage.substring(lastColonIndex + 1);\n    // If it contains letters or starts with 'v' or 'dev-', it's likely a tag\n    if (/[a-zA-Z]/.test(afterColon) || afterColon.startsWith('v') || afterColon.startsWith('dev-')) {\n      imageWithoutTag = normalizedImage.substring(0, lastColonIndex);\n    }\n  }\n  \n  console.log(`   imageWithoutTag: \"${imageWithoutTag}\"`);\n  \n  // Split by / and get the last 1 or 2 parts depending on format\n  const imageParts = imageWithoutTag.split('/');\n  const logicalParts = logicalName.split('/');\n  \n  console.log(`   imageParts: [${imageParts.join(', ')}]`);\n  console.log(`   logicalParts: [${logicalParts.join(', ')}]`);\n  \n  // If logical name has no slash (e.g., \"test-sync\"), match last part\n  if (logicalParts.length === 1) {\n    const lastPart = imageParts[imageParts.length - 1];\n    const matches = lastPart === logicalName;\n    console.log(`   Single part match: \"${lastPart}\" === \"${logicalName}\" = ${matches}`);\n    return matches;\n  }\n  \n  // If logical name has slash (e.g., \"dev/test-sync\"), match last 2 parts\n  if (logicalParts.length === 2 && imageParts.length >= 2) {\n    const containerName = imageParts.slice(-2).join('/');\n    const matches = containerName === logicalName;\n    console.log(`   Two part match: \"${containerName}\" === \"${logicalName}\" = ${matches}`);\n    return matches;\n  }\n  \n  // Exact match fallback\n  const matches = imageWithoutTag === logicalName;\n  console.log(`   Exact match: \"${imageWithoutTag}\" === \"${logicalName}\" = ${matches}`);\n  return matches;\n}\n\n/**\n * Recursively searches a Kubernetes resource for containers using a specific image\n */\nfunction findContainersWithImage(obj: any, logicalName: string, registryConfig?: RegistryConfig): string[] {\n  const containers: string[] = [];\n  const foundImages: string[] = [];\n\n  function searchObject(current: any, path: string[] = []): void {\n    if (Array.isArray(current)) {\n      current.forEach((item, index) => {\n        searchObject(item, [...path, index.toString()]);\n      });\n    } else if (current && typeof current === \"object\") {\n      // Check if this looks like a container spec\n      if (current.image && current.name) {\n        foundImages.push(current.image);\n        if (imageMatches(current.image, logicalName, registryConfig)) {\n          containers.push(current.name);\n        }\n      }\n      \n      // Recursively search nested objects\n      for (const [key, value] of Object.entries(current)) {\n        searchObject(value, [...path, key]);\n      }\n    }\n  }\n\n  searchObject(obj);\n  \n  // Debug logging\n  if (foundImages.length > 0) {\n    logger.debug('🔍 Found images in resource', {\n      logicalName,\n      foundImages,\n      matchingContainers: containers,\n    });\n  }\n  \n  return containers;\n}\n\n/**\n * Automatically starts live updates for correlated images after successful Kubernetes deployment\n */\nexport async function autoStartLiveUpdates(correlations: CorrelatedImage[]): Promise<void> {\n  const liveUpdatePromises: Promise<void>[] = [];\n\n  for (const correlation of correlations) {\n    const { registryEntry, kubernetesResources } = correlation;\n    \n    // Only start live updates if the image has live update configuration\n    if (!registryEntry.builtImage.live_update || registryEntry.builtImage.live_update.length === 0) {\n      continue;\n    }\n\n    // Start live updates for each matching Kubernetes resource\n    for (const k8sResource of kubernetesResources) {\n      logger.info('🔄 Auto-starting live updates for correlated resource', {\n        logicalName: registryEntry.builtImage.logicalName,\n        kind: k8sResource.kind,\n        name: k8sResource.name,\n        namespace: k8sResource.namespace,\n        containers: k8sResource.containers,\n        steps: registryEntry.builtImage.live_update.length,\n      });\n\n      // Create selector based on the Kubernetes resource\n      const selector: ResourceSelector = {\n        kind: k8sResource.kind as any, // Cast to supported kinds\n        name: k8sResource.name,\n        namespace: k8sResource.namespace,\n        container: k8sResource.containers[0], // Use first container if multiple\n      };\n\n      // Start live update (these run indefinitely)\n      const liveUpdatePromise = live_update({\n        selector,\n        steps: registryEntry.builtImage.live_update,\n      }).catch((error) => {\n        logger.error('Auto live update failed', {\n          logicalName: registryEntry.builtImage.logicalName,\n          resource: `${k8sResource.kind}/${k8sResource.name}`,\n          namespace: k8sResource.namespace,\n          error: String(error),\n        });\n      });\n\n      liveUpdatePromises.push(liveUpdatePromise);\n    }\n  }\n\n  if (liveUpdatePromises.length > 0) {\n    logger.info('🚀 Started live updates for correlated images', {\n      correlationCount: correlations.length,\n      liveUpdateCount: liveUpdatePromises.length,\n    });\n\n    // Wait for all live updates (they run indefinitely, so this will keep the process alive)\n    await Promise.allSettled(liveUpdatePromises);\n  }\n}","import { spawn } from \"child_process\";\nimport * as fs from \"fs\";\n\n/**\n * Copy a file to a pod using streaming approach (much faster than kubectl cp)\n * Equivalent to: cat localFile | kubectl exec -i pod -- tee remotePath\n */\nexport async function streamFileToPod(\n  localFilePath: string,\n  namespace: string,\n  podName: string,\n  remotePath: string,\n  containerName?: string\n): Promise<void> {\n  return new Promise<void>((resolve, reject) => {\n    const kubectlArgs = [\n      \"exec\", \"-i\", \"-n\", namespace, podName,\n      ...(containerName ? [\"-c\", containerName] : []),\n      \"--\", \"tee\", remotePath\n    ];\n    \n    const kubectlProc = spawn(\"kubectl\", kubectlArgs, {\n      stdio: [\"pipe\", \"pipe\", \"pipe\"]\n    });\n    \n    // Stream file content to kubectl exec stdin\n    const readStream = fs.createReadStream(localFilePath);\n    readStream.pipe(kubectlProc.stdin!);\n    \n    // Discard tee output (we don't need it echoed back)\n    kubectlProc.stdout!.on('data', () => {});\n    \n    let stderr = '';\n    kubectlProc.stderr!.on('data', (data) => {\n      stderr += data.toString();\n    });\n    \n    readStream.on('error', (err) => {\n      kubectlProc.kill();\n      reject(new Error(`file read error: ${err.message}`));\n    });\n    \n    kubectlProc.on('close', (code) => {\n      if (code !== 0) {\n        // Check for read-only filesystem error\n        if (stderr.includes('Read-only file system')) {\n          const error = new Error(`Read-only file system: Cannot write to ${remotePath}`);\n          (error as any).isReadOnlyFilesystem = true;\n          (error as any).remotePath = remotePath;\n          reject(error);\n        } else {\n          reject(new Error(`kubectl exec failed ${code}: ${stderr}`));\n        }\n      } else {\n        resolve();\n      }\n    });\n    \n    kubectlProc.on('error', (err) => {\n      reject(new Error(`kubectl exec error: ${err.message}`));\n    });\n  });\n}","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { spawn } from \"child_process\";\n\nexport function pathIsDir(p: string): boolean {\n  try { return fs.statSync(p).isDirectory(); } catch { return false; }\n}\n\nexport type WatchEntry = { root: string; files: Set<string> };\n\nexport function buildWatchEntries(pathsIn: string[]): WatchEntry[] {\n  const absRequested = Array.from(new Set(pathsIn.map(p => path.resolve(process.cwd(), p))));\n  const map = new Map<string, Set<string>>();\n\n  for (const p of absRequested) {\n    const isDir = pathIsDir(p);\n    const root = isDir ? p : path.dirname(p);\n    const set = map.get(root) ?? new Set<string>();\n    if (!isDir) set.add(p);\n    map.set(root, set);\n  }\n\n  const roots = Array.from(map.keys()).sort((a, b) => a.length - b.length);\n  const kept: string[] = [];\n  for (const r of roots) {\n    const filesInRoot = map.get(r)!;\n    const isDirWatch = filesInRoot.size === 0;\n    // Don't deduplicate directory watches - they need their own watcher\n    const shouldKeep = isDirWatch || !kept.some(k => r.startsWith(k + path.sep));\n    if (shouldKeep) kept.push(r);\n  }\n  return kept.map(r => ({ root: r, files: map.get(r)! }));\n}\n\nexport async function createTar(root: string, relFiles: string[], outTarPath: string) {\n  const fileListPath = path.join(root, `.devtool-files-${Date.now()}-${Math.random().toString(36).slice(2)}.txt`);\n  fs.writeFileSync(fileListPath, relFiles.map(f => f.replaceAll(\"\\\\\", \"/\")).join(\"\\n\"), \"utf8\");\n  try {\n    await new Promise<void>((resolve, reject) => {\n      const proc = spawn(\"tar\", [\"-C\", root, \"-cf\", outTarPath, \"-T\", fileListPath], {\n        stdio: [\"ignore\", \"inherit\", \"inherit\"],\n      });\n      \n      proc.on('close', (code) => {\n        if (code !== 0) {\n          reject(new Error(`tar failed with code ${code}`));\n        } else {\n          resolve();\n        }\n      });\n      \n      proc.on('error', (err) => {\n        reject(new Error(`tar error: ${err.message}`));\n      });\n    });\n  } finally {\n    fs.unlinkSync(fileListPath);\n  }\n}\n\nexport function shQ(s: string) {\n  if (/^[A-Za-z0-9._\\-\\/:@]+$/.test(s)) return s;\n  return `'${s.replaceAll(\"'\", \"'\\\\''\")}'`;\n}","import { spawn, ChildProcess } from \"child_process\";\nimport { execCapture } from \"./process\";\nimport { logger } from \"./logger\";\nimport type { ResourceSelector } from \"../types/index\";\n\ninterface PodEvent {\n  type: 'ADDED' | 'MODIFIED' | 'DELETED';\n  object: {\n    metadata: { name: string; namespace: string };\n    status: { phase: string; conditions: any[]; containerStatuses?: any[] };\n  };\n}\n\nexport interface ContainerInfo {\n  podName: string;\n  containerName: string;\n  containerID: string;\n  restartCount: number;\n  startTime: number;\n}\n\nexport interface ContainerEvent {\n  type: 'started' | 'restarted';\n  container: ContainerInfo;\n}\n\n/**\n * Watches Kubernetes pods using the Watch API for efficient real-time updates\n */\nexport class PodWatcher {\n  private readyPods = new Set<string>();\n  private runningPods = new Set<string>();\n  private watchProcess?: ChildProcess;\n  private selector?: ResourceSelector;\n  private trackedContainers = new Map<string, ContainerInfo>();\n  private containerEventHandlers: ((event: ContainerEvent) => void)[] = [];\n\n  /**\n   * Start watching pods for a specific resource selector\n   */\n  async start(selector: ResourceSelector): Promise<void> {\n    this.selector = selector;\n    const namespace = selector.namespace || 'default';\n    \n    logger.info('Starting pod watcher', {\n      kind: selector.kind,\n      name: selector.name,\n      namespace,\n      operation: 'pod_watcher_start'\n    });\n\n    try {\n      // Get label selector from the deployment\n      const labelSelector = await this.getLabelSelector(selector);\n      logger.info('Pod watcher label selector configured', {\n        labelSelector,\n        operation: 'pod_watcher_label_selector'\n      });\n\n      // Start watching pods with the label selector\n      this.watchProcess = spawn('kubectl', [\n        'get', 'pods',\n        '-n', namespace,\n        '-l', labelSelector,\n        '--watch=true',\n        '--output-watch-events=true',\n        '-o', 'json'\n      ], {\n        stdio: ['ignore', 'pipe', 'pipe']\n      });\n\n      // Set up stream with no buffering\n      if (this.watchProcess.stdout) {\n        this.watchProcess.stdout.setEncoding('utf8');\n      }\n\n      let buffer = '';\n      this.watchProcess.stdout?.on('data', (data: string) => {\n        logger.debug('Pod watcher raw data received', {\n          dataLength: data.length,\n          dataPreview: data.substring(0, 200),\n          operation: 'pod_watcher_raw_data'\n        });\n        \n        buffer += data;\n        const lines = buffer.split('\\n');\n        \n        // Process complete lines, keep incomplete line in buffer\n        buffer = lines.pop() || '';\n        \n        for (const line of lines) {\n          const trimmedLine = line.trim();\n          if (trimmedLine) {\n            logger.debug('Processing pod watch line', {\n              linePreview: trimmedLine.substring(0, 150),\n              operation: 'pod_watcher_process_line'\n            });\n            try {\n              const event: PodEvent = JSON.parse(trimmedLine);\n              logger.debug('Pod watch event received', {\n                eventType: event.type,\n                podName: event.object.metadata.name,\n                operation: 'pod_watcher_event'\n              });\n              this.handlePodEvent(event);\n            } catch (e) {\n              logger.warn('Failed to parse pod watch JSON', {\n                error: e instanceof Error ? e.message : String(e),\n                linePreview: trimmedLine.substring(0, 100),\n                operation: 'pod_watcher_parse_error'\n              });\n            }\n          }\n        }\n      });\n\n      this.watchProcess.stderr?.on('data', (data) => {\n        logger.warn('Pod watcher stderr output', {\n          stderr: data.toString(),\n          operation: 'pod_watcher_stderr'\n        });\n      });\n\n      this.watchProcess.on('exit', (code) => {\n        logger.info('Pod watcher process exited', {\n          exitCode: code,\n          operation: 'pod_watcher_exit'\n        });\n        if (code !== 0) {\n          // Restart watcher after delay\n          setTimeout(() => this.restart(), 5000);\n        }\n      });\n\n      // Get initial pod list\n      await this.getInitialPods(namespace, labelSelector);\n      \n      logger.info('Pod watcher started successfully', {\n        kind: selector.kind,\n        name: selector.name,\n        namespace,\n        labelSelector,\n        operation: 'pod_watcher_start'\n      });\n\n    } catch (error) {\n      logger.error('Failed to start pod watcher', {\n        error: String(error),\n        selector,\n        operation: 'pod_watcher_start'\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Get label selector from the deployment/statefulset/etc\n   */\n  private async getLabelSelector(selector: ResourceSelector): Promise<string> {\n    try {\n      const resourceJson = await execCapture([\n        'kubectl', 'get', selector.kind.toLowerCase(), selector.name,\n        '-n', selector.namespace || 'default',\n        '-o', 'json'\n      ]);\n\n      const resource = JSON.parse(resourceJson);\n      let labels: Record<string, string> = {};\n\n      // Handle different resource types\n      switch (selector.kind.toLowerCase()) {\n        case 'deployment':\n          labels = resource.spec?.template?.metadata?.labels || {};\n          break;\n        case 'statefulset':\n          labels = resource.spec?.template?.metadata?.labels || {};\n          break;\n        case 'daemonset':\n          labels = resource.spec?.template?.metadata?.labels || {};\n          break;\n        default:\n          // For other resources, try to get labels from spec.selector\n          labels = resource.spec?.selector?.matchLabels || {};\n      }\n\n      if (Object.keys(labels).length === 0) {\n        throw new Error(`No labels found for ${selector.kind}/${selector.name}`);\n      }\n\n      // Convert labels to selector string: \"app=dagster,version=v1\"\n      return Object.entries(labels)\n        .map(([k, v]) => `${k}=${v}`)\n        .join(',');\n\n    } catch (error) {\n      logger.error('Failed to get label selector', {\n        error: String(error),\n        selector,\n        operation: 'get_label_selector'\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Get initial list of ready pods\n   */\n  private async getInitialPods(namespace: string, labelSelector: string): Promise<void> {\n    try {\n      const podsJson = await execCapture([\n        'kubectl', 'get', 'pods',\n        '-n', namespace,\n        '-l', labelSelector,\n        '-o', 'json'\n      ]);\n\n      const response = JSON.parse(podsJson);\n      const pods = response.items || [];\n\n      for (const pod of pods) {\n        if (this.isPodReady(pod)) {\n          this.readyPods.add(pod.metadata.name);\n          logger.debug('Initial ready pod found', {\n            podName: pod.metadata.name,\n            operation: 'pod_watcher_initial_ready'\n          });\n        }\n      }\n\n      logger.info('Initial pod scan completed', {\n        readyPodsCount: this.readyPods.size,\n        readyPods: Array.from(this.readyPods),\n        operation: 'pod_watcher_initial_scan'\n      });\n\n    } catch (error) {\n      logger.warn('Failed to get initial pods', {\n        error: String(error),\n        namespace,\n        labelSelector,\n        operation: 'get_initial_pods'\n      });\n    }\n  }\n\n  /**\n   * Handle pod events from the watch stream\n   */\n  private handlePodEvent(event: PodEvent): void {\n    const pod = event.object;\n    const podName = pod.metadata.name;\n    const wasTracked = this.readyPods.has(podName);\n    const isReady = this.isPodReady(pod);\n    const isRunning = this.isPodRunning(pod);\n\n    logger.debug('Handling pod event', {\n      eventType: event.type,\n      podName,\n      wasTracked,\n      isReady,\n      isRunning,\n      currentCachedPods: Array.from(this.readyPods),\n      currentRunningPods: Array.from(this.runningPods),\n      operation: 'pod_watcher_handle_event'\n    });\n\n    // Handle pod readiness\n    switch (event.type) {\n      case 'ADDED':\n      case 'MODIFIED':\n        // Handle ready state\n        if (isReady) {\n          if (!this.readyPods.has(podName)) {\n            this.readyPods.add(podName);\n            logger.info('Pod became ready', {\n              podName,\n              operation: 'pod_ready'\n            });\n          }\n        } else {\n          if (this.readyPods.has(podName)) {\n            this.readyPods.delete(podName);\n            logger.info('Pod no longer ready', {\n              podName,\n              operation: 'pod_not_ready'\n            });\n          }\n        }\n\n        // Handle running state (stricter criteria)\n        if (isRunning) {\n          if (!this.runningPods.has(podName)) {\n            this.runningPods.add(podName);\n            logger.info('Pod became running', {\n              podName,\n              operation: 'pod_running'\n            });\n          }\n        } else {\n          if (this.runningPods.has(podName)) {\n            this.runningPods.delete(podName);\n            logger.info('Pod no longer running', {\n              podName,\n              operation: 'pod_not_running'\n            });\n          }\n        }\n        \n        // Handle container lifecycle events\n        this.handleContainerEvents(pod);\n        break;\n\n      case 'DELETED':\n        if (this.readyPods.has(podName)) {\n          this.readyPods.delete(podName);\n          logger.info('Pod deleted from ready cache', {\n            podName,\n            operation: 'pod_deleted_ready'\n          });\n        } else {\n          logger.debug('Pod deleted but was not in ready cache', {\n            podName,\n            operation: 'pod_deleted_not_cached'\n          });\n        }\n\n        if (this.runningPods.has(podName)) {\n          this.runningPods.delete(podName);\n          logger.info('Pod deleted from running cache', {\n            podName,\n            operation: 'pod_deleted_running'\n          });\n        }\n        \n        // Clean up tracked containers for deleted pod\n        this.cleanupContainersForPod(podName);\n        break;\n    }\n\n    logger.debug('Pod watcher cache state updated', {\n      readyPods: Array.from(this.readyPods),\n      runningPods: Array.from(this.runningPods),\n      operation: 'pod_watcher_cache_updated'\n    });\n\n    logger.debug('Pod event handled', {\n      event: event.type,\n      pod: podName,\n      ready: isReady,\n      totalReadyPods: this.readyPods.size,\n      operation: 'handle_pod_event'\n    });\n  }\n\n  /**\n   * Check if a pod is ready for operations\n   */\n  private isPodReady(pod: any): boolean {\n    const phase = pod.status?.phase;\n    const conditions = pod.status?.conditions || [];\n    const ready = conditions.find((c: any) => c.type === 'Ready')?.status === 'True';\n    const running = phase === 'Running';\n    \n    return running && ready;\n  }\n\n  /**\n   * Get list of ready pods (instant - no kubectl calls)\n   */\n  getReadyPods(): string[] {\n    return Array.from(this.readyPods);\n  }\n\n  /**\n   * Check if a pod is truly running and stable (stricter than ready)\n   */\n  private isPodRunning(pod: any): boolean {\n    const phase = pod.status?.phase;\n    const conditions = pod.status?.conditions || [];\n    const ready = conditions.find((c: any) => c.type === 'Ready')?.status === 'True';\n    const isRunning = phase === 'Running';\n    const notDeleting = !pod.metadata?.deletionTimestamp;\n    \n    // Check that all containers are actually running (not just ready)\n    const containerStatuses = pod.status?.containerStatuses || [];\n    const allContainersRunning = containerStatuses.every((status: any) => \n      status.ready && status.state?.running\n    );\n    \n    return isRunning && ready && notDeleting && allContainersRunning;\n  }\n\n  /**\n   * Get list of truly running pods (instant - no kubectl calls)\n   */\n  getRunningPods(): string[] {\n    return Array.from(this.runningPods);\n  }\n\n  /**\n   * Stop the pod watcher\n   */\n  stop(): void {\n    if (this.watchProcess) {\n      logger.info('Killing pod watcher process', {\n        operation: 'pod_watcher_killing'\n      });\n      \n      // Kill the process and its children\n      this.watchProcess.kill('SIGTERM');\n      \n      // Force kill if it doesn't respond\n      setTimeout(() => {\n        if (this.watchProcess && !this.watchProcess.killed) {\n          logger.warn('Force killing pod watcher process', {\n            operation: 'pod_watcher_force_kill'\n          });\n          this.watchProcess.kill('SIGKILL');\n        }\n      }, 500);\n      \n      this.watchProcess = undefined;\n    }\n    this.readyPods.clear();\n    \n    // Logging handled by structured logger below\n    logger.info('Pod watcher stopped', {\n      selector: this.selector,\n      operation: 'pod_watcher_stop'\n    });\n  }\n\n  /**\n   * Restart the pod watcher\n   */\n  private async restart(): Promise<void> {\n    logger.info('Restarting pod watcher', {\n      operation: 'pod_watcher_restart'\n    });\n    if (this.selector) {\n      try {\n        await this.start(this.selector);\n      } catch (error) {\n        logger.error('Failed to restart pod watcher', {\n          error: String(error),\n          operation: 'pod_watcher_restart_failed'\n        });\n        setTimeout(() => this.restart(), 10000); // Try again in 10s\n      }\n    }\n  }\n\n  /**\n   * Handle container lifecycle events from pod status\n   */\n  private handleContainerEvents(pod: any): void {\n    const podName = pod.metadata.name;\n    const containerStatuses = pod.status?.containerStatuses || [];\n    \n    for (const status of containerStatuses) {\n      const containerName = status.name;\n      const key = `${podName}:${containerName}`;\n      const existing = this.trackedContainers.get(key);\n      \n      // Parse container start time, fall back to current time if not available\n      let startTime = Date.now(); // Default to current time\n      if (status.state?.running?.startedAt) {\n        startTime = new Date(status.state.running.startedAt).getTime();\n      }\n      \n      const container: ContainerInfo = {\n        podName,\n        containerName,\n        containerID: status.containerID || '',\n        restartCount: status.restartCount || 0,\n        startTime\n      };\n      \n      if (!existing) {\n        // New container\n        this.trackedContainers.set(key, container);\n        this.notifyContainerEvent({\n          type: 'started',\n          container\n        });\n        \n        logger.info('New container detected', {\n          podName: container.podName,\n          containerName: container.containerName,\n          containerID: container.containerID.substring(0, 12),\n          startTime: container.startTime\n        });\n      } else if (\n        container.containerID !== existing.containerID ||\n        container.restartCount > existing.restartCount\n      ) {\n        // Container restarted\n        this.trackedContainers.set(key, container);\n        this.notifyContainerEvent({\n          type: 'restarted',\n          container\n        });\n        \n        logger.info('Container restart detected', {\n          podName: container.podName,\n          containerName: container.containerName,\n          oldContainerID: existing.containerID.substring(0, 12),\n          newContainerID: container.containerID.substring(0, 12),\n          oldRestartCount: existing.restartCount,\n          newRestartCount: container.restartCount\n        });\n      }\n    }\n  }\n\n  /**\n   * Clean up tracked containers for a deleted pod\n   */\n  private cleanupContainersForPod(podName: string): void {\n    const keysToDelete: string[] = [];\n    for (const [key, container] of this.trackedContainers) {\n      if (container.podName === podName) {\n        keysToDelete.push(key);\n      }\n    }\n    \n    for (const key of keysToDelete) {\n      this.trackedContainers.delete(key);\n    }\n  }\n\n  /**\n   * Notify all container event handlers\n   */\n  private notifyContainerEvent(event: ContainerEvent): void {\n    for (const handler of this.containerEventHandlers) {\n      try {\n        handler(event);\n      } catch (error) {\n        logger.error('Error in container event handler', {\n          error: error instanceof Error ? error.message : String(error)\n        });\n      }\n    }\n  }\n\n  /**\n   * Add an event handler for container lifecycle events\n   */\n  onContainerEvent(handler: (event: ContainerEvent) => void): void {\n    this.containerEventHandlers.push(handler);\n  }\n\n  /**\n   * Get tracked container info for a specific pod/container\n   */\n  getTrackedContainer(podName: string, containerName?: string): ContainerInfo | undefined {\n    const key = `${podName}:${containerName || 'default'}`;\n    return this.trackedContainers.get(key);\n  }\n\n  /**\n   * Check if a container needs catch-up sync based on our tracking\n   */\n  needsCatchupSync(podName: string, containerName?: string): boolean {\n    const tracked = this.getTrackedContainer(podName, containerName);\n    \n    // If we've never seen this container, it needs catch-up\n    if (!tracked) {\n      return true;\n    }\n\n    // Check if there was a recent restart (within last 30 seconds)\n    // This covers both new containers and restarted containers\n    const now = Date.now();\n    const recentStart = (now - tracked.startTime) < 30000;\n    \n    return recentStart;\n  }\n\n  /**\n   * Get current status for debugging\n   */\n  getStatus(): {\n    isWatching: boolean;\n    readyPodCount: number;\n    readyPods: string[];\n    runningPodCount: number;\n    runningPods: string[];\n    trackedContainerCount: number;\n    selector?: ResourceSelector;\n  } {\n    return {\n      isWatching: !!this.watchProcess,\n      readyPodCount: this.readyPods.size,\n      readyPods: this.getReadyPods(),\n      runningPodCount: this.runningPods.size,\n      runningPods: this.getRunningPods(),\n      trackedContainerCount: this.trackedContainers.size,\n      selector: this.selector\n    };\n  }\n}","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as crypto from \"crypto\";\nimport { logger } from \"../utils/logger\";\n\nexport interface FileState {\n  relativePath: string;\n  contentHash: string;\n  syncTimestamp: number;\n  size: number;\n  sourceDirectory: string; // Track which source directory this file came from\n}\n\nexport interface ContainerState {\n  podName: string;\n  containerID: string;\n  startTime: number;\n  lastSyncCheck: number;\n}\n\nexport interface ImageSyncState {\n  imageTag: string;\n  imageHash: string;\n  buildTimestamp: number;\n  syncedFiles: Record<string, FileState>;\n  containers: Record<string, ContainerState>;\n}\n\nexport interface SyncStateData {\n  version: string;\n  images: Record<string, ImageSyncState>;\n  currentImage?: string;\n}\n\nexport class SyncStateManager {\n  private stateDir: string;\n  private stateFile: string;\n  private state: SyncStateData;\n\n  constructor(projectRoot: string = process.cwd()) {\n    this.stateDir = path.join(projectRoot, \".tilt-ts\");\n    this.stateFile = path.join(this.stateDir, \"sync-state.json\");\n    this.state = this.loadState();\n  }\n\n  private loadState(): SyncStateData {\n    try {\n      if (fs.existsSync(this.stateFile)) {\n        const data = fs.readFileSync(this.stateFile, \"utf8\");\n        const parsed = JSON.parse(data) as SyncStateData;\n        logger.info(\"Loaded sync state\", {\n          version: parsed.version,\n          imageCount: Object.keys(parsed.images).length,\n          currentImage: parsed.currentImage,\n        });\n        return parsed;\n      }\n    } catch (error) {\n      logger.warn(\"Failed to load sync state, starting fresh\", {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n\n    return {\n      version: \"1.0.0\",\n      images: {},\n    };\n  }\n\n  private saveState(): void {\n    try {\n      // Ensure directory exists\n      if (!fs.existsSync(this.stateDir)) {\n        fs.mkdirSync(this.stateDir, { recursive: true });\n      }\n\n      fs.writeFileSync(this.stateFile, JSON.stringify(this.state, null, 2));\n      logger.info(\"Saved sync state\", {\n        imageCount: Object.keys(this.state.images).length,\n        stateFile: this.stateFile,\n      });\n    } catch (error) {\n      logger.error(\"Failed to save sync state\", {\n        error: error instanceof Error ? error.message : String(error),\n        stateFile: this.stateFile,\n      });\n    }\n  }\n\n  /**\n   * Track a new Docker image build, resetting sync state for this image\n   */\n  trackImageBuild(imageTag: string, imageHash: string): void {\n    const buildTimestamp = Date.now();\n\n    this.state.images[imageTag] = {\n      imageTag,\n      imageHash,\n      buildTimestamp,\n      syncedFiles: {},\n      containers: {},\n    };\n\n    this.state.currentImage = imageTag;\n    this.saveState();\n\n    logger.info(\"Tracked new image build\", {\n      imageTag,\n      imageHash: imageHash.substring(0, 12),\n      buildTimestamp,\n    });\n  }\n\n  /**\n   * Track a file that was synced to containers\n   */\n  trackFileSync(\n    relativePath: string,\n    localFilePath: string,\n    sourceDirectory: string\n  ): void {\n    logger.debug(\"trackFileSync - currentImage check\", {\n      currentImage: this.state.currentImage,\n    });\n\n    if (!this.state.currentImage) {\n      logger.debug(\n        \"trackFileSync - no current image, skipping file tracking\"\n      );\n      logger.warn(\"No current image set, cannot track file sync\");\n      return;\n    }\n\n    const imageState = this.state.images[this.state.currentImage];\n    if (!imageState) {\n      logger.warn(\"Current image not found in state\", {\n        currentImage: this.state.currentImage,\n      });\n      return;\n    }\n\n    try {\n      // Calculate file hash and size\n      const content = fs.readFileSync(localFilePath);\n      const contentHash = crypto\n        .createHash(\"sha256\")\n        .update(content)\n        .digest(\"hex\");\n      const size = content.length;\n\n      const fileState: FileState = {\n        relativePath,\n        contentHash,\n        syncTimestamp: Date.now(),\n        size,\n        sourceDirectory,\n      };\n\n      imageState.syncedFiles[relativePath] = fileState;\n      logger.info(\"trackFileSync - added file\", {\n        relativePath,\n        totalFiles: Object.keys(imageState.syncedFiles).length,\n      });\n\n      this.saveState();\n\n      logger.info(\"Tracked file sync\", {\n        relativePath,\n        contentHash: contentHash.substring(0, 12),\n        size,\n      });\n    } catch (error) {\n      logger.error(\"Failed to track file sync\", {\n        relativePath,\n        localFilePath,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  /**\n   * Track a container's state for lifecycle detection\n   */\n  trackContainer(\n    podName: string,\n    containerID: string,\n    startTime: number\n  ): void {\n    if (!this.state.currentImage) {\n      return;\n    }\n\n    const imageState = this.state.images[this.state.currentImage];\n    if (!imageState) {\n      return;\n    }\n\n    const containerKey = `${podName}:${containerID}`;\n    imageState.containers[containerKey] = {\n      podName,\n      containerID,\n      startTime,\n      lastSyncCheck: Date.now(),\n    };\n\n    this.saveState();\n\n    logger.info(\"Tracked container\", {\n      podName,\n      containerID: containerID.substring(0, 12),\n      startTime,\n    });\n  }\n\n  /**\n   * Check if a container needs catch-up sync (is new since last sync)\n   */\n  needsCatchupSync(\n    podName: string,\n    containerID: string,\n    startTime: number\n  ): boolean {\n    if (!this.state.currentImage) {\n      return false;\n    }\n\n    const imageState = this.state.images[this.state.currentImage];\n    if (!imageState) {\n      return false;\n    }\n\n    const containerKey = `${podName}:${containerID}`;\n    const existingContainer = imageState.containers[containerKey];\n\n    // If we haven't seen this container before, it needs catch-up\n    if (!existingContainer) {\n      return true;\n    }\n\n    // If the start time is newer, it's a restarted container\n    if (startTime > existingContainer.startTime) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Get all synced files for the current image that need to be re-synced\n   */\n  getFilesForCatchupSync(): FileState[] {\n    if (!this.state.currentImage) {\n      return [];\n    }\n\n    const imageState = this.state.images[this.state.currentImage];\n    if (!imageState) {\n      return [];\n    }\n\n    return Object.values(imageState.syncedFiles);\n  }\n\n  /**\n   * Get the current image information\n   */\n  getCurrentImageState(): ImageSyncState | undefined {\n    if (!this.state.currentImage) {\n      return undefined;\n    }\n\n    return this.state.images[this.state.currentImage];\n  }\n\n  /**\n   * Clear sync state for debugging or reset\n   */\n  clearState(): void {\n    this.state = {\n      version: \"1.0.0\",\n      images: {},\n    };\n    this.saveState();\n    logger.info(\"Cleared sync state\");\n  }\n}\n","import * as path from \"path\";\nimport { SyncStateManager, FileState } from \"./sync-state\";\nimport { streamFileToPod } from \"../utils/kubectl-stream\";\nimport { exec } from \"../utils/process\";\nimport { logger } from \"../utils/logger\";\n\nexport interface CatchupSyncOptions {\n  namespace: string;\n  podName: string;\n  containerName?: string;\n  syncDestinations: Array<{\n    src: string;\n    dest: string;\n  }>;\n}\n\n/**\n * Handles catch-up sync for containers that have restarted\n */\nexport class CatchupSyncManager {\n  private syncStateManager: SyncStateManager;\n\n  constructor(syncStateManager?: SyncStateManager) {\n    this.syncStateManager = syncStateManager || new SyncStateManager();\n  }\n\n  /**\n   * Perform catch-up sync for a container that needs it\n   */\n  async performCatchupSync(options: CatchupSyncOptions): Promise<void> {\n    const { namespace, podName, containerName, syncDestinations } = options;\n    \n    logger.info('Starting catch-up sync for container', {\n      podName,\n      containerName,\n      namespace,\n      operation: 'catchup_sync_start'\n    });\n    \n    logger.info('catchup - starting file recovery', {\n      podName,\n      containerName,\n      namespace,\n      operation: 'catchup_start'\n    });\n    \n    const filesToSync = this.syncStateManager.getFilesForCatchupSync();\n    if (filesToSync.length === 0) {\n      logger.info('catchup - no files to sync', {\n        podName,\n        containerName,\n        namespace,\n        operation: 'catchup_no_files'\n      });\n      return;\n    }\n\n    logger.info('catchup - files to recover', {\n      podName,\n      containerName,\n      namespace,\n      count: filesToSync.length,\n      operation: 'catchup_list_count'\n    });\n    \n    // Filter out files that no longer exist\n    const existingFiles: typeof filesToSync = [];\n    const projectRoot = process.cwd();\n    \n    for (const fileState of filesToSync) {\n      const localFilePath = path.join(projectRoot, fileState.sourceDirectory, fileState.relativePath);\n      try {\n        const fs = await import('fs');\n        await fs.promises.access(localFilePath, fs.constants.F_OK);\n        existingFiles.push(fileState);\n      } catch {\n        logger.warn('catchup::skip - file no longer exists, skipping', {\n          podName,\n          containerName,\n          namespace,\n          relativePath: fileState.relativePath,\n          operation: 'catchup_skip_missing'\n        });\n      }\n    }\n    \n    if (existingFiles.length === 0) {\n      logger.info('catchup - no existing files to sync', {\n        podName,\n        containerName,\n        namespace,\n        operation: 'catchup_no_existing'\n      });\n      return;\n    }\n    \n    logger.info('catchup - existing files to recover', {\n      podName,\n      containerName,\n      namespace,\n      existingCount: existingFiles.length,\n      skippedCount: filesToSync.length - existingFiles.length,\n      operation: 'catchup_existing_count'\n    });\n    \n    let syncedCount = 0;\n    let errorCount = 0;\n    \n    // Group existing files by their destination base path\n    const filesByDestination = this.groupFilesByDestination(existingFiles, syncDestinations);\n    \n    for (const [destBase, files] of filesByDestination) {\n      try {\n        // Ensure destination directory exists\n        await this.ensureDestinationDirectory(namespace, podName, containerName, destBase);\n        \n        // Sync all files to this destination\n        for (const fileState of files) {\n          try {\n            await this.syncSingleFile(namespace, podName, containerName, fileState, destBase);\n            syncedCount++;\n            logger.info('catchup::create - file synced', {\n              podName,\n              containerName,\n              namespace,\n              relativePath: fileState.relativePath,\n              operation: 'catchup_file_synced'\n            });\n          } catch (error) {\n            errorCount++;\n            const errorMessage = error instanceof Error ? error.message : String(error);\n            logger.warn('catchup::error - failed to sync file', {\n              podName,\n              containerName,\n              namespace,\n              relativePath: fileState.relativePath,\n              error: errorMessage,\n              operation: 'catchup_file_error'\n            });\n          }\n        }\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        logger.error('catchup::error - failed to prepare destination', {\n          podName,\n          containerName,\n          namespace,\n          destination: destBase,\n          error: errorMessage,\n          operation: 'catchup_prepare_dest_error'\n        });\n      }\n    }\n    \n    if (syncedCount > 0) {\n      logger.info('catchup - recovered files', {\n        podName,\n        containerName,\n        namespace,\n        count: syncedCount,\n        operation: 'catchup_recovered_summary'\n      });\n    }\n    \n    if (errorCount > 0) {\n      logger.warn('catchup - files failed', {\n        podName,\n        containerName,\n        namespace,\n        count: errorCount,\n        operation: 'catchup_failed_summary'\n      });\n    }\n    \n    logger.info('Completed catch-up sync for container', {\n      podName,\n      containerName,\n      syncedCount,\n      errorCount,\n      totalFiles: filesToSync.length,\n      operation: 'catchup_sync_complete'\n    });\n  }\n\n  /**\n   * Group files by their destination base path\n   */\n  private groupFilesByDestination(\n    files: FileState[], \n    syncDestinations: Array<{ src: string; dest: string }>\n  ): Map<string, FileState[]> {\n    const groups = new Map<string, FileState[]>();\n    \n    for (const file of files) {\n      // Find which sync destination this file belongs to\n      // For now, just use the first sync destination since we're syncing all files from the same source\n      // TODO: Improve this logic when we support multiple sync sources\n      let destBase = syncDestinations.length > 0 ? syncDestinations[0].dest : '/tmp';\n      \n      if (!groups.has(destBase)) {\n        groups.set(destBase, []);\n      }\n      groups.get(destBase)!.push(file);\n    }\n    \n    return groups;\n  }\n\n  /**\n   * Ensure destination directory exists in the pod with retry for container readiness\n   */\n  private async ensureDestinationDirectory(\n    namespace: string,\n    podName: string,\n    containerName: string | undefined,\n    destBase: string\n  ): Promise<void> {\n    const maxRetries = 5;\n    const retryDelay = 1000; // 1 second\n    \n    for (let attempt = 1; attempt <= maxRetries; attempt++) {\n      try {\n        await exec([\n          \"kubectl\", \"exec\", \"-n\", namespace, podName,\n          ...(containerName ? [\"-c\", containerName] : []),\n          \"--\", \"mkdir\", \"-p\", destBase\n        ]);\n        return; // Success\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        \n        if (attempt === maxRetries) {\n          throw new Error(`Failed to create directory after ${maxRetries} attempts: ${errorMessage}`);\n        }\n        \n        logger.warn('catchup::retry - mkdir failed, will retry', {\n          podName,\n          containerName,\n          namespace,\n          destination: destBase,\n          attempt,\n          maxRetries,\n          delayMs: retryDelay,\n          error: errorMessage,\n          operation: 'catchup_mkdir_retry'\n        });\n        await new Promise(resolve => setTimeout(resolve, retryDelay));\n      }\n    }\n  }\n\n  /**\n   * Sync a single file to the pod\n   */\n  private async syncSingleFile(\n    namespace: string,\n    podName: string,\n    containerName: string | undefined,\n    fileState: FileState,\n    destBase: string\n  ): Promise<void> {\n    // Reconstruct the local file path using the tracked source directory\n    const projectRoot = process.cwd();\n    const localFilePath = path.join(projectRoot, fileState.sourceDirectory, fileState.relativePath);\n    \n    logger.debug('catchup::file - resolving local path', {\n      podName,\n      containerName,\n      namespace,\n      relativePath: fileState.relativePath,\n      sourceDirectory: fileState.sourceDirectory,\n      localFilePath,\n      operation: 'catchup_file_resolve'\n    });\n    \n    // Create the full destination path preserving directory structure\n    const destPath = path.join(destBase, fileState.relativePath);\n    \n    // Create parent directory if needed (with retry)\n    const parentDir = path.dirname(destPath);\n    if (parentDir !== destBase) {\n      await this.ensureDestinationDirectory(namespace, podName, containerName, parentDir);\n    }\n    \n    // Stream the file to the pod (with retry)\n    const maxRetries = 5;\n    const retryDelay = 1000; // 1 second\n    \n    for (let attempt = 1; attempt <= maxRetries; attempt++) {\n      try {\n        await streamFileToPod(localFilePath, namespace, podName, destPath, containerName);\n        break; // Success\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        \n        if (attempt === maxRetries) {\n          throw new Error(`Failed to stream file after ${maxRetries} attempts: ${errorMessage}`);\n        }\n        \n        logger.warn('catchup::retry - file stream failed, will retry', {\n          podName,\n          containerName,\n          namespace,\n          relativePath: fileState.relativePath,\n          destPath,\n          attempt,\n          maxRetries,\n          delayMs: retryDelay,\n          error: errorMessage,\n          operation: 'catchup_stream_retry'\n        });\n        await new Promise(resolve => setTimeout(resolve, retryDelay));\n      }\n    }\n    \n    logger.info('Catch-up synced file to pod', {\n      podName,\n      containerName,\n      namespace,\n      relativePath: fileState.relativePath,\n      destPath,\n      contentHash: fileState.contentHash.substring(0, 12),\n      operation: 'catchup_file_synced_detail'\n    });\n  }\n\n  /**\n   * Check if a container needs catch-up sync\n   */\n  needsCatchupSync(podName: string, containerName?: string): boolean {\n    // Check if there are synced files that need to be restored to containers\n    const currentImage = this.syncStateManager.getCurrentImageState();\n    logger.debug('catchup::manager::check - current image state presence', {\n      podName,\n      containerName,\n      hasCurrentImage: !!currentImage,\n      operation: 'catchup_check_image_presence'\n    });\n    logger.debug('catchup::manager::check - input pod/container', {\n      podName,\n      containerName,\n      operation: 'catchup_check_inputs'\n    });\n    \n    if (!currentImage) {\n      logger.debug('catchup::manager::check - no current image state', {\n        podName,\n        containerName,\n        operation: 'catchup_check_no_image'\n      });\n      return false;\n    }\n    \n    const syncedFileCount = Object.keys(currentImage.syncedFiles).length;\n    const syncedFileNames = Object.keys(currentImage.syncedFiles);\n    logger.debug('catchup::manager::check - synced files summary', {\n      podName,\n      containerName,\n      count: syncedFileCount,\n      files: syncedFileNames,\n      operation: 'catchup_check_synced_summary'\n    });\n    \n    // Check if we have any synced files that need to be restored\n    return syncedFileCount > 0;\n  }\n}\n","/**\n * Global ignore patterns management for file watchers\n * \n * Provides a centralized system for managing ignore patterns that can be\n * extended via CLI flags or programmatic configuration.\n */\n\nexport const DEFAULT_IGNORE_PATTERNS = [\n  \"**/node_modules/**\",\n  \"**/.git/**\",\n  \"**/.idea/**\",\n  \"**/.devtool-*/**\",\n  \"**/.venv/**\",           // Python virtual env\n  \"**/venv/**\",            // Alternative venv name\n  \"**/__pycache__/**\",     // Python cache\n  \"**/.pytest_cache/**\",  // Pytest cache\n  \"**/site-packages/**\",  // Direct site-packages\n];\n\nlet globalIgnorePatterns: string[] = [...DEFAULT_IGNORE_PATTERNS];\n\n/**\n * Set global ignore patterns by combining defaults with custom patterns\n * @param customPatterns Additional patterns to add to defaults\n */\nexport function setGlobalIgnorePatterns(customPatterns: string[]): void {\n  globalIgnorePatterns = [...DEFAULT_IGNORE_PATTERNS, ...customPatterns];\n}\n\n/**\n * Get current global ignore patterns\n * @returns Copy of current ignore patterns array\n */\nexport function getGlobalIgnorePatterns(): string[] {\n  return [...globalIgnorePatterns];\n}\n\n/**\n * Reset ignore patterns to defaults only\n */\nexport function resetIgnorePatterns(): void {\n  globalIgnorePatterns = [...DEFAULT_IGNORE_PATTERNS];\n}\n\n/**\n * Get only the custom patterns (excluding defaults)\n * @returns Custom patterns that were added\n */\nexport function getCustomIgnorePatterns(): string[] {\n  return globalIgnorePatterns.slice(DEFAULT_IGNORE_PATTERNS.length);\n}","/**\n * Helper functions for displaying live update error messages\n */\n\nexport interface ReadOnlyFilesystemErrorParams {\n  destPath: string;\n  pod: string;\n  namespace: string;\n  context?: 'batch' | 'single' | 'fallback';\n}\n\n/**\n * Display helpful error message for read-only filesystem issues\n *\n * This provides consistent error messaging across different sync strategies\n * when encountering read-only filesystem errors.\n *\n * @param params - Error context parameters\n */\nexport function displayReadOnlyFilesystemError(params: ReadOnlyFilesystemErrorParams): void {\n  const contextLabel = params.context === 'batch' ? 'Batch sync' : 'Live sync';\n\n  console.error(`\\n❌ ${contextLabel} failed: Read-only file system`);\n  console.error(`   Destination: ${params.destPath}`);\n  console.error(`   Pod: ${params.pod}`);\n  console.error(`\\n💡 Common causes:`);\n  console.error(`   • Volume is mounted as read-only in your deployment YAML`);\n  console.error(`   • Container filesystem is read-only (check securityContext.readOnlyRootFilesystem)`);\n  console.error(`   • The directory is part of a read-only image layer`);\n  console.error(`\\n🔧 Troubleshooting:`);\n  console.error(`   1. Check your volume mounts: kubectl describe pod ${params.pod} -n ${params.namespace}`);\n  console.error(`   2. Verify deployment securityContext allows writes`);\n  console.error(`   3. Ensure sync destination (${params.destPath}) is writable\\n`);\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as watcher from \"@parcel/watcher\";\nimport type { LiveUpdateBinding, LiveSync, LiveRun } from \"../types/index\";\nimport { exec, execCapture } from \"../utils/process\";\nimport { streamFileToPod } from \"../utils/kubectl-stream\";\nimport { buildWatchEntries, createTar, shQ } from \"../utils/file-watch\";\nimport { logger } from \"../utils/logger\";\nimport { liveUpdateManager } from \"./live-update-manager\";\nimport { PodWatcher } from \"../utils/pod-watcher\";\nimport { SyncStateManager } from \"./sync-state\";\nimport { CatchupSyncManager } from \"./catchup-sync\";\nimport { getGlobalIgnorePatterns } from \"./ignore-patterns\";\nimport { displayReadOnlyFilesystemError } from \"../utils/live-update-errors\";\n\n/**\n * Recursively scan a directory and return all file paths found\n */\nfunction scanDirectoryRecursively(dirPath: string): string[] {\n  const foundFiles: string[] = [];\n  \n  try {\n    const items = fs.readdirSync(dirPath, { withFileTypes: true });\n    \n    for (const item of items) {\n      const itemPath = path.join(dirPath, item.name);\n      \n      if (item.isFile()) {\n        foundFiles.push(itemPath);\n      } else if (item.isDirectory()) {\n        // Recursively scan subdirectories\n        const subFiles = scanDirectoryRecursively(itemPath);\n        foundFiles.push(...subFiles);\n      }\n    }\n  } catch (error) {\n    logger.warn('Failed to scan directory during file discovery', {\n      dirPath,\n      error: error instanceof Error ? error.message : String(error),\n      operation: 'scan_directory_error'\n    });\n  }\n  \n  return foundFiles;\n}\n\n/**\n * Batch sync multiple files to a pod using tar for efficiency\n */\nasync function batchSyncFilesToPod(\n  files: Array<{ relPath: string; srcPath: string; destPath: string }>,\n  absSrc: string,\n  namespace: string,\n  podName: string,\n  containerName?: string\n): Promise<void> {\n  if (files.length === 0) return;\n\n  const tempDir = process.cwd();\n  const tarFileName = `tilt-batch-${Date.now()}-${Math.random().toString(36).slice(2)}.tar`;\n  const localTarPath = path.join(tempDir, tarFileName);\n  const remoteTarPath = `/tmp/${tarFileName}`;\n\n  // Calculate base destination directory early for error reporting\n  const firstDestPath = files[0]?.destPath || \"\";\n  const firstRelPath = files[0]?.relPath || \"\";\n  const baseDestDir = firstDestPath.replace(firstRelPath, \"\").replace(/\\/$/, \"\");\n\n  try {\n    // Create tar archive with relative paths\n    const relativeFiles = files.map(f => f.relPath);\n    await createTar(absSrc, relativeFiles, localTarPath);\n\n    logger.debug('Created tar archive for batch sync', {\n      fileCount: files.length,\n      tarPath: localTarPath,\n      operation: 'batch_sync_tar_created'\n    });\n\n    // Copy tar to pod\n    await exec([\n      \"kubectl\", \"cp\", localTarPath,\n      `${namespace}/${podName}:${remoteTarPath}`,\n      ...(containerName ? [\"-c\", containerName] : [])\n    ]);\n\n    logger.debug('Uploaded tar to pod', {\n      podName,\n      remotePath: remoteTarPath,\n      operation: 'batch_sync_uploaded'\n    });\n\n    // Extract tar in pod to the correct base destination directory\n    \n    await exec([\n      \"kubectl\", \"exec\", \"-n\", namespace, podName,\n      ...(containerName ? [\"-c\", containerName] : []),\n      \"--\", \"tar\", \"-xf\", remoteTarPath, \"-C\", baseDestDir\n    ]);\n\n    logger.info('Batch sync completed successfully', {\n      fileCount: files.length,\n      podName,\n      baseDestDir,\n      operation: 'batch_sync_completed'\n    });\n\n    // Clean up remote tar\n    await exec([\n      \"kubectl\", \"exec\", \"-n\", namespace, podName,\n      ...(containerName ? [\"-c\", containerName] : []),\n      \"--\", \"rm\", \"-f\", remoteTarPath\n    ]);\n\n    // Log each file for debugging\n    logger.debug('Batch synced files', {\n      files: files.map(f => f.relPath),\n      operation: 'batch_sync_files'\n    });\n\n  } catch (error: any) {\n    const errorMessage = error instanceof Error ? error.message : String(error);\n\n    // Check for read-only filesystem error\n    if (errorMessage.includes('Read-only file system')) {\n      displayReadOnlyFilesystemError({\n        destPath: baseDestDir,\n        pod: podName,\n        namespace,\n        context: 'batch'\n      });\n\n      logger.error('Read-only filesystem detected in batch sync', {\n        podName,\n        baseDestDir,\n        operation: 'batch_sync_readonly_error'\n      });\n\n      const readOnlyError = new Error(`Read-only file system: Cannot write to ${baseDestDir}`);\n      (readOnlyError as any).isReadOnlyFilesystem = true;\n      throw readOnlyError;\n    }\n\n    logger.error('Batch sync failed', {\n      error: errorMessage,\n      fileCount: files.length,\n      podName,\n      operation: 'batch_sync_error'\n    });\n    throw error;\n  } finally {\n    // Clean up local tar file\n    try {\n      if (fs.existsSync(localTarPath)) {\n        fs.unlinkSync(localTarPath);\n      }\n    } catch (cleanupError) {\n      logger.warn('Failed to cleanup local tar file', {\n        error: cleanupError instanceof Error ? cleanupError.message : String(cleanupError),\n        tarPath: localTarPath,\n        operation: 'batch_sync_cleanup_failed'\n      });\n    }\n  }\n}\n\nasync function live_update_binding(bind: LiveUpdateBinding) {\n  const ns = bind.selector.namespace || \"default\";\n  const containerName = bind.selector.container;\n\n  // Configuration for batch sync threshold\n  const BATCH_SYNC_THRESHOLD = parseInt(process.env.TILT_BATCH_SYNC_THRESHOLD || \"2\");\n\n  // Initialize sync state management\n  const syncStateManager = new SyncStateManager();\n  const catchupSyncManager = new CatchupSyncManager(syncStateManager);\n\n  // Start pod watcher for efficient pod tracking and container lifecycle monitoring\n  const podWatcher = new PodWatcher();\n  await podWatcher.start(bind.selector);\n\n  // Set up container lifecycle event handling (now integrated in PodWatcher)\n  podWatcher.onContainerEvent(async (event) => {\n    if (event.type === 'restarted') {\n      logger.info('Container restarted', {\n        podName: event.container.podName,\n        containerID: event.container.containerID.substring(0, 12),\n        operation: 'container_restart'\n      });\n    } else if (event.type === 'started') {\n      logger.info('New container detected', {\n        podName: event.container.podName,\n        containerID: event.container.containerID.substring(0, 12),\n        operation: 'container_start'\n      });\n      \n      // Trigger catch-up sync for new containers if needed\n      const podName = event.container.podName;\n      const podWatcherNeedsCatchup = podWatcher.needsCatchupSync(podName, containerName);\n      const catchupManagerNeedsCatchup = catchupSyncManager.needsCatchupSync(podName, containerName);\n      \n      if (podWatcherNeedsCatchup && catchupManagerNeedsCatchup) {\n        logger.info('Initiating catch-up sync for new container', {\n          podName,\n          operation: 'catchup_sync_start'\n        });\n        \n        const syncDestinations = syncSteps.map(s => ({\n          src: s.src,\n          dest: s.dest\n        }));\n        \n        try {\n          await catchupSyncManager.performCatchupSync({\n            namespace: ns,\n            podName,\n            containerName,\n            syncDestinations\n          });\n        } catch (error) {\n          const errorMessage = error instanceof Error ? error.message : String(error);\n          logger.error('Catch-up sync failed', {\n            podName,\n            error: errorMessage,\n            operation: 'catchup_sync_error'\n          });\n          logger.error('Failed to perform catch-up sync for new container', {\n            podName,\n            containerName,\n            error: errorMessage\n          });\n        }\n      }\n    }\n  });\n\n  // Replace slow currentPods() with instant cached lookup\n  async function currentPods(): Promise<string[]> {\n    const pods = podWatcher.getRunningPods();\n    \n    if (pods.length > 0) {\n      logger.info('Found running pods for operations (cached)', {\n        runningPodCount: pods.length,\n        runningPods: pods,\n        operation: 'current_pods_cached'\n      });\n    } else {\n      logger.warn('No running pods found for operations (cached)', {\n        operation: 'current_pods_cached'\n      });\n    }\n    \n    return pods;\n  }\n\n  const syncSteps = bind.steps.filter((s) => s.type === \"sync\") as LiveSync[];\n  const runSteps = bind.steps.filter((s) => s.type === \"run\") as LiveRun[];\n\n  const watchTargets = [\n    ...syncSteps.map((s) => s.src),\n    ...runSteps.flatMap((r) => r.whenFilesChanged || []),\n  ];\n  const entries = buildWatchEntries(watchTargets);\n\n  for (const e of entries) {\n    logger.info('Setting up file watcher', { \n      root: e.root, \n      fileCount: e.files.size,\n      isDirectoryWatch: e.files.size === 0,\n      absoluteRoot: path.resolve(e.root),\n      operation: 'watch_setup'\n    });\n  }\n  const projectRoot = process.cwd();\n  const changedSet = new Set<string>();\n  let timer: any = null;\n\n  // Persistent cache to avoid redundant directory creation across all sync cycles\n  const createdDirs = new Set<string>();\n\n  async function flush() {\n    if (changedSet.size === 0) return;\n    const changes = Array.from(changedSet.values());\n    changedSet.clear();\n\n    let pods: string[];\n    try {\n      pods = await currentPods();\n      \n      // Container restart detection is now handled automatically by PodWatcher\n      // Note: Catch-up sync will be performed after file syncing is complete\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      logger.error('Failed to get pods', {\n        operation: 'get_pods_error'\n      });\n      logger.warn('Failed to get current pods, skipping this sync cycle', {\n        error: errorMessage.replace(/^command failed \\d+: /, ''),\n        changeCount: changes.length\n      });\n      return;\n    }\n    \n    if (pods.length === 0) {\n      logger.warn('No running pods found', {\n        operation: 'no_pods_warning'\n      });\n      logger.info('No running pods available, skipping sync cycle', {\n        changeCount: changes.length\n      });\n      return;\n    }\n\n    for (const s of syncSteps) {\n      const absSrc = path.resolve(projectRoot, s.src);\n      \n      // Separate existing and deleted files\n      // Include files that are within the sync source directory (including subdirectories)\n      const allRelativeChanges = changes\n        .filter((p) => {\n          // Check if the change is within this sync source\n          const rel = path.relative(absSrc, p);\n          // Include if it's within the directory and not going up (..)\n          return rel && !rel.startsWith('..') && rel !== '.';\n        })\n        .map((p) => path.relative(absSrc, p));\n\n      const rels = allRelativeChanges.filter((p) => {\n        const fullPath = path.join(absSrc, p);\n        return fs.existsSync(fullPath);\n      });\n\n      const deletedFiles = allRelativeChanges.filter((p) => {\n        const fullPath = path.join(absSrc, p);\n        return !fs.existsSync(fullPath);\n      });\n\n      logger.debug('Filtering file changes for sync step', {\n        srcPath: s.src,\n        absSrc,\n        totalChanges: changes.length,\n        allChanges: changes.map(p => path.relative(projectRoot, p)),\n        allRelativeChanges,\n        matchingFiles: rels,\n        deletedFiles,\n        operation: 'sync_filter_debug'\n      });\n      \n      logger.info('Filtered files for sync', {\n        totalChanges: changes.length,\n        absSrc,\n        matchingFiles: rels,\n        deletedFiles: deletedFiles,\n        allChanges: changes\n      });\n\n      // Handle file deletions first\n      if (deletedFiles.length > 0) {\n        for (const pod of pods) {\n          for (const deletedFile of deletedFiles) {\n            const destPath = `${s.dest}/${deletedFile}`;\n            \n            logger.info('Deleting file from pod', {\n              pod,\n              destPath,\n              command: `kubectl exec -n ${ns} ${pod} ${containerName ? `-c ${containerName}` : ''} -- rm -rf ${destPath}`\n            });\n            \n            try {\n              await exec([\n                \"kubectl\", \"exec\", \"-n\", ns, pod, ...(containerName ? [\"-c\", containerName] : []),\n                \"--\", \"rm\", \"-rf\", destPath\n              ]);\n              \n              // If we deleted a directory, invalidate cache entries that might be affected\n              const dirKey = `${pod}:${containerName || 'default'}:${path.dirname(destPath)}`;\n              const fileParentKey = `${pod}:${containerName || 'default'}:${destPath}`;\n              if (createdDirs.has(dirKey) || createdDirs.has(fileParentKey)) {\n                createdDirs.delete(dirKey);\n                createdDirs.delete(fileParentKey);\n              }\n              \n              logger.info('File deleted from container', {\n                deletedFile,\n                operation: 'sync_delete'\n              });\n            } catch (error) {\n              const errorMessage = error instanceof Error ? error.message : String(error);\n              logger.warn('Failed to delete file from container', {\n                deletedFile,\n                error: errorMessage,\n                operation: 'sync_delete_error'\n              });\n              logger.warn('Failed to delete file/directory (may not exist)', {\n                deletedFile,\n                pod,\n                error: errorMessage\n              });\n              // Continue with other deletions - file might not exist in pod\n            }\n          }\n        }\n      }\n\n      if (rels.length === 0) continue;\n\n      console.log(`🔄 Syncing ${rels.length} files: ${rels.join(', ')}`);\n      \n      logger.info('Syncing files directly to pods', { \n        fileCount: rels.length,\n        podCount: pods.length,\n        source: path.relative(projectRoot, absSrc),\n        dest: s.dest,\n        files: rels\n      });\n\n      for (const pod of pods) {\n        const dest = s.dest;\n        \n        logger.info('Processing pod for sync', {\n          pod,\n          namespace: ns,\n          container: containerName,\n          dest\n        });\n        \n        try {\n          // Create destination directory in pod (only if not already created)\n          const dirKey = `${pod}:${containerName || 'default'}:${dest}`;\n          \n          if (!createdDirs.has(dirKey)) {\n            logger.info('Creating directory in pod', {\n              pod,\n              command: `kubectl exec -n ${ns} ${pod} ${containerName ? `-c ${containerName}` : ''} -- mkdir -p ${dest}`\n            });\n            \n            await exec([\n              \"kubectl\", \"exec\", \"-n\", ns, pod, ...(containerName ? [\"-c\", containerName] : []),\n              \"--\", \"mkdir\", \"-p\", dest\n            ]);\n            \n            createdDirs.add(dirKey);\n          }\n\n          // Separate files and directories for processing\n          const filesToSync: Array<{ relPath: string; srcPath: string; destPath: string }> = [];\n          const dirsToCreate: Array<{ relPath: string; destPath: string }> = [];\n\n          for (const relFile of rels) {\n            const srcFile = path.join(absSrc, relFile);\n            const destPath = `${dest}/${relFile}`;\n            \n            // Check if it's a directory\n            const stat = fs.statSync(srcFile);\n            if (stat.isDirectory()) {\n              dirsToCreate.push({ relPath: relFile, destPath });\n            } else {\n              filesToSync.push({ relPath: relFile, srcPath: srcFile, destPath });\n            }\n          }\n\n          // Handle directories first\n          for (const dir of dirsToCreate) {\n            logger.debug('Creating directory in pod', {\n              directory: dir.relPath,\n              pod,\n              destPath: dir.destPath,\n              operation: 'sync_mkdir'\n            });\n            \n            const dirKey = `${pod}:${containerName || 'default'}:${dir.destPath}`;\n            if (!createdDirs.has(dirKey)) {\n              await exec([\n                \"kubectl\", \"exec\", \"-n\", ns, pod, ...(containerName ? [\"-c\", containerName] : []),\n                \"--\", \"mkdir\", \"-p\", dir.destPath\n              ]);\n              createdDirs.add(dirKey);\n            }\n            \n            // Recursively scan for files inside the directory and add them to changes for syncing\n            const dirSrcPath = path.join(absSrc, dir.relPath);\n            logger.debug('Scanning directory recursively for files', {\n              directory: dirSrcPath,\n              operation: 'sync_directory_scan'\n            });\n            \n            try {\n              const foundFiles = scanDirectoryRecursively(dirSrcPath);\n              \n              logger.debug('Found files in directory', {\n                directory: dirSrcPath,\n                fileCount: foundFiles.length,\n                files: foundFiles.map(f => path.relative(process.cwd(), f)),\n                operation: 'sync_files_discovered'\n              });\n              \n              for (const fileAbsPath of foundFiles) {\n                changedSet.add(fileAbsPath);\n              }\n              \n              // If we found files, trigger another flush to process them\n              if (foundFiles.length > 0) {\n                logger.debug('Triggering additional flush for directory files', {\n                  fileCount: foundFiles.length,\n                  directory: dirSrcPath,\n                  operation: 'sync_additional_flush'\n                });\n                if (timer) clearTimeout(timer);\n                timer = setTimeout(flush, 50); // Short delay to process directory contents\n              }\n            } catch (error) {\n              logger.error('Error scanning directory', {\n                directory: dirSrcPath,\n                error: error instanceof Error ? error.message : String(error),\n                operation: 'sync_directory_scan_error'\n              });\n            }\n          }\n\n          // Skip if no files to sync\n          if (filesToSync.length === 0) continue;\n\n          // Ensure parent directories exist for all files\n          for (const file of filesToSync) {\n            const parentDir = path.dirname(file.destPath);\n            if (parentDir && parentDir !== dest) {\n              const parentDirKey = `${pod}:${containerName || 'default'}:${parentDir}`;\n              if (!createdDirs.has(parentDirKey)) {\n                await exec([\n                  \"kubectl\", \"exec\", \"-n\", ns, pod, ...(containerName ? [\"-c\", containerName] : []),\n                  \"--\", \"mkdir\", \"-p\", parentDir\n                ]);\n                createdDirs.add(parentDirKey);\n              }\n            }\n          }\n\n          // Choose sync strategy based on file count\n          if (filesToSync.length <= BATCH_SYNC_THRESHOLD) {\n            logger.info('Using single file sync strategy', {\n              fileCount: filesToSync.length,\n              threshold: BATCH_SYNC_THRESHOLD,\n              pod,\n              operation: 'sync_strategy_single'\n            });\n            \n            // Single file sync for small changes\n            for (const file of filesToSync) {\n              logger.debug('Streaming file to pod', {\n                pod,\n                srcFile: path.relative(projectRoot, file.srcPath),\n                destPath: file.destPath,\n                operation: 'sync_file_stream'\n              });\n\n              try {\n                await streamFileToPod(file.srcPath, ns, pod, file.destPath, containerName);\n                syncStateManager.trackFileSync(file.relPath, file.srcPath, s.src);\n\n                logger.debug('File synced successfully', {\n                  file: file.relPath,\n                  pod,\n                  operation: 'sync_file_created'\n                });\n              } catch (fileError: any) {\n                if (fileError.isReadOnlyFilesystem) {\n                  displayReadOnlyFilesystemError({\n                    destPath: file.destPath,\n                    pod,\n                    namespace: ns,\n                    context: 'single'\n                  });\n\n                  logger.error('Read-only filesystem detected', {\n                    pod,\n                    destPath: file.destPath,\n                    dest,\n                    operation: 'sync_readonly_error'\n                  });\n                  throw fileError;\n                }\n                throw fileError;\n              }\n            }\n          } else {\n            logger.info('Using batch sync strategy', {\n              fileCount: filesToSync.length,\n              threshold: BATCH_SYNC_THRESHOLD,\n              pod,\n              operation: 'sync_strategy_batch'\n            });\n            \n            // Batch sync for large changes\n            try {\n              await batchSyncFilesToPod(filesToSync, absSrc, ns, pod, containerName);\n              \n              // Track all files for state management\n              for (const file of filesToSync) {\n                syncStateManager.trackFileSync(file.relPath, file.srcPath, s.src);\n              }\n            } catch (batchError) {\n              const batchErrorMessage = batchError instanceof Error ? batchError.message : String(batchError);\n              logger.warn('Batch sync failed, falling back to single file sync', {\n                error: batchErrorMessage,\n                fileCount: filesToSync.length,\n                pod,\n                operation: 'sync_batch_fallback'\n              });\n              \n              // Fallback to single file sync\n              for (const file of filesToSync) {\n                try {\n                  await streamFileToPod(file.srcPath, ns, pod, file.destPath, containerName);\n                  syncStateManager.trackFileSync(file.relPath, file.srcPath, s.src);\n\n                  logger.debug('File synced via fallback', {\n                    file: file.relPath,\n                    pod,\n                    operation: 'sync_fallback_created'\n                  });\n                } catch (singleError: any) {\n                  if (singleError.isReadOnlyFilesystem) {\n                    displayReadOnlyFilesystemError({\n                      destPath: file.destPath,\n                      pod,\n                      namespace: ns,\n                      context: 'fallback'\n                    });\n\n                    logger.error('Read-only filesystem detected in fallback sync', {\n                      pod,\n                      destPath: file.destPath,\n                      dest,\n                      operation: 'sync_readonly_error'\n                    });\n                    throw singleError;\n                  }\n\n                  const singleErrorMessage = singleError instanceof Error ? singleError.message : String(singleError);\n                  logger.error('Single file sync failed in fallback', {\n                    file: file.relPath,\n                    error: singleErrorMessage,\n                    pod,\n                    operation: 'sync_fallback_error'\n                  });\n                }\n              }\n            }\n          }\n        } catch (error) {\n          const errorMessage = error instanceof Error ? error.message : String(error);\n          logger.error('Sync step failed', {\n            srcPath: s.src,\n            error: errorMessage,\n            operation: 'sync_step_error'\n          });\n          logger.warn('Sync operation failed for pod, will retry on next file change', {\n            pod,\n            dest,\n            source: s.src,\n            error: errorMessage.replace(/^command failed \\d+: /, ''),\n            container: containerName\n          });\n          continue;\n        }\n      }\n    }\n\n    // Perform catch-up sync for any containers that need it (after file syncing is complete)\n    for (const pod of pods) {\n      const podWatcherNeedsCatchup = podWatcher.needsCatchupSync(pod, containerName);\n      const catchupManagerNeedsCatchup = catchupSyncManager.needsCatchupSync(pod, containerName);\n      \n      logger.debug('Checking if pod needs catch-up sync', {\n        podName: pod,\n        podWatcherNeedsCatchup,\n        catchupManagerNeedsCatchup,\n        operation: 'catchup_check'\n      });\n      \n      if (podWatcherNeedsCatchup && catchupManagerNeedsCatchup) {\n        logger.info('Container restart detected, starting catch-up sync', {\n          podName: pod,\n          operation: 'catchup_restart_detected'\n        });\n        \n        const syncDestinations = syncSteps.map(s => ({\n          src: s.src,\n          dest: s.dest\n        }));\n        \n        await catchupSyncManager.performCatchupSync({\n          namespace: ns,\n          podName: pod,\n          containerName,\n          syncDestinations\n        });\n      }\n    }\n\n    const changedAbs = new Set(changes.map((p) => path.resolve(p)));\n    for (const r of runSteps) {\n      const filters = (r.whenFilesChanged || []).map((p) => path.resolve(projectRoot, p));\n      let triggerFiles: string[] = [];\n      \n      if (filters.length > 0) {\n        triggerFiles = filters.filter(f => changedAbs.has(f)).map(f => path.relative(projectRoot, f));\n        if (triggerFiles.length === 0) continue;\n      } else {\n        triggerFiles = changes.map(f => path.relative(projectRoot, f));\n      }\n\n      const execEnv = Object.entries(r.env || {}).map(([k, v]) => `${k}=${shQ(v)}`).join(\" \");\n      const work = r.dir ? `cd ${shQ(r.dir)} && ` : \"\";\n      const cmd = r.cmd.map(shQ).join(\" \");\n      \n      logger.info(`runStep triggered by file changes`, {\n        command: r.cmd.join(' '),\n        triggerFiles,\n        dir: r.dir || '.',\n        podCount: pods.length\n      });\n      \n      logger.info('Executing run step', {\n        command: r.cmd.join(' '),\n        operation: 'run_step_execute'\n      });\n\n      for (const pod of pods) {\n        try {\n          await exec([\n            \"kubectl\", \"exec\", \"-n\", ns, pod, ...(containerName ? [\"-c\", containerName] : []),\n            \"--\", \"sh\", \"-lc\", `${execEnv ? execEnv + \" \" : \"\"}${work}${cmd}`\n          ]);\n        } catch (error) {\n          const errorMessage = error instanceof Error ? error.message : String(error);\n          const cleanError = errorMessage.replace(/^command failed \\d+: kubectl exec.*-- sh -lc /, '');\n          logger.error('Run step failed', {\n            command: r.cmd.join(' '),\n            error: cleanError,\n            operation: 'run_step_error'\n          });\n          logger.warn(`runStep failed for pod, will retry on next file change`, {\n            command: r.cmd.join(' '),\n            triggerFiles,\n            pod,\n            dir: r.dir || '.',\n            error: cleanError,\n            container: containerName\n          });\n          continue;\n        }\n      }\n    }\n  }\n\n  const subs: { unsubscribe: () => Promise<void> }[] = [];\n  for (const e of entries) {\n    if (!fs.existsSync(e.root)) {\n      logger.warn('Watch root does not exist', { root: e.root });\n      continue;\n    }\n    const includeFiles = e.files;\n    const isDirectoryWatch = includeFiles.size === 0;\n    \n    try {\n      const sub = await watcher.subscribe(\n        e.root,\n        (err, events) => {\n          if (err) {\n            logger.error('File watcher error', { root: e.root, error: err.message });\n            return;\n          }\n          \n          logger.info('File changes detected', { \n            root: e.root, \n            eventCount: events.length,\n            files: events.map(ev => path.relative(projectRoot, ev.path)),\n            operation: 'file_watcher'\n          });\n          for (const ev of events) {\n            const abs = path.resolve(ev.path);\n            if (isDirectoryWatch || includeFiles.has(abs)) {\n              changedSet.add(abs);\n            }\n          }\n          if (timer) clearTimeout(timer);\n          timer = setTimeout(flush, 150);\n        },\n        {\n          backend:\"inotify\",\n          ignore: getGlobalIgnorePatterns(),\n        }\n      );\n      subs.push(sub);\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      \n      if (errorMessage.includes('No space left on device') || errorMessage.includes('inotify_add_watch')) {\n        logger.error('inotify watch limit exceeded - file watching disabled for this directory', {\n          root: e.root,\n          error: errorMessage,\n          suggestion: 'Increase fs.inotify.max_user_watches or exclude more directories',\n          operation: 'file_watcher_inotify_limit'\n        });\n        console.error(`❌ File watching failed for ${e.root}`);\n        console.error('💡 Suggestion: Increase inotify limits with: echo 524288 | sudo tee /proc/sys/fs/inotify/max_user_watches');\n        console.error('💡 Or exclude more directories in your live_update configuration');\n      } else {\n        logger.error('File watcher setup failed', { \n          root: e.root, \n          error: errorMessage,\n          operation: 'file_watcher_setup_error'\n        });\n        console.error(`❌ File watching failed for ${e.root}: ${errorMessage}`);\n      }\n      \n      // Continue with other watchers instead of failing completely\n      continue;\n    }\n  }\n\n  logger.info('Live update started', { \n    kind: bind.selector.kind, \n    name: bind.selector.name, \n    namespace: ns,\n    container: containerName\n  });\n\n  // Setup cleanup handler with proper exit\n  let isShuttingDown = false;\n  \n  const cleanup = () => {\n    if (isShuttingDown) return;\n    isShuttingDown = true;\n    \n    logger.info('Cleaning up live update resources', {\n      operation: 'cleanup_start'\n    });\n    podWatcher.stop();\n    for (const sub of subs) {\n      sub.unsubscribe().catch(() => {});\n    }\n    \n    // Force exit after cleanup\n    setTimeout(() => {\n      logger.warn('Force exiting live update', {\n        operation: 'force_exit'\n      });\n      process.exit(0);\n    }, 1000);\n  };\n\n  process.on('SIGINT', cleanup);\n  process.on('SIGTERM', cleanup);\n\n  try {\n    while (!isShuttingDown) {\n      await new Promise((r) => setTimeout(r, 1000));\n    }\n  } finally {\n    cleanup();\n  }\n}\n\n/**\n * Start live updates for a specific binding (legacy mode)\n */\nexport async function live_update(bind: LiveUpdateBinding): Promise<void>;\n\n/**\n * Start live updates using the LiveUpdateManager (new mode)\n * This is the main function to be called at the end of tiltfile.ts\n */\nexport async function live_update(): Promise<void>;\n\nexport async function live_update(bind?: LiveUpdateBinding): Promise<void> {\n  if (bind) {\n    // Legacy single binding mode\n    return live_update_binding(bind);\n  }\n  \n  // New manager-based mode\n  logger.info('Starting live updates', {\n    operation: 'live_update_start'\n  });\n  \n  // Force reload state when called from CLI context (after tiltfile execution)\n  // This ensures we pick up registrations made in the tiltfile module context\n  const sessionId = process.env.TILT_TS_SESSION_ID;\n  liveUpdateManager.forceReloadState(sessionId);\n  \n  // Also reload imageRegistry state for correlation\n  const { imageRegistry } = await import('../core/image-registry');\n  imageRegistry.forceReloadState(sessionId);\n  \n  // Get current status before starting\n  const beforeStatus = liveUpdateManager.getStatus();\n  \n  logger.info('Live update manager status before start', {\n    isStarted: beforeStatus.isStarted,\n    registrationCount: beforeStatus.registrationCount,\n    correlationCount: beforeStatus.correlationCount,\n    imageCount: beforeStatus.images.length,\n    deploymentCount: beforeStatus.deployments.length,\n    operation: 'live_update_debug'\n  });\n  \n  logger.info('Live update status check', {\n    imagesRegistered: beforeStatus.images.length,\n    images: beforeStatus.images,\n    deploymentsRegistered: beforeStatus.deployments.length,\n    deployments: beforeStatus.deployments,\n    totalRegistrations: beforeStatus.registrationCount,\n    operation: 'live_update_status'\n  });\n  \n  if (beforeStatus.registrationCount === 0) {\n    logger.warn('No resources registered for live updates', {\n      message: 'Make sure to call docker_build() and k8s_file().apply() before live_update()',\n      operation: 'no_resources_warning'\n    });\n    return;\n  }\n  \n  await liveUpdateManager.start();\n  \n  // Get status after starting\n  const afterStatus = liveUpdateManager.getStatus();\n  logger.info('Image-deployment correlations found', {\n    correlationCount: afterStatus.correlationCount,\n    operation: 'correlations_found'\n  });\n  \n  if (afterStatus.correlationCount === 0) {\n    logger.warn('No correlations found between images and deployments', {\n      troubleshooting: [\n        'Image tags don\\'t match what\\'s in your k8s YAML',\n        'Images were built but k8s resources don\\'t reference them',\n        'Check that updateImages() is being called correctly'\n      ],\n      operation: 'no_correlations_warning'\n    });\n  } else {\n    logger.info('Live updates started successfully', {\n      message: 'File watchers are now active and will sync changes to running pods',\n      operation: 'live_update_success'\n    });\n  }\n}","import { exec, execCapture } from \"../utils/process\";\nimport { logger } from \"../utils/logger\";\n\n// Default contexts that are considered safe for local development\nconst DEFAULT_SAFE_CONTEXTS = new Set([\n  \"minikube\",\n  \"docker-desktop\",\n  \"docker-for-desktop\",\n  \"microk8s\",\n  \"crc-admin\", // Red Hat CodeReady Containers\n  \"crc-developer\",\n  \"kind-kind\",\n  \"krucible\",\n  // k3d contexts (various naming patterns)\n  \"k3d-default\",\n  \"k3d-local\",\n  \"k3d-dev\",\n]);\n\n// Contexts that match these patterns are considered safe\nconst DEFAULT_SAFE_PATTERNS = [\n  /^kind-/, // Kind clusters\n  /^k3d-/, // K3D clusters\n  /^minikube/, // Minikube variants\n  /^docker-/, // Docker Desktop variants\n  /^microk8s/, // MicroK8s variants\n  /localhost/, // Localhost contexts\n  /127\\.0\\.0\\.1/, // Local IP contexts\n  /\\.local$/, // .local domain contexts\n];\n\nlet allowedContexts: Set<string> = new Set(DEFAULT_SAFE_CONTEXTS);\nlet allowedPatterns: RegExp[] = [...DEFAULT_SAFE_PATTERNS];\n\n/**\n * Get the current Kubernetes context\n */\nexport async function k8s_context(): Promise<string> {\n  try {\n    const result = await execCapture([\"kubectl\", \"config\", \"current-context\"]);\n    return result.trim();\n  } catch (error) {\n    logger.error(\"Failed to get current Kubernetes context\", {\n      error: String(error),\n    });\n    throw new Error(\"Failed to get current Kubernetes context\");\n  }\n}\n\n/**\n * Get the current Kubernetes namespace from the context\n */\nexport async function k8s_namespace(): Promise<string> {\n  try {\n    const result = await execCapture([\n      \"kubectl\", \n      \"config\", \n      \"view\", \n      \"--minify\", \n      \"--output\", \n      \"jsonpath={..namespace}\"\n    ]);\n    const namespace = result.trim();\n    return namespace || \"default\";\n  } catch (error) {\n    logger.warn(\"Failed to get current Kubernetes namespace, using 'default'\", {\n      error: String(error),\n    });\n    return \"default\";\n  }\n}\n\n/**\n * Check if a context is safe for development\n */\nfunction isContextSafe(context: string): boolean {\n  // Check exact matches\n  if (allowedContexts.has(context)) {\n    return true;\n  }\n\n  // Check pattern matches\n  return allowedPatterns.some((pattern) => pattern.test(context));\n}\n\n/**\n * Allow additional Kubernetes contexts for Tilt operations\n * Similar to Tilt's allow_k8s_contexts function\n *\n * @param contexts - A string or array of context names to allow\n */\nexport function allow_k8s_contexts(contexts: string | string[]): void {\n  const contextList = Array.isArray(contexts) ? contexts : [contexts];\n\n  for (const context of contextList) {\n    allowedContexts.add(context);\n    logger.info(\"Added allowed Kubernetes context\", {\n      context,\n      operation: \"allow_k8s_contexts\",\n    });\n  }\n}\n\n/**\n * Validate that the current context is safe for development\n * Throws an error if the context is not allowed\n */\nexport async function validate_k8s_context(): Promise<void> {\n  const currentContext = await k8s_context();\n\n  if (!isContextSafe(currentContext)) {\n    const allowedList = Array.from(allowedContexts).concat(\n      allowedPatterns.map((p) => p.source)\n    );\n\n    logger.error(\"Unsafe Kubernetes context detected\", {\n      currentContext,\n      allowedContexts: allowedList,\n      operation: \"validate_k8s_context\",\n    });\n\n    throw new Error(\n      `Unsafe Kubernetes context '${currentContext}'.\\n` +\n        `To protect against accidental deployment to production, only safe contexts are allowed.\\n` +\n        `Add this context to the allow list with: allow_k8s_contexts('${currentContext}')\\n` +\n        `Or disable the check entirely with: allow_k8s_contexts(k8s_context())\\n` +\n        `Allowed contexts: ${allowedList.join(\", \")}`\n    );\n  }\n\n  logger.info(\"Kubernetes context validated\", {\n    context: currentContext,\n    operation: \"validate_k8s_context\",\n  });\n}\n\n/**\n * Set the Kubernetes context after validating it's safe\n * This function combines setting and allowing the context in one step\n *\n * @param context - The context name to switch to\n * @param validate - Whether to validate the context is safe (default: true)\n */\nexport async function set_k8s_context(\n  context: string,\n  validate: boolean = true\n): Promise<void> {\n  // First allow the context (adds it to allowed list)\n  allow_k8s_contexts(context);\n\n  logger.info(\"Switching to Kubernetes context\", {\n    context,\n    validate,\n    operation: \"set_k8s_context\",\n  });\n\n  try {\n    // Switch to the context\n    await exec([\"kubectl\", \"config\", \"use-context\", context]);\n\n    // Validate if requested\n    if (validate) {\n      await validate_k8s_context();\n    }\n\n    logger.info(\"Successfully switched Kubernetes context\", {\n      context,\n      operation: \"set_k8s_context\",\n    });\n  } catch (error: any) {\n    logger.error(\"Failed to switch Kubernetes context\", {\n      context,\n      error: String(error),\n      operation: \"set_k8s_context\",\n    });\n    console.error(`Failed to switch to context '${context}': ${error.message}`);\n    process.exit(-1);\n  }\n}\n\n/**\n * Reset allowed contexts to defaults\n * Useful for testing or resetting state\n */\nexport function reset_allowed_contexts(): void {\n  allowedContexts = new Set(DEFAULT_SAFE_CONTEXTS);\n  allowedPatterns = [...DEFAULT_SAFE_PATTERNS];\n  logger.info(\"Reset allowed contexts to defaults\", {\n    operation: \"reset_allowed_contexts\",\n  });\n}\n\n/**\n * Set the current Kubernetes namespace\n *\n * @param namespace - The namespace to set as current\n */\nexport async function set_k8s_namespace(namespace: string): Promise<void> {\n  logger.info(\"Setting Kubernetes namespace\", {\n    namespace,\n    operation: \"set_k8s_namespace\",\n  });\n\n  try {\n    await execCapture([\n      \"kubectl\",\n      \"config\",\n      \"set-context\",\n      \"--current\",\n      `--namespace=${namespace}`,\n    ]);\n\n    logger.info(\"Successfully set Kubernetes namespace\", {\n      namespace,\n      operation: \"set_k8s_namespace\",\n    });\n  } catch (error: any) {\n    logger.error(\"Failed to set Kubernetes namespace\", {\n      namespace,\n      error: String(error),\n      operation: \"set_k8s_namespace\",\n    });\n    console.error(`Failed to set namespace '${namespace}': ${error.message}`);\n    process.exit(-1);\n  }\n}\n\n/**\n * Get currently allowed contexts and patterns\n * Useful for debugging and introspection\n */\nexport function get_allowed_contexts(): {\n  contexts: string[];\n  patterns: string[];\n} {\n  return {\n    contexts: Array.from(allowedContexts),\n    patterns: allowedPatterns.map((p) => p.source),\n  };\n}\n","import type { BuiltImage } from \"../types/index\";\nimport type { K8sResource } from \"../utils/yaml-wrapper\";\nimport { logger } from \"../utils/logger\";\nimport { correlateImages, autoStartLiveUpdates, type CorrelatedImage } from \"../utils/image-correlation\";\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface LiveUpdateRegistration {\n  type: 'image' | 'deployment';\n  resource: BuiltImage | K8sResource;\n  timestamp: number;\n}\n\n/**\n * Singleton manager for coordinating live updates across all resources\n */\nexport class LiveUpdateManager {\n  private static instance: LiveUpdateManager;\n  private registrations = new Map<string, LiveUpdateRegistration>();\n  private correlations: CorrelatedImage[] = [];\n  private isStarted = false;\n  private stateFile: string;\n\n  private constructor() {\n    const sessionId = process.env.TILT_TS_SESSION_ID || 'default';\n    // Use the same state directory regardless of where tilt-ts is installed\n    // This ensures state files are shared between tiltfile execution and CLI\n    this.stateFile = path.join(process.cwd(), '.tilt-ts', `live-update-${sessionId}.json`);\n    \n    logger.info('LiveUpdateManager initialized', {\n      sessionId,\n      stateFile: this.stateFile,\n      cwd: process.cwd(),\n      operation: 'live_update_manager_init'\n    });\n    \n    this.loadState();\n  }\n\n  static getInstance(): LiveUpdateManager {\n    if (!LiveUpdateManager.instance) {\n      LiveUpdateManager.instance = new LiveUpdateManager();\n    }\n    return LiveUpdateManager.instance;\n  }\n\n  private saveState(): void {\n    const stateDir = path.dirname(this.stateFile);\n    if (!fs.existsSync(stateDir)) {\n      fs.mkdirSync(stateDir, { recursive: true });\n    }\n\n    const serializedRegistrations: Array<[string, LiveUpdateRegistration]> = [];\n    for (const [key, registration] of this.registrations) {\n      serializedRegistrations.push([key, registration]);\n    }\n\n    const state = {\n      registrations: serializedRegistrations,\n      correlations: this.correlations,\n      isStarted: this.isStarted\n    };\n\n    fs.writeFileSync(this.stateFile, JSON.stringify(state, null, 2));\n  }\n\n  private loadState(): void {\n    if (!fs.existsSync(this.stateFile)) {\n      logger.info('No existing live update state file found', { stateFile: this.stateFile });\n      return;\n    }\n\n    try {\n      const state = JSON.parse(fs.readFileSync(this.stateFile, 'utf8'));\n      \n      this.registrations.clear();\n      for (const [key, registration] of state.registrations || []) {\n        this.registrations.set(key, registration);\n      }\n      \n      this.correlations = state.correlations || [];\n      this.isStarted = state.isStarted || false;\n\n      logger.info('Loaded live update state from file', { \n        stateFile: this.stateFile,\n        registrationCount: this.registrations.size,\n        correlationCount: this.correlations.length,\n        isStarted: this.isStarted\n      });\n    } catch (error) {\n      logger.warn('Failed to load live update state', { \n        error: error instanceof Error ? error.message : String(error),\n        stateFile: this.stateFile \n      });\n    }\n  }\n\n  /**\n   * Register a built image for live updates\n   */\n  registerImage(builtImage: BuiltImage): void {\n    const key = `image:${builtImage.logicalName}`;\n    this.registrations.set(key, {\n      type: 'image',\n      resource: builtImage,\n      timestamp: Date.now()\n    });\n\n    logger.info('Registered image for live updates', {\n      logicalName: builtImage.logicalName,\n      imageRef: builtImage.imageRef,\n      hasLiveUpdate: !!builtImage.live_update,\n      liveUpdateSteps: builtImage.live_update?.length || 0,\n      operation: 'live_update_register_image'\n    });\n\n    this.saveState();\n  }\n\n  /**\n   * Register a Kubernetes resource for live updates\n   */\n  registerDeployment(resource: K8sResource, source?: string): void {\n    const key = `deployment:${resource.metadata?.name || 'unnamed'}:${resource.kind}`;\n    this.registrations.set(key, {\n      type: 'deployment',\n      resource,\n      timestamp: Date.now()\n    });\n\n    logger.info('Registered deployment for live updates', {\n      kind: resource.kind,\n      name: resource.metadata?.name,\n      namespace: resource.metadata?.namespace,\n      source: source || 'unknown',\n      operation: 'live_update_register_deployment'\n    });\n\n    this.saveState();\n  }\n\n  /**\n   * Force reload state from disk (useful when called from different module contexts)\n   */\n  forceReloadState(sessionId?: string): void {\n    this.registrations.clear();\n    this.correlations = [];\n    this.isStarted = false;\n    \n    // If sessionId is provided, update the state file path\n    if (sessionId) {\n      this.stateFile = path.join(process.cwd(), '.tilt-ts', `live-update-${sessionId}.json`);\n      logger.info('Updated LiveUpdateManager state file path', {\n        sessionId,\n        stateFile: this.stateFile,\n        operation: 'live_update_manager_reconfig'\n      });\n    }\n    \n    this.loadState();\n  }\n\n  /**\n   * Clean up state file (call at session end)\n   */\n  cleanup(): void {\n    if (fs.existsSync(this.stateFile)) {\n      fs.unlinkSync(this.stateFile);\n    }\n  }\n\n  /**\n   * Get all registered images\n   */\n  private getRegisteredImages(): BuiltImage[] {\n    const images: BuiltImage[] = [];\n    for (const [key, registration] of this.registrations.entries()) {\n      if (registration.type === 'image') {\n        images.push(registration.resource as BuiltImage);\n      }\n    }\n    return images;\n  }\n\n  /**\n   * Get all registered deployments\n   */\n  private getRegisteredDeployments(): K8sResource[] {\n    const deployments: K8sResource[] = [];\n    for (const [key, registration] of this.registrations.entries()) {\n      if (registration.type === 'deployment') {\n        deployments.push(registration.resource as K8sResource);\n      }\n    }\n    return deployments;\n  }\n\n  /**\n   * Correlate images with deployments and start live updates\n   */\n  async start(): Promise<void> {\n    if (this.isStarted) {\n      logger.info('Live update manager already started, skipping', {\n        operation: 'live_update_manager_start'\n      });\n      return;\n    }\n\n    const images = this.getRegisteredImages();\n    const deployments = this.getRegisteredDeployments();\n    \n    console.log(`🔧 LiveUpdateManager starting correlation process...`);\n    \n    logger.info('Starting live update manager', {\n      imageCount: images.length,\n      deploymentCount: deployments.length,\n      registrationCount: this.registrations.size,\n      operation: 'live_update_manager_start'\n    });\n    \n    if (images.length > 0) {\n      console.log(`📦 Images with live update configs:`);\n      images.forEach(img => {\n        const hasLiveUpdate = img.live_update && img.live_update.length > 0;\n        console.log(`   - ${img.logicalName} (${img.imageRef}) ${hasLiveUpdate ? '✓' : '✗'} live update`);\n        if (hasLiveUpdate && img.live_update) {\n          img.live_update.forEach(step => {\n            console.log(`     ${step.type}: ${step.type === 'sync' ? `${step.src} → ${step.dest}` : step.cmd.join(' ')}`);\n          });\n        }\n      });\n    }\n    \n    if (deployments.length > 0) {\n      console.log(`🚀 Kubernetes resources:`);\n      deployments.forEach(dep => {\n        console.log(`   - ${dep.kind}/${dep.metadata?.name} (ns: ${dep.metadata?.namespace || 'default'})`);\n      });\n    }\n\n    if (images.length === 0) {\n      logger.info('No images registered for live updates', {\n        operation: 'live_update_manager_start'\n      });\n      return;\n    }\n\n    // Correlate images with deployments\n    this.correlations = await correlateImages(deployments);\n\n    if (this.correlations.length === 0) {\n      logger.info('No correlations found between images and deployments', {\n        imageCount: images.length,\n        deploymentCount: deployments.length,\n        operation: 'live_update_manager_start'\n      });\n      return;\n    }\n\n    // Start live updates for correlated resources\n    console.log(`🔗 Found ${this.correlations.length} correlations, starting live updates...`);\n    \n    this.correlations.forEach(correlation => {\n      console.log(`   🎯 ${correlation.logicalName} → ${correlation.kubernetesResources.length} k8s resources`);\n      correlation.kubernetesResources.forEach(resource => {\n        console.log(`      - ${resource.kind}/${resource.name} (ns: ${resource.namespace})`);\n      });\n    });\n    \n    logger.info('🔗 Starting live updates with correlations', {\n      correlationCount: this.correlations.length,\n      operation: 'live_update_manager_start'\n    });\n\n    await autoStartLiveUpdates(this.correlations);\n    this.isStarted = true;\n\n    logger.info('✅ Live update manager started successfully', {\n      correlationCount: this.correlations.length,\n      operation: 'live_update_manager_start'\n    });\n  }\n\n  /**\n   * Stop all live updates and clean up\n   */\n  async stop(): Promise<void> {\n    logger.info('Stopping live update manager', {\n      correlationCount: this.correlations.length,\n      operation: 'live_update_manager_stop'\n    });\n\n    // TODO: Implement cleanup logic for watchers\n    this.isStarted = false;\n    this.correlations = [];\n\n    logger.info('Live update manager stopped', {\n      operation: 'live_update_manager_stop'\n    });\n  }\n\n  /**\n   * Get current status for debugging\n   */\n  getStatus(): {\n    isStarted: boolean;\n    registrationCount: number;\n    correlationCount: number;\n    images: string[];\n    deployments: string[];\n  } {\n    const images = this.getRegisteredImages().map(img => img.logicalName);\n    const deployments = this.getRegisteredDeployments().map(dep => \n      `${dep.kind}:${dep.metadata?.name || 'unnamed'}`\n    );\n\n    return {\n      isStarted: this.isStarted,\n      registrationCount: this.registrations.size,\n      correlationCount: this.correlations.length,\n      images,\n      deployments\n    };\n  }\n\n  /**\n   * Reset manager state (useful for testing)\n   */\n  reset(): void {\n    this.registrations.clear();\n    this.correlations = [];\n    this.isStarted = false;\n    logger.info('Live update manager reset', {\n      operation: 'live_update_manager_reset'\n    });\n  }\n}\n\n// Export singleton instance\nexport const liveUpdateManager = LiveUpdateManager.getInstance();","import { EventEmitter } from 'events';\n\nexport type ResourceType = 'docker_build' | 'k8s_file' | 'k8s_yaml';\nexport type ResourceStatus = 'pending' | 'building' | 'ready' | 'error';\n\nexport type TrackedResource = {\n  id: string;\n  type: ResourceType;\n  name: string;\n  status: ResourceStatus;\n  path?: string; // for k8s_file\n  context?: string; // for docker_build\n  imageRef?: string; // for docker_build\n  buildTime?: number;\n  dependencies?: string[]; // which docker builds this k8s resource uses\n  lastUpdate: Date;\n  error?: string;\n};\n\nexport type ResourceEvent = \n  | { type: 'resource_added', resource: TrackedResource }\n  | { type: 'resource_updated', resource: TrackedResource }\n  | { type: 'resource_status_changed', id: string, status: ResourceStatus, error?: string }\n  | { type: 'build_started', id: string }\n  | { type: 'build_completed', id: string, imageRef?: string, buildTime?: number };\n\n/**\n * Tracks resources deployed by tiltfile.ts and emits events for UI consumption\n */\nexport class ResourceTracker extends EventEmitter {\n  private resources = new Map<string, TrackedResource>();\n  private idCounter = 0;\n  private static instance: ResourceTracker;\n\n  private constructor() {\n    super();\n  }\n\n  static getInstance(): ResourceTracker {\n    if (!ResourceTracker.instance) {\n      ResourceTracker.instance = new ResourceTracker();\n    }\n    return ResourceTracker.instance;\n  }\n\n  /**\n   * Track a docker build operation\n   */\n  trackDockerBuild(name: string, context: string): string {\n    const id = `docker_${this.idCounter++}`;\n    const resource: TrackedResource = {\n      id,\n      type: 'docker_build',\n      name,\n      context,\n      status: 'pending',\n      lastUpdate: new Date()\n    };\n\n    this.resources.set(id, resource);\n    this.emit('resource_added', resource);\n    this.emitToConsole('resource_added', resource);\n    \n    return id;\n  }\n\n  /**\n   * Track a k8s file application\n   */\n  trackK8sFile(path: string, dependencies?: string[]): string {\n    const id = `k8s_file_${this.idCounter++}`;\n    const fileName = path.split('/').pop() || path;\n    const resource: TrackedResource = {\n      id,\n      type: 'k8s_file',\n      name: fileName,\n      path,\n      status: 'pending',\n      dependencies,\n      lastUpdate: new Date()\n    };\n\n    this.resources.set(id, resource);\n    this.emit('resource_added', resource);\n    this.emitToConsole('resource_added', resource);\n    \n    return id;\n  }\n\n  /**\n   * Track a k8s yaml application\n   */\n  trackK8sYaml(name: string, dependencies?: string[]): string {\n    const id = `k8s_yaml_${this.idCounter++}`;\n    const resource: TrackedResource = {\n      id,\n      type: 'k8s_yaml',\n      name,\n      status: 'pending',\n      dependencies,\n      lastUpdate: new Date()\n    };\n\n    this.resources.set(id, resource);\n    this.emit('resource_added', resource);\n    this.emitToConsole('resource_added', resource);\n    \n    return id;\n  }\n\n  /**\n   * Update resource status\n   */\n  updateStatus(id: string, status: ResourceStatus, updates?: Partial<TrackedResource>): void {\n    const resource = this.resources.get(id);\n    if (!resource) return;\n\n    const updatedResource = {\n      ...resource,\n      status,\n      lastUpdate: new Date(),\n      ...updates\n    };\n\n    this.resources.set(id, updatedResource);\n    this.emit('resource_status_changed', id, status, updates?.error);\n    this.emit('resource_updated', updatedResource);\n    this.emitToConsole('resource_updated', updatedResource);\n  }\n\n  /**\n   * Mark build as started and track build time\n   */\n  startBuild(id: string): void {\n    this.updateStatus(id, 'building');\n    this.emit('build_started', id);\n    this.emitToConsole('build_started', { id });\n  }\n\n  /**\n   * Mark build as completed with results\n   */\n  completeBuild(id: string, imageRef?: string, buildTimeMs?: number): void {\n    this.updateStatus(id, 'ready', { \n      imageRef, \n      buildTime: buildTimeMs \n    });\n    this.emit('build_completed', id, imageRef, buildTimeMs);\n    this.emitToConsole('build_completed', { id, imageRef, buildTime: buildTimeMs });\n  }\n\n  /**\n   * Mark resource as failed with error\n   */\n  markError(id: string, error: string): void {\n    this.updateStatus(id, 'error', { error });\n    this.emitToConsole('resource_error', { id, error });\n  }\n\n  /**\n   * Get a resource by ID\n   */\n  get(id: string): TrackedResource | undefined {\n    return this.resources.get(id);\n  }\n\n  /**\n   * Get all tracked resources\n   */\n  getAll(): TrackedResource[] {\n    return Array.from(this.resources.values());\n  }\n\n  /**\n   * Get resources by type\n   */\n  getByType(type: ResourceType): TrackedResource[] {\n    return this.getAll().filter(r => r.type === type);\n  }\n\n  /**\n   * Get docker builds that a k8s resource depends on\n   */\n  getDependencies(resourceId: string): TrackedResource[] {\n    const resource = this.get(resourceId);\n    if (!resource || !resource.dependencies) return [];\n\n    return resource.dependencies\n      .map(depName => this.get(`docker:${depName}`))\n      .filter(Boolean) as TrackedResource[];\n  }\n\n  /**\n   * Find k8s resources that depend on a docker build\n   */\n  getDependents(dockerBuildName: string): TrackedResource[] {\n    return this.getAll().filter(resource => \n      resource.dependencies?.includes(dockerBuildName)\n    );\n  }\n\n  /**\n   * Clear all tracked resources\n   */\n  reset(): void {\n    this.resources.clear();\n    this.idCounter = 0; // Reset the counter when clearing resources\n    this.emit('reset');\n    this.emitToConsole('tracker_reset', {});\n  }\n\n  /**\n   * Get summary statistics\n   */\n  getStats(): {\n    total: number;\n    byStatus: Record<ResourceStatus, number>;\n    byType: Record<ResourceType, number>;\n  } {\n    const resources = this.getAll();\n    const byStatus: Record<ResourceStatus, number> = {\n      pending: 0,\n      building: 0,\n      ready: 0,\n      error: 0\n    };\n    const byType: Record<ResourceType, number> = {\n      docker_build: 0,\n      k8s_file: 0,\n      k8s_yaml: 0\n    };\n\n    resources.forEach(resource => {\n      byStatus[resource.status]++;\n      byType[resource.type]++;\n    });\n\n    return {\n      total: resources.length,\n      byStatus,\n      byType\n    };\n  }\n\n  /**\n   * Emit events to console for UI consumption\n   */\n  private emitToConsole(eventType: string, data: any): void {\n    const event = {\n      type: eventType,\n      timestamp: new Date().toISOString(),\n      data\n    };\n    \n    // Use a special prefix that the UI can parse\n    //console.log(`TILT_TRACK:${JSON.stringify(event)}`);\n  }\n}\n\n// Export singleton instance\nexport const resourceTracker = ResourceTracker.getInstance();","import * as YAML from 'yaml';\nimport { set } from 'es-toolkit/compat';\nimport type { TransformContext, ResourceTransform } from '../types/transforms';\n\nexport type K8sResource = {\n  apiVersion?: string;\n  kind?: string;\n  metadata?: {\n    name?: string;\n    namespace?: string;\n    labels?: Record<string, string>;\n    annotations?: Record<string, string>;\n  };\n  spec?: any;\n  data?: any;\n  [key: string]: any;\n};\n\nexport class YamlWrapper {\n  protected resources: K8sResource[];\n  protected _transforms: ResourceTransform[] = [];\n\n  constructor(input: string | K8sResource[]) {\n    if (typeof input === 'string') {\n      // Parse YAML string, handling multi-document YAML\n      this.resources = YAML.parseAllDocuments(input)\n        .map(doc => doc.toJS())\n        .filter(Boolean);\n    } else {\n      this.resources = input;\n    }\n  }\n\n  /**\n   * Transform each resource with a function\n   */\n  map(transform: (resource: K8sResource, index: number) => K8sResource): YamlWrapper {\n    return new YamlWrapper(this.resources.map(transform));\n  }\n\n  /**\n   * Filter resources by predicate\n   */\n  filter(predicate: (resource: K8sResource) => boolean): YamlWrapper {\n    return new YamlWrapper(this.resources.filter(predicate));\n  }\n\n  /**\n   * Update container images using a transform function\n   */\n  updateImages(transformFn: (image: string) => string): YamlWrapper {\n    return this.map(resource => {\n      let updatedResource = { ...resource };\n      \n      // Handle regular container images in various specs (Deployment, StatefulSet, DaemonSet)\n      if (resource.spec?.template?.spec?.containers) {\n        const containers = resource.spec.template.spec.containers.map((container: any) => \n          container.image && typeof container.image === 'string'\n            ? { ...container, image: transformFn(container.image) }\n            : container\n        );\n        updatedResource = set(updatedResource, 'spec.template.spec.containers', containers);\n      }\n      \n      // Handle direct containers (for Pods)\n      else if (resource.spec?.containers) {\n        const containers = resource.spec.containers.map((container: any) =>\n          container.image && typeof container.image === 'string'\n            ? { ...container, image: transformFn(container.image) }\n            : container\n        );\n        updatedResource = set(updatedResource, 'spec.containers', containers);\n      }\n      \n      return updatedResource;\n    });\n  }\n\n  /**\n   * Get all resources as array\n   */\n  toArray(): K8sResource[] {\n    return [...this.resources];\n  }\n\n  /**\n   * Convert to YAML string\n   */\n  toYaml(): string {\n    if (this.resources.length === 0) {\n      return '';\n    }\n    \n    return this.resources\n      .map(resource => YAML.stringify(resource))\n      .join('---\\n');\n  }\n\n  /**\n   * Get count of resources\n   */\n  count(): number {\n    return this.resources.length;\n  }\n\n  /**\n   * Add a transform to be applied later (synchronous chain, async execution)\n   * Transforms are applied during apply() call\n   * @param transform - Function that transforms resource content with context\n   * @returns This YamlWrapper for chaining\n   *\n   * @example\n   * ```typescript\n   * await k8s_yaml(\"./secrets.yaml\")\n   *   .transform(decryptSecrets)\n   *   .apply();\n   * ```\n   */\n  transform(transform: ResourceTransform): this {\n    this._transforms.push(transform);\n    return this;\n  }\n\n  /**\n   * Apply all pending transforms to resources\n   * @returns New resources array with all transforms applied\n   */\n  protected async applyTransforms(): Promise<K8sResource[]> {\n    if (this._transforms.length === 0) {\n      return this.resources;\n    }\n\n    let currentResources = this.resources;\n\n    // Apply each transform in sequence\n    for (const transform of this._transforms) {\n      currentResources = await Promise.all(\n        currentResources.map(async (resource) => {\n          const ctx: TransformContext = {\n            content: YAML.stringify(resource),\n            kind: resource.kind,\n            name: resource.metadata?.name,\n            namespace: resource.metadata?.namespace,\n            resource\n          };\n\n          const newContent = await transform(ctx);\n          return YAML.parse(newContent) as K8sResource;\n        })\n      );\n    }\n\n    return currentResources;\n  }\n}\n\n// Helper functions for filtering\nexport const byKind = (kind: string) => (resource: K8sResource): boolean => {\n  return resource.kind === kind;\n};\n\nexport const byName = (name: string) => (resource: K8sResource): boolean => {\n  return resource.metadata?.name === name;\n};\n\nexport const byNamespace = (namespace: string) => (resource: K8sResource): boolean => {\n  return resource.metadata?.namespace === namespace;\n};","import * as path from \"path\";\nimport type { ResourceTransform } from \"../types/transforms\";\n\nexport interface WetRepositoryConfig {\n  path: string;\n  stage?: string;\n  flatStructure?: boolean;\n  transform?: ResourceTransform[];\n}\n\nexport interface WetRepositoryOptions {\n  flatStructure?: boolean;\n  transform?: ResourceTransform[];\n}\n\nlet globalWetRepoConfig: WetRepositoryConfig | null = null;\n\n/**\n * Configure wet repository settings for materialized YAML output\n * \n * @param pathOrConfig - Repository path string or full config object\n * @param stage - Stage/environment subdirectory (optional)\n * @param options - Additional options like flatStructure\n * \n * @example\n * ```typescript\n * // Basic usage\n * wet_repository(\"./wet-repo\", \"dev\");\n * \n * // With flat structure (no resource type subfolders)\n * wet_repository(\"./wet-repo\", \"dev\", { flatStructure: true });\n * \n * // Full config object\n * wet_repository({\n *   path: \"./wet-repo\",\n *   stage: \"dev\", \n *   flatStructure: false\n * });\n * ```\n */\nexport function wet_repository(\n  pathOrConfig: string | WetRepositoryConfig,\n  stage?: string,\n  options?: WetRepositoryOptions\n): void {\n  if (typeof pathOrConfig === \"string\") {\n    globalWetRepoConfig = {\n      path: pathOrConfig,\n      stage,\n      flatStructure: options?.flatStructure ?? false,\n      transform: options?.transform,\n    };\n  } else {\n    globalWetRepoConfig = {\n      ...pathOrConfig,\n      flatStructure: pathOrConfig.flatStructure ?? false,\n    };\n  }\n}\n\n/**\n * Get the current wet repository configuration\n * Returns default .tilt-ts configuration if none set\n */\nexport function getWetRepositoryConfig(): WetRepositoryConfig {\n  return globalWetRepoConfig ?? {\n    path: \".tilt-ts\",\n    stage: undefined,\n    flatStructure: false,\n  };\n}\n\n/**\n * Reset wet repository configuration to default\n */\nexport function resetWetRepositoryConfig(): void {\n  globalWetRepoConfig = null;\n}\n\n/**\n * Generate the full path for wet repository output\n * \n * @param resourceType - K8s resource type (deployments, services, etc.)\n * @param fileName - Name of the YAML file\n * @returns Full path for the materialized YAML file\n */\nexport function generateWetRepoPath(\n  resourceType?: string,\n  fileName?: string\n): string {\n  const config = getWetRepositoryConfig();\n  let fullPath = config.path;\n\n  // Add stage subdirectory if specified\n  if (config.stage) {\n    fullPath = path.join(fullPath, config.stage);\n  }\n\n  // Add resource type subdirectory unless flat structure is enabled\n  if (!config.flatStructure && resourceType) {\n    fullPath = path.join(fullPath, resourceType);\n  }\n\n  // Add filename if provided\n  if (fileName) {\n    fullPath = path.join(fullPath, fileName);\n  }\n\n  return fullPath;\n}","import type { K8sResource } from \"./yaml-wrapper\";\n\n/**\n * Map of singular Kubernetes resource kinds to their plural folder names\n */\nconst RESOURCE_TYPE_PLURALS: Record<string, string> = {\n  Deployment: \"deployments\",\n  Service: \"services\", \n  ConfigMap: \"configmaps\",\n  Secret: \"secrets\",\n  Ingress: \"ingresses\",\n  Pod: \"pods\",\n  ReplicaSet: \"replicasets\",\n  StatefulSet: \"statefulsets\",\n  DaemonSet: \"daemonsets\",\n  Job: \"jobs\",\n  CronJob: \"cronjobs\",\n  ServiceAccount: \"serviceaccounts\",\n  Role: \"roles\",\n  RoleBinding: \"rolebindings\",\n  ClusterRole: \"clusterroles\", \n  ClusterRoleBinding: \"clusterrolebindings\",\n  PersistentVolume: \"persistentvolumes\",\n  PersistentVolumeClaim: \"persistentvolumeclaims\",\n  StorageClass: \"storageclasses\",\n  Namespace: \"namespaces\",\n  NetworkPolicy: \"networkpolicies\",\n  PodSecurityPolicy: \"podsecuritypolicies\",\n  HorizontalPodAutoscaler: \"horizontalpodautoscalers\",\n  VerticalPodAutoscaler: \"verticalpodautoscalers\",\n  CustomResourceDefinition: \"customresourcedefinitions\",\n  ValidatingAdmissionWebhook: \"validatingadmissionwebhooks\",\n  MutatingAdmissionWebhook: \"mutatingadmissionwebhooks\",\n};\n\n/**\n * Extract and normalize resource type from a Kubernetes resource\n * \n * @param resource - Kubernetes resource object\n * @returns Lowercase plural resource type (e.g., \"deployments\", \"services\")\n */\nexport function getResourceType(resource: K8sResource): string {\n  const kind = resource?.kind;\n  if (!kind) {\n    return \"unknown\";\n  }\n\n  // Try to find in our mapping first\n  const plural = RESOURCE_TYPE_PLURALS[kind];\n  if (plural) {\n    return plural;\n  }\n\n  // Fallback: simple pluralization rules\n  return simplePluralize(kind.toLowerCase());\n}\n\n/**\n * Simple pluralization for resource types not in our mapping\n */\nfunction simplePluralize(word: string): string {\n  if (word.endsWith(\"y\")) {\n    return word.slice(0, -1) + \"ies\";\n  }\n  if (word.endsWith(\"s\") || word.endsWith(\"x\") || word.endsWith(\"z\") || \n      word.endsWith(\"ch\") || word.endsWith(\"sh\")) {\n    return word + \"es\";\n  }\n  return word + \"s\";\n}\n\n/**\n * Generate a meaningful filename for a Kubernetes resource\n * \n * @param resource - Kubernetes resource object\n * @returns Filename like \"app-deployment.yaml\" or \"database-service.yaml\"\n */\nexport function generateResourceFileName(resource: K8sResource): string {\n  const name = resource?.metadata?.name || \"unnamed\";\n  const kind = resource?.kind?.toLowerCase() || \"resource\";\n  \n  // Clean the name for filename usage\n  const cleanName = name.replace(/[^a-z0-9-]/gi, \"-\").toLowerCase();\n  const cleanKind = kind.replace(/[^a-z0-9-]/gi, \"-\").toLowerCase();\n  \n  return `${cleanName}-${cleanKind}.yaml`;\n}\n\n/**\n * Generate a base filename for a collection of resources\n * Used when multiple resources are in a single YAML file\n * \n * @param resources - Array of Kubernetes resources\n * @returns Base filename like \"mixed-resources.yaml\"\n */\nexport function generateMultiResourceFileName(resources: K8sResource[]): string {\n  if (resources.length === 0) {\n    return \"empty-resource.yaml\";\n  }\n  \n  if (resources.length === 1 && resources[0]) {\n    return generateResourceFileName(resources[0]);\n  }\n\n  // Check if all resources are the same kind\n  const kinds = [...new Set(resources.map(r => r?.kind).filter(Boolean))];\n  if (kinds.length === 1 && resources[0]) {\n    const resourceType = getResourceType(resources[0]);\n    return `${resourceType}.yaml`;\n  }\n\n  // Mixed resources\n  return \"mixed-resources.yaml\";\n}\n\n/**\n * Split resources by type for organized wet repository structure\n * \n * @param resources - Array of Kubernetes resources\n * @returns Map of resource type to resources of that type\n */\nexport function groupResourcesByType(resources: K8sResource[]): Map<string, K8sResource[]> {\n  const grouped = new Map<string, K8sResource[]>();\n  \n  for (const resource of resources) {\n    const resourceType = getResourceType(resource);\n    const existing = grouped.get(resourceType) || [];\n    existing.push(resource);\n    grouped.set(resourceType, existing);\n  }\n  \n  return grouped;\n}\n\n/**\n * Generate content hash for change detection (keeps existing behavior)\n * \n * @param content - YAML content string\n * @returns Short hash for change detection\n */\nexport function generateContentHash(content: string): string {\n  const crypto = require(\"crypto\");\n  return crypto\n    .createHash(\"sha256\")\n    .update(content)\n    .digest(\"hex\")\n    .substring(0, 12);\n}","import * as path from \"path\";\nimport * as fs from \"fs\";\nimport { writeFile, mkdir } from \"fs/promises\";\nimport { generateContentHash } from \"./wet-repo-utils\";\nimport type { K8sApplyOptions } from \"../types/index\";\n\nexport interface WetRepoFileState {\n  contentHash: string;\n  lastApplied: string;\n  sourceFiles?: string[];\n  resourceCount: number;\n  applyOptions: K8sApplyOptions;\n}\n\nexport interface WetRepoState {\n  version: string;\n  lastUpdated: string;\n  wetRepoPath: string;\n  stage?: string;\n  flatStructure: boolean;\n  files: Record<string, WetRepoFileState>;\n  currentRunFiles: string[];       // Files created in this tiltfile run\n  previousRunFiles: string[];      // Files from last completed run\n  runStartTime?: string;           // Track run boundaries\n}\n\nexport class WetRepoStateManager {\n  private cacheDir: string;\n  private stateFilePath: string;\n  private state: WetRepoState | null = null;\n\n  constructor(wetRepoPath: string, stage?: string) {\n    // Use the same directory where the wet repository is located for cache\n    // This ensures cache follows the wet repo regardless of CWD\n    const resolvedWetRepoPath = path.resolve(wetRepoPath);\n    const wetRepoDir = path.dirname(resolvedWetRepoPath);\n    this.cacheDir = path.join(wetRepoDir, \".tilt-ts\");\n    \n    // Normalize path for filename: ./wet-repo/dev -> wet-repo-dev\n    const normalizedPath = this.normalizePath(wetRepoPath, stage);\n    this.stateFilePath = path.join(this.cacheDir, `wet-repo-state-${normalizedPath}.json`);\n  }\n\n  /**\n   * Normalize wet repo path and stage into a safe filename component\n   */\n  private normalizePath(wetRepoPath: string, stage?: string): string {\n    // Remove leading ./ and convert path separators to hyphens\n    let normalized = wetRepoPath\n      .replace(/^\\.\\//, \"\")\n      .replace(/\\//g, \"-\")\n      .replace(/\\\\/g, \"-\")\n      .replace(/[^a-zA-Z0-9-_]/g, \"-\");\n\n    // Add stage if provided\n    if (stage) {\n      const normalizedStage = stage.replace(/[^a-zA-Z0-9-_]/g, \"-\");\n      normalized = `${normalized}-${normalizedStage}`;\n    }\n\n    // Remove consecutive hyphens and trim\n    normalized = normalized\n      .replace(/-+/g, \"-\")\n      .replace(/^-+|-+$/g, \"\");\n\n    return normalized || \"default\";\n  }\n\n  /**\n   * Load state from cache file\n   */\n  async loadState(): Promise<WetRepoState> {\n    if (this.state) {\n      return this.state;\n    }\n\n    try {\n      if (fs.existsSync(this.stateFilePath)) {\n        const content = await fs.promises.readFile(this.stateFilePath, \"utf8\");\n        const loadedState = JSON.parse(content);\n        \n        // Ensure backward compatibility by adding missing fields\n        this.state = {\n          version: loadedState.version || \"1.0\",\n          lastUpdated: loadedState.lastUpdated || new Date().toISOString(),\n          wetRepoPath: loadedState.wetRepoPath || \"\",\n          stage: loadedState.stage,\n          flatStructure: loadedState.flatStructure || false,\n          files: loadedState.files || {},\n          currentRunFiles: loadedState.currentRunFiles || [],\n          previousRunFiles: loadedState.previousRunFiles || [],\n          runStartTime: loadedState.runStartTime,\n        };\n        return this.state;\n      }\n    } catch (error) {\n      // If file is corrupted, we'll create a new one\n      console.warn(`Failed to load wet repo state from ${this.stateFilePath}:`, error);\n    }\n\n    // Initialize new state\n    this.state = {\n      version: \"1.0\",\n      lastUpdated: new Date().toISOString(),\n      wetRepoPath: \"\",\n      stage: undefined,\n      flatStructure: false,\n      files: {},\n      currentRunFiles: [],\n      previousRunFiles: [],\n      runStartTime: undefined,\n    };\n\n    return this.state;\n  }\n\n  /**\n   * Save current state to cache file\n   */\n  async saveState(): Promise<void> {\n    if (!this.state) {\n      return;\n    }\n\n    // Ensure cache directory exists\n    await mkdir(this.cacheDir, { recursive: true });\n\n    // Update timestamp\n    this.state.lastUpdated = new Date().toISOString();\n\n    // Write state file\n    const content = JSON.stringify(this.state, null, 2);\n    await writeFile(this.stateFilePath, content, \"utf8\");\n  }\n\n  /**\n   * Check if content has changed for a specific file\n   * Also verifies that the actual file exists on disk\n   * Also compares apply options to detect option changes\n   */\n  async hasContentChanged(filePath: string, content: string, actualFilePath: string, applyOptions: K8sApplyOptions): Promise<boolean> {\n    const state = await this.loadState();\n    const contentHash = generateContentHash(content);\n    \n    const fileState = state.files[filePath];\n    if (!fileState) {\n      return true; // New file\n    }\n\n    // Check if content hash has changed\n    if (fileState.contentHash !== contentHash) {\n      return true; // Content changed\n    }\n\n    // Check if apply options have changed\n    if (!this.areOptionsEqual(fileState.applyOptions, applyOptions)) {\n      return true; // Apply options changed\n    }\n\n    // Check if the actual file still exists on disk\n    if (!fs.existsSync(actualFilePath)) {\n      console.log(`Wet repository file missing: ${actualFilePath}, will recreate`);\n      return true; // File was deleted, need to recreate\n    }\n\n    return false; // No changes and file exists\n  }\n\n  /**\n   * Deep compare two K8sApplyOptions objects for equality\n   */\n  private areOptionsEqual(options1: K8sApplyOptions, options2: K8sApplyOptions): boolean {\n    return JSON.stringify(options1) === JSON.stringify(options2);\n  }\n\n  /**\n   * Update file state after successful application\n   */\n  async updateFileState(\n    filePath: string, \n    content: string, \n    applyOptions: K8sApplyOptions,\n    sourceFiles?: string[],\n    resourceCount: number = 1\n  ): Promise<void> {\n    const state = await this.loadState();\n    const contentHash = generateContentHash(content);\n\n    state.files[filePath] = {\n      contentHash,\n      lastApplied: new Date().toISOString(),\n      sourceFiles: sourceFiles || [],\n      resourceCount,\n      applyOptions,\n    };\n\n    await this.saveState();\n  }\n\n  /**\n   * Update wet repo configuration in state\n   */\n  async updateConfig(wetRepoPath: string, stage?: string, flatStructure: boolean = false): Promise<void> {\n    const state = await this.loadState();\n    state.wetRepoPath = wetRepoPath;\n    state.stage = stage;\n    state.flatStructure = flatStructure;\n    await this.saveState();\n  }\n\n  /**\n   * Get all tracked files\n   */\n  async getTrackedFiles(): Promise<string[]> {\n    const state = await this.loadState();\n    return Object.keys(state.files);\n  }\n\n  /**\n   * Remove file from tracking (when file is deleted)\n   */\n  async removeFile(filePath: string): Promise<void> {\n    const state = await this.loadState();\n    delete state.files[filePath];\n    await this.saveState();\n  }\n\n  /**\n   * Clear all state (for cleanup)\n   */\n  async clearState(): Promise<void> {\n    this.state = null;\n    if (fs.existsSync(this.stateFilePath)) {\n      await fs.promises.unlink(this.stateFilePath);\n    }\n  }\n\n  /**\n   * Start a new tiltfile run - initializes current run tracking\n   */\n  async startNewRun(): Promise<void> {\n    const state = await this.loadState();\n    \n    // Move current → previous (if exists) \n    state.previousRunFiles = state.currentRunFiles || [];\n    state.currentRunFiles = [];\n    state.runStartTime = new Date().toISOString();\n    \n    await this.saveState();\n  }\n\n  /**\n   * Track a file as part of the current tiltfile run\n   */\n  async trackFileInCurrentRun(relativePath: string): Promise<void> {\n    const state = await this.loadState();\n    \n    if (!state.currentRunFiles.includes(relativePath)) {\n      state.currentRunFiles.push(relativePath);\n      await this.saveState();\n    }\n  }\n\n  /**\n   * Complete the current tiltfile run and return orphaned files\n   */\n  async completeCurrentRun(): Promise<string[]> {\n    const state = await this.loadState();\n    \n    // Find orphaned files (in previous run but not current run)\n    const orphaned = (state.previousRunFiles || []).filter(\n      prevFile => !state.currentRunFiles.includes(prevFile)\n    );\n    \n    // Current run becomes the new baseline\n    state.previousRunFiles = [...state.currentRunFiles];\n    await this.saveState();\n    \n    return orphaned;\n  }\n\n  /**\n   * Get orphaned files without completing the run\n   */\n  async getOrphanedFiles(): Promise<string[]> {\n    const state = await this.loadState();\n    \n    return (state.previousRunFiles || []).filter(\n      prevFile => !state.currentRunFiles.includes(prevFile)\n    );\n  }\n\n  /**\n   * Remove orphaned files from the wet repository\n   */\n  async removeOrphanedFiles(basePath: string): Promise<void> {\n    const orphanedFiles = await this.getOrphanedFiles();\n    \n    await Promise.all(\n      orphanedFiles.map(async (relativePath) => {\n        const filePath = path.join(basePath, relativePath);\n        \n        try {\n          await fs.promises.unlink(filePath);\n          \n          // Also remove from files tracking\n          const state = await this.loadState();\n          delete state.files[relativePath];\n          await this.saveState();\n          \n        } catch (error) {\n          // File might already be deleted, ignore error\n          console.warn(`Failed to remove orphaned file ${filePath}:`, error);\n        }\n      })\n    );\n  }\n\n  /**\n   * Get statistics about the wet repo\n   */\n  async getStats(): Promise<{\n    totalFiles: number;\n    totalResources: number;\n    lastUpdated: string;\n    currentRunFiles: number;\n    previousRunFiles: number;\n  }> {\n    const state = await this.loadState();\n    const totalFiles = Object.keys(state.files).length;\n    const totalResources = Object.values(state.files)\n      .reduce((sum, file) => sum + file.resourceCount, 0);\n\n    return {\n      totalFiles,\n      totalResources,\n      lastUpdated: state.lastUpdated,\n      currentRunFiles: state.currentRunFiles?.length || 0,\n      previousRunFiles: state.previousRunFiles?.length || 0,\n    };\n  }\n}","import { logger } from \"../utils/logger\";\nimport type { K8sApplyOptions } from \"../types/index\";\n\n/**\n * Global default K8s apply options configuration\n */\nlet globalK8sDefaults: K8sApplyOptions = {\n  validate: false,\n  dryRun: false,\n  validateContext: true,\n  cache: true,\n  continueOnError: true,\n};\n\n/**\n * Sets the default K8s apply options for all K8sApplier.apply() operations\n *\n * @param options - Default K8s apply options\n * @returns The options for chaining\n *\n * @example\n * ```typescript\n * // Set global defaults for all k8s applies\n * k8s_defaults({\n *   validate: true,\n *   continueOnError: false,\n *   cache: true\n * });\n *\n * // Now all k8s applies will use these defaults unless overridden\n * await k8s_yaml(\"./deploy.yaml\").apply(); // Uses global defaults\n * \n * // Local options override globals\n * await k8s_yaml(\"./deploy.yaml\").apply({ \n *   validate: false  // This overrides the global validate: true\n * });\n * ```\n */\nexport function k8s_defaults(options: Partial<K8sApplyOptions>): K8sApplyOptions {\n  globalK8sDefaults = { ...globalK8sDefaults, ...options };\n\n  logger.info(\"🏗️ Set default K8s apply options\", {\n    options: globalK8sDefaults,\n    operation: \"k8s_defaults\",\n  });\n\n  return globalK8sDefaults;\n}\n\n/**\n * Gets the current default K8s apply options configuration\n */\nexport function get_k8s_defaults(): K8sApplyOptions {\n  return { ...globalK8sDefaults };\n}\n\n/**\n * Resets the default K8s apply options configuration (useful for testing)\n */\nexport function reset_k8s_defaults(): void {\n  globalK8sDefaults = {\n    validate: false,\n    dryRun: false,\n    validateContext: true,\n    cache: true,\n    continueOnError: true,\n  };\n  logger.info(\"🔄 Reset default K8s apply options\", {\n    operation: \"reset_k8s_defaults\",\n  });\n}","import * as path from \"path\";\nimport { writeFile, mkdir } from \"fs/promises\";\nimport { YamlWrapper, type K8sResource } from \"../utils/yaml-wrapper\";\nimport { exec } from \"../utils/process\";\nimport { logger } from \"../utils/logger\";\nimport { validate_k8s_context } from \"./k8s-contexts\";\nimport { liveUpdateManager } from \"./live-update-manager\";\nimport { resourceTracker } from \"../utils/resource-tracker\";\nimport { generateWetRepoPath, getWetRepositoryConfig } from \"./wet-repository\";\nimport {\n  generateResourceFileName,\n  generateMultiResourceFileName,\n  groupResourcesByType\n} from \"../utils/wet-repo-utils\";\nimport { generateContentHash } from \"../utils/wet-repo-utils\";\nimport { WetRepoStateManager } from \"../utils/wet-repo-state\";\nimport { get_k8s_defaults } from \"./k8s-defaults\";\nimport type { K8sApplyOptions } from \"../types/index\";\nimport chalk from \"chalk\";\nimport * as YAML from \"yaml\";\n\n\nexport class K8sApplier extends YamlWrapper {\n  private resourceId?: string;\n  _sourceFiles?: string[]; // Store source file paths for better display names\n\n  constructor(input: string | K8sResource[]) {\n    super(input);\n  }\n\n  /**\n   * Extract docker image names that this k8s resource depends on\n   */\n  private extractImageDependencies(): string[] {\n    const dependencies: string[] = [];\n    const resources = this.toArray();\n\n    for (const resource of resources) {\n      this.findImagesInResource(resource, dependencies);\n    }\n\n    // Convert full image refs to logical names\n    return dependencies\n      .map((imageRef) => this.extractLogicalName(imageRef))\n      .filter(Boolean) as string[];\n  }\n\n  /**\n   * Recursively find image references in a k8s resource\n   */\n  private findImagesInResource(obj: any, images: string[]): void {\n    if (Array.isArray(obj)) {\n      obj.forEach((item) => this.findImagesInResource(item, images));\n    } else if (obj && typeof obj === \"object\") {\n      // Check if this looks like a container spec\n      if (obj.image && typeof obj.image === \"string\") {\n        images.push(obj.image);\n      }\n\n      // Recursively search nested objects\n      for (const value of Object.values(obj)) {\n        this.findImagesInResource(value, images);\n      }\n    }\n  }\n\n  /**\n   * Extract logical image name from full image reference\n   * e.g., \"docker.io/frank1147/usercode:tag\" -> \"frank1147/usercode\"\n   */\n  private extractLogicalName(imageRef: string): string | null {\n    // Remove tag if present\n    const withoutTag = imageRef.split(\":\")[0] || imageRef;\n\n    // Split by / and get the last 1 or 2 parts\n    const parts = withoutTag.split(\"/\");\n\n    if (parts.length >= 2) {\n      // Return last 2 parts: \"registry/namespace/name\" -> \"namespace/name\"\n      return parts.slice(-2).join(\"/\");\n    } else if (parts.length === 1) {\n      // Return single part: \"name\" -> \"name\"\n      return parts[0] || null;\n    }\n\n    return null;\n  }\n\n\n\n  /**\n   * Generate flat temporary file for per-apply operations\n   * Uses existing k8s-apply-{hash}.yaml approach\n   */\n  private async generateFlatTempFile(yamlContent: string): Promise<string> {\n    // Create cache directory at project root\n    const cacheDir = path.resolve('.tilt-ts');\n    await mkdir(cacheDir, { recursive: true });\n    \n    // Generate content hash for uniqueness (same as existing approach)\n    const contentHash = generateContentHash(yamlContent);\n    const tempFileName = `k8s-apply-${contentHash}.yaml`;\n    const tempFilePath = path.join(cacheDir, tempFileName);\n    \n    // Write flat temp file with all resources\n    await writeFile(tempFilePath, yamlContent, 'utf8');\n    \n    return tempFilePath;\n  }\n\n\n  /**\n   * Generate a resource name based on the k8s resources contained\n   */\n  private generateResourceName(): string {\n    // If we have source files from k8s_file, use the first file's name\n    if (this._sourceFiles && this._sourceFiles.length > 0) {\n      const firstFile = this._sourceFiles[0];\n      if (firstFile) {\n        const fileName = firstFile.split(\"/\").pop() || firstFile;\n\n        if (this._sourceFiles.length === 1) {\n          return fileName;\n        } else {\n          return `${fileName} (+${this._sourceFiles.length - 1} more)`;\n        }\n      }\n    }\n\n    // Fallback to original logic for k8s_yaml resources\n    const resources = this.toArray();\n    if (resources.length === 0) return \"empty-resource\";\n\n    if (resources.length === 1) {\n      const resource = resources[0];\n      return `${resource?.kind || \"Unknown\"}/${\n        resource?.metadata?.name || \"unnamed\"\n      }`;\n    }\n\n    // Multiple resources - create a simpler summary\n    const kinds = [...new Set(resources.map((r) => r?.kind).filter(Boolean))];\n    if (kinds.length === 1) {\n      // All same kind - show count\n      return `${kinds[0]} (${resources.length})`;\n    }\n\n    // Mixed kinds - show a simple summary\n    return `Mixed Resources (${resources.length})`;\n  }\n\n  log() {\n    console.log(this.toYaml());\n\n    return this;\n  }\n\n  // Override methods to return K8sApplier for chaining\n  override map(\n    transform: (resource: K8sResource, index: number) => K8sResource\n  ): K8sApplier {\n    const newApplier = new K8sApplier(super.map(transform).toArray());\n    return newApplier;\n  }\n\n  override filter(predicate: (resource: K8sResource) => boolean): K8sApplier {\n    const newApplier = new K8sApplier(super.filter(predicate).toArray());\n    return newApplier;\n  }\n\n  override updateImages(transformFn: (image: string) => string): K8sApplier {\n    const newApplier = new K8sApplier(\n      super.updateImages(transformFn).toArray()\n    );\n    return newApplier;\n  }\n\n  /**\n   * Apply the YAML resources to the Kubernetes cluster\n   */\n  async apply(options: Partial<K8sApplyOptions> = {}): Promise<void> {\n    // Merge global defaults with local options (local overrides global)\n    const globalDefaults = get_k8s_defaults();\n    const mergedOptions = { ...globalDefaults, ...options };\n\n    const {\n      validate,\n      dryRun,\n      validateContext,\n      cache,\n      resourceName,\n      continueOnError,\n    } = mergedOptions;\n\n    // Track this k8s resource application\n    const dependencies = this.extractImageDependencies();\n    const name = resourceName || this.generateResourceName();\n    this.resourceId = resourceTracker.trackK8sYaml(name, dependencies);\n\n    try {\n      // Validate context if requested\n      if (validateContext) {\n        await validate_k8s_context().catch((error) => {\n          console.error(error.message);\n          throw error;\n        });\n      }\n\n      // Apply pending transforms if any\n      const transformedResources = await this.applyTransforms();\n      const yamlContent = new YamlWrapper(transformedResources).toYaml();\n\n      if (!yamlContent.trim()) {\n        logger.info(\"No YAML content to apply\", { operation: \"k8s_apply\" });\n        if (this.resourceId) {\n          resourceTracker.updateStatus(this.resourceId, \"ready\");\n        }\n        return;\n      }\n\n      // Generate wet repository paths and filenames\n      const resources = transformedResources;\n      const config = getWetRepositoryConfig();\n      \n      // Initialize state manager for change detection\n      const stateManager = new WetRepoStateManager(config.path, config.stage);\n      await stateManager.updateConfig(config.path, config.stage, config.flatStructure);\n      \n      let wetRepoFiles: { path: string, content: string, relativePath: string }[] = [];\n      \n      if (config.flatStructure) {\n        // Flat structure approach - all files in root folder\n        const fileName = generateMultiResourceFileName(resources);\n        const filePath = generateWetRepoPath(undefined, fileName);\n        const relativePath = fileName;\n        wetRepoFiles = [{ path: filePath, content: yamlContent, relativePath }];\n      } else {\n        // Group by resource type for organized structure\n        const grouped = groupResourcesByType(resources);\n\n        for (const [resourceType, typeResources] of grouped) {\n          for (const resource of typeResources) {\n            const fileName = generateResourceFileName(resource);\n            const filePath = generateWetRepoPath(resourceType, fileName);\n            const resourceYaml = YAML.stringify(resource);\n            const relativePath = `${resourceType}/${fileName}`;\n            wetRepoFiles.push({ path: filePath, content: resourceYaml, relativePath });\n          }\n        }\n      }\n      \n      // Create wet repository directory structure\n      const basePath = generateWetRepoPath();\n      await mkdir(basePath, { recursive: true });\n      \n      if (!config.flatStructure) {\n        // Create resource type subdirectories for organized structure\n        const resourceTypes = [...groupResourcesByType(resources).keys()];\n        for (const resourceType of resourceTypes) {\n          const typePath = generateWetRepoPath(resourceType);\n          await mkdir(typePath, { recursive: true });\n        }\n      }\n      console.log(\n        chalk.bgRed(\"delete command\"),\n        chalk.blue(`kubectl delete -f ${basePath}`)\n      );\n\n      // Register Kubernetes resources with live update manager (before cache check!)\n      if (!dryRun) {\n        for (const resource of transformedResources) {\n          liveUpdateManager.registerDeployment(resource);\n        }\n\n        logger.info(\n          \"Registered Kubernetes resources with live update manager\",\n          {\n            resourceCount: transformedResources.length,\n            operation: \"k8s_apply_register\",\n          }\n        );\n      }\n\n      // Check if content has changed using metadata-based detection\n      if (cache) {\n        let hasAnyChanges = false;\n        for (const file of wetRepoFiles) {\n          if (await stateManager.hasContentChanged(file.relativePath, file.content, file.path, mergedOptions)) {\n            hasAnyChanges = true;\n            break;\n          }\n        }\n        \n        if (!hasAnyChanges) {\n          logger.info(\"No changes detected, skipping apply\", {\n            resourceCount: this.count(),\n            fileCount: wetRepoFiles.length,\n            operation: \"k8s_apply_cached_skip\",\n          });\n          console.log(chalk.bgYellow(\"No changes detected, wet repository up to date\"));\n\n          // Update status to ready since cached resources are already applied\n          if (this.resourceId) {\n            resourceTracker.updateStatus(this.resourceId, \"ready\");\n          }\n          return;\n        }\n      }\n\n      console.log(chalk.bgYellow(\"Creating new wet repository files\"));\n      logger.info(\"Materializing Kubernetes resources to wet repository\", {\n        resourceCount: this.count(),\n        fileCount: wetRepoFiles.length,\n        wetRepoPath: basePath,\n        flatStructure: config.flatStructure,\n        stage: config.stage,\n        dryRun,\n        operation: \"k8s_apply_wet_repo\",\n      });\n\n      // Apply wet repository transforms if configured\n      const transforms = config.transform || [];\n\n      await Promise.all(\n        wetRepoFiles.map(async (file) => {\n          let contentToWrite = file.content;\n\n          // Apply transforms if configured\n          if (transforms.length > 0) {\n            // Parse resource to get metadata for transform context\n            const parsedResource = YAML.parse(file.content);\n\n            for (const transform of transforms) {\n              try {\n                const ctx = {\n                  content: contentToWrite,\n                  filePath: file.path,\n                  kind: parsedResource?.kind,\n                  name: parsedResource?.metadata?.name,\n                  namespace: parsedResource?.metadata?.namespace,\n                  resource: parsedResource\n                };\n\n                contentToWrite = await transform(ctx);\n\n                logger.info(\"Applied wet repository transform\", {\n                  filePath: file.relativePath,\n                  kind: ctx.kind,\n                  name: ctx.name,\n                  operation: \"wet_repo_transform\"\n                });\n              } catch (transformError) {\n                const errorMessage = transformError instanceof Error ? transformError.message : String(transformError);\n                logger.error(\"Failed to apply wet repository transform\", {\n                  filePath: file.relativePath,\n                  error: errorMessage,\n                  operation: \"wet_repo_transform_error\"\n                });\n                console.log(chalk.red(`❌ Transform failed for ${file.relativePath}: ${errorMessage}`));\n                throw transformError;\n              }\n            }\n          }\n\n          await writeFile(file.path, contentToWrite, \"utf8\");\n          await stateManager.trackFileInCurrentRun(file.relativePath);\n        })\n      );\n\n      // Generate flat temp file for per-apply operations\n      // Note: Transforms have already decrypted content if needed\n      const tempFilePath = await this.generateFlatTempFile(yamlContent);\n      \n      console.log(\n        chalk.bgRed(\"delete command\"),\n        chalk.blue(`kubectl delete -f ${tempFilePath}`)\n      );\n      \n      let applyFilePath = tempFilePath;\n      let useKustomize = false;\n\n      try {\n        const baseArgs = [\"kubectl\", \"apply\"];\n\n        if (!validate) {\n          baseArgs.push(\"--validate=false\");\n        }\n\n        if (dryRun) {\n          baseArgs.push(\"--dry-run=client\");\n        }\n\n        if (useKustomize) {\n          baseArgs.push(\"-k\", applyFilePath!);\n        } else {\n          baseArgs.push(\"-f\", applyFilePath!);\n        }\n\n        if (!dryRun) {\n          try {\n            // Try server-side apply first\n            await exec([...baseArgs, \"--server-side\", \"--force-conflicts\"]);\n          } catch {\n            // Fallback to regular apply\n            await exec(baseArgs);\n          }\n        }\n\n        logger.info(\"Successfully applied Kubernetes resources from wet repository\", {\n          resourceCount: this.count(),\n          wetRepoFiles: wetRepoFiles.length,\n          operation: \"k8s_apply_wet_repo\",\n        });\n        \n        // Update state manager with successful application\n        await Promise.all(\n          wetRepoFiles.map(file => \n            stateManager.updateFileState(\n              file.relativePath,\n              file.content,\n              mergedOptions,\n              this._sourceFiles,\n              this.count()\n            )\n          )\n        );\n\n        // Track successful completion\n        if (this.resourceId) {\n          resourceTracker.updateStatus(this.resourceId, \"ready\");\n        }\n      } catch (applyError) {\n        // Track apply failure\n        const errorMessage =\n          applyError instanceof Error ? applyError.message : String(applyError);\n        if (this.resourceId) {\n          resourceTracker.markError(this.resourceId, errorMessage);\n        }\n        \n        console.log(chalk.bgRed.white(\" KUBECTL APPLY FAILED \"));\n        console.log(chalk.red(`Resource: ${name}`));\n        console.log(chalk.red(`Error: ${errorMessage}`));\n        \n        if (continueOnError) {\n          logger.warn(\"Continuing despite kubectl apply failure\", { \n            resourceName: name,\n            error: errorMessage \n          });\n          return; // Continue execution instead of throwing\n        }\n        \n        throw applyError;\n      } finally {\n        // for now keep file as we don't have up and down commands\n        // fs.unlinkSync(tmp);\n      }\n    } catch (error) {\n      // Track overall failure\n      const errorMessage =\n        error instanceof Error ? error.message : String(error);\n      if (this.resourceId) {\n        resourceTracker.markError(this.resourceId, errorMessage);\n      }\n      throw error;\n    }\n  }\n}\n\n/**\n * Create a new K8sApplier from YAML input\n *\n * @param input - YAML string\n * @returns K8sApplier for chaining operations\n *\n * @example\n * ```typescript\n * await k8s(yamlString)\n *   .filter(byKind(\"Deployment\"))\n *   .updateImages(image => `registry.com/${image}`)\n *   .apply();\n * ```\n */\nexport function k8s(input: string): K8sApplier {\n  return new K8sApplier(input);\n}\n","import * as fs from \"fs\";\nimport fg from \"fast-glob\";\nimport { k8s } from \"./k8s-simple\";\nimport type { K8sApplier } from \"./k8s-simple\";\nimport chalk from \"chalk\";\n\n/**\n * Interface for objects that can be serialized to YAML\n */\nexport interface ToYamlable {\n  toYaml(options?: any): string;\n}\n\n/**\n * Type guard to check if an object has a toYaml method\n */\nfunction isToYamlable(value: any): value is ToYamlable {\n  return value != null && typeof value === 'object' && typeof value.toYaml === 'function';\n}\n\n/**\n * Smart YAML loader that automatically detects input type\n *\n * @param inputs - File path, YAML content string, or ToYamlable object (accepts multiple arguments)\n * @returns K8sApplier for chaining operations\n *\n * @example\n * ```typescript\n * // Load from file\n * await k8s_yaml(\"./deploy.yaml\")\n *   .updateImages(image => `registry.com/${image}`)\n *   .apply();\n *\n * // Load from YAML string\n * await k8s_yaml(yamlContent)\n *   .filter(byKind(\"Deployment\"))\n *   .apply();\n *\n * // Load from object with toYaml() method\n * await k8s_yaml(deployment(\"my-app\", \"image:latest\"))\n *   .apply();\n *\n * // Load multiple objects as arguments\n * await k8s_yaml(appDeployment, appService, configMap)\n *   .apply();\n *\n * // Load multiple files\n * await k8s_yaml(\"./app.yaml\", \"./service.yaml\", \"./config.yaml\")\n *   .updateImages(image => `registry.com/${image}`)\n *   .apply();\n * ```\n */\nexport function k8s_yaml(...inputs: Array<string | ToYamlable>): K8sApplier {\n  console.log(\"\\n\\n---\\n\\n\")\n\n  // Process inputs\n  const yamlParts: string[] = [];\n\n  for (const item of inputs) {\n    // Check if item has toYaml() method\n    if (isToYamlable(item)) {\n      console.log(chalk.bgBlue(\"Object with toYaml()\"))\n      yamlParts.push(item.toYaml());\n    }\n    // Check if it's a file path\n    else if (typeof item === 'string' && fs.existsSync(item)) {\n      console.log(chalk.bgBlue(item))\n      const content = fs.readFileSync(item, \"utf8\");\n      yamlParts.push(content);\n    }\n    // Assume it's inline YAML string\n    else {\n      console.log(chalk.bgBlue(\"Inline Yaml\"))\n      yamlParts.push(item as string);\n    }\n  }\n\n  const yamlText = yamlParts.join(\"\\n---\\n\");\n  return k8s(yamlText);\n}\n\n/**\n * Load YAML from one or more files with wildcard support and early validation\n *\n * @param paths - File paths or glob patterns (supports *, ?, [])\n * @returns K8sApplier for chaining operations\n *\n * @example\n * ```typescript\n * // Single file\n * await k8s_file(\"./deploy/app.yaml\")\n *   .updateImages(image => `registry.com/${image}`)\n *   .apply();\n *\n * // Multiple files\n * await k8s_file(\"./app.yaml\", \"./service.yaml\", \"./ingress.yaml\")\n *   .filter(byKind(\"Deployment\"))\n *   .apply();\n *\n * // Wildcard patterns\n * await k8s_file(\"./deploy/*.yaml\", \"./config/**\\/*.yml\")\n *   .apply();\n * ```\n */\nexport function k8s_file(...paths: string[]): K8sApplier {\n  // Expand wildcards using fast-glob\n  const expandedPaths: string[] = [];\n\n  for (const path of paths) {\n    if (path.includes('*') || path.includes('?') || path.includes('[')) {\n      // It's a glob pattern\n      const matches = fg.sync(path);\n      expandedPaths.push(...matches);\n    } else {\n      // Regular file path\n      expandedPaths.push(path);\n    }\n  }\n\n  // Early validation - check all files exist upfront\n  const missingFiles = expandedPaths.filter(path => !fs.existsSync(path));\n  if (missingFiles.length > 0) {\n    console.warn(`Files not found: ${missingFiles.join(', ')}`);\n  }\n\n  // Create K8sApplier but mark it as file-based for better display names\n  const applier = k8s_yaml(...expandedPaths);\n  applier._sourceFiles = expandedPaths; // Store source files for better display\n  return applier;\n}","import type { LiveSync, LiveRun } from \"../types/index\";\n\nfunction normalizeCommand(cmd: string[]): string[] {\n  // Handle case where someone passes [\"ls -a\"] instead of [\"ls\", \"-a\"]\n  if (cmd.length === 1 && cmd[0] && cmd[0].includes(\" \")) {\n    const firstCmd = cmd[0];\n    console.warn(\n      `Warning: Command \"${firstCmd}\" contains spaces. Consider splitting into separate arguments: ${JSON.stringify(\n        firstCmd.split(\" \")\n      )}`\n    );\n    return firstCmd.split(\" \");\n  }\n  return cmd;\n}\n\nexport function sync(\n  src: string,\n  dest: string,\n  include?: string[],\n  exclude?: string[]\n): LiveSync {\n  return { type: \"sync\", src, dest, include, exclude };\n}\n\nexport function run(\n  cmd: string[],\n  whenFilesChanged: string[],\n  options: { dir?: string; env?: Record<string, string> } | undefined = {}\n): LiveRun {\n  const { dir = \".\", env = {} } = options;\n  return {\n    type: \"run\",\n    cmd: normalizeCommand(cmd),\n    dir,\n    env,\n    whenFilesChanged,\n  };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'yaml';\nimport { ToYamlable } from '../core/k8s';\nimport type { FileDecryptor } from '../types';\n\n\n// Example usage:\n// const cm = ConfigMap.fromDirectory('my-config', './config-files');\n// console.log(cm.toYaml());\n//\n// Single file (key derived from filename):\n// const cm1 = ConfigMap.fromFile('single-config', './app.conf');\n//\n// Multiple files (keys derived from filenames):\n// const cm2 = ConfigMap.fromFile('multi-config', './app.conf', './nginx.conf', './redis.conf');\n//\n// Mixed approach with custom keys:\n// const cm3 = ConfigMap.fromFile('mixed-config', \n//   { key: 'app', path: './app.conf' },\n//   './default.conf',\n//   { key: 'custom', path: './settings.json' }\n// );\n\n\nexport class ConfigMap implements ToYamlable {\n  name: string;\n  data: Record<string, string> = {};\n  binaryData: Record<string, string> = {};\n\n  constructor(name: string) {\n    this.name = name;\n  }\n\n  static fromFile(name: string, ...files: Array<{ key?: string; path: string } | string>): ConfigMap {\n    const cm = new ConfigMap(name);\n\n    // Process files\n    for (const file of files) {\n      if (typeof file === 'string') {\n        // Use filename as key when only path is provided\n        const key = path.basename(file);\n        cm.addFile(key, file);\n      } else {\n        // Use provided key or filename as fallback\n        const key = file.key || path.basename(file.path);\n        cm.addFile(key, file.path);\n      }\n    }\n\n    return cm;\n  }\n\n  static fromDirectory(name: string, dirPath: string): ConfigMap {\n    const cm = new ConfigMap(name);\n\n    function walk(currentPath: string): void {\n      const entries = fs.readdirSync(currentPath, { withFileTypes: true });\n      for (const entry of entries) {\n        const fullPath = path.join(currentPath, entry.name);\n        if (entry.isDirectory()) {\n          walk(fullPath);\n        } else {\n          const relPath = path.relative(dirPath, fullPath);\n          cm.addFile(relPath, fullPath);\n        }\n      }\n    }\n\n    walk(dirPath);\n    return cm;\n  }\n\n  /**\n   * Create a ConfigMap from encrypted env file\n   *\n   * @deprecated **Not recommended for sensitive data!**\n   *\n   * ConfigMaps are designed for **non-sensitive** configuration.\n   * For sensitive data (passwords, tokens, API keys), use `Secret.fromEncryptedEnvFile()` instead.\n   *\n   * This method decrypts the env file and stores plain text in the ConfigMap,\n   * allowing the pod to use the values directly. However, ConfigMaps are not\n   * designed for sensitive data and lack the security features of Secrets.\n   *\n   * **Prefer:** `Secret.fromEncryptedEnvFile()` for sensitive data\n   *\n   * @param name - ConfigMap name\n   * @param decryptor - File decryptor implementation (e.g., SopsHelper from @tilt-ts/sops)\n   * @param envFilePath - Encrypted env file path\n   * @returns ConfigMap instance with decrypted content\n   *\n   * @example\n   * ```typescript\n   * import { SopsHelper } from \"@tilt-ts/sops\";\n   *\n   * const sops = await SopsHelper.create({ ageKeys: [process.env.SOPS_AGE_KEY] });\n   *\n   * // ⚠️ Not recommended - use Secret.fromEncryptedEnvFile() instead!\n   * const config = await ConfigMap.fromEncryptedEnvFile(\n   *   'app-config',\n   *   sops,\n   *   './config/.env.encrypted'\n   * );\n   *\n   * // ✅ Recommended for sensitive data:\n   * import { Secret } from \"@tilt-ts/core\";\n   * const secret = await Secret.fromEncryptedEnvFile(\n   *   'app-secrets',\n   *   sops,\n   *   './secrets/.env.encrypted'\n   * );\n   * ```\n   */\n  static async fromEncryptedEnvFile(\n    name: string,\n    decryptor: FileDecryptor,\n    envFilePath: string\n  ): Promise<ConfigMap> {\n    const cm = new ConfigMap(name);\n\n    if (!fs.existsSync(envFilePath)) {\n      throw new Error(`Encrypted env file not found: ${envFilePath}`);\n    }\n\n    // Read encrypted content\n    const encryptedContent = fs.readFileSync(envFilePath, \"utf8\");\n\n    // Decrypt using provided decryptor\n    const decryptedContent = await decryptor.decrypt(encryptedContent, envFilePath);\n\n    // Parse env content and add to ConfigMap data\n    for (const line of decryptedContent.split(/\\r?\\n/)) {\n      const trimmed = line.trim();\n      if (!trimmed || trimmed.startsWith(\"#\")) continue;\n      const idx = trimmed.indexOf(\"=\");\n      if (idx === -1) continue;\n      const key = trimmed.slice(0, idx).trim();\n      const val = trimmed.slice(idx + 1);\n      cm.data[key] = val;\n    }\n\n    return cm;\n  }\n\n  private addFile(key: string, filePath: string): void {\n    const content = fs.readFileSync(filePath);\n\n    if (this.isUtf8(content)) {\n      // Text file\n      const textContent = content.toString('utf-8');\n      this.data[key] = textContent;\n    } else {\n      // Binary file - store as base64\n      this.binaryData[key] = content.toString('base64');\n    }\n  }\n\n  private isUtf8(buffer: Buffer): boolean {\n    try {\n      buffer.toString('utf-8');\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  toJSON(): Record<string, any> {\n    const manifest: Record<string, any> = {\n      apiVersion: 'v1',\n      kind: 'ConfigMap',\n      metadata: { name: this.name },\n    };\n    if (Object.keys(this.data).length > 0) {\n      manifest.data = this.data;\n    }\n    if (Object.keys(this.binaryData).length > 0) {\n      manifest.binaryData = this.binaryData;\n    }\n    return manifest;\n  }\n\n  toYaml(): string {\n    return yaml.stringify(this.toJSON());\n  }\n}\n\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as yaml from \"yaml\";\nimport { z, ZodTypeAny } from \"zod\";\nimport { ToYamlable } from \"../core/k8s\";\nimport type { FileDecryptor } from \"../types\";\n\ntype SecretType =\n  | \"Opaque\"\n  | \"kubernetes.io/dockerconfigjson\"\n  | \"kubernetes.io/basic-auth\"\n  | \"kubernetes.io/ssh-auth\"\n  | \"kubernetes.io/tls\";\n\ntype Value = string | Buffer;\n\ntype BuilderOpts = {\n  type?: SecretType;\n  namespace?: string;\n  labels?: Record<string, string>;\n  annotations?: Record<string, string>;\n  useStringData?: boolean;\n  schema?: ZodTypeAny; // zod schema that validates the key/value object\n};\n/*\nUsage with zod:\n\nimport { z } from \"zod\";\n\n// Require specific keys; disallow unknowns via .strict()\nconst schema = z.object({\n  DB_USER: z.string().min(1),\n  DB_PASS: z.string().min(1),\n}).strict();\n\nconst s1 = Secret.fromValues(\"db-secrets\", { DB_USER: \"u\", DB_PASS: \"p\" }, { schema });\nconsole.log(s1.toYaml());\n\n// From .env with schema\nconst s2 = Secret.fromEnvFile(\"env-secrets\", \"./.env\", { schema, useStringData: true });\nconsole.log(s2.toJSON());\n\n// Allow optional extras via .passthrough()\nconst loose = z.object({ TOKEN: z.string() }).passthrough();\nconst s3 = Secret.fromValues(\"loose\", { TOKEN: \"t\", EXTRA: \"ok\" }, { schema: loose });\nconsole.log(s3.toYaml());\n*/\n\nexport class Secret implements ToYamlable {\n  name: string;\n  namespace?: string;\n  type: SecretType = \"Opaque\";\n  labels: Record<string, string> = {};\n  annotations: Record<string, string> = {};\n\n  private useStringDataFlag = false;\n  private data: Record<string, string> = {}; // base64 values\n  private stringData: Record<string, string> = {}; // plaintext values\n\n  private constructor(name: string) {\n    this.name = name;\n  }\n\n  // ---------- Static builders ----------\n\n  static create(name: string): Secret {\n    return new Secret(name);\n  }\n\n  static fromValues(\n    name: string,\n    values: Record<string, Value>,\n    opts: BuilderOpts = {}\n  ): Secret {\n    const s = new Secret(name);\n    if (opts.type) s.type = opts.type;\n    if (opts.namespace) s.namespace = opts.namespace;\n    if (opts.labels) s.labels = { ...opts.labels };\n    if (opts.annotations) s.annotations = { ...opts.annotations };\n    if (opts.useStringData) s.useStringData();\n\n    let validated: Record<string, Value> = values;\n    if (opts.schema) {\n      const result = opts.schema.safeParse(values);\n      if (!result.success) {\n        console.error('Secret validation error:', result.error);\n        throw result.error;\n      }\n      validated = result.data as Record<string, Value>;\n    }\n\n    for (const [k, v] of Object.entries(validated)) s.add(k, v);\n    return s;\n  }\n\n  static fromEnvFile(\n    name: string,\n    envFilePath: string,\n    opts: BuilderOpts = {}\n  ): Secret {\n    if (!fs.existsSync(envFilePath))\n      throw new Error(`Env file not found: ${envFilePath}`);\n\n    const parsed: Record<string, string> = {};\n    const raw = fs.readFileSync(envFilePath, \"utf8\");\n    for (const line of raw.split(/\\r?\\n/)) {\n      const trimmed = line.trim();\n      if (!trimmed || trimmed.startsWith(\"#\")) continue;\n      const idx = trimmed.indexOf(\"=\");\n      if (idx === -1) continue;\n      const key = trimmed.slice(0, idx).trim();\n      const val = trimmed.slice(idx + 1);\n      parsed[key] = val;\n    }\n\n    return Secret.fromValues(name, parsed, opts);\n  }\n\n  /**\n   * Create a Secret from encrypted env file(s)\n   *\n   * The env files are decrypted, parsed, and stored as plain text in the Secret.\n   * This allows the pod to use the environment variables directly.\n   *\n   * **Flow:**\n   * 1. Source: Encrypted `.env` file (safe for Git with SOPS)\n   * 2. Decrypt using provided decryptor\n   * 3. Parse env variables\n   * 4. Create Secret with plain text stringData\n   * 5. Pod receives decrypted env vars\n   *\n   * @param name - Secret name\n   * @param decryptor - File decryptor implementation (e.g., SopsHelper from @tilt-ts/sops)\n   * @param envFilePath - Encrypted env file path\n   * @param opts - Optional configuration\n   * @returns Secret instance with decrypted content\n   *\n   * @example\n   * ```typescript\n   * import { Secret } from \"@tilt-ts/core\";\n   * import { SopsHelper } from \"@tilt-ts/sops\";\n   *\n   * const sops = await SopsHelper.create({\n   *   ageKeys: [process.env.SOPS_AGE_KEY]\n   * });\n   *\n   * // Create Secret from encrypted .env file\n   * const secret = await Secret.fromEncryptedEnvFile(\n   *   'app-secrets',\n   *   sops,\n   *   './secrets/.env.encrypted'\n   * );\n   *\n   * await k8s_yaml(secret).apply();\n   * ```\n   */\n  static async fromEncryptedEnvFile(\n    name: string,\n    decryptor: FileDecryptor,\n    envFilePath: string,\n    opts: BuilderOpts = {}\n  ): Promise<Secret> {\n    if (!fs.existsSync(envFilePath))\n      throw new Error(`Encrypted env file not found: ${envFilePath}`);\n\n    // Read encrypted content\n    const encryptedContent = fs.readFileSync(envFilePath, \"utf8\");\n\n    // Decrypt using provided decryptor\n    const decryptedContent = await decryptor.decrypt(encryptedContent, envFilePath);\n\n    // Parse decrypted env content\n    const parsed: Record<string, string> = {};\n    for (const line of decryptedContent.split(/\\r?\\n/)) {\n      const trimmed = line.trim();\n      if (!trimmed || trimmed.startsWith(\"#\")) continue;\n      const idx = trimmed.indexOf(\"=\");\n      if (idx === -1) continue;\n      const key = trimmed.slice(0, idx).trim();\n      const val = trimmed.slice(idx + 1);\n      parsed[key] = val;\n    }\n\n    return Secret.fromValues(name, parsed, {\n      ...opts,\n      useStringData: true, // Use stringData for env vars (more readable)\n    });\n  }\n\n  static dockerConfigJson(\n    name: string,\n    dockerConfig: Record<string, unknown> | string,\n    opts: Omit<BuilderOpts, \"schema\"> = {}\n  ): Secret {\n    const s = new Secret(name).setType(\"kubernetes.io/dockerconfigjson\");\n    if (opts.namespace) s.namespace = opts.namespace;\n    if (opts.labels) s.labels = { ...opts.labels };\n    if (opts.annotations) s.annotations = { ...opts.annotations };\n    if (opts.useStringData) s.useStringData();\n\n    const jsonStr =\n      typeof dockerConfig === \"string\"\n        ? dockerConfig\n        : JSON.stringify(dockerConfig);\n    s.add(\".dockerconfigjson\", jsonStr);\n    return s;\n  }\n\n  // ---------- Builder methods ----------\n\n  setNamespace(ns: string): this {\n    this.namespace = ns;\n    return this;\n  }\n\n  setType(t: SecretType): this {\n    this.type = t;\n    return this;\n  }\n\n  setLabels(labels: Record<string, string>): this {\n    this.labels = { ...labels };\n    return this;\n  }\n\n  setAnnotations(annotations: Record<string, string>): this {\n    this.annotations = { ...annotations };\n    return this;\n  }\n\n  useStringData(): this {\n    this.useStringDataFlag = true;\n    return this;\n  }\n\n  add(key: string, value: Value): this {\n    if (this.useStringDataFlag && this.isProbablyText(value)) {\n      this.stringData[key] = Buffer.isBuffer(value)\n        ? value.toString(\"utf8\")\n        : value;\n    } else {\n      this.data[key] = this.b64(value);\n    }\n    return this;\n  }\n\n  addFile(keyOrPath: string, filePath?: string): this {\n    const fp = filePath ?? keyOrPath;\n    const key = filePath ? keyOrPath : path.basename(fp);\n    const buf = fs.readFileSync(fp);\n    return this.add(key, buf);\n  }\n\n  addFiles(...files: Array<{ key?: string; path: string } | string>): this {\n    for (const f of files) {\n      if (typeof f === \"string\") this.addFile(f);\n      else this.addFile(f.key ?? path.basename(f.path), f.path);\n    }\n    return this;\n  }\n\n  // ---------- Emitters ----------\n\n  toJSON(): Record<string, unknown> {\n    const metadata: Record<string, unknown> = { name: this.name };\n    if (this.namespace) metadata.namespace = this.namespace;\n    if (Object.keys(this.labels).length) metadata.labels = this.labels;\n    if (Object.keys(this.annotations).length)\n      metadata.annotations = this.annotations;\n\n    const manifest: Record<string, unknown> = {\n      apiVersion: \"v1\",\n      kind: \"Secret\",\n      metadata,\n      type: this.type,\n    };\n\n    if (Object.keys(this.data).length) manifest.data = this.data;\n    if (Object.keys(this.stringData).length)\n      manifest.stringData = this.stringData;\n\n    return manifest;\n  }\n\n  toYaml(): string {\n    return yaml.stringify(this.toJSON());\n  }\n\n  // ---------- Internals ----------\n\n  private b64(v: Value): string {\n    return Buffer.isBuffer(v)\n      ? v.toString(\"base64\")\n      : Buffer.from(v, \"utf8\").toString(\"base64\");\n  }\n\n  private isProbablyText(v: Value): boolean {\n    const buf = Buffer.isBuffer(v) ? v : Buffer.from(v, \"utf8\");\n    if (buf.includes(0)) return false;\n    let nonText = 0;\n    for (const b of buf) {\n      if (\n        b === 9 ||\n        b === 10 ||\n        b === 13 ||\n        (b >= 32 && b <= 126) ||\n        (b >= 160 && b <= 255)\n      )\n        continue;\n      nonText++;\n    }\n    return nonText / buf.length < 0.3;\n  }\n}\n","export { docker_build } from \"./core/docker\";\nexport { k8s_yaml, k8s_file } from \"./core/k8s\";\nexport { k8s } from \"./core/k8s-simple\";\nexport { live_update } from \"./core/live-update\";\nexport {\n  allow_k8s_contexts,\n  set_k8s_context,\n  set_k8s_namespace,\n  k8s_context,\n  validate_k8s_context,\n  reset_allowed_contexts,\n  get_allowed_contexts,\n} from \"./core/k8s-contexts\";\nexport { sync, run } from \"./helpers/steps\";\nexport { ConfigMap } from \"./helpers/ConfigMap\";\nexport { Secret } from \"./helpers/Secret\";\nexport { exec, execCapture } from \"./utils/process\";\nexport { logger } from \"./utils/logger\";\nexport {\n  YamlWrapper,\n  byKind,\n  byName,\n  byNamespace,\n} from \"./utils/yaml-wrapper\";\nexport { imageRegistry } from \"./core/image-registry\";\nexport { default_registry, get_default_registry, reset_default_registry } from \"./core/registry\";\nexport { k8s_defaults, get_k8s_defaults, reset_k8s_defaults } from \"./core/k8s-defaults\";\nexport { \n  setGlobalIgnorePatterns, \n  getGlobalIgnorePatterns, \n  resetIgnorePatterns, \n  getCustomIgnorePatterns,\n  DEFAULT_IGNORE_PATTERNS \n} from \"./core/ignore-patterns\";\nexport { liveUpdateManager } from \"./core/live-update-manager\";\nexport { resourceTracker } from \"./utils/resource-tracker\";\nexport { wet_repository, getWetRepositoryConfig, resetWetRepositoryConfig } from \"./core/wet-repository\";\nexport { __tiltfile_start_hook, __tiltfile_completion_hook } from \"./core/tiltfile-hooks\";\nexport * from \"./types/index\";\nexport type { TransformContext, ResourceTransform, FileTransform } from \"./types/transforms\";\n\n// UI components are optional - only available if React/Ink is installed\n// export { startTiltUI } from \"./ui/index\";\n","import { logger } from \"../utils/logger\";\nimport { WetRepoStateManager } from \"../utils/wet-repo-state\";\nimport { generateWetRepoPath, getWetRepositoryConfig } from \"./wet-repository\";\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\n\n/**\n * Tiltfile start hook - initialize new run tracking\n * Call this at the beginning of tiltfile execution\n */\nexport async function __tiltfile_start_hook(): Promise<void> {\n  try {\n    const config = getWetRepositoryConfig();\n    const stateManager = new WetRepoStateManager(config.path, config.stage);\n    \n    // Initialize new run tracking\n    await stateManager.startNewRun();\n    \n    logger.info(\"Started new tiltfile execution\", { \n      stage: config.stage,\n      wetRepoPath: config.path,\n      flatStructure: config.flatStructure,\n      operation: \"tiltfile_start\" \n    });\n  } catch (error) {\n    logger.error(\"Failed to initialize tiltfile start hook\", { \n      error: error instanceof Error ? error.message : String(error),\n      operation: \"tiltfile_start_error\" \n    });\n    // Don't fail the entire tiltfile for hook errors\n  }\n}\n\n/**\n * Generate comprehensive kustomization.yaml by scanning wet repository directory\n * This creates the GitOps-friendly kustomization file with ALL resources from ALL applies\n */\nasync function generateComprehensiveWetRepoKustomization(basePath: string): Promise<void> {\n  try {\n    // Scan wet repo directory for all YAML files (excluding existing kustomization.yaml)\n    const allYamlFiles = await scanWetRepoForYamlFiles(basePath);\n    \n    if (allYamlFiles.length <= 1) {\n      // No comprehensive kustomization needed for single or no files\n      return;\n    }\n    \n    // Filter out kustomization.yaml itself and sort for consistent output\n    const resources = allYamlFiles\n      .filter(file => file !== \"kustomization.yaml\")\n      .sort();\n      \n    if (resources.length === 0) {\n      return;\n    }\n      \n    // Generate comprehensive kustomization content\n    const kustomizationContent = `apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n${resources.map(file => `- ${file}`).join('\\n')}\n`;\n\n    // Write comprehensive kustomization.yaml to wet repository\n    const kustomizationPath = path.join(basePath, \"kustomization.yaml\");\n    await fs.writeFile(kustomizationPath, kustomizationContent, \"utf8\");\n    \n    logger.info(\"Generated comprehensive kustomization.yaml for GitOps\", {\n      resourceCount: resources.length,\n      kustomizationPath,\n      operation: \"wet_repo_kustomization\"\n    });\n    \n  } catch (error) {\n    logger.warn(\"Failed to generate comprehensive wet repo kustomization\", { \n      error: error instanceof Error ? error.message : String(error), \n      basePath,\n      operation: \"wet_repo_kustomization_error\" \n    });\n  }\n}\n\n/**\n * Recursively scan wet repository directory for YAML files\n */\nasync function scanWetRepoForYamlFiles(basePath: string): Promise<string[]> {\n  const yamlFiles: string[] = [];\n  \n  const scanDirectory = async (dirPath: string, relativePath = \"\"): Promise<void> => {\n    try {\n      const entries = await fs.readdir(dirPath, { withFileTypes: true });\n      \n      for (const entry of entries) {\n        if (entry.isDirectory()) {\n          // Recursively scan subdirectories\n          const subRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;\n          await scanDirectory(path.join(dirPath, entry.name), subRelativePath);\n        } else if (entry.isFile() && entry.name.endsWith('.yaml')) {\n          // Found a YAML file\n          const filePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;\n          yamlFiles.push(filePath);\n        }\n      }\n    } catch (error) {\n      // Directory might not exist or be accessible, skip silently\n      logger.debug(\"Failed to scan directory\", { dirPath, error });\n    }\n  };\n  \n  await scanDirectory(basePath);\n  return yamlFiles;\n}\n\n/**\n * Tiltfile completion hook - cleanup orphaned files and generate comprehensive kustomization\n * Call this at the end of tiltfile execution (in finally block)\n */\nexport async function __tiltfile_completion_hook(): Promise<void> {\n  try {\n    const config = getWetRepositoryConfig();\n    const stateManager = new WetRepoStateManager(config.path, config.stage);\n    const basePath = generateWetRepoPath();\n    \n    // Get orphaned files before completing run\n    const orphanedFiles = await stateManager.getOrphanedFiles();\n    \n    // Remove orphaned files\n    if (orphanedFiles.length > 0) {\n      await stateManager.removeOrphanedFiles(basePath);\n      logger.info(\"Cleaned up orphaned wet repository files\", {\n        count: orphanedFiles.length,\n        files: orphanedFiles,\n        stage: config.stage,\n        operation: \"wet_repo_cleanup\"\n      });\n    }\n    \n    // Mark run as completed (moves current → previous)\n    const completedOrphans = await stateManager.completeCurrentRun();\n    \n    // Generate comprehensive kustomization.yaml with only current files\n    await generateComprehensiveWetRepoKustomization(basePath);\n    \n    logger.info(\"Completed tiltfile execution\", { \n      stage: config.stage,\n      wetRepoPath: config.path,\n      cleanedFiles: completedOrphans.length,\n      operation: \"tiltfile_completion\" \n    });\n    \n  } catch (error) {\n    logger.error(\"Failed to execute tiltfile completion hook\", { \n      error: error instanceof Error ? error.message : String(error),\n      operation: \"tiltfile_completion_error\" \n    });\n    // Don't fail the entire tiltfile for hook errors\n  }\n}"]}