import type { Event, createOpencodeClient, Project, Model, Provider, Permission, UserMessage, Message, 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; serverUrl: URL; $: 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; accountId?: string; } | { key: string; })) | { type: "failed"; }>; } | { method: "code"; callback(code: string): Promise<({ type: "success"; provider?: string; } & ({ refresh: string; access: string; expires: number; accountId?: string; } | { 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; variant?: 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; topK: number; options: Record; }) => Promise; "chat.headers"?: (input: { sessionID: string; agent: string; model: Model; provider: ProviderContext; message: UserMessage; }, output: { headers: Record; }) => Promise; "permission.ask"?: (input: Permission, output: { status: "ask" | "deny" | "allow"; }) => Promise; "command.execute.before"?: (input: { command: string; sessionID: string; arguments: string; }, output: { parts: Part[]; }) => Promise; "tool.execute.before"?: (input: { tool: string; sessionID: string; callID: string; }, output: { args: any; }) => Promise; "shell.env"?: (input: { cwd: string; sessionID?: string; callID?: string; }, output: { env: Record; }) => Promise; "tool.execute.after"?: (input: { tool: string; sessionID: string; callID: string; args: any; }, output: { title: string; output: string; metadata: any; }) => Promise; "experimental.chat.messages.transform"?: (input: {}, output: { messages: { info: Message; parts: Part[]; }[]; }) => Promise; "experimental.chat.system.transform"?: (input: { sessionID?: string; model: Model; }, output: { system: string[]; }) => Promise; /** * Called before session compaction starts. Allows plugins to customize * the compaction prompt. * * - `context`: Additional context strings appended to the default prompt * - `prompt`: If set, replaces the default compaction prompt entirely */ "experimental.session.compacting"?: (input: { sessionID: string; }, output: { context: string[]; prompt?: string; }) => Promise; "experimental.text.complete"?: (input: { sessionID: string; messageID: string; partID: string; }, output: { text: string; }) => Promise; /** * Modify tool definitions (description and parameters) sent to LLM */ "tool.definition"?: (input: { toolID: string; }, output: { description: string; parameters: any; }) => Promise; }