{"version":3,"file":"plugin.mjs","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import { EventEmitter } from \"node:events\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { Effect } from \"effect\";\nimport { buildRuntimeConfig, detectLocalPackages, prepareDevelopmentRuntimeConfig } from \"./app\";\nimport {\n  buildEveryPluginQuietly,\n  buildEverythingDevQuietly,\n  buildWorkspaceTargets,\n  fileExists,\n  getPluginRef,\n  readJsonFile,\n  selectWorkspaceTargets,\n} from \"./build\";\nimport {\n  ensureEnvFile,\n  loadProjectEnv,\n  syncGeneratedInfra,\n  writeGeneratedInfra,\n} from \"./cli/infra\";\nimport {\n  buildInitPatterns,\n  copyFilteredFiles,\n  detectGitRemoteUrl,\n  fetchParentConfig,\n  generateDatabaseMigrations,\n  personalizeAgentsMd,\n  personalizeConfig,\n  removeInitLockfile,\n  resolveSourceDir,\n  runBunInstall,\n  runTypesGen,\n  scaffoldMinimalProject,\n  stripOrphanedWorkspacesFromLockfile,\n  writeInitSnapshot,\n} from \"./cli/init\";\nimport { getStatus } from \"./cli/status\";\nimport { syncTemplate } from \"./cli/sync\";\nimport { upgradeTemplate } from \"./cli/upgrade\";\nimport { generateCodeArtifacts } from \"./code-artifacts\";\nimport {\n  buildRuntimePluginsForConfig,\n  drainConfigWarnings,\n  findConfigPath,\n  getHostDevelopmentPort,\n  getProjectRoot,\n  loadLocalConfig,\n  loadResolvedConfig,\n  resolveConfigComposableEntries,\n  resumeWarnings,\n  suppressWarnings,\n} from \"./config\";\nimport {\n  type BosConfigResult,\n  bosContract,\n  type OverrideSection,\n  type PhaseTiming,\n  type PluginListResult,\n} from \"./contract\";\nimport {\n  buildRegistryConfigUrl,\n  fetchBosConfigFromFastKv,\n  fetchRemotePluginManifest,\n  getRegistryNamespaceForAccount,\n  type PluginManifest,\n  parseBosUrl,\n} from \"./fastkv\";\nimport { computeSriHashForUrl, parseDeployLines } from \"./integrity\";\nimport { type BosEnv, mergeBosConfigWithExtends, resolveExtendsRef } from \"./merge\";\nimport { addFunctionCallAccessKey, ensureNearCli } from \"./near-cli\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport { extractPublishedUrl, publishToFastKv } from \"./publish\";\nimport { createPlugin, z } from \"./sdk\";\nimport {\n  type AppOrchestrator,\n  buildDescription,\n  buildServiceDescriptorMap,\n  type ServiceDescriptor,\n} from \"./service-descriptor\";\nimport { syncResolvedSharedDeps } from \"./shared-deps\";\nimport type { BosConfig, BosConfigInput, ExtendsConfig, RuntimeConfig, SourceMode } from \"./types\";\nimport { BosConfigSchema } from \"./types\";\nimport { run } from \"./utils/run\";\nimport { saveBosConfig } from \"./utils/save-config\";\nimport { colors } from \"./utils/theme\";\n\nexport interface DevSessionData {\n  orchestrator: AppOrchestrator;\n  services: Map<string, ServiceDescriptor>;\n  runtimeConfig: RuntimeConfig;\n}\n\nexport interface StartSummary {\n  configSource: string;\n  configSourceHttp?: string;\n  account: string;\n  domain?: string;\n  modules: { host?: string; ui?: string; api?: string; auth?: string };\n  warnings: string[];\n}\n\nexport type ProgressEvent = {\n  phase: string;\n  status: \"running\" | \"done\" | \"error\";\n  durationMs?: number;\n  message?: string;\n};\n\nexport const pluginEvents = new EventEmitter();\n\nlet pendingSession: DevSessionData | null = null;\nlet pendingStartSummary: StartSummary | null = null;\n\nexport function consumeDevSession(): (DevSessionData & { summary?: StartSummary }) | null {\n  const data = pendingSession;\n  const summary = pendingStartSummary;\n  pendingSession = null;\n  pendingStartSummary = null;\n  if (!data) return null;\n  return summary ? { ...data, summary } : data;\n}\n\nasync function timePhase<T>(\n  timings: PhaseTiming[],\n  name: string,\n  fn: () => Promise<T>,\n): Promise<T> {\n  pluginEvents.emit(\"progress\", { phase: name, status: \"running\" } satisfies ProgressEvent);\n  const startedAt = Date.now();\n  try {\n    const result = await fn();\n    timings.push({ name, durationMs: Date.now() - startedAt });\n    pluginEvents.emit(\"progress\", {\n      phase: name,\n      status: \"done\",\n      durationMs: Date.now() - startedAt,\n    } satisfies ProgressEvent);\n    return result;\n  } catch (error) {\n    pluginEvents.emit(\"progress\", {\n      phase: name,\n      status: \"error\",\n      durationMs: Date.now() - startedAt,\n    } satisfies ProgressEvent);\n    throw error;\n  }\n}\n\nconst PUBLISH_FUNCTION_NAMES = [\"__fastdata_kv\"];\n\ntype BosDeps = {\n  bosConfig: BosConfig | null;\n  runtimeConfig: RuntimeConfig | null;\n  configDir: string;\n};\n\ntype PluginAttachmentConfig = NonNullable<BosConfig[\"plugins\"]>[string];\n\nfunction parseSourceMode(value: string | undefined, defaultValue: SourceMode): SourceMode {\n  if (value === \"local\" || value === \"remote\") return value;\n  return defaultValue;\n}\n\nfunction buildConfigResult(\n  bosConfig: BosConfigInput | BosConfig | null,\n  full = false,\n): BosConfigResult {\n  const packages =\n    bosConfig?.app && typeof bosConfig.app === \"object\" ? Object.keys(bosConfig.app) : [];\n  const remotes = packages.filter((name) => name !== \"host\");\n\n  return {\n    config: bosConfig ?? null,\n    packages,\n    remotes,\n    full,\n  };\n}\n\nfunction isValidProxyUrl(url: string): boolean {\n  try {\n    const parsed = new URL(url);\n    return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n  } catch {\n    return false;\n  }\n}\n\nfunction resolveProxyUrl(bosConfig: BosConfig | null): string | null {\n  if (!bosConfig) return null;\n  const apiConfig = bosConfig.app.api;\n  if (!apiConfig) return null;\n  if (apiConfig.proxy && isValidProxyUrl(apiConfig.proxy)) return apiConfig.proxy;\n  if (apiConfig.production && isValidProxyUrl(apiConfig.production)) return apiConfig.production;\n  return null;\n}\n\nfunction sanitizePluginKey(value: string): string {\n  return value\n    .replace(/[^A-Za-z0-9/_-]/g, \"-\")\n    .replace(/\\/+/g, \"/\")\n    .split(\"/\")\n    .filter(Boolean)\n    .map((segment) => segment.replace(/[^A-Za-z0-9_-]/g, \"-\"))\n    .join(\"/\")\n    .replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction defaultPluginKey(source: string): string {\n  const normalized = source.replace(/^local:/, \"\").replace(/\\/$/, \"\");\n  if (source.startsWith(\"local:\")) {\n    return sanitizePluginKey(basename(normalized)) || \"plugin\";\n  }\n\n  try {\n    const url = new URL(source);\n    return sanitizePluginKey(basename(url.pathname) || url.hostname) || \"plugin\";\n  } catch {\n    return sanitizePluginKey(source) || \"plugin\";\n  }\n}\n\nfunction pluginLocalPath(configDir: string, attachment: PluginAttachmentConfig): string | null {\n  const ref = getPluginRef(attachment);\n  const source = ref?.development ?? ref?.production;\n  if (!source?.startsWith(\"local:\")) {\n    return null;\n  }\n\n  return join(configDir, source.slice(\"local:\".length));\n}\n\nfunction listPluginAttachments(config: BosConfig | null) {\n  return (Object.entries(config?.plugins ?? {}) as Array<[string, PluginAttachmentConfig]>)\n    .map(([key, attachment]) => {\n      const ref = getPluginRef(attachment);\n      return {\n        key,\n        development: ref?.development,\n        production: ref?.production,\n        localPath: ref?.development?.startsWith(\"local:\")\n          ? ref.development.slice(\"local:\".length)\n          : undefined,\n        source: ref?.development?.startsWith(\"local:\") ? (\"local\" as const) : (\"remote\" as const),\n        integrity: ref?.integrity,\n        version: ref?.version,\n        name: ref?.name,\n      };\n    })\n    .sort((a, b) => a.key.localeCompare(b.key));\n}\n\nexport async function resolveRemoteConfigChain(\n  accountId: string,\n  gatewayId: string,\n  visited: Set<string>,\n): Promise<BosConfig> {\n  const selfRef = `bos://${accountId}/${gatewayId}`;\n  if (visited.has(selfRef)) {\n    throw new Error(`Circular extends detected: ${selfRef}`);\n  }\n\n  const nextVisited = new Set(visited);\n  nextVisited.add(selfRef);\n\n  const config = await fetchBosConfigFromFastKv<BosConfigInput>(selfRef);\n  const parentRef = config.extends\n    ? resolveExtendsRef(config.extends as string | ExtendsConfig, \"production\")\n    : undefined;\n\n  let merged: BosConfigInput;\n  if (!parentRef) {\n    merged = config;\n  } else {\n    const { accountId: parentAccountId, gatewayId: parentGatewayId } = parseBosUrl(parentRef);\n    const parentResolved = await resolveRemoteConfigChain(\n      parentAccountId,\n      parentGatewayId,\n      nextVisited,\n    );\n    merged = mergeBosConfigWithExtends(parentResolved as BosConfigInput, config);\n  }\n\n  return resolveConfigComposableEntries(BosConfigSchema.parse(merged), process.cwd(), \"production\");\n}\n\nasync function fetchPublishedConfig(\n  accountId: string,\n  gatewayId: string,\n): Promise<BosConfig | null> {\n  try {\n    return await resolveRemoteConfigChain(accountId, gatewayId, new Set());\n  } catch (error) {\n    if (error instanceof Error && error.message.startsWith(\"No config found\")) {\n      return null;\n    }\n    throw error;\n  }\n}\n\nexport default createPlugin({\n  variables: z.object({\n    configPath: z.string().optional(),\n  }),\n  secrets: z.object({}),\n  contract: bosContract,\n  initialize: (config) =>\n    Effect.promise(async () => {\n      const configResult = await loadResolvedConfig({ path: config.variables.configPath });\n      return {\n        bosConfig: configResult?.config ?? null,\n        runtimeConfig: configResult?.runtime ?? null,\n        configDir: getProjectRoot(),\n      } satisfies BosDeps;\n    }),\n  shutdown: () => Effect.void,\n  createRouter: (deps, builder) => ({\n    config: builder.config.handler(async ({ input }) => {\n      if (input.full) {\n        return buildConfigResult(deps.bosConfig, true);\n      }\n\n      const localConfig = await loadLocalConfig({ cwd: deps.configDir });\n      return buildConfigResult(localConfig?.config ?? null, false);\n    }),\n\n    pluginAdd: builder.pluginAdd.handler(async ({ input }) => {\n      if (!deps.bosConfig) {\n        return {\n          status: \"error\" as const,\n          key: \"\",\n          error: \"No bos.config.json found\",\n        };\n      }\n\n      const isBosRef = input.source.startsWith(\"bos://\");\n      const isLocal = input.source.startsWith(\"local:\");\n      const key = sanitizePluginKey(\n        input.as ??\n          (isBosRef ? (input.source.split(\"/\").pop() ?? \"plugin\") : defaultPluginKey(input.source)),\n      );\n      const existing = deps.bosConfig.plugins?.[key];\n      const existingEntry = existing && typeof existing === \"object\" ? existing : {};\n      const nextPlugins = { ...(deps.bosConfig.plugins ?? {}) };\n\n      if (isBosRef) {\n        nextPlugins[key] = {\n          ...existingEntry,\n          extends: input.source,\n        };\n      } else if (isLocal) {\n        nextPlugins[key] = {\n          ...existingEntry,\n          development: input.source,\n          ...(existingEntry.extends ? {} : {}),\n        };\n      } else {\n        nextPlugins[key] = {\n          ...existingEntry,\n          production: input.production ?? input.source,\n        };\n      }\n\n      deps.bosConfig = {\n        ...deps.bosConfig,\n        plugins: nextPlugins,\n      };\n\n      await saveBosConfig(deps.configDir, deps.bosConfig);\n      await generateCodeArtifacts(deps.configDir, deps.bosConfig);\n\n      const stored = deps.bosConfig.plugins?.[key];\n      const storedObj = stored && typeof stored === \"object\" ? stored : {};\n\n      return {\n        status: \"added\" as const,\n        key,\n        development: storedObj.development,\n        production: storedObj.production,\n        integrity: storedObj.integrity,\n        version: storedObj.version,\n      };\n    }),\n\n    pluginRemove: builder.pluginRemove.handler(async ({ input }) => {\n      if (!deps.bosConfig) {\n        return {\n          status: \"error\" as const,\n          key: input.key,\n          error: \"No bos.config.json found\",\n        };\n      }\n\n      if (!deps.bosConfig.plugins?.[input.key]) {\n        return {\n          status: \"error\" as const,\n          key: input.key,\n          error: `Plugin '${input.key}' is not configured`,\n        };\n      }\n\n      const nextPlugins = { ...(deps.bosConfig.plugins ?? {}) };\n      delete nextPlugins[input.key];\n      deps.bosConfig = {\n        ...deps.bosConfig,\n        plugins: Object.keys(nextPlugins).length > 0 ? nextPlugins : undefined,\n      };\n\n      await saveBosConfig(deps.configDir, deps.bosConfig);\n      await generateCodeArtifacts(deps.configDir, deps.bosConfig);\n\n      return {\n        status: \"removed\" as const,\n        key: input.key,\n      };\n    }),\n\n    pluginList: builder.pluginList.handler(async () => {\n      const plugins: PluginListResult[\"plugins\"] = listPluginAttachments(deps.bosConfig);\n      return {\n        status: \"listed\" as const,\n        plugins,\n      };\n    }),\n\n    pluginPublish: builder.pluginPublish.handler(async ({ input }) => {\n      if (!deps.bosConfig) {\n        return {\n          status: \"error\" as const,\n          key: input.key,\n          error: \"No bos.config.json found\",\n        };\n      }\n\n      const attachment = deps.bosConfig.plugins?.[input.key];\n      if (!attachment) {\n        return {\n          status: \"error\" as const,\n          key: input.key,\n          error: `Plugin '${input.key}' is not configured`,\n        };\n      }\n\n      const attachmentRef = getPluginRef(attachment);\n\n      const localPath = pluginLocalPath(deps.configDir, attachment);\n      if (!localPath) {\n        return {\n          status: \"error\" as const,\n          key: input.key,\n          error: `Plugin '${input.key}' does not have a local development path`,\n        };\n      }\n\n      const pkgPath = join(localPath, \"package.json\");\n      if (!(await fileExists(pkgPath))) {\n        return {\n          status: \"error\" as const,\n          key: input.key,\n          error: `Missing package.json at ${localPath}`,\n        };\n      }\n\n      const pkgJson = await readJsonFile<{\n        scripts?: Record<string, string>;\n        name?: string;\n        version?: string;\n      }>(pkgPath);\n      const script = pkgJson.scripts?.deploy ? \"deploy\" : \"build\";\n\n      const { stdout, stderr, exitCode } = (await run(\"bun\", [\"run\", script], {\n        cwd: localPath,\n        capture: true,\n      })) as { stdout: string; stderr: string; exitCode: number };\n\n      if (exitCode !== 0) {\n        if (stdout.trim()) process.stdout.write(stdout);\n        if (stderr.trim()) process.stderr.write(stderr);\n        return {\n          status: \"error\" as const,\n          key: input.key,\n          error: `Publish failed with exit code ${exitCode}`,\n        };\n      }\n\n      if (stdout.trim()) process.stdout.write(stdout);\n      if (stderr.trim()) process.stderr.write(stderr);\n\n      const output = `${stdout}\\n${stderr}`;\n      const deployEntries = parseDeployLines(output);\n      const deployEntry = deployEntries.find(\n        (e) => e.urlField === `plugins.${input.key}.production`,\n      );\n\n      let publishedUrl: string | undefined;\n      let integrity: string | undefined;\n      if (deployEntry) {\n        publishedUrl = deployEntry.url;\n        integrity = deployEntry.integrity;\n      } else {\n        publishedUrl = extractPublishedUrl(output) ?? undefined;\n        integrity = publishedUrl\n          ? ((await computeSriHashForUrl(publishedUrl)) ?? undefined)\n          : undefined;\n      }\n\n      let manifest: PluginManifest | null = null;\n      if (publishedUrl) {\n        manifest = await fetchRemotePluginManifest(publishedUrl);\n      } else if (attachmentRef?.production) {\n        manifest = await fetchRemotePluginManifest(attachmentRef.production);\n        if (manifest) {\n          publishedUrl = attachmentRef.production;\n        }\n      }\n\n      const version = manifest?.plugin.version ?? pkgJson.version;\n\n      if (publishedUrl) {\n        const rootConfigPath = join(deps.configDir, \"bos.config.json\");\n        try {\n          const rootConfig = JSON.parse(readFileSync(rootConfigPath, \"utf-8\")) as Record<\n            string,\n            unknown\n          >;\n          if (!rootConfig.plugins || typeof rootConfig.plugins !== \"object\") {\n            rootConfig.plugins = {};\n          }\n          const plugins = rootConfig.plugins as Record<string, unknown>;\n          if (!plugins[input.key] || typeof plugins[input.key] !== \"object\") {\n            plugins[input.key] = {};\n          }\n          const entry = plugins[input.key] as Record<string, unknown>;\n          entry.production = publishedUrl;\n          if (integrity) {\n            entry.integrity = integrity;\n          } else {\n            delete entry.integrity;\n          }\n          writeFileSync(rootConfigPath, `${JSON.stringify(rootConfig, null, 2)}\\n`);\n          console.log(`   ✅ Updated bos.config.json: plugins.${input.key}.production`);\n        } catch (err) {\n          console.error(\n            `   ❌ Failed to update bos.config.json:`,\n            err instanceof Error ? err.message : err,\n          );\n        }\n\n        await generateCodeArtifacts(deps.configDir, deps.bosConfig);\n      }\n\n      return {\n        status: \"published\" as const,\n        key: input.key,\n        path: localPath,\n        script,\n        production: publishedUrl ?? attachmentRef?.production,\n        integrity: integrity ?? undefined,\n        version: version ?? undefined,\n      };\n    }),\n\n    dev: builder.dev.handler(async ({ input }) => {\n      const devTimings: PhaseTiming[] = [];\n\n      ensureEnvFile(deps.configDir);\n      loadProjectEnv(deps.configDir);\n\n      const localPackages = detectLocalPackages(\n        deps.bosConfig ?? undefined,\n        deps.runtimeConfig ?? undefined,\n      );\n\n      const hostSource: SourceMode = localPackages.includes(\"host\")\n        ? parseSourceMode(input.host, \"local\")\n        : \"remote\";\n      const uiSource: SourceMode = localPackages.includes(\"ui\")\n        ? parseSourceMode(input.ui, \"local\")\n        : \"remote\";\n      const apiSource: SourceMode = localPackages.includes(\"api\")\n        ? parseSourceMode(input.api, \"local\")\n        : \"remote\";\n      const authSource: SourceMode = localPackages.includes(\"auth\")\n        ? parseSourceMode(input.auth, \"local\")\n        : \"remote\";\n      const ssr = input.ssr ?? false;\n      const proxy = input.proxy ?? false;\n\n      const sharedSync = await timePhase(devTimings, \"shared deps\", () =>\n        syncResolvedSharedDeps({\n          configDir: deps.configDir,\n          hostMode: hostSource,\n          bosConfig: deps.bosConfig ?? undefined,\n          extendsChain: [],\n        }),\n      );\n      let configMayHaveChanged = false;\n      if (sharedSync.catalogChanged) {\n        await timePhase(devTimings, \"install\", () =>\n          run(\"bun\", [\"install\"], { cwd: deps.configDir }),\n        );\n        configMayHaveChanged = true;\n      }\n      const shouldBuildPlugin =\n        (apiSource === \"local\" && !proxy) || localPackages.some((pkg) => pkg.startsWith(\"plugin:\"));\n\n      await timePhase(devTimings, \"build\", async () => {\n        const buildTasks: Promise<void>[] = [buildEverythingDevQuietly(deps.configDir)];\n        if (shouldBuildPlugin) {\n          buildTasks.push(buildEveryPluginQuietly(deps.configDir));\n        }\n        await Promise.all(buildTasks);\n      });\n\n      let devExtendsChain: string[] | undefined;\n      if (configMayHaveChanged || input.remotePlugins?.length) {\n        const refreshed = await timePhase(devTimings, \"resolve config\", () =>\n          loadResolvedConfig({\n            cwd: deps.configDir,\n            remotePlugins: input.remotePlugins,\n          }),\n        );\n        deps.bosConfig = refreshed?.config ?? deps.bosConfig;\n        deps.runtimeConfig = refreshed?.runtime ?? deps.runtimeConfig;\n        devExtendsChain = refreshed?.source.extended;\n      }\n\n      if (!deps.bosConfig) {\n        return {\n          status: \"error\" as const,\n          description: \"No bos.config.json found\",\n          processes: [],\n          timings: devTimings,\n        };\n      }\n\n      if (proxy && !resolveProxyUrl(deps.bosConfig)) {\n        return {\n          status: \"error\" as const,\n          description: \"No valid proxy URL configured in bos.config.json\",\n          processes: [],\n          timings: devTimings,\n        };\n      }\n\n      const hostPort = input.port ?? getHostDevelopmentPort(deps.bosConfig.app.host.development);\n      suppressWarnings();\n      const developmentRuntime = buildRuntimeConfig(deps.bosConfig, {\n        uiSource,\n        apiSource,\n        authSource,\n        hostSource,\n        env: \"development\",\n        plugins: deps.runtimeConfig?.plugins,\n      });\n      drainConfigWarnings();\n      resumeWarnings();\n      const runtimeConfig = await timePhase(devTimings, \"ports\", () =>\n        prepareDevelopmentRuntimeConfig(developmentRuntime, {\n          hostPort,\n          ssr,\n        }),\n      );\n\n      syncGeneratedInfra(deps.configDir, runtimeConfig);\n      ensureEnvFile(deps.configDir);\n      loadProjectEnv(deps.configDir);\n\n      await timePhase(devTimings, \"generate artifacts\", () =>\n        generateCodeArtifacts(deps.configDir, deps.bosConfig!, {\n          env: \"development\",\n          extendsChain: devExtendsChain,\n          runtimeConfig,\n        }),\n      );\n\n      const services = buildServiceDescriptorMap(runtimeConfig, { ssr, proxy });\n      const packages = [...services.keys()];\n      if (process.env.DEBUG === \"true\" || process.env.DEBUG === \"1\") {\n        console.error(\"[DEBUG dev] services keys:\", packages.join(\", \"));\n        console.error(\n          \"[DEBUG dev] services sources:\",\n          packages.map((k) => `${k}=${services.get(k)?.source ?? \"?\"}`).join(\", \"),\n        );\n        console.error(\n          \"[DEBUG dev] runtimeConfig.plugins keys:\",\n          Object.keys(runtimeConfig.plugins ?? {}).join(\", \"),\n        );\n        console.error(\n          \"[DEBUG dev] runtimeConfig.plugins sources:\",\n          Object.entries(runtimeConfig.plugins ?? {})\n            .map(([k, v]) => `${k}=${v.source}`)\n            .join(\", \"),\n        );\n      }\n      const displayEnv: Record<string, string> = {};\n      const apiDescriptor = services.get(\"api\");\n      if (apiDescriptor?.proxy) {\n        const proxyUrl = resolveProxyUrl(deps.bosConfig);\n        if (proxyUrl) displayEnv.API_PROXY = proxyUrl;\n      }\n\n      const orchestrator: AppOrchestrator = {\n        packages,\n        env: displayEnv,\n        description: buildDescription(services),\n        port: runtimeConfig.host.port,\n        interactive: input.interactive,\n      };\n\n      pendingSession = { orchestrator, services, runtimeConfig };\n\n      return {\n        status: \"started\" as const,\n        description: orchestrator.description,\n        processes: packages,\n        timings: devTimings,\n      };\n    }),\n\n    start: builder.start.handler(async ({ input }) => {\n      ensureEnvFile(deps.configDir);\n      loadProjectEnv(deps.configDir);\n\n      pluginEvents.emit(\"progress\", { phase: \"config\", status: \"running\" } satisfies ProgressEvent);\n\n      const bosEnv = input.env ?? (process.env.BOS_ENV === \"staging\" ? \"staging\" : \"production\");\n      const account = input.account ?? process.env.BOS_ACCOUNT;\n      const domain = input.domain ?? process.env.BOS_GATEWAY;\n\n      let config: BosConfig | null = null;\n      let remoteConfig: BosConfig | null = null;\n\n      if (account && domain) {\n        try {\n          remoteConfig = await fetchPublishedConfig(account, domain);\n          if (remoteConfig) {\n            config = remoteConfig;\n          } else {\n            return {\n              status: \"error\" as const,\n              url: \"\",\n              error: `No config found at bos://${account}/${domain}. Verify the account and gateway are correct and the config has been published.\\nExpected URL: ${buildRegistryConfigUrl(account, domain)}`,\n            };\n          }\n        } catch (error) {\n          return {\n            status: \"error\" as const,\n            url: \"\",\n            error: `Failed to fetch config for bos://${account}/${domain}: ${error instanceof Error ? error.message : \"Unknown error\"}\\nExpected URL: ${buildRegistryConfigUrl(account, domain)}`,\n          };\n        }\n      } else {\n        config = deps.bosConfig;\n      }\n\n      if (!config) {\n        return {\n          status: \"error\" as const,\n          url: \"\",\n          error:\n            \"No configuration found. Provide --account and --gateway flags, or create a local bos.config.json.\",\n        };\n      }\n\n      // Apply runtime overrides from CLI flags / env vars\n      if (account) {\n        config = { ...config, account };\n      }\n      if (domain) {\n        config = { ...config, domain };\n      }\n\n      const port = input.port ?? getHostDevelopmentPort(config.app.host.development);\n      const isStaging = bosEnv === \"staging\";\n      const runtimePlugins = await buildRuntimePluginsForConfig(\n        config,\n        deps.configDir,\n        \"production\",\n      );\n      suppressWarnings();\n      const runtimeConfig = buildRuntimeConfig(config, {\n        uiSource: \"remote\",\n        apiSource: \"remote\",\n        authSource: \"remote\",\n        hostSource: \"remote\",\n        env: \"production\",\n        plugins: runtimePlugins,\n      });\n      drainConfigWarnings();\n      resumeWarnings();\n\n      if (isStaging && config.staging?.domain) {\n        runtimeConfig.domain = config.staging.domain;\n      }\n\n      if (isStaging) {\n        runtimeConfig.env = \"staging\";\n      }\n\n      syncGeneratedInfra(deps.configDir, runtimeConfig);\n      ensureEnvFile(deps.configDir);\n      loadProjectEnv(deps.configDir);\n\n      pluginEvents.emit(\"progress\", {\n        phase: \"generate artifacts\",\n        status: \"running\",\n      } satisfies ProgressEvent);\n      await generateCodeArtifacts(deps.configDir, config, {\n        env: \"production\",\n        runtimeConfig,\n      });\n      pluginEvents.emit(\"progress\", {\n        phase: \"generate artifacts\",\n        status: \"done\",\n      } satisfies ProgressEvent);\n\n      // ── Production Readiness Validation ──\n      const productionEnv: Record<string, string> = {};\n      const warnings: string[] = [];\n\n      // Default CORS_ORIGIN to the configured domain if not set\n      if (!process.env.CORS_ORIGIN && config.domain) {\n        const effectiveDomain = isStaging\n          ? (config.staging?.domain ?? config.domain)\n          : config.domain;\n        const defaultOrigin = `https://${effectiveDomain}`;\n        productionEnv.CORS_ORIGIN = defaultOrigin;\n        warnings.push(`CORS_ORIGIN defaulting to ${defaultOrigin}`);\n      }\n\n      // Validate required secrets\n      const requiredSecrets = new Set<string>();\n      const missingSecrets: string[] = [];\n\n      if (runtimeConfig.host.secrets) {\n        for (const s of runtimeConfig.host.secrets) requiredSecrets.add(s);\n      }\n      if (runtimeConfig.auth?.secrets) {\n        for (const s of runtimeConfig.auth.secrets) requiredSecrets.add(s);\n      }\n      if (runtimeConfig.api?.secrets) {\n        for (const s of runtimeConfig.api.secrets) requiredSecrets.add(s);\n      }\n      for (const plugin of Object.values(runtimeConfig.plugins ?? {})) {\n        if (plugin.secrets) {\n          for (const s of plugin.secrets) requiredSecrets.add(s);\n        }\n      }\n\n      for (const secret of requiredSecrets) {\n        const value = process.env[secret];\n        if (!value || value.length === 0) {\n          missingSecrets.push(secret);\n        }\n      }\n\n      if (missingSecrets.length > 0) {\n        warnings.push(`Missing ${missingSecrets.length} secret(s): ${missingSecrets.join(\", \")}`);\n      }\n\n      const services = buildServiceDescriptorMap(runtimeConfig);\n\n      const stagingEnvVars: Record<string, string> = isStaging\n        ? { BOS_GATEWAY: config.staging?.domain ?? config.domain ?? \"\" }\n        : {};\n\n      const configSource = remoteConfig\n        ? `bos://${account}/${domain}`\n        : (findConfigPath() ?? \"bos.config.json\");\n\n      const configSourceHttp =\n        remoteConfig && account && domain ? buildRegistryConfigUrl(account, domain) : undefined;\n\n      const summary: StartSummary = {\n        configSource,\n        configSourceHttp,\n        account: config.account,\n        domain: config.domain ?? undefined,\n        modules: {\n          host: runtimeConfig.host.remoteUrl ?? runtimeConfig.host.url ?? \"local\",\n          ui: runtimeConfig.ui.url ?? \"local\",\n          api: runtimeConfig.api.url ?? \"local\",\n          auth: runtimeConfig.auth?.url ?? undefined,\n        },\n        warnings,\n      };\n\n      const orchestrator: AppOrchestrator = {\n        packages: [\"host\"],\n        env: {\n          NODE_ENV: \"production\",\n          ...productionEnv,\n          ...stagingEnvVars,\n        },\n        description: `${isStaging ? \"Staging\" : \"Production\"} Mode (${config.account})`,\n        port,\n        interactive: input.interactive,\n        noLogs: true,\n      };\n\n      pendingSession = { orchestrator, services, runtimeConfig };\n      pendingStartSummary = summary;\n\n      pluginEvents.emit(\"progress\", { phase: \"config\", status: \"done\" } satisfies ProgressEvent);\n\n      return {\n        status: \"running\" as const,\n        url: `http://localhost:${port}`,\n      };\n    }),\n\n    build: builder.build.handler(async ({ input }) => {\n      if (!deps.bosConfig) {\n        return {\n          status: \"error\" as const,\n          built: [],\n          skipped: [],\n        };\n      }\n\n      const buildEnv: BosEnv = input.deploy ? \"production\" : \"development\";\n\n      const targets = selectWorkspaceTargets(input.packages, deps.bosConfig);\n      if (targets.length === 0) {\n        return {\n          status: \"error\" as const,\n          built: [],\n          skipped: [],\n        };\n      }\n\n      suppressWarnings();\n      const runtimeConfig = buildRuntimeConfig(deps.bosConfig, {\n        uiSource: deps.bosConfig.app.ui?.development ? \"local\" : \"remote\",\n        apiSource: deps.bosConfig.app.api?.development ? \"local\" : \"remote\",\n        authSource: deps.bosConfig.app.auth?.development ? \"local\" : \"remote\",\n        hostSource: deps.bosConfig.app.host?.development ? \"local\" : \"remote\",\n        env: buildEnv,\n        plugins: deps.runtimeConfig?.plugins,\n      });\n      drainConfigWarnings();\n      resumeWarnings();\n\n      await generateCodeArtifacts(deps.configDir, deps.bosConfig, {\n        env: buildEnv,\n        runtimeConfig,\n      });\n\n      const { built, skipped } = await buildWorkspaceTargets({\n        configDir: deps.configDir,\n        bosConfig: deps.bosConfig,\n        runtimeConfig: runtimeConfig,\n        targets,\n        deploy: input.deploy,\n      });\n\n      if (built.length === 0) {\n        return {\n          status: \"error\" as const,\n          built: [],\n          skipped,\n        };\n      }\n\n      return {\n        status: \"success\" as const,\n        built,\n        skipped,\n        deployed: input.deploy,\n      };\n    }),\n\n    publish: builder.publish.handler(async ({ input }) => {\n      if (!deps.bosConfig) {\n        return {\n          status: \"error\" as const,\n          registryUrl: \"\",\n          error: \"No bos.config.json found\",\n        };\n      }\n\n      const result = await publishToFastKv({\n        bosConfig: deps.bosConfig,\n        runtimeConfig: deps.runtimeConfig,\n        configDir: deps.configDir,\n        env: input.env,\n        build: input.deploy,\n        dryRun: input.dryRun,\n        verbose: input.verbose,\n        packages: input.packages,\n        network: input.network,\n        privateKey: input.privateKey,\n      });\n\n      if (result.publishConfig) {\n        const refreshed = await loadResolvedConfig({ cwd: deps.configDir });\n        if (refreshed?.config) {\n          deps.bosConfig = refreshed.config;\n          deps.runtimeConfig = refreshed.runtime;\n        }\n      }\n\n      return {\n        status: result.status,\n        registryUrl: result.registryUrl,\n        txHash: result.txHash,\n        error: result.error,\n        built: result.built,\n        skipped: result.skipped,\n        deployResults: result.deployResults,\n      };\n    }),\n\n    deploy: builder.deploy.handler(async ({ input }) => {\n      if (!deps.bosConfig) {\n        return {\n          status: \"error\" as const,\n          registryUrl: \"\",\n          redeployed: false,\n          error: \"No bos.config.json found\",\n        };\n      }\n\n      const result = await publishToFastKv({\n        bosConfig: deps.bosConfig,\n        runtimeConfig: deps.runtimeConfig,\n        configDir: deps.configDir,\n        env: input.env,\n        build: input.build,\n        dryRun: input.dryRun,\n        verbose: input.verbose,\n        packages: input.packages,\n        network: input.network,\n        privateKey: input.privateKey,\n      });\n\n      if (result.status === \"error\") {\n        return {\n          status: \"error\" as const,\n          registryUrl: result.registryUrl,\n          txHash: result.txHash,\n          built: result.built,\n          skipped: result.skipped,\n          redeployed: false,\n          error: result.error,\n          deployResults: result.deployResults,\n        };\n      }\n\n      if (result.status === \"dry-run\") {\n        return {\n          status: \"dry-run\" as const,\n          registryUrl: result.registryUrl,\n          built: result.built,\n          skipped: result.skipped,\n          redeployed: false,\n        };\n      }\n\n      if (result.publishConfig) {\n        const refreshed = await loadResolvedConfig({ cwd: deps.configDir });\n        if (refreshed?.config) {\n          deps.bosConfig = refreshed.config;\n          deps.runtimeConfig = refreshed.runtime;\n        }\n      }\n\n      let redeployed = false;\n      let service: string | undefined;\n\n      if (process.env.RAILWAY_TOKEN) {\n        const railwayService = input.service ?? deps.bosConfig.ci?.railway?.service;\n        if (!railwayService) {\n          console.log();\n          console.log(\n            colors.yellow(\n              \"  Railway redeploy skipped: ci.railway.service is not configured in bos.config.json\",\n            ),\n          );\n          return {\n            status: \"published\" as const,\n            registryUrl: result.registryUrl,\n            txHash: result.txHash,\n            built: result.built,\n            skipped: result.skipped,\n            redeployed: false,\n            deployResults: result.deployResults,\n            error:\n              \"Config published but Railway redeploy failed: ci.railway.service is not configured in bos.config.json\",\n          };\n        }\n\n        service = railwayService;\n        console.log();\n        console.log(`  Redeploying Railway service ${colors.cyan(railwayService)}...`);\n        try {\n          const railResult = await run(\n            \"railway\",\n            [\"redeploy\", \"--service\", railwayService, \"--yes\"],\n            {\n              capture: true,\n            },\n          );\n          if (railResult?.stdout) {\n            for (const line of railResult.stdout.split(\"\\n\")) {\n              if (line.trim()) console.log(`  ${colors.dim(line.trim())}`);\n            }\n          }\n          redeployed = true;\n          console.log(colors.green(`  Railway redeploy complete`));\n        } catch (error) {\n          const message = error instanceof Error ? error.message : String(error);\n          const railError =\n            message.includes(\"not found\") || message.includes(\"ENOENT\")\n              ? \"Railway CLI not found. Install it: npm i -g @railway/cli\"\n              : `Railway redeploy failed: ${message}`;\n          console.log(colors.yellow(`  ${railError}`));\n          return {\n            status: \"published\" as const,\n            registryUrl: result.registryUrl,\n            txHash: result.txHash,\n            built: result.built,\n            skipped: result.skipped,\n            redeployed: false,\n            service,\n            deployResults: result.deployResults,\n            error: `Config published but ${railError}`,\n          };\n        }\n      } else {\n        console.log();\n        console.log(colors.yellow(\"  Railway redeploy skipped (RAILWAY_TOKEN not set)\"));\n      }\n\n      return {\n        status: \"deployed\" as const,\n        registryUrl: result.registryUrl,\n        txHash: result.txHash,\n        built: result.built,\n        skipped: result.skipped,\n        redeployed,\n        service,\n        deployResults: result.deployResults,\n      };\n    }),\n\n    keyPublish: builder.keyPublish.handler(async ({ input }) => {\n      if (!deps.bosConfig) {\n        return {\n          status: \"error\" as const,\n          account: \"\",\n          network: \"mainnet\" as const,\n          contract: \"\",\n          allowance: input.allowance,\n          functionNames: PUBLISH_FUNCTION_NAMES,\n          error: \"No bos.config.json found\",\n        };\n      }\n\n      const account = deps.bosConfig.account;\n      const network = getNetworkIdForAccount(account);\n      const contract = getRegistryNamespaceForAccount(account);\n      try {\n        await Effect.runPromise(ensureNearCli);\n        const keyPair = await addFunctionCallAccessKey({\n          account,\n          contract,\n          allowance: input.allowance,\n          functionNames: PUBLISH_FUNCTION_NAMES,\n          network,\n        });\n\n        return {\n          status: \"published\" as const,\n          account,\n          network,\n          contract,\n          allowance: input.allowance,\n          functionNames: PUBLISH_FUNCTION_NAMES,\n          publicKey: keyPair.publicKey,\n          privateKey: keyPair.privateKey,\n        };\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          account,\n          network,\n          contract,\n          allowance: input.allowance,\n          functionNames: PUBLISH_FUNCTION_NAMES,\n          error: error instanceof Error ? error.message : \"Unknown error\",\n        };\n      }\n    }),\n\n    init: builder.init.handler(async ({ input }) => {\n      try {\n        const timings: PhaseTiming[] = [];\n        let extendsAccount = \"\";\n        let extendsGateway = \"\";\n        let directory = input.directory;\n        const account = input.account;\n        const domain = input.domain;\n        let overrides = input.overrides as OverrideSection[] | undefined;\n        let plugins = input.plugins;\n\n        if (input.extends) {\n          const normalized = input.extends.startsWith(\"bos://\")\n            ? input.extends\n            : `bos://${input.extends}`;\n          const match = normalized.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n          if (match) {\n            extendsAccount = match[1];\n            extendsGateway = match[2];\n          }\n        }\n\n        extendsAccount = extendsAccount || \"dev.everything.near\";\n        extendsGateway = extendsGateway || \"everything.dev\";\n\n        let parentPluginKeys: string[] = [];\n        let parentConfig: BosConfig | null = null;\n        try {\n          parentConfig = await timePhase(timings, \"parent config\", () =>\n            fetchParentConfig(extendsAccount, extendsGateway),\n          );\n          if (parentConfig?.plugins && typeof parentConfig.plugins === \"object\") {\n            parentPluginKeys = Object.keys(parentConfig.plugins);\n          }\n        } catch (e) {\n          console.warn(\n            `[init] Failed to fetch parent config from ${extendsAccount}/${extendsGateway}: ${e instanceof Error ? e.message : e}`,\n          );\n        }\n\n        overrides = overrides?.length ? overrides : ([\"ui\", \"api\"] as OverrideSection[]);\n        if (overrides.includes(\"plugins\") && plugins === undefined) {\n          plugins = parentPluginKeys;\n        }\n        plugins = plugins ?? [];\n\n        const pluginDirMap: Record<string, string> = {};\n        if (parentConfig?.plugins) {\n          for (const plugin of plugins) {\n            const entry = (parentConfig.plugins as Record<string, unknown>)?.[plugin];\n            if (entry && typeof entry === \"object\") {\n              const dev = (entry as Record<string, unknown>).development;\n              if (typeof dev === \"string\") {\n                const match = dev.match(/^local:plugins\\/(.+)$/);\n                if (match?.[1] && match[1] !== plugin) pluginDirMap[plugin] = match[1];\n              }\n            }\n          }\n        }\n\n        directory = directory || domain || extendsGateway;\n        const targetDir = resolve(directory);\n        const extendsRef = `bos://${extendsAccount}/${extendsGateway}`;\n\n        const repository =\n          (await detectGitRemoteUrl(process.cwd()).catch(() => undefined)) ??\n          parentConfig?.repository;\n\n        if (!parentConfig) {\n          try {\n            parentConfig = await timePhase(timings, \"parent config\", () =>\n              fetchParentConfig(extendsAccount, extendsGateway),\n            );\n          } catch {\n            return {\n              status: \"error\" as const,\n              directory,\n              extendsRef,\n              account,\n              domain,\n              extends: extendsRef,\n              plugins,\n              overrides,\n              filesCopied: 0,\n              timings,\n              error: `No config found at ${extendsRef} — are you sure this is the right parent?`,\n            };\n          }\n        }\n\n        const {\n          sourceDir,\n          parentConfig: resolvedParentConfig,\n          cleanup,\n        } = await timePhase(timings, \"template source\", () =>\n          resolveSourceDir({\n            extendsAccount,\n            extendsGateway,\n            source: input.source,\n          }),\n        );\n\n        parentConfig = resolvedParentConfig;\n\n        const isMinimalScaffold = sourceDir === \"\";\n\n        try {\n          let filesCopied: number;\n\n          if (isMinimalScaffold) {\n            filesCopied = await timePhase(timings, \"scaffold project\", () =>\n              scaffoldMinimalProject(targetDir, parentConfig as unknown as BosConfigInput, {\n                extendsAccount,\n                extendsGateway,\n                account: account || extendsAccount,\n                domain,\n                plugins,\n                overrides,\n                repository,\n                title: parentConfig?.title,\n                description: parentConfig?.description,\n              }),\n            );\n\n            await timePhase(timings, \"personalize config\", () =>\n              personalizeConfig(targetDir, {\n                extendsAccount,\n                extendsGateway,\n                account: account || extendsAccount,\n                domain: domain || extendsGateway,\n                plugins,\n                overrides,\n                mode: \"init\",\n                repository,\n                title: parentConfig?.title,\n                description: parentConfig?.description,\n                testnet: parentConfig?.testnet,\n                staging: parentConfig?.staging,\n              }),\n            );\n          } else {\n            const patterns = buildInitPatterns(overrides, plugins, pluginDirMap);\n\n            filesCopied = await timePhase(timings, \"copy files\", () =>\n              copyFilteredFiles(sourceDir, targetDir, patterns, {\n                overrides,\n                plugins,\n              }),\n            );\n\n            await timePhase(timings, \"personalize config\", () =>\n              personalizeConfig(targetDir, {\n                extendsAccount,\n                extendsGateway,\n                account: account || extendsAccount,\n                domain: domain || extendsGateway,\n                plugins,\n                overrides,\n                workspaceOpts: { sourceDir },\n                repository,\n                title: parentConfig?.title,\n                description: parentConfig?.description,\n                testnet: parentConfig?.testnet,\n                staging: parentConfig?.staging,\n              }),\n            );\n\n            await timePhase(timings, \"write snapshot\", () =>\n              writeInitSnapshot(targetDir, extendsAccount, extendsGateway, sourceDir, patterns, {\n                overrides,\n                plugins,\n              }),\n            );\n\n            await timePhase(timings, \"personalize agents\", () =>\n              personalizeAgentsMd(targetDir, { overrides, plugins }),\n            );\n          }\n\n          await timePhase(timings, \"sync shared deps\", () =>\n            syncResolvedSharedDeps({\n              configDir: targetDir,\n              hostMode: \"local\",\n            }),\n          );\n\n          const lockfilePath = join(targetDir, \"bun.lock\");\n          const allowedWorkspaces = computeAllowedWorkspaces(overrides, plugins);\n          stripOrphanedWorkspacesFromLockfile(lockfilePath, allowedWorkspaces);\n          removeInitLockfile(lockfilePath);\n\n          const initConfig = await timePhase(timings, \"resolve config\", () =>\n            loadResolvedConfig({ cwd: targetDir }),\n          );\n          if (initConfig?.runtime) {\n            await timePhase(timings, \"generate env/docker\", async () => {\n              writeGeneratedInfra(targetDir, initConfig.runtime);\n            });\n          }\n          await timePhase(timings, \"create env file\", async () => {\n            ensureEnvFile(targetDir);\n          });\n\n          if (!input.noInstall) {\n            await timePhase(timings, \"install dependencies\", () => runBunInstall(targetDir));\n            await timePhase(timings, \"generate types\", () => runTypesGen(targetDir));\n            await timePhase(timings, \"generate migrations\", () =>\n              generateDatabaseMigrations(targetDir),\n            );\n          }\n\n          if (input.noInstall && initConfig?.config) {\n            await timePhase(timings, \"generate code artifacts\", () =>\n              generateCodeArtifacts(targetDir, initConfig.config),\n            );\n          }\n\n          return {\n            status: \"initialized\" as const,\n            directory,\n            extendsRef,\n            account,\n            domain,\n            extends: extendsRef,\n            plugins,\n            overrides,\n            filesCopied,\n            timings,\n            targetDir,\n          };\n        } finally {\n          await cleanup();\n        }\n      } catch (error) {\n        const extendsRef = input.extends\n          ? input.extends.startsWith(\"bos://\")\n            ? input.extends\n            : `bos://${input.extends}`\n          : \"bos://dev.everything.near/everything.dev\";\n        return {\n          status: \"error\" as const,\n          directory: input.directory ?? \"\",\n          extendsRef,\n          account: input.account,\n          domain: input.domain,\n          extends: extendsRef,\n          plugins: input.plugins ?? [],\n          overrides: input.overrides,\n          filesCopied: 0,\n          timings: [],\n          error: error instanceof Error ? error.message : \"Unknown error\",\n        };\n      }\n    }),\n\n    sync: builder.sync.handler(async ({ input }) => {\n      try {\n        const configPath = findConfigPath();\n        if (!configPath) {\n          return {\n            status: \"error\" as const,\n            updated: [],\n            skipped: [],\n            added: [],\n            error: \"No bos.config.json found in current directory\",\n          };\n        }\n\n        const projectDir = resolve(dirname(configPath));\n        const result = await syncTemplate(projectDir, input);\n\n        if (result.status === \"synced\" || result.status === \"dry-run\") {\n          const syncedConfig = await loadResolvedConfig({ cwd: projectDir });\n          if (syncedConfig?.config) {\n            await generateCodeArtifacts(projectDir, syncedConfig.config);\n          }\n        }\n\n        return result;\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          updated: [],\n          skipped: [],\n          added: [],\n          error: error instanceof Error ? error.message : \"Unknown error\",\n        };\n      }\n    }),\n\n    upgrade: builder.upgrade.handler(async ({ input }) => {\n      try {\n        const configPath = findConfigPath();\n        if (!configPath) {\n          return {\n            status: \"error\" as const,\n            packages: [],\n            error: \"No bos.config.json found in current directory\",\n          };\n        }\n\n        const projectDir = resolve(dirname(configPath));\n        return await upgradeTemplate(projectDir, input);\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          packages: [],\n          error: error instanceof Error ? error.message : \"Unknown error\",\n        };\n      }\n    }),\n\n    typesGen: builder.typesGen.handler(async ({ input }) => {\n      try {\n        const configPath = findConfigPath();\n        if (!configPath) {\n          return {\n            status: \"error\" as const,\n            generated: [],\n            fetched: [],\n            skipped: [],\n            failed: [],\n            error: \"No bos.config.json found in current directory\",\n          };\n        }\n\n        const projectDir = resolve(dirname(configPath));\n        const env =\n          input.env ?? (process.env.NODE_ENV === \"production\" ? \"production\" : \"development\");\n\n        const refreshed = await loadResolvedConfig({ cwd: projectDir, env });\n        if (!refreshed) {\n          return {\n            status: \"error\" as const,\n            generated: [],\n            fetched: [],\n            skipped: [],\n            failed: [],\n            error: \"Failed to load bos.config.json\",\n          };\n        }\n\n        if (input.dryRun) {\n          const pluginEntries = Object.entries(refreshed.runtime.plugins ?? {});\n          const fetched: string[] = [];\n          const skipped: string[] = [];\n          const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n\n          if (refreshed.runtime.api.source !== \"local\") {\n            fetched.push(`api (${refreshed.runtime.api.url})`);\n          } else {\n            skipped.push(\"api (local)\");\n          }\n\n          if (refreshed.runtime.auth) {\n            if (refreshed.runtime.auth.source !== \"local\") {\n              fetched.push(`auth (${refreshed.runtime.auth.url})`);\n            } else {\n              skipped.push(\"auth (local)\");\n            }\n          }\n\n          for (const [key, plugin] of pluginEntries) {\n            if (plugin.url && plugin.source !== \"local\") {\n              fetched.push(`${key} (${plugin.url})`);\n            } else if (plugin.localPath) {\n              skipped.push(`${key} (local)`);\n            } else {\n              skipped.push(`${key} (no URL resolved)`);\n            }\n          }\n\n          const generated = [\"ui/src/lib/api-types.gen.ts\", \"ui/src/lib/auth-types.gen.ts\"];\n          if (hasLocalApiWorkspace) {\n            generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n          }\n          if (existsSync(join(projectDir, \"host\", \"src\"))) {\n            generated.push(\"host/src/lib/auth-types.gen.ts\");\n          }\n\n          return {\n            status: \"success\" as const,\n            generated,\n            fetched,\n            skipped,\n            failed: [],\n            source: refreshed.runtime.api.source,\n          };\n        }\n\n        const artifacts = await generateCodeArtifacts(projectDir, refreshed.config, {\n          runtimeConfig: refreshed.runtime,\n        });\n\n        const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n        const generated = [\"ui/src/lib/api-types.gen.ts\"];\n        if (hasLocalApiWorkspace) {\n          generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n        }\n        if (\n          refreshed.runtime.auth &&\n          (refreshed.runtime.auth.source !== \"local\" || refreshed.runtime.auth.localPath)\n        ) {\n          generated.push(\"ui/src/lib/auth-types.gen.ts\");\n        }\n        if (existsSync(join(projectDir, \"host\", \"src\"))) {\n          generated.push(\"host/src/lib/auth-types.gen.ts\");\n        }\n\n        const contractStatus = artifacts?.contractStatus ?? [];\n        const fetched: string[] = [];\n        const skipped: string[] = [];\n        const failed: string[] = [];\n        for (const entry of contractStatus) {\n          if (entry.source === \"remote\") {\n            fetched.push(entry.url ? `${entry.key} (${entry.url})` : entry.key);\n          } else if (entry.source === \"local\") {\n            skipped.push(`${entry.key} (local)`);\n          } else if (entry.source === \"skipped\") {\n            skipped.push(`${entry.key} (no URL resolved)`);\n          } else if (entry.source === \"failed\") {\n            const detail = entry.error ? `: ${entry.error}` : \"\";\n            failed.push(`${entry.key}${detail}`);\n          }\n        }\n\n        return {\n          status: \"success\" as const,\n          generated,\n          fetched,\n          skipped,\n          failed,\n          source: refreshed.runtime.api.source,\n        };\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          generated: [],\n          fetched: [],\n          skipped: [],\n          failed: [],\n          error: error instanceof Error ? error.message : \"Unknown error\",\n        };\n      }\n    }),\n\n    dbStudio: builder.dbStudio.handler(async ({ input }) => {\n      try {\n        const configPath = findConfigPath();\n        if (!configPath) {\n          return {\n            status: \"error\" as const,\n            plugin: input.plugin,\n            source: \"remote\" as const,\n            section: \"\",\n            error: \"No bos.config.json found in current directory\",\n          };\n        }\n\n        const projectDir = resolve(dirname(configPath));\n        loadProjectEnv(projectDir);\n        const refreshed = await loadResolvedConfig({ cwd: projectDir });\n        if (!refreshed) {\n          return {\n            status: \"error\" as const,\n            plugin: input.plugin,\n            source: \"remote\" as const,\n            section: \"\",\n            error: \"Failed to load bos.config.json\",\n          };\n        }\n\n        const { resolvePluginDbInfo } = await import(\"./cli/db-studio\");\n        const info = resolvePluginDbInfo(input.plugin, refreshed.runtime, projectDir);\n\n        return {\n          status: \"success\" as const,\n          plugin: info.key,\n          source: info.source,\n          section: info.section,\n          databaseSecret: info.databaseSecret,\n          databaseUrl: info.databaseUrl,\n          workspaceDir: info.workspaceDir,\n        };\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          plugin: input.plugin,\n          source: \"remote\" as const,\n          section: \"\",\n          error: error instanceof Error ? error.message : \"Unknown error\",\n        };\n      }\n    }),\n\n    status: builder.status.handler(async () => {\n      try {\n        const configPath = findConfigPath();\n        if (!configPath) {\n          return {\n            status: \"error\" as const,\n            packages: [],\n            envFile: \"missing\" as const,\n            error: \"No bos.config.json found in current directory\",\n          };\n        }\n\n        const projectDir = resolve(dirname(configPath));\n        return await getStatus(projectDir);\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          packages: [],\n          envFile: \"missing\" as const,\n          error: error instanceof Error ? error.message : \"Unknown error\",\n        };\n      }\n    }),\n  }),\n});\n\nfunction computeAllowedWorkspaces(overrides: string[], plugins?: string[]): string[] {\n  const workspaces: string[] = [];\n  for (const section of overrides) {\n    if (section === \"host\") workspaces.push(\"host\");\n    if (section === \"ui\") workspaces.push(\"ui\");\n    if (section === \"api\") workspaces.push(\"api\");\n  }\n  if (plugins && plugins.length > 0) {\n    workspaces.push(\"plugins/*\");\n  }\n  return workspaces;\n}\n"],"mappings":"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"}