import { describe, expect } from "bun:test" import { Effect } from "effect" import { AgentV2 } from "@opencode-ai/core/agent" import { PluginV2 } from "@opencode-ai/core/plugin" import { PluginHost } from "@opencode-ai/core/plugin/host" import { PluginPromise } from "@opencode-ai/core/plugin/promise" import { define } from "@opencode-ai/plugin/v2/promise" import { testEffect } from "../lib/effect" import { PluginTestLayer } from "./fixture" const it = testEffect(PluginTestLayer) describe("fromPromise", () => { it.effect("loads a promise plugin and registers a transform hook", () => Effect.gen(function* () { const agents = yield* AgentV2.Service const plugin = yield* PluginV2.Service const host = yield* PluginHost.make(plugin) const promisePlugin = define({ id: "promise-example", setup: async (ctx) => { expect(ctx.options.mode).toBe("strict") await ctx.agent.transform((draft) => { draft.update("reviewer", (item) => { item.description = "Reviews code" item.mode = "subagent" }) }) }, }) const adapted = PluginPromise.fromPromise(promisePlugin) yield* adapted.effect({ ...host, options: { mode: "strict" } }) expect(yield* agents.get(AgentV2.ID.make("reviewer"))).toMatchObject({ description: "Reviews code", mode: "subagent", }) }), ) it.effect("disposes a hook registration on request", () => Effect.gen(function* () { const agents = yield* AgentV2.Service const plugin = yield* PluginV2.Service const host = yield* PluginHost.make(plugin) const promisePlugin = define({ id: "promise-dispose", setup: async (ctx) => { const registration = await ctx.agent.transform((draft) => { draft.update("temp", (item) => { item.description = "temporary" }) }) await registration.dispose() }, }) const adapted = PluginPromise.fromPromise(promisePlugin) yield* adapted.effect(host) expect(yield* agents.get(AgentV2.ID.make("temp"))).toBeUndefined() }), ) })