mirror of
https://github.com/anomalyco/opencode.git
synced 2026-06-01 19:05:38 +00:00
effect: move tool flags into RuntimeFlags (#27198)
This commit is contained in:
@@ -1,9 +1,28 @@
|
|||||||
import { Config, ConfigProvider, Context, Effect, Layer } from "effect"
|
import { Config, ConfigProvider, Context, Effect, Layer } from "effect"
|
||||||
import { ConfigService } from "@/effect/config-service"
|
import { ConfigService } from "@/effect/config-service"
|
||||||
|
|
||||||
|
const bool = (name: string) => Config.boolean(name).pipe(Config.withDefault(false))
|
||||||
|
const experimental = bool("OPENCODE_EXPERIMENTAL")
|
||||||
|
const enabledByExperimental = (name: string) =>
|
||||||
|
Config.all({ experimental, enabled: bool(name) }).pipe(Config.map((flags) => flags.experimental || flags.enabled))
|
||||||
|
|
||||||
export class Service extends ConfigService.Service<Service>()("@opencode/RuntimeFlags", {
|
export class Service extends ConfigService.Service<Service>()("@opencode/RuntimeFlags", {
|
||||||
pure: Config.boolean("OPENCODE_PURE").pipe(Config.withDefault(false)),
|
pure: bool("OPENCODE_PURE"),
|
||||||
disableDefaultPlugins: Config.boolean("OPENCODE_DISABLE_DEFAULT_PLUGINS").pipe(Config.withDefault(false)),
|
disableDefaultPlugins: bool("OPENCODE_DISABLE_DEFAULT_PLUGINS"),
|
||||||
|
enableExa: Config.all({
|
||||||
|
experimental,
|
||||||
|
enabled: bool("OPENCODE_ENABLE_EXA"),
|
||||||
|
legacy: bool("OPENCODE_EXPERIMENTAL_EXA"),
|
||||||
|
}).pipe(Config.map((flags) => flags.experimental || flags.enabled || flags.legacy)),
|
||||||
|
enableParallel: Config.all({
|
||||||
|
enabled: bool("OPENCODE_ENABLE_PARALLEL"),
|
||||||
|
legacy: bool("OPENCODE_EXPERIMENTAL_PARALLEL"),
|
||||||
|
}).pipe(Config.map((flags) => flags.enabled || flags.legacy)),
|
||||||
|
enableQuestionTool: bool("OPENCODE_ENABLE_QUESTION_TOOL"),
|
||||||
|
experimentalScout: enabledByExperimental("OPENCODE_EXPERIMENTAL_SCOUT"),
|
||||||
|
experimentalLspTool: enabledByExperimental("OPENCODE_EXPERIMENTAL_LSP_TOOL"),
|
||||||
|
experimentalPlanMode: enabledByExperimental("OPENCODE_EXPERIMENTAL_PLAN_MODE"),
|
||||||
|
client: Config.string("OPENCODE_CLIENT").pipe(Config.withDefault("cli")),
|
||||||
}) {}
|
}) {}
|
||||||
|
|
||||||
export type Info = Context.Service.Shape<typeof Service>
|
export type Info = Context.Service.Shape<typeof Service>
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import { ProviderID, type ModelID } from "../provider/schema"
|
|||||||
import { WebSearchTool } from "./websearch"
|
import { WebSearchTool } from "./websearch"
|
||||||
import { RepoCloneTool } from "./repo_clone"
|
import { RepoCloneTool } from "./repo_clone"
|
||||||
import { RepoOverviewTool } from "./repo_overview"
|
import { RepoOverviewTool } from "./repo_overview"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
||||||
import * as Log from "@opencode-ai/core/util/log"
|
import * as Log from "@opencode-ai/core/util/log"
|
||||||
import { LspTool } from "./lsp"
|
import { LspTool } from "./lsp"
|
||||||
import * as Truncate from "./truncate"
|
import * as Truncate from "./truncate"
|
||||||
@@ -50,13 +49,11 @@ import { Git } from "@/git"
|
|||||||
import { Skill } from "../skill"
|
import { Skill } from "../skill"
|
||||||
import { Permission } from "@/permission"
|
import { Permission } from "@/permission"
|
||||||
import { Reference } from "@/reference/reference"
|
import { Reference } from "@/reference/reference"
|
||||||
|
import { RuntimeFlags } from "@/effect/runtime-flags"
|
||||||
|
|
||||||
const log = Log.create({ service: "tool.registry" })
|
const log = Log.create({ service: "tool.registry" })
|
||||||
|
|
||||||
export function webSearchEnabled(
|
export function webSearchEnabled(providerID: ProviderID, flags = { exa: false, parallel: false }) {
|
||||||
providerID: ProviderID,
|
|
||||||
flags = { exa: Flag.OPENCODE_ENABLE_EXA, parallel: Flag.OPENCODE_ENABLE_PARALLEL },
|
|
||||||
) {
|
|
||||||
return providerID === ProviderID.opencode || flags.exa || flags.parallel
|
return providerID === ProviderID.opencode || flags.exa || flags.parallel
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,6 +98,7 @@ export const layer: Layer.Layer<
|
|||||||
| Ripgrep.Service
|
| Ripgrep.Service
|
||||||
| Format.Service
|
| Format.Service
|
||||||
| Truncate.Service
|
| Truncate.Service
|
||||||
|
| RuntimeFlags.Service
|
||||||
> = Layer.effect(
|
> = Layer.effect(
|
||||||
Service,
|
Service,
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
@@ -109,6 +107,7 @@ export const layer: Layer.Layer<
|
|||||||
const agents = yield* Agent.Service
|
const agents = yield* Agent.Service
|
||||||
const skill = yield* Skill.Service
|
const skill = yield* Skill.Service
|
||||||
const truncate = yield* Truncate.Service
|
const truncate = yield* Truncate.Service
|
||||||
|
const flags = yield* RuntimeFlags.Service
|
||||||
|
|
||||||
const invalid = yield* InvalidTool
|
const invalid = yield* InvalidTool
|
||||||
const task = yield* TaskTool
|
const task = yield* TaskTool
|
||||||
@@ -209,8 +208,7 @@ export const layer: Layer.Layer<
|
|||||||
}
|
}
|
||||||
|
|
||||||
yield* config.get()
|
yield* config.get()
|
||||||
const questionEnabled =
|
const questionEnabled = ["app", "cli", "desktop"].includes(flags.client) || flags.enableQuestionTool
|
||||||
["app", "cli", "desktop"].includes(Flag.OPENCODE_CLIENT) || Flag.OPENCODE_ENABLE_QUESTION_TOOL
|
|
||||||
|
|
||||||
const tool = yield* Effect.all({
|
const tool = yield* Effect.all({
|
||||||
invalid: Tool.init(invalid),
|
invalid: Tool.init(invalid),
|
||||||
@@ -248,11 +246,11 @@ export const layer: Layer.Layer<
|
|||||||
tool.fetch,
|
tool.fetch,
|
||||||
tool.todo,
|
tool.todo,
|
||||||
tool.search,
|
tool.search,
|
||||||
...(Flag.OPENCODE_EXPERIMENTAL_SCOUT ? [tool.repo_clone, tool.repo_overview] : []),
|
...(flags.experimentalScout ? [tool.repo_clone, tool.repo_overview] : []),
|
||||||
tool.skill,
|
tool.skill,
|
||||||
tool.patch,
|
tool.patch,
|
||||||
...(Flag.OPENCODE_EXPERIMENTAL_LSP_TOOL ? [tool.lsp] : []),
|
...(flags.experimentalLspTool ? [tool.lsp] : []),
|
||||||
...(Flag.OPENCODE_EXPERIMENTAL_PLAN_MODE && Flag.OPENCODE_CLIENT === "cli" ? [tool.plan] : []),
|
...(flags.experimentalPlanMode && flags.client === "cli" ? [tool.plan] : []),
|
||||||
],
|
],
|
||||||
task: tool.task,
|
task: tool.task,
|
||||||
read: tool.read,
|
read: tool.read,
|
||||||
@@ -306,7 +304,7 @@ export const layer: Layer.Layer<
|
|||||||
const tools: Interface["tools"] = Effect.fn("ToolRegistry.tools")(function* (input) {
|
const tools: Interface["tools"] = Effect.fn("ToolRegistry.tools")(function* (input) {
|
||||||
const filtered = (yield* all()).filter((tool) => {
|
const filtered = (yield* all()).filter((tool) => {
|
||||||
if (tool.id === WebSearchTool.id) {
|
if (tool.id === WebSearchTool.id) {
|
||||||
return webSearchEnabled(input.providerID)
|
return webSearchEnabled(input.providerID, { exa: flags.enableExa, parallel: flags.enableParallel })
|
||||||
}
|
}
|
||||||
|
|
||||||
const usePatch =
|
const usePatch =
|
||||||
@@ -380,6 +378,7 @@ export const defaultLayer = Layer.suspend(() =>
|
|||||||
Layer.provide(CrossSpawnSpawner.defaultLayer),
|
Layer.provide(CrossSpawnSpawner.defaultLayer),
|
||||||
Layer.provide(Ripgrep.defaultLayer),
|
Layer.provide(Ripgrep.defaultLayer),
|
||||||
Layer.provide(Truncate.defaultLayer),
|
Layer.provide(Truncate.defaultLayer),
|
||||||
|
Layer.provide(RuntimeFlags.defaultLayer),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ import { HttpClient } from "effect/unstable/http"
|
|||||||
import * as Tool from "./tool"
|
import * as Tool from "./tool"
|
||||||
import * as McpWebSearch from "./mcp-websearch"
|
import * as McpWebSearch from "./mcp-websearch"
|
||||||
import DESCRIPTION from "./websearch.txt"
|
import DESCRIPTION from "./websearch.txt"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
||||||
import { checksum } from "@opencode-ai/core/util/encode"
|
import { checksum } from "@opencode-ai/core/util/encode"
|
||||||
import { InstallationVersion } from "@opencode-ai/core/installation/version"
|
import { InstallationVersion } from "@opencode-ai/core/installation/version"
|
||||||
|
import { RuntimeFlags } from "@/effect/runtime-flags"
|
||||||
|
|
||||||
export const Parameters = Schema.Struct({
|
export const Parameters = Schema.Struct({
|
||||||
query: Schema.String.annotate({ description: "Websearch query" }),
|
query: Schema.String.annotate({ description: "Websearch query" }),
|
||||||
@@ -27,10 +27,7 @@ export const Parameters = Schema.Struct({
|
|||||||
const WebSearchProviderSchema = Schema.Literals(["exa", "parallel"])
|
const WebSearchProviderSchema = Schema.Literals(["exa", "parallel"])
|
||||||
export type WebSearchProvider = Schema.Schema.Type<typeof WebSearchProviderSchema>
|
export type WebSearchProvider = Schema.Schema.Type<typeof WebSearchProviderSchema>
|
||||||
|
|
||||||
export function selectWebSearchProvider(
|
export function selectWebSearchProvider(sessionID: string, flags = { exa: false, parallel: false }): WebSearchProvider {
|
||||||
sessionID: string,
|
|
||||||
flags = { exa: Flag.OPENCODE_ENABLE_EXA, parallel: Flag.OPENCODE_ENABLE_PARALLEL },
|
|
||||||
): WebSearchProvider {
|
|
||||||
const override = process.env.OPENCODE_WEBSEARCH_PROVIDER
|
const override = process.env.OPENCODE_WEBSEARCH_PROVIDER
|
||||||
if (override === "exa" || override === "parallel") return override
|
if (override === "exa" || override === "parallel") return override
|
||||||
if (flags.parallel) return "parallel"
|
if (flags.parallel) return "parallel"
|
||||||
@@ -103,6 +100,7 @@ export const WebSearchTool = Tool.define(
|
|||||||
"websearch",
|
"websearch",
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const http = yield* HttpClient.HttpClient
|
const http = yield* HttpClient.HttpClient
|
||||||
|
const flags = yield* RuntimeFlags.Service
|
||||||
|
|
||||||
return {
|
return {
|
||||||
get description() {
|
get description() {
|
||||||
@@ -111,7 +109,10 @@ export const WebSearchTool = Tool.define(
|
|||||||
parameters: Parameters,
|
parameters: Parameters,
|
||||||
execute: (params: Schema.Schema.Type<typeof Parameters>, ctx: Tool.Context) =>
|
execute: (params: Schema.Schema.Type<typeof Parameters>, ctx: Tool.Context) =>
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const provider = selectWebSearchProvider(ctx.sessionID)
|
const provider = selectWebSearchProvider(ctx.sessionID, {
|
||||||
|
exa: flags.enableExa,
|
||||||
|
parallel: flags.enableParallel,
|
||||||
|
})
|
||||||
const title = webSearchProviderLabel(provider)
|
const title = webSearchProviderLabel(provider)
|
||||||
yield* ctx.metadata({ title: `${title} "${params.query}"`, metadata: { provider } })
|
yield* ctx.metadata({ title: `${title} "${params.query}"`, metadata: { provider } })
|
||||||
|
|
||||||
|
|||||||
@@ -16,12 +16,24 @@ describe("RuntimeFlags", () => {
|
|||||||
fromConfig({
|
fromConfig({
|
||||||
OPENCODE_PURE: "true",
|
OPENCODE_PURE: "true",
|
||||||
OPENCODE_DISABLE_DEFAULT_PLUGINS: "true",
|
OPENCODE_DISABLE_DEFAULT_PLUGINS: "true",
|
||||||
|
OPENCODE_EXPERIMENTAL: "true",
|
||||||
|
OPENCODE_ENABLE_EXA: "true",
|
||||||
|
OPENCODE_ENABLE_PARALLEL: "true",
|
||||||
|
OPENCODE_ENABLE_QUESTION_TOOL: "true",
|
||||||
|
OPENCODE_CLIENT: "desktop",
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
expect(flags.pure).toBe(true)
|
expect(flags.pure).toBe(true)
|
||||||
expect(flags.disableDefaultPlugins).toBe(true)
|
expect(flags.disableDefaultPlugins).toBe(true)
|
||||||
|
expect(flags.enableExa).toBe(true)
|
||||||
|
expect(flags.enableParallel).toBe(true)
|
||||||
|
expect(flags.enableQuestionTool).toBe(true)
|
||||||
|
expect(flags.experimentalScout).toBe(true)
|
||||||
|
expect(flags.experimentalLspTool).toBe(true)
|
||||||
|
expect(flags.experimentalPlanMode).toBe(true)
|
||||||
|
expect(flags.client).toBe("desktop")
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -31,6 +43,8 @@ describe("RuntimeFlags", () => {
|
|||||||
|
|
||||||
expect(flags.pure).toBe(false)
|
expect(flags.pure).toBe(false)
|
||||||
expect(flags.disableDefaultPlugins).toBe(true)
|
expect(flags.disableDefaultPlugins).toBe(true)
|
||||||
|
expect(flags.enableExa).toBe(false)
|
||||||
|
expect(flags.client).toBe("cli")
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -43,6 +57,9 @@ describe("RuntimeFlags", () => {
|
|||||||
ConfigProvider.fromUnknown({
|
ConfigProvider.fromUnknown({
|
||||||
OPENCODE_PURE: "true",
|
OPENCODE_PURE: "true",
|
||||||
OPENCODE_DISABLE_DEFAULT_PLUGINS: "true",
|
OPENCODE_DISABLE_DEFAULT_PLUGINS: "true",
|
||||||
|
OPENCODE_EXPERIMENTAL: "true",
|
||||||
|
OPENCODE_ENABLE_EXA: "true",
|
||||||
|
OPENCODE_CLIENT: "desktop",
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -50,6 +67,8 @@ describe("RuntimeFlags", () => {
|
|||||||
|
|
||||||
expect(flags.pure).toBe(false)
|
expect(flags.pure).toBe(false)
|
||||||
expect(flags.disableDefaultPlugins).toBe(false)
|
expect(flags.disableDefaultPlugins).toBe(false)
|
||||||
|
expect(flags.enableExa).toBe(false)
|
||||||
|
expect(flags.client).toBe("cli")
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ import { provideTmpdirInstance, provideTmpdirServer } from "../fixture/fixture"
|
|||||||
import { testEffect } from "../lib/effect"
|
import { testEffect } from "../lib/effect"
|
||||||
import { reply, TestLLMServer } from "../lib/llm-server"
|
import { reply, TestLLMServer } from "../lib/llm-server"
|
||||||
import { SyncEvent } from "@/sync"
|
import { SyncEvent } from "@/sync"
|
||||||
|
import { RuntimeFlags } from "@/effect/runtime-flags"
|
||||||
|
|
||||||
void Log.init({ print: false })
|
void Log.init({ print: false })
|
||||||
|
|
||||||
@@ -188,6 +189,7 @@ function makeHttp() {
|
|||||||
Layer.provide(Reference.defaultLayer),
|
Layer.provide(Reference.defaultLayer),
|
||||||
Layer.provide(Ripgrep.defaultLayer),
|
Layer.provide(Ripgrep.defaultLayer),
|
||||||
Layer.provide(Format.defaultLayer),
|
Layer.provide(Format.defaultLayer),
|
||||||
|
Layer.provide(RuntimeFlags.layer()),
|
||||||
Layer.provideMerge(todo),
|
Layer.provideMerge(todo),
|
||||||
Layer.provideMerge(question),
|
Layer.provideMerge(question),
|
||||||
Layer.provideMerge(deps),
|
Layer.provideMerge(deps),
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ import { Ripgrep } from "../../src/file/ripgrep"
|
|||||||
import { Format } from "../../src/format"
|
import { Format } from "../../src/format"
|
||||||
import { Reference } from "../../src/reference/reference"
|
import { Reference } from "../../src/reference/reference"
|
||||||
import { SyncEvent } from "@/sync"
|
import { SyncEvent } from "@/sync"
|
||||||
|
import { RuntimeFlags } from "@/effect/runtime-flags"
|
||||||
|
|
||||||
void Log.init({ print: false })
|
void Log.init({ print: false })
|
||||||
|
|
||||||
@@ -137,6 +138,7 @@ function makeHttp() {
|
|||||||
Layer.provide(Reference.defaultLayer),
|
Layer.provide(Reference.defaultLayer),
|
||||||
Layer.provide(Ripgrep.defaultLayer),
|
Layer.provide(Ripgrep.defaultLayer),
|
||||||
Layer.provide(Format.defaultLayer),
|
Layer.provide(Format.defaultLayer),
|
||||||
|
Layer.provide(RuntimeFlags.layer()),
|
||||||
Layer.provideMerge(todo),
|
Layer.provideMerge(todo),
|
||||||
Layer.provideMerge(question),
|
Layer.provideMerge(question),
|
||||||
Layer.provideMerge(deps),
|
Layer.provideMerge(deps),
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import { Effect, Layer, Result, Schema } from "effect"
|
|||||||
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
|
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
|
||||||
import { ToolRegistry } from "@/tool/registry"
|
import { ToolRegistry } from "@/tool/registry"
|
||||||
import { Tool } from "@/tool/tool"
|
import { Tool } from "@/tool/tool"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
||||||
import { disposeAllInstances, TestInstance } from "../fixture/fixture"
|
import { disposeAllInstances, TestInstance } from "../fixture/fixture"
|
||||||
import { testEffect } from "../lib/effect"
|
import { testEffect } from "../lib/effect"
|
||||||
import { TestConfig } from "../fixture/config"
|
import { TestConfig } from "../fixture/config"
|
||||||
@@ -31,46 +30,47 @@ import { Reference } from "@/reference/reference"
|
|||||||
import { ProviderID, ModelID } from "@/provider/schema"
|
import { ProviderID, ModelID } from "@/provider/schema"
|
||||||
import { ToolJsonSchema } from "@/tool/json-schema"
|
import { ToolJsonSchema } from "@/tool/json-schema"
|
||||||
import { MessageID, SessionID } from "@/session/schema"
|
import { MessageID, SessionID } from "@/session/schema"
|
||||||
|
import { RuntimeFlags } from "@/effect/runtime-flags"
|
||||||
|
|
||||||
const node = CrossSpawnSpawner.defaultLayer
|
const node = CrossSpawnSpawner.defaultLayer
|
||||||
const originalExperimentalScout = Flag.OPENCODE_EXPERIMENTAL_SCOUT
|
|
||||||
const configLayer = TestConfig.layer({
|
const configLayer = TestConfig.layer({
|
||||||
directories: () => InstanceState.directory.pipe(Effect.map((dir) => [path.join(dir, ".opencode")])),
|
directories: () => InstanceState.directory.pipe(Effect.map((dir) => [path.join(dir, ".opencode")])),
|
||||||
})
|
})
|
||||||
|
|
||||||
const registryLayer = ToolRegistry.layer.pipe(
|
const registryLayer = (flags: Partial<RuntimeFlags.Info> = {}) =>
|
||||||
Layer.provide(configLayer),
|
ToolRegistry.layer.pipe(
|
||||||
Layer.provide(Plugin.defaultLayer),
|
Layer.provide(configLayer),
|
||||||
Layer.provide(Question.defaultLayer),
|
Layer.provide(Plugin.defaultLayer),
|
||||||
Layer.provide(Todo.defaultLayer),
|
Layer.provide(Question.defaultLayer),
|
||||||
Layer.provide(Skill.defaultLayer),
|
Layer.provide(Todo.defaultLayer),
|
||||||
Layer.provide(Agent.defaultLayer),
|
Layer.provide(Skill.defaultLayer),
|
||||||
Layer.provide(Session.defaultLayer),
|
Layer.provide(Agent.defaultLayer),
|
||||||
Layer.provide(Provider.defaultLayer),
|
Layer.provide(Session.defaultLayer),
|
||||||
Layer.provide(Git.defaultLayer),
|
Layer.provide(Provider.defaultLayer),
|
||||||
Layer.provide(Reference.defaultLayer),
|
Layer.provide(Git.defaultLayer),
|
||||||
Layer.provide(LSP.defaultLayer),
|
Layer.provide(Reference.defaultLayer),
|
||||||
Layer.provide(Instruction.defaultLayer),
|
Layer.provide(LSP.defaultLayer),
|
||||||
Layer.provide(AppFileSystem.defaultLayer),
|
Layer.provide(Instruction.defaultLayer),
|
||||||
Layer.provide(Bus.layer),
|
Layer.provide(AppFileSystem.defaultLayer),
|
||||||
Layer.provide(FetchHttpClient.layer),
|
Layer.provide(Bus.layer),
|
||||||
Layer.provide(Format.defaultLayer),
|
Layer.provide(FetchHttpClient.layer),
|
||||||
Layer.provide(node),
|
Layer.provide(Format.defaultLayer),
|
||||||
Layer.provide(Ripgrep.defaultLayer),
|
Layer.provide(node),
|
||||||
Layer.provide(Truncate.defaultLayer),
|
Layer.provide(Ripgrep.defaultLayer),
|
||||||
)
|
Layer.provide(Truncate.defaultLayer),
|
||||||
|
Layer.provide(RuntimeFlags.layer(flags)),
|
||||||
|
)
|
||||||
|
|
||||||
const it = testEffect(Layer.mergeAll(registryLayer, node, Agent.defaultLayer))
|
const it = testEffect(Layer.mergeAll(registryLayer(), node, Agent.defaultLayer))
|
||||||
|
const scout = testEffect(Layer.mergeAll(registryLayer({ experimentalScout: true }), node, Agent.defaultLayer))
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
Flag.OPENCODE_EXPERIMENTAL_SCOUT = originalExperimentalScout
|
|
||||||
await disposeAllInstances()
|
await disposeAllInstances()
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("tool.registry", () => {
|
describe("tool.registry", () => {
|
||||||
it.instance("hides repo research tools unless experimental", () =>
|
it.instance("hides repo research tools unless experimental", () =>
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
Flag.OPENCODE_EXPERIMENTAL_SCOUT = false
|
|
||||||
const registry = yield* ToolRegistry.Service
|
const registry = yield* ToolRegistry.Service
|
||||||
const ids = yield* registry.ids()
|
const ids = yield* registry.ids()
|
||||||
|
|
||||||
@@ -79,9 +79,8 @@ describe("tool.registry", () => {
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
it.instance("shows repo research tools when experimental scout is enabled", () =>
|
scout.instance("shows repo research tools when experimental scout is enabled", () =>
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
Flag.OPENCODE_EXPERIMENTAL_SCOUT = true
|
|
||||||
const registry = yield* ToolRegistry.Service
|
const registry = yield* ToolRegistry.Service
|
||||||
const ids = yield* registry.ids()
|
const ids = yield* registry.ids()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user