diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index fc24aa35e7..2547daee6e 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -40,6 +40,7 @@ import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner" import { Ripgrep } from "../file/ripgrep" import { Format } from "../format" import { InstanceState } from "@/effect/instance-state" +import { EffectBridge } from "@/effect/bridge" import { Question } from "../question" import { Todo } from "../session/todo" import { LSP } from "@/lsp/lsp" @@ -158,9 +159,12 @@ export const layer: Layer.Layer< description: def.description, execute: (args, toolCtx) => Effect.gen(function* () { + // Bridge the host's Effect-based `ask` into a Promise-returning + // function for the plugin to make sure context persists + const bridge = yield* EffectBridge.make() const pluginCtx: PluginToolContext = { ...toolCtx, - ask: (req) => toolCtx.ask(req), + ask: (req) => bridge.promise(toolCtx.ask(req)), directory: ctx.directory, worktree: ctx.worktree, } diff --git a/packages/plugin/src/tool.ts b/packages/plugin/src/tool.ts index b8a634c796..9c6daa34d0 100644 --- a/packages/plugin/src/tool.ts +++ b/packages/plugin/src/tool.ts @@ -1,5 +1,4 @@ import { z } from "zod" -import { Effect } from "effect" export type ToolContext = { sessionID: string @@ -17,7 +16,7 @@ export type ToolContext = { worktree: string abort: AbortSignal metadata(input: { title?: string; metadata?: { [key: string]: any } }): void - ask(input: AskInput): Effect.Effect + ask(input: AskInput): Promise } type AskInput = {