{"version":3,"file":"config.mjs","names":[],"sources":["../../src/commands/config.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { Context } from \"effect\";\nimport {\n  loadAppDescriptorConfig,\n  localConfigEntryPath,\n  readAuthoredConfigInput,\n  readLocalAuthoredConfigInput,\n  resolveConfigComposableEntries,\n} from \"../config\";\nimport type { BosConfigResult } from \"../contract\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport { applyRegistrySections } from \"../registry-use\";\nimport { walkExtendsChain } from \"../resolution/session\";\nimport type { BosConfig, BosConfigInput } from \"../types\";\nimport { BosConfigSchema } from \"../types\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { type BosBuilder, BosDepsTag } from \"./shared\";\n\nexport function registerConfig(builder: BosBuilder) {\n  return {\n    config: builder.config.handler(async ({ input, context }) => {\n      const deps = Context.get(context[\"effect/context\"], BosDepsTag);\n      if (input.full) {\n        return buildConfigResult(deps.session?.config ?? null, true);\n      }\n\n      const localConfig = await readAuthoredConfigInput(deps.session?.root);\n      return buildConfigResult(localConfig, false);\n    }),\n\n    registryUse: builder.registryUse.handler(async ({ input, context }) => {\n      const deps = Context.get(context[\"effect/context\"], BosDepsTag);\n      const root = deps.session?.root ?? process.cwd();\n      const configPath = localConfigEntryPath(root) ?? join(root, \"bos.config.json\");\n      const normalizedFrom = input.from.startsWith(\"bos://\") ? input.from : `bos://${input.from}`;\n\n      try {\n        const remote = await fetchBosConfigFromFastKv<Record<string, unknown>>(normalizedFrom);\n        const localRaw = await readLocalAuthoredConfigInput(root);\n        const local = (localRaw ??\n          (configPath.endsWith(\".json\")\n            ? (JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>)\n            : ((await loadAppDescriptorConfig(configPath)) as unknown as Record<\n                string,\n                unknown\n              >))) as Record<string, unknown>;\n        const { config: merged, applied } = applyRegistrySections(\n          local as never,\n          remote as never,\n          input.sections,\n        );\n\n        if (input.dryRun) {\n          return {\n            status: \"dry-run\" as const,\n            from: normalizedFrom,\n            applied,\n            configPath,\n          };\n        }\n\n        await saveBosConfig(root, merged);\n\n        return {\n          status: \"updated\" as const,\n          from: normalizedFrom,\n          applied,\n          configPath,\n        };\n      } catch (error) {\n        return {\n          status: \"error\" as const,\n          from: normalizedFrom,\n          applied: [],\n          error: error instanceof Error ? error.message : String(error),\n        };\n      }\n    }),\n  };\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\nexport async function resolveRemoteConfigChain(\n  accountId: string,\n  gatewayId: string,\n  registry?: string,\n): Promise<BosConfig> {\n  const { config: merged } = await walkExtendsChain(`bos://${accountId}/${gatewayId}`, {\n    env: \"production\",\n    registry,\n    visit: async () => {},\n  });\n\n  return resolveConfigComposableEntries(BosConfigSchema.parse(merged), process.cwd(), \"production\");\n}\n"],"mappings":";;;;;;;;;;;;;AAoBA,SAAgB,eAAe,SAAqB;CAClD,OAAO;EACL,QAAQ,QAAQ,OAAO,QAAQ,OAAO,EAAE,OAAO,cAAc;GAC3D,MAAM,OAAO,QAAQ,IAAI,QAAQ,mBAAmB,UAAU;GAC9D,IAAI,MAAM,MACR,OAAO,kBAAkB,KAAK,SAAS,UAAU,MAAM,IAAI;GAI7D,OAAO,kBAAkB,MADC,wBAAwB,KAAK,SAAS,IAAI,GAC9B,KAAK;EAC7C,CAAC;EAED,aAAa,QAAQ,YAAY,QAAQ,OAAO,EAAE,OAAO,cAAc;GAErE,MAAM,OADO,QAAQ,IAAI,QAAQ,mBAAmB,UACpC,CAAC,CAAC,SAAS,QAAQ,QAAQ,IAAI;GAC/C,MAAM,aAAa,qBAAqB,IAAI,KAAK,KAAK,MAAM,iBAAiB;GAC7E,MAAM,iBAAiB,MAAM,KAAK,WAAW,QAAQ,IAAI,MAAM,OAAO,SAAS,MAAM;GAErF,IAAI;IACF,MAAM,SAAS,MAAM,yBAAkD,cAAc;IAErF,MAAM,QAAS,MADQ,6BAA6B,IAAI,MAErD,WAAW,SAAS,OAAO,IACvB,KAAK,MAAM,aAAa,YAAY,OAAO,CAAC,IAC3C,MAAM,wBAAwB,UAAU;IAIhD,MAAM,EAAE,QAAQ,QAAQ,YAAY,sBAClC,OACA,QACA,MAAM,QACR;IAEA,IAAI,MAAM,QACR,OAAO;KACL,QAAQ;KACR,MAAM;KACN;KACA;IACF;IAGF,MAAM,cAAc,MAAM,MAAM;IAEhC,OAAO;KACL,QAAQ;KACR,MAAM;KACN;KACA;IACF;GACF,SAAS,OAAO;IACd,OAAO;KACL,QAAQ;KACR,MAAM;KACN,SAAS,CAAC;KACV,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;IAC9D;GACF;EACF,CAAC;CACH;AACF;AAEA,SAAS,kBACP,WACA,OAAO,OACU;CACjB,MAAM,WACJ,WAAW,OAAO,OAAO,UAAU,QAAQ,WAAW,OAAO,KAAK,UAAU,GAAG,IAAI,CAAC;CACtF,MAAM,UAAU,SAAS,QAAQ,SAAS,SAAS,MAAM;CAEzD,OAAO;EACL,QAAQ,aAAa;EACrB;EACA;EACA;CACF;AACF;AAEA,eAAsB,yBACpB,WACA,WACA,UACoB;CACpB,MAAM,EAAE,QAAQ,WAAW,MAAM,iBAAiB,SAAS,UAAU,GAAG,aAAa;EACnF,KAAK;EACL;EACA,OAAO,YAAY,CAAC;CACtB,CAAC;CAED,OAAO,+BAA+B,gBAAgB,MAAM,MAAM,GAAG,QAAQ,IAAI,GAAG,YAAY;AAClG"}