import { describe, expect } from "bun:test" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { Location } from "@opencode-ai/core/location" import { AbsolutePath } from "@opencode-ai/core/schema" import { Tool } from "@opencode-ai/core/tool" import { Effect, Schema } from "effect" import { it } from "./lib/effect" describe("CodeMode", () => { it.effect("owns registrations, execute, and catalog materialization", () => Effect.gen(function* () { const tools = yield* Tool.Service yield* tools.transform((draft) => draft.add({ name: "echo", description: "Echo text", input: Schema.Struct({ text: Schema.String }), output: Schema.String, execute: ({ text }) => Effect.succeed({ output: text }), }), ) const snapshot = yield* tools.snapshot() expect(snapshot.definitions.some((tool) => tool.name === "execute")).toBe(true) expect(snapshot.codeModeCatalog).toStrictEqual([ { path: "echo", description: "Echo text", signature: "tools.echo(input: {\n text: string,\n}): Promise", }, ]) }).pipe( Effect.scoped, Effect.provide( AppNodeBuilder.build(Tool.node, [ [Location.node, Location.boundNode({ directory: AbsolutePath.make("/project") })], ]), ), ), ) })