|
Download packages/plugin/src/v2/promise/README.md from SaylorTwift/opencode: direct link, hf CLI and curl.
- Browser
- Download file 2.48 kB
-
https://huggingface.co/SaylorTwift/opencode/resolve/main/packages/plugin/src/v2/promise/README.md
- Command line
-
hf download hf://SaylorTwift/opencode/packages/plugin/src/v2/promise/README.md
-
curl -L -o README.md https://huggingface.co/SaylorTwift/opencode/resolve/main/packages/plugin/src/v2/promise/README.md
2.48 kB
| # 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() | |
| ``` | |