From 46295dc33d2e42d56f9c581a683d3d81661626ee Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Mon, 3 Aug 2026 21:43:00 -0500 Subject: [PATCH] refactor(plugin): isolate promise HTTP adapter --- packages/core/src/plugin/promise.ts | 51 +++++++++++++++-------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/packages/core/src/plugin/promise.ts b/packages/core/src/plugin/promise.ts index 32e5342af26..a4575b2072a 100644 --- a/packages/core/src/plugin/promise.ts +++ b/packages/core/src/plugin/promise.ts @@ -2,6 +2,7 @@ export * as PluginPromise from "./promise" import { define } from "@opencode-ai/plugin/effect/plugin" import type { Context, Plugin } from "@opencode-ai/plugin/promise/plugin" +import type { SessionContext, SessionHttp } from "@opencode-ai/plugin/promise/session" import type { Info } from "@opencode-ai/plugin/promise/tool" import { Agent } from "@opencode-ai/schema/agent" import { Integration } from "@opencode-ai/schema/integration" @@ -57,6 +58,28 @@ export function fromPromise(plugin: Plugin) { }), ) + const sessionHttp = (callback: (event: SessionHttp) => Promise | void) => + register( + host.session.hook("http", (event) => { + const request = event.request + const output: SessionHttp = { + ...event, + request: (input) => Effect.runPromiseWith(context)(request(input), { signal: input.signal }), + } + return Effect.promise(() => Promise.resolve(callback(output))).pipe( + Effect.tap(() => + Effect.sync(() => { + event.request = (input) => + Effect.tryPromise({ + try: (signal) => output.request(new Request(input, { signal })), + catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))), + }) + }), + ), + ) + }), + ) + const context2: Context = { app: host.app, options: host.options, @@ -266,32 +289,10 @@ export function fromPromise(plugin: Plugin) { }, session: { hook: (name, callback) => { - if (name !== "http") - return register( - host.session.hook(name, (event) => - Effect.promise(() => Promise.resolve(Reflect.apply(callback, undefined, [event]))), - ), - ) + if (name === "http") return sessionHttp(callback as (event: SessionHttp) => Promise | void) + const sessionContext = callback as (event: SessionContext) => Promise | void return register( - host.session.hook("http", (event) => { - const request = event.request - const output = { - ...event, - request: (input: Request) => - Effect.runPromiseWith(context)(request(input), { signal: input.signal }), - } - return Effect.promise(() => Promise.resolve(Reflect.apply(callback, undefined, [output]))).pipe( - Effect.tap(() => - Effect.sync(() => { - event.request = (input) => - Effect.tryPromise({ - try: (signal) => output.request(new Request(input, { signal })), - catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))), - }) - }), - ), - ) - }), + host.session.hook("context", (event) => Effect.promise(() => Promise.resolve(sessionContext(event)))), ) }, create: (input) =>