plugin-hooks.test.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { describe, expect } from "bun:test"
  2. import { Message, SystemPart } from "@opencode-ai/ai"
  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. import { testEffect } from "./lib/effect"
  10. const layer = PluginHooks.node.implementation as Layer.Layer<PluginHooks.Service>
  11. const it = testEffect(layer)
  12. describe("PluginHooks", () => {
  13. it.effect("registers scoped session hooks and triggers them sequentially", () =>
  14. Effect.gen(function* () {
  15. const hooks = yield* PluginHooks.Service
  16. const seen: string[] = []
  17. yield* hooks.register("session", "context", (event) =>
  18. Effect.sync(() => {
  19. seen.push("first")
  20. event.system.push(SystemPart.make("second"))
  21. }),
  22. )
  23. yield* hooks.register("session", "context", (event) =>
  24. Effect.sync(() => {
  25. seen.push(event.system[1]?.text ?? "missing")
  26. event.messages = [Message.user("changed")]
  27. }),
  28. )
  29. const event = {
  30. sessionID: Session.ID.make("ses_hooks"),
  31. agent: Agent.ID.make("build"),
  32. model: Model.Ref.make({ providerID: Provider.ID.make("test"), id: Model.ID.make("model") }),
  33. system: [SystemPart.make("first")],
  34. messages: [Message.user("original")],
  35. tools: {},
  36. }
  37. expect(yield* hooks.trigger("session", "context", event)).toBe(event)
  38. expect(seen).toEqual(["first", "second"])
  39. expect(event.messages).toEqual([Message.user("changed")])
  40. }),
  41. )
  42. })