| 77 | } |
| 78 | |
| 79 | export function catalogHost(catalog: Catalog.Interface): PluginContext["catalog"] { |
| 80 | return { |
| 81 | reload: catalog.reload, |
| 82 | transform: (callback) => |
| 83 | catalog.transform((draft) => |
| 84 | callback({ |
| 85 | provider: { |
| 86 | list: () => |
| 87 | draft.provider.list().map((value) => ({ |
| 88 | provider: providerInfo(value.provider), |
| 89 | models: new Map(Array.from(value.models, ([id, model]) => [id, modelInfo(model)])), |
| 90 | })), |
| 91 | get: (id) => { |
| 92 | const value = draft.provider.get(ProviderV2.ID.make(id)) |
| 93 | return ( |
| 94 | value && { |
| 95 | provider: providerInfo(value.provider), |
| 96 | models: new Map(Array.from(value.models, ([id, model]) => [id, modelInfo(model)])), |
| 97 | } |
| 98 | ) |
| 99 | }, |
| 100 | update: (id, update) => |
| 101 | draft.provider.update(ProviderV2.ID.make(id), (value) => { |
| 102 | const current = providerInfo(value) |
| 103 | update(current) |
| 104 | Object.assign(value, current, { id: ProviderV2.ID.make(current.id) }) |
| 105 | }), |
| 106 | remove: (id) => draft.provider.remove(ProviderV2.ID.make(id)), |
| 107 | }, |
| 108 | model: { |
| 109 | get: (providerID, modelID) => { |
| 110 | const value = draft.model.get(ProviderV2.ID.make(providerID), ModelV2.ID.make(modelID)) |
| 111 | return value && modelInfo(value) |
| 112 | }, |
| 113 | update: (providerID, modelID, update) => |
| 114 | draft.model.update(ProviderV2.ID.make(providerID), ModelV2.ID.make(modelID), (value) => { |
| 115 | const current = modelInfo(value) |
| 116 | update(current) |
| 117 | Object.assign(value, current, { |
| 118 | id: ModelV2.ID.make(current.id), |
| 119 | providerID: ProviderV2.ID.make(current.providerID), |
| 120 | family: current.family === undefined ? undefined : ModelV2.Family.make(current.family), |
| 121 | variants: current.variants.map((variant) => ({ |
| 122 | ...variant, |
| 123 | id: ModelV2.VariantID.make(variant.id), |
| 124 | })), |
| 125 | }) |
| 126 | }), |
| 127 | remove: (providerID, modelID) => |
| 128 | draft.model.remove(ProviderV2.ID.make(providerID), ModelV2.ID.make(modelID)), |
| 129 | default: { |
| 130 | get: () => { |
| 131 | const value = draft.model.default.get() |
| 132 | return value && { providerID: value.providerID, modelID: value.modelID } |
| 133 | }, |
| 134 | set: (providerID, modelID) => |
| 135 | draft.model.default.set(ProviderV2.ID.make(providerID), ModelV2.ID.make(modelID)), |
| 136 | }, |