{"version":3,"file":"config.mjs","names":[],"sources":["../../src/handlers/config.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { Effect } from \"effect\";\nimport {\n  loadAppDescriptorConfig,\n  localConfigEntryPath,\n  readAuthoredConfigInput,\n  readLocalAuthoredConfigInput,\n  resolveConfigComposableEntries,\n} from \"../config\";\nimport type { BosConfigResult } from \"../contract\";\nimport { fetchBosConfigFromFastKv } from \"../services/registry/fastkv\";\nimport { applyRegistrySections } from \"../services/registry/use\";\nimport { ResolutionSessionService, walkExtendsChain } from \"../services/resolution/session\";\nimport type { BosConfig, BosConfigInput } from \"../types\";\nimport { BosConfigSchema } from \"../types\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport type { BosBuilder } from \"./shared\";\n\nexport function registerConfig(builder: BosBuilder) {\n  return {\n    config: builder.config.effect(function* (_opts, input) {\n      const session = yield* ResolutionSessionService;\n      if (input.full) {\n        return buildConfigResult(session?.config ?? null, true);\n      }\n\n      const localConfig = yield* Effect.promise(() => readAuthoredConfigInput(session?.root));\n      return buildConfigResult(localConfig, false);\n    }),\n\n    registryUse: builder.registryUse.effect(function* (_opts, input) {\n      const session = yield* ResolutionSessionService;\n      const root = 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      return yield* Effect.tryPromise({\n        try: async () => {\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        },\n        catch: (error) => ({\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,OAAO,WAAW,OAAO,OAAO;GACrD,MAAM,UAAU,OAAO;GACvB,IAAI,MAAM,MACR,OAAO,kBAAkB,SAAS,UAAU,MAAM,IAAI;GAIxD,OAAO,kBAAkB,OADE,OAAO,cAAc,wBAAwB,SAAS,IAAI,CAAC,GAChD,KAAK;EAC7C,CAAC;EAED,aAAa,QAAQ,YAAY,OAAO,WAAW,OAAO,OAAO;GAE/D,MAAM,QAAO,OADU,yBACH,EAAE,QAAQ,QAAQ,IAAI;GAC1C,MAAM,aAAa,qBAAqB,IAAI,KAAK,KAAK,MAAM,iBAAiB;GAC7E,MAAM,iBAAiB,MAAM,KAAK,WAAW,QAAQ,IAAI,MAAM,OAAO,SAAS,MAAM;GAErF,OAAO,OAAO,OAAO,WAAW;IAC9B,KAAK,YAAY;KACf,MAAM,SAAS,MAAM,yBAAkD,cAAc;KAErF,MAAM,QAAS,MADQ,6BAA6B,IAAI,MAErD,WAAW,SAAS,OAAO,IACvB,KAAK,MAAM,aAAa,YAAY,OAAO,CAAC,IAC3C,MAAM,wBAAwB,UAAU;KAIhD,MAAM,EAAE,QAAQ,QAAQ,YAAY,sBAClC,OACA,QACA,MAAM,QACR;KAEA,IAAI,MAAM,QACR,OAAO;MACL,QAAQ;MACR,MAAM;MACN;MACA;KACF;KAGF,MAAM,cAAc,MAAM,MAAM;KAEhC,OAAO;MACL,QAAQ;MACR,MAAM;MACN;MACA;KACF;IACF;IACA,QAAQ,WAAW;KACjB,QAAQ;KACR,MAAM;KACN,SAAS,CAAC;KACV,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;IAC9D;GACF,CAAC;EACH,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"}