diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index fd57101d1b..691d6ef514 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -222,7 +222,7 @@ export const layer: Layer.Layer< tool.edit, tool.write, tool.task, - tool.taskstatus, + ...(Flag.OPENCODE_EXPERIMENTAL ? [tool.taskstatus] : []), tool.fetch, tool.todo, tool.search, diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts index 8bd01f88af..43c02107dd 100644 --- a/packages/opencode/src/tool/task.ts +++ b/packages/opencode/src/tool/task.ts @@ -11,6 +11,7 @@ import { TuiEvent } from "@/cli/cmd/tui/event" import { Cause, Effect, Option, Schema } from "effect" import { Config } from "@/config/config" import { BackgroundJob } from "@/background/job" +import { Flag } from "@opencode-ai/core/flag/flag" export interface TaskPromptOps { cancel(sessionID: SessionID): void @@ -159,6 +160,9 @@ export const TaskTool = Tool.define( providerID: msg.info.providerID, } const background = params.background === true + if (background && !Flag.OPENCODE_EXPERIMENTAL) { + return yield* Effect.fail(new Error("Background tasks require OPENCODE_EXPERIMENTAL=true")) + } const metadata = { sessionId: nextSession.id, diff --git a/packages/opencode/test/tool/task.test.ts b/packages/opencode/test/tool/task.test.ts index 6267d8b506..63ccc78bd1 100644 --- a/packages/opencode/test/tool/task.test.ts +++ b/packages/opencode/test/tool/task.test.ts @@ -15,10 +15,14 @@ import { TaskTool, type TaskPromptOps } from "../../src/tool/task" import { Truncate } from "@/tool/truncate" import { ToolRegistry } from "@/tool/registry" import { BackgroundJob } from "@/background/job" +import { Flag } from "@opencode-ai/core/flag/flag" import { provideTmpdirInstance } from "../fixture/fixture" import { testEffect } from "../lib/effect" +const originalExperimental = Flag.OPENCODE_EXPERIMENTAL + afterEach(async () => { + Flag.OPENCODE_EXPERIMENTAL = originalExperimental await Instance.disposeAll() }) @@ -442,6 +446,7 @@ describe("tool.task", () => { it.live("execute launches background tasks without waiting for completion", () => provideTmpdirInstance(() => Effect.gen(function* () { + Flag.OPENCODE_EXPERIMENTAL = true const sessions = yield* Session.Service const jobs = yield* BackgroundJob.Service const { chat, assistant } = yield* seed() @@ -485,6 +490,7 @@ describe("tool.task", () => { it.live("background tasks inject completion into the parent session and resume when idle", () => provideTmpdirInstance(() => Effect.gen(function* () { + Flag.OPENCODE_EXPERIMENTAL = true const sessions = yield* Session.Service const jobs = yield* BackgroundJob.Service const { chat, assistant } = yield* seed()