1- import { Effect , Layer , LayerMap , ServiceMap } from "effect" ;
2- import { FileService } from "@/file" ;
3- import { FileTimeService } from "@/file/time" ;
4- import { FileWatcherService } from "@/file/watcher" ;
5- import { FormatService } from "@/format" ;
6- import { PermissionService } from "@/permission/service" ;
7- import { Instance } from "@/project/instance" ;
8- import { VcsService } from "@/project/vcs" ;
9- import { ProviderAuthService } from "@/provider/auth-service" ;
10- import { QuestionService } from "@/question/service" ;
11- import { SkillService } from "@/skill/skill" ;
12- import { SnapshotService } from "@/snapshot" ;
13- import { InstanceContext } from "./instance-context" ;
14- import { registerDisposer } from "./instance-registry" ;
1+ import { Effect , Layer , LayerMap , ServiceMap } from "effect"
2+ import { FileService } from "@/file"
3+ import { FileTimeService } from "@/file/time"
4+ import { FileWatcherService } from "@/file/watcher"
5+ import { FormatService } from "@/format"
6+ import { PermissionService } from "@/permission/service"
7+ import { Instance } from "@/project/instance"
8+ import { VcsService } from "@/project/vcs"
9+ import { ProviderAuthService } from "@/provider/auth-service"
10+ import { QuestionService } from "@/question/service"
11+ import { SkillService } from "@/skill/skill"
12+ import { SnapshotService } from "@/snapshot"
13+ import { InstanceContext } from "./instance-context"
14+ import { registerDisposer } from "./instance-registry"
1515
16- export { InstanceContext } from "./instance-context" ;
16+ export { InstanceContext } from "./instance-context"
1717
1818export type InstanceServices =
19- | QuestionService
20- | PermissionService
21- | ProviderAuthService
22- | FileWatcherService
23- | VcsService
24- | FileTimeService
25- | FormatService
26- | FileService
27- | SkillService
28- | SnapshotService ;
19+ | QuestionService
20+ | PermissionService
21+ | ProviderAuthService
22+ | FileWatcherService
23+ | VcsService
24+ | FileTimeService
25+ | FormatService
26+ | FileService
27+ | SkillService
28+ | SnapshotService
2929
3030// NOTE: LayerMap only passes the key (directory string) to lookup, but we need
3131// the full instance context (directory, worktree, project). We read from the
@@ -34,50 +34,41 @@ export type InstanceServices =
3434// This should go away once the old Instance type is removed and lookup can load
3535// the full context directly.
3636function lookup ( _key : string ) {
37- const ctx = Layer . sync ( InstanceContext , ( ) =>
38- InstanceContext . of ( Instance . current ) ,
39- ) ;
40- return Layer . mergeAll (
41- Layer . fresh ( QuestionService . layer ) ,
42- Layer . fresh ( PermissionService . layer ) ,
43- Layer . fresh ( ProviderAuthService . layer ) ,
44- Layer . fresh ( FileWatcherService . layer ) . pipe ( Layer . orDie ) ,
45- Layer . fresh ( VcsService . layer ) ,
46- Layer . fresh ( FileTimeService . layer ) . pipe ( Layer . orDie ) ,
47- Layer . fresh ( FormatService . layer ) ,
48- Layer . fresh ( FileService . layer ) ,
49- Layer . fresh ( SkillService . layer ) ,
50- Layer . fresh ( SnapshotService . layer ) ,
51- ) . pipe ( Layer . provide ( ctx ) ) ;
37+ const ctx = Layer . sync ( InstanceContext , ( ) => InstanceContext . of ( Instance . current ) )
38+ return Layer . mergeAll (
39+ Layer . fresh ( QuestionService . layer ) ,
40+ Layer . fresh ( PermissionService . layer ) ,
41+ Layer . fresh ( ProviderAuthService . layer ) ,
42+ Layer . fresh ( FileWatcherService . layer ) . pipe ( Layer . orDie ) ,
43+ Layer . fresh ( VcsService . layer ) ,
44+ Layer . fresh ( FileTimeService . layer ) . pipe ( Layer . orDie ) ,
45+ Layer . fresh ( FormatService . layer ) ,
46+ Layer . fresh ( FileService . layer ) ,
47+ Layer . fresh ( SkillService . layer ) ,
48+ Layer . fresh ( SnapshotService . layer ) ,
49+ ) . pipe ( Layer . provide ( ctx ) )
5250}
5351
54- export class Instances extends ServiceMap . Service <
55- Instances ,
56- LayerMap . LayerMap < string , InstanceServices >
57- > ( ) ( "opencode/Instances" ) {
58- static readonly layer = Layer . effect (
59- Instances ,
60- Effect . gen ( function * ( ) {
61- const layerMap = yield * LayerMap . make ( lookup , {
62- idleTimeToLive : Infinity ,
63- } ) ;
64- const unregister = registerDisposer ( ( directory ) =>
65- Effect . runPromise ( layerMap . invalidate ( directory ) ) ,
66- ) ;
67- yield * Effect . addFinalizer ( ( ) => Effect . sync ( unregister ) ) ;
68- return Instances . of ( layerMap ) ;
69- } ) ,
70- ) ;
52+ export class Instances extends ServiceMap . Service < Instances , LayerMap . LayerMap < string , InstanceServices > > ( ) (
53+ "opencode/Instances" ,
54+ ) {
55+ static readonly layer = Layer . effect (
56+ Instances ,
57+ Effect . gen ( function * ( ) {
58+ const layerMap = yield * LayerMap . make ( lookup , {
59+ idleTimeToLive : Infinity ,
60+ } )
61+ const unregister = registerDisposer ( ( directory ) => Effect . runPromise ( layerMap . invalidate ( directory ) ) )
62+ yield * Effect . addFinalizer ( ( ) => Effect . sync ( unregister ) )
63+ return Instances . of ( layerMap )
64+ } ) ,
65+ )
7166
72- static get (
73- directory : string ,
74- ) : Layer . Layer < InstanceServices , never , Instances > {
75- return Layer . unwrap (
76- Instances . use ( ( map ) => Effect . succeed ( map . get ( directory ) ) ) ,
77- ) ;
78- }
67+ static get ( directory : string ) : Layer . Layer < InstanceServices , never , Instances > {
68+ return Layer . unwrap ( Instances . use ( ( map ) => Effect . succeed ( map . get ( directory ) ) ) )
69+ }
7970
80- static invalidate ( directory : string ) : Effect . Effect < void , never , Instances > {
81- return Instances . use ( ( map ) => map . invalidate ( directory ) ) ;
82- }
71+ static invalidate ( directory : string ) : Effect . Effect < void , never , Instances > {
72+ return Instances . use ( ( map ) => map . invalidate ( directory ) )
73+ }
8374}
0 commit comments