Builtins and instruction context become ordinary Location-scoped services exposing load(), the same shape as skill, reference, and MCP guidance. The runner composes all six producers explicitly in loadSystemContext, so the full context roster is readable at one call site. Dynamic registration and scoped deregistration had no consumers.
48 lines
1.8 KiB
TypeScript
48 lines
1.8 KiB
TypeScript
export * as SystemContextBuiltIns from "./builtins"
|
|
|
|
import { makeLocationNode } from "../effect/app-node"
|
|
import { Context, DateTime, Effect, Layer, Schema } from "effect"
|
|
import { Location } from "../location"
|
|
import { SystemContext } from "./index"
|
|
|
|
export interface Interface {
|
|
readonly load: () => Effect.Effect<SystemContext.SystemContext>
|
|
}
|
|
|
|
export class Service extends Context.Service<Service, Interface>()("@opencode/v2/SystemContextBuiltIns") {}
|
|
|
|
const layer = Layer.effect(
|
|
Service,
|
|
Effect.gen(function* () {
|
|
const location = yield* Location.Service
|
|
const environment = [
|
|
"<env>",
|
|
` Working directory: ${location.directory}`,
|
|
` Workspace root folder: ${location.project.directory}`,
|
|
` Is directory a git repo: ${location.vcs?.type === "git" ? "yes" : "no"}`,
|
|
` Platform: ${process.platform}`,
|
|
"</env>",
|
|
].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}`,
|
|
}),
|
|
])
|
|
|
|
return Service.of({ load: () => Effect.succeed(context) })
|
|
}),
|
|
)
|
|
|
|
export const node = makeLocationNode({ service: Service, layer, deps: [Location.node] })
|