Skip to content

Commit 379e40d

Browse files
authored
feat: unwrap InstanceState + EffectBridge namespaces to flat exports + barrel (#22721)
1 parent 6c7e9f6 commit 379e40d

40 files changed

Lines changed: 138 additions & 140 deletions

packages/opencode/src/agent/agent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import path from "path"
2020
import { Plugin } from "@/plugin"
2121
import { Skill } from "../skill"
2222
import { Effect, Context, Layer } from "effect"
23-
import { InstanceState } from "@/effect/instance-state"
23+
import { InstanceState } from "@/effect"
2424
import * as Option from "effect/Option"
2525
import * as OtelTracer from "@effect/opentelemetry/Tracer"
2626

packages/opencode/src/bus/bus.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import z from "zod"
22
import { Effect, Exit, Layer, PubSub, Scope, Context, Stream } from "effect"
3-
import { EffectBridge } from "@/effect/bridge"
3+
import { EffectBridge } from "@/effect"
44
import { Log } from "../util/log"
55
import { BusEvent } from "./bus-event"
66
import { GlobalBus } from "./global"
7-
import { InstanceState } from "@/effect/instance-state"
7+
import { InstanceState } from "@/effect"
88
import { makeRuntime } from "@/effect/run-service"
99

1010
const log = Log.create({ service: "bus" })

packages/opencode/src/command/command.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { BusEvent } from "@/bus/bus-event"
2-
import { InstanceState } from "@/effect/instance-state"
3-
import { EffectBridge } from "@/effect/bridge"
2+
import { InstanceState } from "@/effect"
3+
import { EffectBridge } from "@/effect"
44
import type { InstanceContext } from "@/project/instance"
55
import { SessionID, MessageID } from "@/session/schema"
66
import { Effect, Layer, Context } from "effect"

packages/opencode/src/config/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import { isRecord } from "@/util/record"
3232
import { ConfigPaths } from "./paths"
3333
import type { ConsoleState } from "./console-state"
3434
import { AppFileSystem } from "@opencode-ai/shared/filesystem"
35-
import { InstanceState } from "@/effect/instance-state"
35+
import { InstanceState } from "@/effect"
3636
import { Context, Duration, Effect, Exit, Fiber, Layer, Option } from "effect"
3737
import { EffectFlock } from "@opencode-ai/shared/util/effect-flock"
3838

packages/opencode/src/config/tui.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Flag } from "@/flag/flag"
1010
import { Log } from "@/util/log"
1111
import { isRecord } from "@/util/record"
1212
import { Global } from "@/global"
13-
import { InstanceState } from "@/effect/instance-state"
13+
import { InstanceState } from "@/effect"
1414
import { makeRuntime } from "@/effect/run-service"
1515
import { AppFileSystem } from "@opencode-ai/shared/filesystem"
1616

packages/opencode/src/effect/bridge.ts

Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,43 @@ import { LocalContext } from "@/util/local-context"
55
import { InstanceRef, WorkspaceRef } from "./instance-ref"
66
import { attachWith } from "./run-service"
77

8-
export namespace EffectBridge {
9-
export interface Shape {
10-
readonly promise: <A, E, R>(effect: Effect.Effect<A, E, R>) => Promise<A>
11-
readonly fork: <A, E, R>(effect: Effect.Effect<A, E, R>) => Fiber.Fiber<A, E>
12-
}
8+
export interface Shape {
9+
readonly promise: <A, E, R>(effect: Effect.Effect<A, E, R>) => Promise<A>
10+
readonly fork: <A, E, R>(effect: Effect.Effect<A, E, R>) => Fiber.Fiber<A, E>
11+
}
1312

14-
function restore<R>(instance: InstanceContext | undefined, workspace: string | undefined, fn: () => R): R {
15-
if (instance && workspace !== undefined) {
16-
return WorkspaceContext.restore(workspace, () => Instance.restore(instance, fn))
17-
}
18-
if (instance) return Instance.restore(instance, fn)
19-
if (workspace !== undefined) return WorkspaceContext.restore(workspace, fn)
20-
return fn()
13+
function restore<R>(instance: InstanceContext | undefined, workspace: string | undefined, fn: () => R): R {
14+
if (instance && workspace !== undefined) {
15+
return WorkspaceContext.restore(workspace, () => Instance.restore(instance, fn))
2116
}
17+
if (instance) return Instance.restore(instance, fn)
18+
if (workspace !== undefined) return WorkspaceContext.restore(workspace, fn)
19+
return fn()
20+
}
2221

23-
export function make(): Effect.Effect<Shape> {
24-
return Effect.gen(function* () {
25-
const ctx = yield* Effect.context()
26-
const value = yield* InstanceRef
27-
const instance =
28-
value ??
29-
(() => {
30-
try {
31-
return Instance.current
32-
} catch (err) {
33-
if (!(err instanceof LocalContext.NotFound)) throw err
34-
}
35-
})()
36-
const workspace = (yield* WorkspaceRef) ?? WorkspaceContext.workspaceID
37-
const attach = <A, E, R>(effect: Effect.Effect<A, E, R>) => attachWith(effect, { instance, workspace })
38-
const wrap = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
39-
attach(effect).pipe(Effect.provide(ctx)) as Effect.Effect<A, E, never>
22+
export function make(): Effect.Effect<Shape> {
23+
return Effect.gen(function* () {
24+
const ctx = yield* Effect.context()
25+
const value = yield* InstanceRef
26+
const instance =
27+
value ??
28+
(() => {
29+
try {
30+
return Instance.current
31+
} catch (err) {
32+
if (!(err instanceof LocalContext.NotFound)) throw err
33+
}
34+
})()
35+
const workspace = (yield* WorkspaceRef) ?? WorkspaceContext.workspaceID
36+
const attach = <A, E, R>(effect: Effect.Effect<A, E, R>) => attachWith(effect, { instance, workspace })
37+
const wrap = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
38+
attach(effect).pipe(Effect.provide(ctx)) as Effect.Effect<A, E, never>
4039

41-
return {
42-
promise: <A, E, R>(effect: Effect.Effect<A, E, R>) =>
43-
restore(instance, workspace, () => Effect.runPromise(wrap(effect))),
44-
fork: <A, E, R>(effect: Effect.Effect<A, E, R>) =>
45-
restore(instance, workspace, () => Effect.runFork(wrap(effect))),
46-
} satisfies Shape
47-
})
48-
}
40+
return {
41+
promise: <A, E, R>(effect: Effect.Effect<A, E, R>) =>
42+
restore(instance, workspace, () => Effect.runPromise(wrap(effect))),
43+
fork: <A, E, R>(effect: Effect.Effect<A, E, R>) =>
44+
restore(instance, workspace, () => Effect.runFork(wrap(effect))),
45+
} satisfies Shape
46+
})
4947
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * as InstanceState from "./instance-state"
2+
export * as EffectBridge from "./bridge"

packages/opencode/src/effect/instance-state.ts

Lines changed: 55 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -13,72 +13,70 @@ export interface InstanceState<A, E = never, R = never> {
1313
readonly cache: ScopedCache.ScopedCache<string, A, E, R>
1414
}
1515

16-
export namespace InstanceState {
17-
export const bind = <F extends (...args: any[]) => any>(fn: F): F => {
18-
try {
19-
return Instance.bind(fn)
20-
} catch (err) {
21-
if (!(err instanceof LocalContext.NotFound)) throw err
22-
}
23-
const fiber = Fiber.getCurrent()
24-
const ctx = fiber ? Context.getReferenceUnsafe(fiber.context, InstanceRef) : undefined
25-
if (!ctx) return fn
26-
return ((...args: any[]) => Instance.restore(ctx, () => fn(...args))) as F
16+
export const bind = <F extends (...args: any[]) => any>(fn: F): F => {
17+
try {
18+
return Instance.bind(fn)
19+
} catch (err) {
20+
if (!(err instanceof LocalContext.NotFound)) throw err
2721
}
22+
const fiber = Fiber.getCurrent()
23+
const ctx = fiber ? Context.getReferenceUnsafe(fiber.context, InstanceRef) : undefined
24+
if (!ctx) return fn
25+
return ((...args: any[]) => Instance.restore(ctx, () => fn(...args))) as F
26+
}
2827

29-
export const context = Effect.gen(function* () {
30-
return (yield* InstanceRef) ?? Instance.current
31-
})
28+
export const context = Effect.gen(function* () {
29+
return (yield* InstanceRef) ?? Instance.current
30+
})
3231

33-
export const workspaceID = Effect.gen(function* () {
34-
return (yield* WorkspaceRef) ?? WorkspaceContext.workspaceID
35-
})
32+
export const workspaceID = Effect.gen(function* () {
33+
return (yield* WorkspaceRef) ?? WorkspaceContext.workspaceID
34+
})
3635

37-
export const directory = Effect.map(context, (ctx) => ctx.directory)
36+
export const directory = Effect.map(context, (ctx) => ctx.directory)
3837

39-
export const make = <A, E = never, R = never>(
40-
init: (ctx: InstanceContext) => Effect.Effect<A, E, R | Scope.Scope>,
41-
): Effect.Effect<InstanceState<A, E, Exclude<R, Scope.Scope>>, never, R | Scope.Scope> =>
42-
Effect.gen(function* () {
43-
const cache = yield* ScopedCache.make<string, A, E, R>({
44-
capacity: Number.POSITIVE_INFINITY,
45-
lookup: () =>
46-
Effect.gen(function* () {
47-
return yield* init(yield* context)
48-
}),
49-
})
38+
export const make = <A, E = never, R = never>(
39+
init: (ctx: InstanceContext) => Effect.Effect<A, E, R | Scope.Scope>,
40+
): Effect.Effect<InstanceState<A, E, Exclude<R, Scope.Scope>>, never, R | Scope.Scope> =>
41+
Effect.gen(function* () {
42+
const cache = yield* ScopedCache.make<string, A, E, R>({
43+
capacity: Number.POSITIVE_INFINITY,
44+
lookup: () =>
45+
Effect.gen(function* () {
46+
return yield* init(yield* context)
47+
}),
48+
})
5049

51-
const off = registerDisposer((directory) =>
52-
Effect.runPromise(ScopedCache.invalidate(cache, directory).pipe(Effect.provide(EffectLogger.layer))),
53-
)
54-
yield* Effect.addFinalizer(() => Effect.sync(off))
50+
const off = registerDisposer((directory) =>
51+
Effect.runPromise(ScopedCache.invalidate(cache, directory).pipe(Effect.provide(EffectLogger.layer))),
52+
)
53+
yield* Effect.addFinalizer(() => Effect.sync(off))
5554

56-
return {
57-
[TypeId]: TypeId,
58-
cache,
59-
}
60-
})
55+
return {
56+
[TypeId]: TypeId,
57+
cache,
58+
}
59+
})
6160

62-
export const get = <A, E, R>(self: InstanceState<A, E, R>) =>
63-
Effect.gen(function* () {
64-
return yield* ScopedCache.get(self.cache, yield* directory)
65-
})
61+
export const get = <A, E, R>(self: InstanceState<A, E, R>) =>
62+
Effect.gen(function* () {
63+
return yield* ScopedCache.get(self.cache, yield* directory)
64+
})
6665

67-
export const use = <A, E, R, B>(self: InstanceState<A, E, R>, select: (value: A) => B) =>
68-
Effect.map(get(self), select)
66+
export const use = <A, E, R, B>(self: InstanceState<A, E, R>, select: (value: A) => B) =>
67+
Effect.map(get(self), select)
6968

70-
export const useEffect = <A, E, R, B, E2, R2>(
71-
self: InstanceState<A, E, R>,
72-
select: (value: A) => Effect.Effect<B, E2, R2>,
73-
) => Effect.flatMap(get(self), select)
69+
export const useEffect = <A, E, R, B, E2, R2>(
70+
self: InstanceState<A, E, R>,
71+
select: (value: A) => Effect.Effect<B, E2, R2>,
72+
) => Effect.flatMap(get(self), select)
7473

75-
export const has = <A, E, R>(self: InstanceState<A, E, R>) =>
76-
Effect.gen(function* () {
77-
return yield* ScopedCache.has(self.cache, yield* directory)
78-
})
74+
export const has = <A, E, R>(self: InstanceState<A, E, R>) =>
75+
Effect.gen(function* () {
76+
return yield* ScopedCache.has(self.cache, yield* directory)
77+
})
7978

80-
export const invalidate = <A, E, R>(self: InstanceState<A, E, R>) =>
81-
Effect.gen(function* () {
82-
return yield* ScopedCache.invalidate(self.cache, yield* directory)
83-
})
84-
}
79+
export const invalidate = <A, E, R>(self: InstanceState<A, E, R>) =>
80+
Effect.gen(function* () {
81+
return yield* ScopedCache.invalidate(self.cache, yield* directory)
82+
})

packages/opencode/src/env/env.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Context, Effect, Layer } from "effect"
2-
import { InstanceState } from "@/effect/instance-state"
2+
import { InstanceState } from "@/effect"
33

44
type State = Record<string, string | undefined>
55

packages/opencode/src/file/file.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { BusEvent } from "@/bus/bus-event"
2-
import { InstanceState } from "@/effect/instance-state"
2+
import { InstanceState } from "@/effect"
33

44
import { AppFileSystem } from "@opencode-ai/shared/filesystem"
55
import { Git } from "@/git"

0 commit comments

Comments
 (0)