# OpenCode V2 Promise Plugin API The Promise plugin API is the async/await equivalent of `@opencode-ai/plugin/v2/effect`. It grants plugins the same two in-process capabilities: - `hook` installs behavior at an OpenCode extension point. - `reload` reruns every transform hook for a stateful domain. The only difference from the Effect API is the async boundary: hook callbacks, hook registration, `reload`, and `Registration.dispose` use Promises instead of Effects. ## Defining A Plugin ```ts import { define } from "@opencode-ai/plugin/v2/promise" export const Plugin = define({ id: "example", setup: async (ctx) => { await ctx.catalog.transform((catalog) => { catalog.provider.update("example", (provider) => { provider.name = "Example" }) }) }, }) ``` Plugin setup registers hooks imperatively. It does not return a hook object. Configuration supplied for the plugin is available as `ctx.options`. A registration may be removed early through `dispose`: ```ts const registration = await ctx.catalog.transform(applyCatalog) await registration.dispose() ``` ## Transform Hooks Transform hooks contribute to stateful domains. The draft editor is synchronous; the callback may be `async` when it needs to await other work: ```ts await ctx.agent.transform((agent) => { agent.update("reviewer", (item) => { item.description = "Reviews code for regressions" item.mode = "subagent" }) }) ``` Available transform hooks are namespaced by domain: ```ts ctx.agent.transform ctx.catalog.transform ctx.command.transform ctx.integration.transform ctx.reference.transform ctx.skill.transform ``` ## Runtime Hooks Runtime hooks intercept live operations: ```ts await ctx.aisdk.sdk(async (event) => { if (event.package !== "@ai-sdk/xai") return const mod = await import("@ai-sdk/xai") event.sdk = mod.createXai(event.options) }) await ctx.aisdk.language((event) => { if (event.model.providerID !== "xai") return event.language = event.sdk.responses(event.model.api.id) }) ``` ## Reloading A Domain When data captured by a transform changes, reload the affected domain: ```ts let data = await loadCatalog() await ctx.catalog.transform((catalog) => { applyCatalog(data, catalog) }) data = await loadCatalog() await ctx.catalog.reload() ``` Available reload operations are: ```ts ctx.agent.reload() ctx.catalog.reload() ctx.command.reload() ctx.integration.reload() ctx.reference.reload() ctx.skill.reload() ```