From 654da1336af23dacf6b39a481eca4b17e9d010cd Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Mon, 3 Aug 2026 23:49:57 -0500 Subject: [PATCH] refactor(plugin): isolate HTTP hook dispatch --- packages/core/src/plugin/host.ts | 2 +- packages/core/src/plugin/promise.ts | 4 ++-- packages/core/test/session-runner-recorded.test.ts | 4 ++-- packages/core/test/session-runner.test.ts | 2 +- packages/plugin/src/effect/session.ts | 13 +++++++------ packages/plugin/src/promise/session.ts | 9 +++++++-- 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/core/src/plugin/host.ts b/packages/core/src/plugin/host.ts index 407695defe1..5cf4645ab5b 100644 --- a/packages/core/src/plugin/host.ts +++ b/packages/core/src/plugin/host.ts @@ -339,7 +339,7 @@ export const make = Effect.fn("PluginHost.make")(function* (plugin: import("../p }, session: { hook: (...registration: SessionHookRegistration) => { - if (registration[0] === "context") return hooks.register("session", "context", registration[1]) + if (registration[0] !== "http") return hooks.register("session", ...registration) const middleware = registration[1] return hooks.register("session", "http", (event) => Effect.sync(() => { diff --git a/packages/core/src/plugin/promise.ts b/packages/core/src/plugin/promise.ts index 6bbe4f1805d..53ca9effdae 100644 --- a/packages/core/src/plugin/promise.ts +++ b/packages/core/src/plugin/promise.ts @@ -267,9 +267,9 @@ export function fromPromise(plugin: Plugin) { }, session: { hook: (...registration: SessionHookRegistration) => { - if (registration[0] === "context") + if (registration[0] !== "http") return register( - host.session.hook("context", (event) => + host.session.hook(registration[0], (event) => Effect.promise(() => Promise.resolve(registration[1](event))), ), ) diff --git a/packages/core/test/session-runner-recorded.test.ts b/packages/core/test/session-runner-recorded.test.ts index df6a9b68733..c56d47d0210 100644 --- a/packages/core/test/session-runner-recorded.test.ts +++ b/packages/core/test/session-runner-recorded.test.ts @@ -196,7 +196,7 @@ describe("SessionRunnerLLM recorded", () => { session: { hook: (...registration: SessionHookRegistration) => { if (registration[0] === "http") return Effect.die("unused session HTTP hook") - return hooks.register("session", "context", registration[1]) + return hooks.register("session", ...registration) }, }, }) @@ -302,7 +302,7 @@ describe("SessionModelRequest HTTP bridge", () => { catalog: catalogHost(catalog), session: { hook: (...registration: SessionHookRegistration) => { - if (registration[0] === "context") return hooks.register("session", "context", registration[1]) + if (registration[0] !== "http") return hooks.register("session", ...registration) const middleware = registration[1] return hooks.register("session", "http", (event) => Effect.sync(() => { diff --git a/packages/core/test/session-runner.test.ts b/packages/core/test/session-runner.test.ts index 76f820517ec..a10611e80b5 100644 --- a/packages/core/test/session-runner.test.ts +++ b/packages/core/test/session-runner.test.ts @@ -478,7 +478,7 @@ const setup = Effect.gen(function* () { session: { hook: (...registration: SessionHookRegistration) => { if (registration[0] === "http") return Effect.die("unused session HTTP hook") - return hooks.register("session", "context", registration[1]) + return hooks.register("session", ...registration) }, }, }) diff --git a/packages/plugin/src/effect/session.ts b/packages/plugin/src/effect/session.ts index ad25d27cc5f..b9e0b42e2fb 100644 --- a/packages/plugin/src/effect/session.ts +++ b/packages/plugin/src/effect/session.ts @@ -32,15 +32,16 @@ export interface SessionHooks { } export type SessionHookRegistration = - | [name: "context", callback: (event: SessionContext) => Effect.Effect] + | { + [Name in keyof SessionHooks]: [name: Name, callback: (event: SessionHooks[Name]) => Effect.Effect] + }[keyof SessionHooks] | [name: "http", middleware: SessionHttpMiddleware] export interface SessionHook { - (name: "context", callback: (event: SessionContext) => Effect.Effect): Effect.Effect< - Registration, - never, - Scope.Scope - > + ( + name: Name, + callback: (event: SessionHooks[Name]) => Effect.Effect, + ): Effect.Effect (name: "http", middleware: SessionHttpMiddleware): Effect.Effect } diff --git a/packages/plugin/src/promise/session.ts b/packages/plugin/src/promise/session.ts index 5f074106d66..66d59c58d30 100644 --- a/packages/plugin/src/promise/session.ts +++ b/packages/plugin/src/promise/session.ts @@ -32,11 +32,16 @@ export interface SessionHooks { } export type SessionHookRegistration = - | [name: "context", callback: (event: SessionContext) => Promise | void] + | { + [Name in keyof SessionHooks]: [name: Name, callback: (event: SessionHooks[Name]) => Promise | void] + }[keyof SessionHooks] | [name: "http", middleware: SessionHttpMiddleware] export interface SessionHook { - (name: "context", callback: (event: SessionContext) => Promise | void): Promise + ( + name: Name, + callback: (event: SessionHooks[Name]) => Promise | void, + ): Promise (name: "http", middleware: SessionHttpMiddleware): Promise }