diff --git a/packages/e2e-tests/src/opencode2-runner/sha256-pins.json b/packages/e2e-tests/src/opencode2-runner/sha256-pins.json index 149d198424..75f8a0cdc5 100644 --- a/packages/e2e-tests/src/opencode2-runner/sha256-pins.json +++ b/packages/e2e-tests/src/opencode2-runner/sha256-pins.json @@ -3,7 +3,7 @@ "packages/e2e-tests/mutations/goldens-dg-1.json": "3460cfe3cfa31ef3a4576235ac24fba0b36d9372804fd941a9c7ab6d239b52af", "packages/e2e-tests/mutations/goldens-dg-2.json": "f8b7e04765f428b159fa21306fa6e70b7918a92309537b67af1a6cc6a5b69eda", "packages/e2e-tests/mutations/goldens-dg-3.json": "155c8ec37fb0be2d906a0000e2671d5e473106ae70b02b0cfb0d1ee8e28f7c41", - "packages/plugin/src/index.ts": "bbe50e7bcd9bd7d8ea12dfbbcc1ef6d08e7be045d45e19c4cb2cd2cfcc031211", + "packages/plugin/src/index.ts": "68ef7e0fb67c5d90270646b513105a1fc116e9646871c9bd9ca92f1974ae5555", "packages/plugin/src/v2/server.ts": "4f0054e8a5fe8628f84e309ecf306b3cde146882e69386117b1c522a3cc0c876", "packages/e2e-tests/src/opencode2-runner/host-rows.json": "1208c136df23a54de1fef24f3ea5c3155f16ed1c28fa3d7e5864aec4cdfbcc82", "packages/e2e-tests/src/opencode2-runner/payload-v1.json": "992fedba515632bccec56dab34a36f96d192a90ee06f1c33d68020bf7bb25091", diff --git a/packages/plugin/src/hooks/auto-update-checker/index.test.ts b/packages/plugin/src/hooks/auto-update-checker/index.test.ts index 1dd0626ee8..724c89ddfe 100644 --- a/packages/plugin/src/hooks/auto-update-checker/index.test.ts +++ b/packages/plugin/src/hooks/auto-update-checker/index.test.ts @@ -187,6 +187,44 @@ describe("auto-update-checker/index", () => { // Even after waiting longer than initDelayMs would be, no check fires await new Promise((r) => setTimeout(r, 50)); expect(showToast).not.toHaveBeenCalled(); + expect(checkerMocks.getLatestVersion).not.toHaveBeenCalled(); + }); + + test("auto_update: false makes no npm request (#854)", async () => { + checkerMocks.findPluginEntry.mockImplementation(() => ({ + entry: "@cortexkit/opencode-magic-context", + pinnedVersion: null, + isPinned: false, + configPath: "/config/opencode.jsonc", + })); + checkerMocks.getCachedVersion.mockImplementation(() => "0.15.5"); + checkerMocks.getLatestVersion.mockImplementation(async () => "0.15.6"); + const { autoUpdateCheckerOptionsFromConfig, createAutoUpdateCheckerHook } = + await freshIndexImport(); + const { ctx, showToast } = createCtx(); + + createAutoUpdateCheckerHook(ctx as Parameters[0], { + ...autoUpdateCheckerOptionsFromConfig(false), + showStartupToast: false, + initDelayMs: 0, + storageDir: makeTempStorageDir(), + }); + + await new Promise((r) => setTimeout(r, 50)); + expect(checkerMocks.getLatestVersion).not.toHaveBeenCalled(); + expect(showToast).not.toHaveBeenCalled(); + }); + + test("auto_update unset or true keeps the check enabled", async () => { + const { autoUpdateCheckerOptionsFromConfig } = await freshIndexImport(); + expect(autoUpdateCheckerOptionsFromConfig(undefined)).toEqual({ + enabled: true, + autoUpdate: true, + }); + expect(autoUpdateCheckerOptionsFromConfig(true)).toEqual({ + enabled: true, + autoUpdate: true, + }); }); test("on-disk timestamp dedupes concurrent plugin instances", async () => { diff --git a/packages/plugin/src/hooks/auto-update-checker/index.ts b/packages/plugin/src/hooks/auto-update-checker/index.ts index 67e4b04113..1943657b6e 100644 --- a/packages/plugin/src/hooks/auto-update-checker/index.ts +++ b/packages/plugin/src/hooks/auto-update-checker/index.ts @@ -46,6 +46,18 @@ function warn(message: string): void { log(`WARN: ${message}`); } +/** + * Maps the plugin's `auto_update` setting to checker options. `false` turns + * the checker off entirely so no npm request is made, matching the host + * updater's disable behavior. + */ +export function autoUpdateCheckerOptionsFromConfig( + autoUpdateSetting: boolean | undefined, +): Pick { + const enabled = autoUpdateSetting !== false; + return { enabled, autoUpdate: enabled }; +} + /** * Auto-update checker. * diff --git a/packages/plugin/src/index.ts b/packages/plugin/src/index.ts index 783525558a..eb4c573366 100644 --- a/packages/plugin/src/index.ts +++ b/packages/plugin/src/index.ts @@ -38,7 +38,10 @@ import { } from "./features/magic-context/storage-db"; import { recordToolDefinition } from "./features/magic-context/tool-definition-tokens"; import { runDeferredV22Backfill } from "./features/magic-context/v22-deferred-backfill"; -import { createAutoUpdateCheckerHook } from "./hooks/auto-update-checker"; +import { + autoUpdateCheckerOptionsFromConfig, + createAutoUpdateCheckerHook, +} from "./hooks/auto-update-checker"; import { COMPARTMENT_AGENT_SYSTEM_PROMPT, COMPARTMENT_STRUCTURAL_SYSTEM_PROMPT, @@ -881,7 +884,8 @@ const server: Plugin = async (ctx) => { }, }, autoUpdateChecker: createAutoUpdateCheckerHook(ctx, { - autoUpdate: pluginConfig.auto_update !== false, + // auto_update: false skips the checker entirely: no npm request. + ...autoUpdateCheckerOptionsFromConfig(pluginConfig.auto_update), signal: autoUpdateAbort.signal, // Multi-project plugin reloads coordinate via this on-disk // timestamp so npm gets hit at most once per check window