import type { Event, createOpencodeClient, Project, Model, Provider, Permission, UserMessage, Part, Auth, Config, } from "@opencode-ai/sdk" import type { BunShell } from "./shell" import { type ToolDefinition } from "./tool" export * from "./tool" export type ProviderContext = { source: "env" | "config" | "custom" | "api" info: Provider options: Record } export type PluginInput = { client: ReturnType project: Project directory: string worktree: string $: BunShell } export type Plugin = (input: PluginInput) => Promise export type AuthHook = { provider: string loader?: (auth: () => Promise, provider: Provider) => Promise> methods: ( | { type: "oauth" label: string prompts?: Array< | { type: "text" key: string message: string placeholder?: string validate?: (value: string) => string | undefined condition?: (inputs: Record) => boolean } | { type: "select" key: string message: string options: Array<{ label: string value: string hint?: string }> condition?: (inputs: Record) => boolean } > authorize(inputs?: Record): Promise } | { type: "api" label: string prompts?: Array< | { type: "text" key: string message: string placeholder?: string validate?: (value: string) => string | undefined condition?: (inputs: Record) => boolean } | { type: "select" key: string message: string options: Array<{ label: string value: string hint?: string }> condition?: (inputs: Record) => boolean } > authorize?(inputs?: Record): Promise< | { type: "success" key: string provider?: string } | { type: "failed" } > } )[] } export type AuthOuathResult = { url: string; instructions: string } & ( | { method: "auto" callback(): Promise< | ({ type: "success" provider?: string } & ( | { refresh: string access: string expires: number } | { key: string } )) | { type: "failed" } > } | { method: "code" callback(code: string): Promise< | ({ type: "success" provider?: string } & ( | { refresh: string access: string expires: number } | { key: string } )) | { type: "failed" } > } ) export interface Hooks { event?: (input: { event: Event }) => Promise config?: (input: Config) => Promise tool?: { [key: string]: ToolDefinition } auth?: AuthHook /** * Called when a new message is received */ "chat.message"?: ( input: { sessionID: string; agent?: string; model?: { providerID: string; modelID: string }; messageID?: string }, output: { message: UserMessage; parts: Part[] }, ) => Promise /** * Modify parameters sent to LLM */ "chat.params"?: ( input: { sessionID: string; agent: string; model: Model; provider: ProviderContext; message: UserMessage }, output: { temperature: number; topP: number; options: Record }, ) => Promise "permission.ask"?: (input: Permission, output: { status: "ask" | "deny" | "allow" }) => Promise "tool.execute.before"?: ( input: { tool: string; sessionID: string; callID: string }, output: { args: any }, ) => Promise "tool.execute.after"?: ( input: { tool: string; sessionID: string; callID: string }, output: { title: string output: string metadata: any }, ) => Promise }