export * as SystemContextBuiltIns from "./system-context-builtins" import { DateTime, Effect, Layer, Schema } from "effect" import { InstructionContext } from "./instruction-context" import { Location } from "./location" import { SystemContext } from "./system-context" import { SystemContextRegistry } from "./system-context-registry" const builtIns = Layer.effectDiscard( Effect.gen(function* () { const location = yield* Location.Service const registry = yield* SystemContextRegistry.Service const environment = [ "", ` Working directory: ${location.directory}`, ` Workspace root folder: ${location.project.directory}`, ` Is directory a git repo: ${location.vcs?.type === "git" ? "yes" : "no"}`, ` Platform: ${process.platform}`, "", ].join("\n") const context = SystemContext.combine([ SystemContext.make({ key: SystemContext.Key.make("core/environment"), codec: Schema.toCodecJson(Schema.String), load: Effect.succeed(environment), baseline: (environment) => ["Here is some useful information about the environment you are running in:", environment].join("\n"), update: (_previous, environment) => ["The environment you are running in is now:", environment].join("\n"), }), SystemContext.make({ key: SystemContext.Key.make("core/date"), codec: Schema.toCodecJson(Schema.String), load: DateTime.nowAsDate.pipe(Effect.map((date) => date.toDateString())), baseline: (date) => `Today's date: ${date}`, update: (_previous, date) => `Today's date is now: ${date}`, }), ]) yield* registry.contribute({ key: SystemContext.Key.make("core/builtins"), load: Effect.succeed(context) }) }), ) export const layer = Layer.mergeAll(builtIns, InstructionContext.layer).pipe( Layer.provideMerge(SystemContextRegistry.layer), ) export const locationLayer = layer