plugin-hooks.test.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { describe, expect, it } from "bun:test"
  2. import { Message, SystemPart } from "@opencode-ai/llm"
  3. import { Agent } from "@opencode-ai/schema/agent"
  4. import { Model } from "@opencode-ai/schema/model"
  5. import { Provider } from "@opencode-ai/schema/provider"
  6. import { Session } from "@opencode-ai/schema/session"
  7. import { Effect, Layer } from "effect"
  8. import { PluginHooks } from "../src/plugin/hooks"
  9. describe("PluginHooks", () => {
  10. it("registers scoped domain hooks and triggers them sequentially", async () => {
  11. const seen: string[] = []
  12. const program = Effect.gen(function* () {
  13. const hooks = yield* PluginHooks.Service
  14. yield* hooks.register("session", "request", (event) =>
  15. Effect.sync(() => {
  16. seen.push("first")
  17. event.system.push(SystemPart.make("second"))
  18. }),
  19. )
  20. yield* hooks.register("session", "request", (event) =>
  21. Effect.sync(() => {
  22. seen.push(event.system[1]?.text ?? "missing")
  23. event.messages = [Message.user("changed")]
  24. }),
  25. )
  26. const event = {
  27. sessionID: Session.ID.make("ses_hooks"),
  28. agent: Agent.ID.make("build"),
  29. model: Model.Ref.make({ providerID: Provider.ID.make("test"), id: Model.ID.make("model") }),
  30. system: [SystemPart.make("first")],
  31. messages: [Message.user("original")],
  32. tools: {},
  33. }
  34. expect(yield* hooks.trigger("session", "request", event)).toBe(event)
  35. expect(seen).toEqual(["first", "second"])
  36. expect(event.messages).toEqual([Message.user("changed")])
  37. })
  38. await Effect.runPromise(
  39. Effect.scoped(program).pipe(
  40. Effect.provide(PluginHooks.node.implementation as Layer.Layer<PluginHooks.Service>),
  41. ),
  42. )
  43. })
  44. })