From f1fd6ba3c0bfc2330778f01da836d96fa526a7f1 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Fri, 28 Aug 2026 13:14:41 -0400 Subject: [PATCH] test(core): await registry readiness barriers (#45630) --- packages/core/test/location-layer.test.ts | 22 +++------------- packages/core/test/mcp.test.ts | 31 +++++++++++++++++------ 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/packages/core/test/location-layer.test.ts b/packages/core/test/location-layer.test.ts index 2542604f3ab..78414570af0 100644 --- a/packages/core/test/location-layer.test.ts +++ b/packages/core/test/location-layer.test.ts @@ -42,7 +42,7 @@ import { SessionRunnerModel } from "@opencode-ai/core/session/runner/model" import { tmpdir } from "./fixture/tmpdir" import { tempGlobalLayer } from "./fixture/global" import { testEffect } from "./lib/effect" -import { toolDefinitions, waitForTool } from "./lib/tool" +import { toolDefinitions } from "./lib/tool" import { Database } from "../src/database/database" import { Bus } from "../src/bus" import { Reference } from "../src/reference" @@ -701,25 +701,9 @@ describe("LocationServiceMap", () => { yield* Reference.Service const catalog = yield* Catalog.Service yield* catalog.transform((editor) => editor.provider.update(providerID, () => {})) + const supervisor = yield* PluginSupervisor.Service + yield* supervisor.flush const registry = yield* Tool.Service - // Tool plugins register during the forked PluginSupervisor boot; wait for - // every expected tool rather than relying on batch ordering. - yield* Effect.forEach( - [ - "edit", - "glob", - "grep", - "question", - "read", - "shell", - "skill", - "subagent", - "webfetch", - "websearch", - "write", - ], - (name) => waitForTool(registry, name), - ) return { providers: yield* catalog.provider.all(), tools: yield* toolDefinitions(registry), diff --git a/packages/core/test/mcp.test.ts b/packages/core/test/mcp.test.ts index 31b72b2c476..959cc677473 100644 --- a/packages/core/test/mcp.test.ts +++ b/packages/core/test/mcp.test.ts @@ -44,7 +44,7 @@ import { testEffect } from "./lib/effect" import { imagePassthrough } from "./lib/image" import { location } from "./fixture/location" import { hostEnvironmentLayer, recordingEnvironmentLayer } from "./fixture/environment" -import { executeTool, toolDefinitions, toolIdentity, waitForCodeModeTool, waitForTool } from "./lib/tool" +import { executeTool, toolDefinitions, toolIdentity, waitForTool } from "./lib/tool" let assertion: Deferred.Deferred | undefined let decision: Effect.Effect = Effect.void @@ -1563,7 +1563,9 @@ testEffect(Layer.empty).effect("coalesces queued MCP tool notifications after in it.effect("advertises MCP output schemas to Code Mode", () => Effect.gen(function* () { const registry = yield* Tool.Service - const toolSet = yield* waitForCodeModeTool(registry, "demo.search") + const registration = yield* McpTool.Service + yield* registration.flush + const toolSet = yield* registry.snapshot() const execute = toolSet.definitions.find((tool) => tool.name === "execute") expect(toolSet.definitions.map((tool) => tool.name)).toEqual([ @@ -1582,7 +1584,11 @@ it.effect("returns content-only MCP results through Code Mode", () => assertion = yield* Deferred.make() decision = Effect.void const registry = yield* Tool.Service - const toolSet = yield* waitForCodeModeTool(registry, "demo.status") + const registration = yield* McpTool.Service + yield* registration.flush + const toolSet = yield* registry.snapshot() + + expect(toolSet.codeModeCatalog?.some((tool) => tool.path === "demo.status")).toBe(true) const execution = yield* toolSet.execute({ sessionID: Session.ID.make("ses_mcp_content_only"), @@ -1605,7 +1611,8 @@ it.effect("returns content-only MCP results through Code Mode", () => it.effect("advertises MCP tools directly when Code Mode is disabled for the server", () => Effect.gen(function* () { const registry = yield* Tool.Service - yield* waitForTool(registry, "direct_lookup") + const registration = yield* McpTool.Service + yield* registration.flush const definitions = yield* toolDefinitions(registry) const execute = definitions.find((tool) => tool.name === "execute") @@ -1621,7 +1628,8 @@ it.effect("fails the call when MCP reports isError", () => assertion = yield* Deferred.make() decision = Effect.void const registry = yield* Tool.Service - yield* waitForTool(registry, "direct_fail") + const registration = yield* McpTool.Service + yield* registration.flush const execution = yield* executeTool(registry, { sessionID: Session.ID.make("ses_mcp_is_error"), @@ -1639,7 +1647,8 @@ it.effect("preserves MCP text and media content for the model", () => assertion = yield* Deferred.make() decision = Effect.void const registry = yield* Tool.Service - yield* waitForTool(registry, "direct_media") + const registration = yield* McpTool.Service + yield* registration.flush const execution = yield* executeTool(registry, { sessionID: Session.ID.make("ses_mcp_media"), @@ -1662,7 +1671,10 @@ it.effect("waits for permission before calling an MCP tool", () => const permission = yield* Deferred.make() decision = Deferred.await(permission) const registry = yield* Tool.Service - const toolSet = yield* waitForCodeModeTool(registry, "demo.search") + const registration = yield* McpTool.Service + yield* registration.flush + const toolSet = yield* registry.snapshot() + expect(toolSet.codeModeCatalog?.some((tool) => tool.path === "demo.search")).toBe(true) const fiber = yield* toolSet .execute({ @@ -1703,7 +1715,10 @@ it.effect("does not call MCP when permission is blocked", () => assertion = yield* Deferred.make() decision = Effect.fail(new Permission.BlockedError({ rules: [], permission: "demo_search", resources: ["*"] })) const registry = yield* Tool.Service - const toolSet = yield* waitForCodeModeTool(registry, "demo.search") + const registration = yield* McpTool.Service + yield* registration.flush + const toolSet = yield* registry.snapshot() + expect(toolSet.codeModeCatalog?.some((tool) => tool.path === "demo.search")).toBe(true) const execution = yield* toolSet.execute({ sessionID: Session.ID.make("ses_mcp_blocked"),