From 37ff501cc6a3e16682d7a398a68aa35157c9bc24 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Thu, 17 Sep 2026 12:47:49 -0400 Subject: [PATCH] fix(cli): keep updates client-owned (#49577) Co-authored-by: rekram1-node --- packages/cli/src/server-process.ts | 16 ---------------- packages/cli/src/services/updater.ts | 14 +------------- packages/cli/test/updater-poll.test.ts | 24 ------------------------ 3 files changed, 1 insertion(+), 53 deletions(-) delete mode 100644 packages/cli/test/updater-poll.test.ts diff --git a/packages/cli/src/server-process.ts b/packages/cli/src/server-process.ts index 409ced0ecee..efb3ebae509 100644 --- a/packages/cli/src/server-process.ts +++ b/packages/cli/src/server-process.ts @@ -13,7 +13,6 @@ import { HttpServer } from "effect/unstable/http" import { Env } from "./env" import { ServiceConfig } from "./services/service-config" import { ServiceRegistration } from "./services/service-registration" -import { Updater } from "./services/updater" import { WebUi } from "./services/web-ui" import { databasePath } from "./database-path" @@ -159,21 +158,6 @@ const processEffect = Effect.fnUntraced(function* (options: Options) { const url = HttpServer.formatAddress(server.address) console.log(options.mode === "stdio" ? JSON.stringify({ url }) : `server listening on ${url}`) if (foreground && !environmentPassword) console.log(`server password ${password}`) - yield* Updater.Service.pipe( - Effect.flatMap((updater) => - Updater.pollUpdates({ - check: updater.run().pipe( - Effect.flatMap((result) => { - if (!result) return Effect.void - if (result.type === "available") return server.updateAvailable(result.version) - return server.updated(result.version) - }), - ), - }), - ), - Effect.provide(Updater.layer), - Effect.forkScoped, - ) return yield* options.mode === "service" ? server.shutdown : options.mode === "stdio" diff --git a/packages/cli/src/services/updater.ts b/packages/cli/src/services/updater.ts index 0425be04f3e..530929c7e93 100644 --- a/packages/cli/src/services/updater.ts +++ b/packages/cli/src/services/updater.ts @@ -1,7 +1,7 @@ import { Global } from "@opencode/util/global" import { AppProcess } from "@opencode/util/process" import { OPENCODE_ARTIFACT, OPENCODE_CHANNEL, OPENCODE_LOCAL, OPENCODE_VERSION } from "../version" -import { Context, Duration, Effect, FileSystem, Layer, Ref, Schedule } from "effect" +import { Context, Duration, Effect, FileSystem, Layer, Ref } from "effect" import { ChildProcess } from "effect/unstable/process" import { parse, type ParseError } from "jsonc-parser" import path from "node:path" @@ -24,18 +24,6 @@ export interface Interface { | undefined } -export const pollUpdates = Effect.fnUntraced(function* (input: { - readonly check: Effect.Effect - readonly initialDelay?: Duration.Input - readonly interval?: Duration.Input -}) { - const interval = input.interval ?? "10 minutes" - return yield* input.check.pipe( - Effect.repeat(Schedule.spaced(interval)), - Effect.delay(input.initialDelay ?? "1 minute"), - ) -}) - export class Service extends Context.Service()("@opencode/cli/Updater") {} export function decodePolicy(text: string): Policy | undefined { diff --git a/packages/cli/test/updater-poll.test.ts b/packages/cli/test/updater-poll.test.ts deleted file mode 100644 index 640e32b0474..00000000000 --- a/packages/cli/test/updater-poll.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { expect } from "bun:test" -import { Effect, Layer, Queue } from "effect" -import { TestClock } from "effect/testing" -import { testEffect } from "../../core/test/lib/effect" -import { Updater } from "../src/services/updater" - -const it = testEffect(Layer.empty) - -it.effect("polls after 1 minute and every 10 minutes after that", () => - Effect.gen(function* () { - const checks = yield* Queue.unbounded() - yield* Updater.pollUpdates({ check: Queue.offer(checks, undefined).pipe(Effect.asVoid) }).pipe(Effect.forkScoped) - - yield* Effect.yieldNow - expect(yield* Queue.size(checks)).toBe(0) - yield* TestClock.adjust("59 seconds") - expect(yield* Queue.size(checks)).toBe(0) - yield* TestClock.adjust("1 second") - yield* Queue.take(checks) - yield* Effect.yieldNow - yield* TestClock.adjust("10 minutes") - yield* Queue.take(checks) - }), -)