{"version":3,"file":"plugin.mjs","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import { EventEmitter } from \"node:events\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { Effect } from \"effect\";\nimport { syncApiContractBridge } from \"./api-contract\";\nimport { buildRuntimeConfig, detectLocalPackages, prepareDevelopmentRuntimeConfig } from \"./app\";\nimport { ensureEnvFile, loadProjectEnv, writeGeneratedInfra } from \"./cli/infra\";\nimport {\n  buildInitPatterns,\n  copyFilteredFiles,\n  detectGitRemoteUrl,\n  fetchParentConfig,\n  generateDatabaseMigrations,\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 {\n  buildRuntimePluginsForConfig,\n  findConfigPath,\n  getHostDevelopmentPort,\n  getProjectRoot,\n  loadConfig,\n  resolveLocalDevelopmentPath,\n  writeResolvedConfig,\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  buildRegistryConfigUrlForNetwork,\n  fetchBosConfigFromFastKv,\n  fetchRemotePluginManifest,\n  getRegistryNamespaceForAccount,\n  getRegistryNamespaceForNetwork,\n  type PluginManifest,\n} from \"./fastkv\";\nimport { computeSriHashForUrl } from \"./integrity\";\nimport type { BosEnv } from \"./merge\";\nimport { addFunctionCallAccessKey, ensureNearCli, executeTransaction } from \"./near-cli\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport { createPlugin, z } from \"./sdk\";\nimport {\n  type AppOrchestrator,\n  buildDescription,\n  buildServiceDescriptorMap,\n  type ServiceDescriptor,\n} from \"./service-descriptor\";\nimport { syncAndGenerateSharedUi } from \"./shared\";\nimport { writePluginSidebarGen } from \"./sidebar\";\nimport type { BosConfig, BosConfigInput, BosPluginRef, RuntimeConfig, SourceMode } from \"./types\";\nimport { run } from \"./utils/run\";\nimport { saveBosConfig } from \"./utils/save-config\";\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 buildCommands: Record<string, { cmd: string; args: string[] }> = {\n  host: { cmd: \"bun\", args: [\"run\", \"build\"] },\n  ui: { cmd: \"bun\", args: [\"run\", \"build\"] },\n  api: { cmd: \"bun\", args: [\"run\", \"build\"] },\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 getPluginRef(entry: string | BosPluginRef | undefined | null): BosPluginRef | null {\n  if (!entry || typeof entry === \"string\") return null;\n  return entry;\n}\n\nfunction parseSourceMode(value: string | undefined, defaultValue: SourceMode): SourceMode {\n  if (value === \"local\" || value === \"remote\") return value;\n  return defaultValue;\n}\n\nfunction buildConfigResult(bosConfig: BosConfig | null): BosConfigResult {\n  const packages = bosConfig ? Object.keys(bosConfig.app) : [];\n  const remotes = packages.filter((name) => name !== \"host\");\n\n  return {\n    config: bosConfig,\n    packages,\n    remotes,\n  };\n}\n\ntype WorkspaceTarget = {\n  key: string;\n  kind: \"app\" | \"plugin\";\n  path: string;\n};\n\nasync function fileExists(path: string): Promise<boolean> {\n  try {\n    await access(path);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nasync function readJsonFile<T>(path: string): Promise<T> {\n  return JSON.parse(await readFile(path, \"utf8\")) as T;\n}\n\nfunction resolveWorkspaceTarget(\n  key: string,\n  bosConfig: BosConfig | null,\n  runtimeConfig: RuntimeConfig | null,\n  configDir: string,\n): WorkspaceTarget | null {\n  if (bosConfig?.app && key in bosConfig.app) {\n    const appEntry = (bosConfig.app as Record<string, { development?: string }>)[key];\n    const devPath = resolveLocalDevelopmentPath(appEntry?.development, configDir);\n    if (devPath) {\n      return {\n        key,\n        kind: \"app\",\n        path: devPath,\n      };\n    }\n    return {\n      key,\n      kind: \"app\",\n      path: `${configDir}/${key}`,\n    };\n  }\n\n  const runtimePlugin = runtimeConfig?.plugins?.[key];\n  const pluginPath =\n    runtimePlugin?.localPath ??\n    resolveLocalDevelopmentPath(getPluginRef(bosConfig?.plugins?.[key])?.development, configDir);\n  if (pluginPath) {\n    return {\n      key,\n      kind: \"plugin\",\n      path: pluginPath,\n    };\n  }\n\n  return null;\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\ninterface GeneratedArtifacts {\n  sidebarPath: string;\n  resolvedConfigPath?: string;\n  contractBridgePath: string;\n}\n\nasync function generateCodeArtifacts(\n  configDir: string,\n  config: BosConfig,\n  opts?: {\n    env?: BosEnv;\n    extendsChain?: string[];\n    runtimeConfig?: RuntimeConfig;\n  },\n): Promise<GeneratedArtifacts | null> {\n  if (opts?.env) {\n    writeResolvedConfig(configDir, config, opts.env, opts.extendsChain);\n  }\n\n  const runtimeConfig = opts?.runtimeConfig ?? (await loadConfig({ cwd: configDir }))?.runtime;\n  if (!runtimeConfig) return null;\n\n  writePluginSidebarGen(configDir, runtimeConfig);\n\n  const bridge = await syncApiContractBridge({\n    configDir,\n    runtimeConfig,\n    apiBaseUrl: runtimeConfig.api.url,\n  });\n\n  return {\n    sidebarPath: join(configDir, \"ui/src/lib/plugin-sidebar.gen.ts\"),\n    resolvedConfigPath: opts?.env ? join(configDir, \".bos/bos.resolved-config.json\") : undefined,\n    contractBridgePath: bridge.bridgePath,\n  };\n}\n\nfunction extractPublishedUrl(output: string): string | null {\n  const match = output.match(/https?:\\/\\/[^\\s\"'<>]+/g);\n  if (!match || match.length === 0) return null;\n  return match[match.length - 1] ?? null;\n}\n\nasync function buildEveryPluginQuietly(cwd: string) {\n  const packageDir = `${cwd}/packages/every-plugin`;\n  const packageExists = await fileExists(`${packageDir}/package.json`);\n  if (!packageExists) {\n    return;\n  }\n\n  const distPath = `${cwd}/packages/every-plugin/dist/build/rspack/plugin.mjs`;\n  const distExists = await fileExists(distPath);\n\n  if (distExists) {\n    return;\n  }\n\n  const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/every-plugin\", \"build\"], {\n    cwd,\n    capture: true,\n  })) as { stdout: string; stderr: string; exitCode: number };\n\n  if (result.exitCode === 0) {\n    console.log(\"[build:ssr] build succeeded\");\n    return;\n  }\n\n  if (result.stdout.trim()) {\n    process.stdout.write(result.stdout);\n  }\n\n  if (result.stderr.trim()) {\n    process.stderr.write(result.stderr);\n  }\n\n  throw new Error(\n    `bun run --cwd packages/every-plugin build failed with exit code ${result.exitCode}`,\n  );\n}\n\nasync function buildEverythingDevQuietly(cwd: string) {\n  const packageDir = `${cwd}/packages/everything-dev`;\n  const packageExists = await fileExists(`${packageDir}/package.json`);\n  if (!packageExists) {\n    return;\n  }\n\n  const distPath = `${cwd}/packages/everything-dev/dist/index.mjs`;\n  const distExists = await fileExists(distPath);\n\n  if (distExists) {\n    return;\n  }\n\n  const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/everything-dev\", \"build\"], {\n    cwd,\n    capture: true,\n  })) as { stdout: string; stderr: string; exitCode: number };\n\n  if (result.exitCode === 0) {\n    console.log(\"[everything-dev] build succeeded\");\n    return;\n  }\n\n  if (result.stdout.trim()) {\n    process.stdout.write(result.stdout);\n  }\n\n  if (result.stderr.trim()) {\n    process.stderr.write(result.stderr);\n  }\n\n  throw new Error(\n    `bun run --cwd packages/everything-dev build failed with exit code ${result.exitCode}`,\n  );\n}\n\nasync function fetchPublishedConfig(\n  accountId: string,\n  gatewayId: string,\n): Promise<BosConfig | null> {\n  try {\n    return await fetchBosConfigFromFastKv<BosConfig>(`bos://${accountId}/${gatewayId}`);\n  } catch {\n    return null;\n  }\n}\n\nfunction selectWorkspaceTargets(packages: string, bosConfig: BosConfig | null): string[] {\n  const allPackages = [\n    ...Object.keys(bosConfig?.app ?? {}),\n    ...Object.keys(bosConfig?.plugins ?? {}),\n  ];\n  if (packages === \"all\") {\n    return allPackages;\n  }\n\n  return packages\n    .split(\",\")\n    .map((pkg) => pkg.trim())\n    .filter((pkg) => allPackages.includes(pkg));\n}\n\nasync function buildWorkspaceTargets(opts: {\n  configDir: string;\n  bosConfig: BosConfig | null;\n  runtimeConfig: RuntimeConfig | null;\n  targets: string[];\n  deploy: boolean;\n}): Promise<{ built: string[]; skipped: string[] }> {\n  const existing: WorkspaceTarget[] = [];\n  const skipped: string[] = [];\n\n  for (const target of opts.targets) {\n    const resolved = resolveWorkspaceTarget(\n      target,\n      opts.bosConfig,\n      opts.runtimeConfig,\n      opts.configDir,\n    );\n    if (!resolved) {\n      skipped.push(target);\n      continue;\n    }\n\n    const exists = await fileExists(`${resolved.path}/package.json`);\n    if (exists) existing.push(resolved);\n    else skipped.push(target);\n  }\n\n  if (existing.length === 0) {\n    return { built: [], skipped };\n  }\n\n  const sharedSync = await syncAndGenerateSharedUi({\n    configDir: opts.configDir,\n    hostMode: \"local\",\n    bosConfig: opts.bosConfig ?? undefined,\n    extendsChain: [],\n  });\n  if (sharedSync.catalogChanged) {\n    await run(\"bun\", [\"install\"], { cwd: opts.configDir });\n  }\n\n  if (existing.some((entry) => entry.key === \"api\")) {\n    await buildEveryPluginQuietly(opts.configDir);\n  }\n\n  await buildEverythingDevQuietly(opts.configDir);\n\n  const env: Record<string, string> = {\n    ...process.env,\n    NODE_ENV: opts.deploy ? \"production\" : \"development\",\n  };\n  if (opts.deploy) {\n    env.DEPLOY = \"true\";\n  } else {\n    delete env.DEPLOY;\n  }\n\n  const orderedExisting = opts.deploy\n    ? [\n        ...existing.filter((entry) => entry.kind === \"app\" && entry.key !== \"host\"),\n        ...existing.filter((entry) => entry.kind === \"plugin\"),\n        ...existing.filter((entry) => entry.kind === \"app\" && entry.key === \"host\"),\n      ]\n    : existing;\n  const built: string[] = [];\n\n  for (const resolved of orderedExisting) {\n    const pkgJson = await readJsonFile<{\n      scripts?: Record<string, string>;\n    }>(`${resolved.path}/package.json`);\n    const shouldDeployScript = opts.deploy && pkgJson.scripts?.deploy;\n    const buildConfig = shouldDeployScript\n      ? { cmd: \"bun\", args: [\"run\", \"deploy\"] }\n      : (buildCommands[resolved.key] ?? { cmd: \"bun\", args: [\"run\", \"build\"] });\n\n    await run(buildConfig.cmd, buildConfig.args, {\n      cwd: resolved.path,\n      env,\n    });\n    built.push(resolved.key);\n  }\n\n  return { built, skipped };\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 loadConfig({ 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 () => buildConfigResult(deps.bosConfig)),\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      let publishedUrl = extractPublishedUrl(`${stdout}\\n${stderr}`);\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 integrity = publishedUrl ? await computeSriHashForUrl(publishedUrl) : null;\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      ensureEnvFile(deps.configDir);\n      loadProjectEnv(deps.configDir);\n\n      pluginEvents.emit(\"progress\", { phase: \"config\", status: \"running\" } satisfies ProgressEvent);\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 syncAndGenerateSharedUi({\n        configDir: deps.configDir,\n        hostMode: hostSource,\n        bosConfig: deps.bosConfig ?? undefined,\n        extendsChain: [],\n      });\n      if (sharedSync.catalogChanged) {\n        pluginEvents.emit(\"progress\", {\n          phase: \"install\",\n          status: \"running\",\n        } satisfies ProgressEvent);\n        await run(\"bun\", [\"install\"], { cwd: deps.configDir });\n        pluginEvents.emit(\"progress\", { phase: \"install\", status: \"done\" } satisfies ProgressEvent);\n      }\n      if (\n        (apiSource === \"local\" && !proxy) ||\n        localPackages.some((pkg) => pkg.startsWith(\"plugin:\"))\n      ) {\n        pluginEvents.emit(\"progress\", {\n          phase: \"build plugin\",\n          status: \"running\",\n        } satisfies ProgressEvent);\n        await buildEveryPluginQuietly(deps.configDir);\n        pluginEvents.emit(\"progress\", {\n          phase: \"build plugin\",\n          status: \"done\",\n        } satisfies ProgressEvent);\n      }\n\n      pluginEvents.emit(\"progress\", { phase: \"build\", status: \"running\" } satisfies ProgressEvent);\n      await buildEverythingDevQuietly(deps.configDir);\n      pluginEvents.emit(\"progress\", { phase: \"build\", status: \"done\" } satisfies ProgressEvent);\n\n      pluginEvents.emit(\"progress\", { phase: \"config\", status: \"done\" } satisfies ProgressEvent);\n\n      const refreshed = await loadConfig({ cwd: deps.configDir });\n      deps.bosConfig = refreshed?.config ?? deps.bosConfig;\n      deps.runtimeConfig = refreshed?.runtime ?? deps.runtimeConfig;\n\n      if (!deps.bosConfig) {\n        return {\n          status: \"error\" as const,\n          description: \"No bos.config.json found\",\n          processes: [],\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        };\n      }\n\n      const hostPort = input.port ?? getHostDevelopmentPort(deps.bosConfig.app.host.development);\n      const developmentRuntime = buildRuntimeConfig(deps.bosConfig, {\n        uiSource,\n        apiSource,\n        authSource,\n        hostSource,\n        env: \"development\",\n        plugins: deps.runtimeConfig?.plugins,\n      });\n      const runtimeConfig = await prepareDevelopmentRuntimeConfig(developmentRuntime, {\n        hostPort,\n        ssr,\n      });\n\n      await generateCodeArtifacts(deps.configDir, deps.bosConfig, {\n        env: \"development\",\n        extendsChain: refreshed?.source.extended,\n        runtimeConfig,\n      });\n\n      const services = buildServiceDescriptorMap(runtimeConfig, { ssr, proxy });\n      const packages = [...services.keys()];\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      };\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 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        remoteConfig = await fetchPublishedConfig(account, domain);\n        if (remoteConfig) {\n          config = remoteConfig;\n        } else {\n          console.warn(\n            `[Start] Failed to fetch remote config for ${account}/${domain}, falling back to local bos.config.json`,\n          );\n        }\n      }\n\n      if (!config) {\n        config = deps.bosConfig;\n      }\n\n      if (!config) {\n        return {\n          status: \"error\" as const,\n          url: \"\",\n          error:\n            \"No configuration found. Set BOS_ACCOUNT and BOS_GATEWAY environment variables, or provide 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 = input.env === \"staging\";\n      const runtimePlugins = await buildRuntimePluginsForConfig(\n        config,\n        deps.configDir,\n        \"production\",\n      );\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\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 defaultOrigin = `https://${config.domain}`;\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.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      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\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 account = deps.bosConfig.account;\n      const gateway = deps.bosConfig.domain;\n      if (!gateway) {\n        return {\n          status: \"error\" as const,\n          registryUrl: \"\",\n          error: \"bos.config.json must define domain to publish\",\n        };\n      }\n\n      const network = input.network ?? getNetworkIdForAccount(account);\n      const bosUrl = `bos://${account}/${gateway}`;\n      const registryUrl = buildRegistryConfigUrlForNetwork(network, account, gateway);\n      const targets = selectWorkspaceTargets(input.packages, deps.bosConfig);\n\n      let publishConfig = deps.bosConfig;\n      let built: string[] | undefined;\n      let skipped: string[] | undefined;\n\n      if (input.dryRun) {\n        return {\n          status: \"dry-run\" as const,\n          registryUrl,\n          built,\n          skipped,\n        };\n      }\n\n      if (input.deploy) {\n        await generateCodeArtifacts(deps.configDir, deps.bosConfig, {\n          env: \"production\",\n          runtimeConfig: deps.runtimeConfig ?? undefined,\n        });\n\n        const result = await buildWorkspaceTargets({\n          configDir: deps.configDir,\n          bosConfig: deps.bosConfig,\n          runtimeConfig: deps.runtimeConfig,\n          targets,\n          deploy: true,\n        });\n        built = result.built;\n        skipped = result.skipped;\n\n        const refreshed = await loadConfig({ cwd: deps.configDir });\n        if (refreshed?.config) {\n          deps.bosConfig = refreshed.config;\n          deps.runtimeConfig = refreshed.runtime;\n          publishConfig = refreshed.config;\n        }\n      }\n\n      const registryEntries: Record<string, string> = {\n        [`apps/${account}/${gateway}/bos.config.json`]: JSON.stringify(publishConfig),\n      };\n\n      const payload = JSON.stringify(registryEntries);\n      const argsBase64 = Buffer.from(payload).toString(\"base64\");\n      const privateKey =\n        input.privateKey || process.env.NEAR_PRIVATE_KEY || process.env.BOS_NEAR_PRIVATE_KEY;\n\n      try {\n        await Effect.runPromise(ensureNearCli);\n        let txHash: string | undefined;\n\n        try {\n          const tx = await Effect.runPromise(\n            executeTransaction({\n              account,\n              contract: getRegistryNamespaceForNetwork(network),\n              method: \"__fastdata_kv\",\n              argsBase64,\n              network,\n              privateKey,\n              gas: \"300Tgas\",\n              deposit: \"0NEAR\",\n            }),\n          );\n          txHash = tx.txHash;\n        } catch (error) {\n          txHash = extractTransactionHash(error);\n\n          if (!txHash) {\n            throw error;\n          }\n\n          try {\n            const verifiedConfig = await fetchBosConfigFromFastKv<BosConfig>(bosUrl);\n            if (JSON.stringify(verifiedConfig) !== JSON.stringify(publishConfig)) {\n              throw error;\n            }\n          } catch {\n            // Config may not exist yet on first publish or propagation delay;\n            // a valid txHash is sufficient proof the transaction was submitted.\n          }\n        }\n\n        return {\n          status: \"published\" as const,\n          registryUrl,\n          txHash,\n          built,\n          skipped,\n        };\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          registryUrl,\n          error: error instanceof Error ? error.message : \"Unknown error\",\n          built,\n          skipped,\n        };\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 {}\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        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);\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\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            loadConfig({ 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 loadConfig({ 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 loadConfig({ 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\n          if (refreshed.runtime.api.source !== \"local\") {\n            fetched.push(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(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(plugin.url);\n            } else if (plugin.localPath) {\n              skipped.push(`${key} (local)`);\n            }\n          }\n\n          const generated = [\n            \"ui/src/lib/api-types.gen.ts\",\n            \"ui/src/lib/auth-types.gen.ts\",\n            \"api/src/lib/plugins-types.gen.ts\",\n            \"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        await generateCodeArtifacts(projectDir, refreshed.config, {\n          runtimeConfig: refreshed.runtime,\n        });\n\n        const generated = [\n          \"ui/src/lib/plugin-sidebar.gen.ts\",\n          \"ui/src/lib/api-types.gen.ts\",\n          \"api/src/lib/plugins-types.gen.ts\",\n          \"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        return {\n          status: \"success\" as const,\n          generated,\n          fetched: refreshed.runtime.api.source === \"remote\" ? [refreshed.runtime.api.url] : [],\n          skipped: refreshed.runtime.api.source === \"local\" ? [\"api (local)\"] : [],\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    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 extractTransactionHash(error: unknown) {\n  const message = error instanceof Error ? error.message : String(error);\n  const match = message.match(/Transaction ID:\\s*([A-Za-z0-9]+)/i);\n  return match?.[1];\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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"}