Lines 34-74typescript
34import { applyPlan } from "./plan/executor.ts"
35import { run } from "./plan/run.ts"
36import { planChanges, ReclassifyError, type Plan } from "./plan/planner.ts"
37import { migratePostgresState } from "./state/postgres.ts"
38import { migrateSqliteState, SqliteStateLive } from "./state/sqlite.ts"
40export class ConfigLoadError extends Data.TaggedError("ConfigLoadError")<{
42 readonly reason: string
45/** Конфиг с уже собранным списком моделей: явные + найденные discovery. */
46type LoadedConfig = EfmeshConfig & { readonly models: ReadonlyArray<AnyModel> }
50): Effect.Effect<LoadedConfig, ConfigLoadError | DiscoveryError | DiscoveryConflictError> =>
51 Effect.gen(function* () {
52 const absolute = NodePath.resolve(process.cwd(), configPath)
53 const config = yield* Effect.tryPromise({
55 const module = (await import(absolute)) as { default?: EfmeshConfig }
56 if (
MediumDynamic Require
Package source references dynamic require/import behavior.
src/cli.tsView on unpkg · L54 57 module.default === undefined ||
58 (!Array.isArray(module.default.models) && module.default.discovery === undefined)
60 throw new Error("конфиг должен экспортировать default с models и/или discovery")
64 catch: (cause) => new ConfigLoadError({ path: configPath, reason: String(cause) }),
66 const explicit = config.models ?? []
67 if (config.discovery === undefined) return { ...config, models: explicit }
68 // маски — относительно конфига: проект переносим независимо от cwd
69 const discovered = yield* discoverModels(config.discovery, NodePath.dirname(absolute))
70 const seen = new Set(explicit)
71 const names = new Map(explicit.map((model) => [model.name.full, "models в конфиге"]))
72 const merged = [...explicit]
73 for (const model of discovered) {
74 if (seen.has(model)) continue