@@ -5,7 +5,8 @@ import { produce, type Draft } from "immer"
55import { ModelV2 } from "./model"
66import { PluginV2 } from "./plugin"
77import { ProviderV2 } from "./provider"
8- import { Instance } from "./instance"
8+ import { Location } from "./location"
9+ import { EventV2 } from "./event"
910
1011type ProviderRecord = {
1112 provider : ProviderV2 . Info
@@ -24,6 +25,15 @@ export class ModelNotFoundError extends Schema.TaggedErrorClass<ModelNotFoundErr
2425 modelID : ModelV2 . ID ,
2526} ) { }
2627
28+ export const Event = {
29+ ModelUpdated : EventV2 . define ( {
30+ type : "catalog.model.updated" ,
31+ schema : {
32+ model : ModelV2 . Info ,
33+ } ,
34+ } ) ,
35+ }
36+
2737export interface Interface {
2838 readonly provider : {
2939 readonly get : ( providerID : ProviderV2 . ID ) => Effect . Effect < ProviderV2 . Info , ProviderNotFoundError >
@@ -57,10 +67,11 @@ export class Service extends Context.Service<Service, Interface>()("@opencode/v2
5767export const layer = Layer . effect (
5868 Service ,
5969 Effect . gen ( function * ( ) {
60- yield * Instance . Service
70+ yield * Location . Service
6171 let records = HashMap . empty < ProviderV2 . ID , ProviderRecord > ( )
6272 let defaultModel : { providerID : ProviderV2 . ID ; modelID : ModelV2 . ID } | undefined
6373 const plugin = yield * PluginV2 . Service
74+ const events = yield * EventV2 . Service
6475
6576 const resolve = ( model : ModelV2 . Info ) => {
6677 const provider = Option . getOrThrow ( HashMap . get ( records , model . providerID ) ) . provider
@@ -157,14 +168,12 @@ export const layer = Layer.effect(
157168 )
158169 const updated = yield * plugin . trigger ( "model.update" , { } , { model, cancel : false } )
159170 if ( updated . cancel ) return
171+ const next = new ModelV2 . Info ( { ...updated . model , id : modelID , providerID } )
160172 records = HashMap . set ( records , providerID , {
161173 provider : record . provider ,
162- models : HashMap . set (
163- record . models ,
164- modelID ,
165- new ModelV2 . Info ( { ...updated . model , id : modelID , providerID } ) ,
166- ) ,
174+ models : HashMap . set ( record . models , modelID , next ) ,
167175 } )
176+ yield * events . publish ( Event . ModelUpdated , { model : resolve ( next ) } )
168177 return
169178 } ) ,
170179
@@ -257,4 +266,4 @@ export const layer = Layer.effect(
257266
258267const SMALL_MODEL_RE = / \b ( n a n o | f l a s h | l i t e | m i n i | h a i k u | s m a l l | f a s t ) \b /
259268
260- export const defaultLayer = layer . pipe ( Layer . provide ( PluginV2 . defaultLayer ) )
269+ export const defaultLayer = layer . pipe ( Layer . provideMerge ( EventV2 . defaultLayer ) , Layer . provide ( PluginV2 . defaultLayer ) )
0 commit comments