mirror of
https://github.com/anomalyco/opencode.git
synced 2026-04-24 06:45:22 +00:00
Convert Vcs from Instance.state namespace to an Effect ServiceMap.Service on the Instances LayerMap. Uses Instance.bind for the Bus.subscribe callback (same ALS pattern as FileWatcherService). Branch state is managed in the layer closure with scope-based cleanup.
48 lines
1.6 KiB
TypeScript
48 lines
1.6 KiB
TypeScript
import { ConfigProvider, Layer, ManagedRuntime } from "effect"
|
|
import { InstanceContext } from "../../src/effect/instance-context"
|
|
import { Instance } from "../../src/project/instance"
|
|
|
|
/** ConfigProvider that enables the experimental file watcher. */
|
|
export const watcherConfigLayer = ConfigProvider.layer(
|
|
ConfigProvider.fromUnknown({
|
|
OPENCODE_EXPERIMENTAL_FILEWATCHER: "true",
|
|
OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: "false",
|
|
}),
|
|
)
|
|
|
|
/**
|
|
* Boot an Instance with the given service layers and run `body` with
|
|
* the ManagedRuntime. Cleanup is automatic — the runtime is disposed
|
|
* and Instance context is torn down when `body` completes.
|
|
*
|
|
* Layers may depend on InstanceContext (provided automatically).
|
|
* Pass extra layers via `options.provide` (e.g. ConfigProvider.layer).
|
|
*/
|
|
export function withServices<S>(
|
|
directory: string,
|
|
layer: Layer.Layer<S, any, InstanceContext>,
|
|
body: (rt: ManagedRuntime.ManagedRuntime<S, never>) => Promise<void>,
|
|
options?: { provide?: Layer.Layer<never>[] },
|
|
) {
|
|
return Instance.provide({
|
|
directory,
|
|
fn: async () => {
|
|
const ctx = Layer.sync(InstanceContext, () =>
|
|
InstanceContext.of({ directory: Instance.directory, project: Instance.project }),
|
|
)
|
|
let resolved: Layer.Layer<S> = Layer.fresh(layer).pipe(Layer.provide(ctx)) as any
|
|
if (options?.provide) {
|
|
for (const l of options.provide) {
|
|
resolved = resolved.pipe(Layer.provide(l)) as any
|
|
}
|
|
}
|
|
const rt = ManagedRuntime.make(resolved)
|
|
try {
|
|
await body(rt)
|
|
} finally {
|
|
await rt.dispose()
|
|
}
|
|
},
|
|
})
|
|
}
|