mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-27 19:53:37 +00:00
45 lines
1.7 KiB
TypeScript
45 lines
1.7 KiB
TypeScript
import { Effect, Scope, Stream } from "effect"
|
|
import { EventV2 } from "../event"
|
|
import { PluginV2 } from "../plugin"
|
|
import { Auth } from "../auth"
|
|
|
|
// Depending on what account is active, enable matching providers for that
|
|
// service
|
|
export const AccountPlugin = PluginV2.define({
|
|
id: PluginV2.ID.make("account"),
|
|
effect: Effect.gen(function* () {
|
|
const accounts = yield* Auth.Service
|
|
const events = yield* EventV2.Service
|
|
const scope = yield* Scope.Scope
|
|
|
|
yield* events.subscribe(Auth.Event.Switched).pipe(
|
|
Stream.runForEach((event) =>
|
|
PluginV2.Service.use((plugin) => plugin.trigger("account.switched", event.data, {})).pipe(Effect.asVoid),
|
|
),
|
|
Effect.forkIn(scope, { startImmediately: true }),
|
|
)
|
|
|
|
return {
|
|
"catalog.transform": Effect.fn(function* (evt) {
|
|
const active = yield* accounts.activeAll().pipe(Effect.orDie)
|
|
if (active.size === 0) return
|
|
for (const item of evt.provider.list()) {
|
|
const account = active.get(Auth.ServiceID.make(item.provider.id))
|
|
if (!account) continue
|
|
evt.provider.update(item.provider.id, (provider) => {
|
|
provider.enabled = {
|
|
via: "account",
|
|
service: account.serviceID,
|
|
}
|
|
if (account.credential.type === "api") {
|
|
provider.request.body.apiKey = account.credential.key
|
|
Object.assign(provider.request.body, account.credential.metadata ?? {})
|
|
}
|
|
if (account.credential.type === "oauth") provider.request.body.apiKey = account.credential.access
|
|
})
|
|
}
|
|
}),
|
|
"account.switched": Effect.fn(function* () {}),
|
|
}
|
|
}),
|
|
})
|