mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-21 18:26:09 +00:00
156 lines
5.3 KiB
TypeScript
156 lines
5.3 KiB
TypeScript
export * as PluginInternal from "./internal"
|
|
|
|
import { makeLocationNode } from "../effect/app-node"
|
|
import { httpClient } from "../effect/app-node-platform"
|
|
import type { PluginContext } from "@opencode-ai/plugin/v2/effect"
|
|
import { Effect, Layer, Scope } from "effect"
|
|
import { AgentV2 } from "../agent"
|
|
import { Catalog } from "../catalog"
|
|
import { CommandV2 } from "../command"
|
|
import { Config } from "../config"
|
|
import { ConfigAgentPlugin } from "../config/plugin/agent"
|
|
import { ConfigCommandPlugin } from "../config/plugin/command"
|
|
import { ConfigExternalPlugin } from "../config/plugin/external"
|
|
import { ConfigProviderPlugin } from "../config/plugin/provider"
|
|
import { ConfigReferencePlugin } from "../config/plugin/reference"
|
|
import { ConfigSkillPlugin } from "../config/plugin/skill"
|
|
import { EventV2 } from "../event"
|
|
import { FileSystem } from "../filesystem"
|
|
import { FSUtil } from "../fs-util"
|
|
import { Global } from "../global"
|
|
import { Integration } from "../integration"
|
|
import { Location } from "../location"
|
|
import { ModelsDev } from "../models-dev"
|
|
import { Npm } from "../npm"
|
|
import { PluginV2 } from "../plugin"
|
|
import { Reference } from "../reference"
|
|
import { SkillV2 } from "../skill"
|
|
import { State } from "../state"
|
|
import { FetchHttpClient, HttpClient } from "effect/unstable/http"
|
|
import { AgentPlugin } from "./agent"
|
|
import { CommandPlugin } from "./command"
|
|
import { ModelsDevPlugin } from "./models-dev"
|
|
import { ProviderPlugins } from "./provider"
|
|
import { SkillPlugin } from "./skill"
|
|
import { VariantPlugin } from "./variant"
|
|
|
|
export type Requirements =
|
|
| AgentV2.Service
|
|
| Catalog.Service
|
|
| CommandV2.Service
|
|
| Config.Service
|
|
| EventV2.Service
|
|
| FileSystem.Service
|
|
| FSUtil.Service
|
|
| Global.Service
|
|
| HttpClient.HttpClient
|
|
| Integration.Service
|
|
| Location.Service
|
|
| ModelsDev.Service
|
|
| Npm.Service
|
|
| Reference.Service
|
|
| SkillV2.Service
|
|
|
|
export interface Plugin<R = never> {
|
|
readonly id: string
|
|
readonly effect: (context: PluginContext) => Effect.Effect<void, never, R | Scope.Scope>
|
|
}
|
|
|
|
export function define<R>(plugin: Plugin<R>) {
|
|
return plugin
|
|
}
|
|
|
|
const layer = Layer.effectDiscard(
|
|
Effect.gen(function* () {
|
|
const catalog = yield* Catalog.Service
|
|
const commands = yield* CommandV2.Service
|
|
const plugin = yield* PluginV2.Service
|
|
const integration = yield* Integration.Service
|
|
const agents = yield* AgentV2.Service
|
|
const config = yield* Config.Service
|
|
const location = yield* Location.Service
|
|
const modelsDev = yield* ModelsDev.Service
|
|
const npm = yield* Npm.Service
|
|
const events = yield* EventV2.Service
|
|
const fs = yield* FSUtil.Service
|
|
const filesystem = yield* FileSystem.Service
|
|
const global = yield* Global.Service
|
|
const http = yield* HttpClient.HttpClient
|
|
const skill = yield* SkillV2.Service
|
|
const reference = yield* Reference.Service
|
|
const add = <R>(input: Plugin<R>) => {
|
|
const loaded = {
|
|
id: input.id,
|
|
effect: (context: PluginContext) =>
|
|
input
|
|
.effect(context)
|
|
.pipe(
|
|
Effect.provideService(Catalog.Service, catalog),
|
|
Effect.provideService(CommandV2.Service, commands),
|
|
Effect.provideService(Integration.Service, integration),
|
|
Effect.provideService(AgentV2.Service, agents),
|
|
Effect.provideService(Config.Service, config),
|
|
Effect.provideService(Location.Service, location),
|
|
Effect.provideService(ModelsDev.Service, modelsDev),
|
|
Effect.provideService(Npm.Service, npm),
|
|
Effect.provideService(EventV2.Service, events),
|
|
Effect.provideService(FSUtil.Service, fs),
|
|
Effect.provideService(FileSystem.Service, filesystem),
|
|
Effect.provideService(Global.Service, global),
|
|
Effect.provideService(HttpClient.HttpClient, http),
|
|
Effect.provideService(SkillV2.Service, skill),
|
|
Effect.provideService(Reference.Service, reference),
|
|
),
|
|
}
|
|
return plugin.add(PluginV2.ID.make(loaded.id), loaded.effect)
|
|
}
|
|
|
|
yield* State.batch(
|
|
Effect.gen(function* () {
|
|
yield* add(ConfigReferencePlugin.Plugin)
|
|
yield* add(AgentPlugin.Plugin)
|
|
yield* add(CommandPlugin.Plugin)
|
|
yield* add(SkillPlugin.Plugin)
|
|
yield* add(ModelsDevPlugin)
|
|
yield* add(ConfigAgentPlugin.Plugin)
|
|
yield* add(ConfigCommandPlugin.Plugin)
|
|
yield* add(ConfigSkillPlugin.Plugin)
|
|
for (const item of ProviderPlugins) yield* add(item)
|
|
yield* add(ConfigExternalPlugin.Plugin)
|
|
yield* add(ConfigProviderPlugin.Plugin)
|
|
yield* add(VariantPlugin.Plugin)
|
|
}),
|
|
).pipe(Effect.withSpan("PluginInternal.boot"), Effect.forkScoped({ startImmediately: true }))
|
|
}),
|
|
)
|
|
|
|
export const locationLayer = layer.pipe(
|
|
Layer.provideMerge(PluginV2.locationLayer),
|
|
Layer.provideMerge(Config.locationLayer),
|
|
Layer.provideMerge(FileSystem.locationLayer),
|
|
Layer.provideMerge(FetchHttpClient.layer),
|
|
)
|
|
|
|
export const node = makeLocationNode({
|
|
name: "plugin-internal",
|
|
layer,
|
|
deps: [
|
|
Catalog.node,
|
|
CommandV2.node,
|
|
PluginV2.node,
|
|
Integration.node,
|
|
AgentV2.node,
|
|
Config.node,
|
|
Location.node,
|
|
ModelsDev.node,
|
|
Npm.node,
|
|
EventV2.node,
|
|
FSUtil.node,
|
|
FileSystem.node,
|
|
Global.node,
|
|
httpClient,
|
|
SkillV2.node,
|
|
Reference.node,
|
|
],
|
|
})
|