Skip to content

Commit 5d4e2fa

Browse files
repparwcodex
andauthored
feat: allow disabling provider update checks (#3130)
Co-authored-by: codex <codex@users.noreply.github.com>
1 parent 3e01c4b commit 5d4e2fa

14 files changed

Lines changed: 239 additions & 57 deletions

apps/server/src/provider/Drivers/ClaudeDriver.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ import * as Effect from "effect/Effect";
2020
import * as FileSystem from "effect/FileSystem";
2121
import * as Path from "effect/Path";
2222
import * as Schema from "effect/Schema";
23-
import * as Stream from "effect/Stream";
2423
import { HttpClient } from "effect/unstable/http";
2524
import { ChildProcessSpawner } from "effect/unstable/process";
2625

2726
import { makeClaudeTextGeneration } from "../../textGeneration/ClaudeTextGeneration.ts";
2827
import { ServerConfig } from "../../config.ts";
28+
import { ServerSettingsService } from "../../serverSettings.ts";
2929
import { ProviderDriverError } from "../Errors.ts";
3030
import { makeClaudeAdapter } from "../Layers/ClaudeAdapter.ts";
3131
import {
@@ -48,6 +48,11 @@ import {
4848
normalizeCommandPath,
4949
resolveProviderMaintenanceCapabilitiesEffect,
5050
} from "../providerMaintenance.ts";
51+
import {
52+
haveProviderSnapshotSettingsChanged,
53+
makeProviderSnapshotSettingsSource,
54+
type ProviderSnapshotSettings,
55+
} from "../providerUpdateSettings.ts";
5156
import { makeClaudeCapabilitiesCacheKey, makeClaudeContinuationGroupKey } from "./ClaudeHome.ts";
5257
const decodeClaudeSettings = Schema.decodeSync(ClaudeSettings);
5358

@@ -83,7 +88,8 @@ export type ClaudeDriverEnv =
8388
| HttpClient.HttpClient
8489
| Path.Path
8590
| ProviderEventLoggers
86-
| ServerConfig;
91+
| ServerConfig
92+
| ServerSettingsService;
8793

8894
const withInstanceIdentity =
8995
(input: {
@@ -114,6 +120,7 @@ export const ClaudeDriver: ProviderDriver<ClaudeSettings, ClaudeDriverEnv> = {
114120
const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
115121
const path = yield* Path.Path;
116122
const httpClient = yield* HttpClient.HttpClient;
123+
const serverSettings = yield* ServerSettingsService;
117124
const eventLoggers = yield* ProviderEventLoggers;
118125
const processEnv = mergeProviderInstanceEnvironment(environment);
119126
const fallbackContinuationIdentity = defaultProviderContinuationIdentity({
@@ -163,16 +170,19 @@ export const ClaudeDriver: ProviderDriver<ClaudeSettings, ClaudeDriverEnv> = {
163170
Effect.provideService(Path.Path, path),
164171
);
165172

166-
const snapshot = yield* makeManagedServerProvider<ClaudeSettings>({
173+
const snapshotSettings = makeProviderSnapshotSettingsSource(effectiveConfig, serverSettings);
174+
const snapshot = yield* makeManagedServerProvider<ProviderSnapshotSettings<ClaudeSettings>>({
167175
maintenanceCapabilities,
168-
getSettings: Effect.succeed(effectiveConfig),
169-
streamSettings: Stream.never,
170-
haveSettingsChanged: () => false,
176+
getSettings: snapshotSettings.getSettings,
177+
streamSettings: snapshotSettings.streamSettings,
178+
haveSettingsChanged: haveProviderSnapshotSettingsChanged,
171179
initialSnapshot: (settings) =>
172-
makePendingClaudeProvider(settings).pipe(Effect.map(stampIdentity)),
180+
makePendingClaudeProvider(settings.provider).pipe(Effect.map(stampIdentity)),
173181
checkProvider,
174-
enrichSnapshot: ({ snapshot, publishSnapshot }) =>
175-
enrichProviderSnapshotWithVersionAdvisory(snapshot, maintenanceCapabilities).pipe(
182+
enrichSnapshot: ({ settings, snapshot, publishSnapshot }) =>
183+
enrichProviderSnapshotWithVersionAdvisory(snapshot, maintenanceCapabilities, {
184+
enableProviderUpdateChecks: settings.enableProviderUpdateChecks,
185+
}).pipe(
176186
Effect.provideService(HttpClient.HttpClient, httpClient),
177187
Effect.flatMap((enrichedSnapshot) => publishSnapshot(enrichedSnapshot)),
178188
),

apps/server/src/provider/Drivers/CodexDriver.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ import * as Effect from "effect/Effect";
2828
import * as FileSystem from "effect/FileSystem";
2929
import * as Path from "effect/Path";
3030
import * as Schema from "effect/Schema";
31-
import * as Stream from "effect/Stream";
3231
import { HttpClient } from "effect/unstable/http";
3332
import { ChildProcessSpawner } from "effect/unstable/process";
3433

3534
import { makeCodexTextGeneration } from "../../textGeneration/CodexTextGeneration.ts";
3635
import { ServerConfig } from "../../config.ts";
36+
import { ServerSettingsService } from "../../serverSettings.ts";
3737
import { ProviderDriverError } from "../Errors.ts";
3838
import { makeCodexAdapter } from "../Layers/CodexAdapter.ts";
3939
import { checkCodexProviderStatus, makePendingCodexProvider } from "../Layers/CodexProvider.ts";
@@ -47,6 +47,11 @@ import {
4747
makePackageManagedProviderMaintenanceResolver,
4848
resolveProviderMaintenanceCapabilitiesEffect,
4949
} from "../providerMaintenance.ts";
50+
import {
51+
haveProviderSnapshotSettingsChanged,
52+
makeProviderSnapshotSettingsSource,
53+
type ProviderSnapshotSettings,
54+
} from "../providerUpdateSettings.ts";
5055
import {
5156
codexContinuationIdentity,
5257
materializeCodexShadowHome,
@@ -75,7 +80,8 @@ export type CodexDriverEnv =
7580
| HttpClient.HttpClient
7681
| Path.Path
7782
| ProviderEventLoggers
78-
| ServerConfig;
83+
| ServerConfig
84+
| ServerSettingsService;
7985

8086
/**
8187
* Stamp instance identity onto a `ServerProvider` snapshot produced by the
@@ -111,6 +117,7 @@ export const CodexDriver: ProviderDriver<CodexSettings, CodexDriverEnv> = {
111117
Effect.gen(function* () {
112118
const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
113119
const httpClient = yield* HttpClient.HttpClient;
120+
const serverSettings = yield* ServerSettingsService;
114121
const eventLoggers = yield* ProviderEventLoggers;
115122
const processEnv = mergeProviderInstanceEnvironment(environment);
116123
const homeLayout = yield* resolveCodexHomeLayout(config);
@@ -163,16 +170,19 @@ export const CodexDriver: ProviderDriver<CodexSettings, CodexDriverEnv> = {
163170
Effect.map(stampIdentity),
164171
Effect.provideService(ChildProcessSpawner.ChildProcessSpawner, spawner),
165172
);
166-
const snapshot = yield* makeManagedServerProvider<CodexSettings>({
173+
const snapshotSettings = makeProviderSnapshotSettingsSource(effectiveConfig, serverSettings);
174+
const snapshot = yield* makeManagedServerProvider<ProviderSnapshotSettings<CodexSettings>>({
167175
maintenanceCapabilities,
168-
getSettings: Effect.succeed(effectiveConfig),
169-
streamSettings: Stream.never,
170-
haveSettingsChanged: () => false,
176+
getSettings: snapshotSettings.getSettings,
177+
streamSettings: snapshotSettings.streamSettings,
178+
haveSettingsChanged: haveProviderSnapshotSettingsChanged,
171179
initialSnapshot: (settings) =>
172-
makePendingCodexProvider(settings).pipe(Effect.map(stampIdentity)),
180+
makePendingCodexProvider(settings.provider).pipe(Effect.map(stampIdentity)),
173181
checkProvider,
174-
enrichSnapshot: ({ snapshot, publishSnapshot }) =>
175-
enrichProviderSnapshotWithVersionAdvisory(snapshot, maintenanceCapabilities).pipe(
182+
enrichSnapshot: ({ settings, snapshot, publishSnapshot }) =>
183+
enrichProviderSnapshotWithVersionAdvisory(snapshot, maintenanceCapabilities, {
184+
enableProviderUpdateChecks: settings.enableProviderUpdateChecks,
185+
}).pipe(
176186
Effect.provideService(HttpClient.HttpClient, httpClient),
177187
Effect.flatMap((enrichedSnapshot) => publishSnapshot(enrichedSnapshot)),
178188
),

apps/server/src/provider/Drivers/CursorDriver.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ import * as Effect from "effect/Effect";
1818
import * as FileSystem from "effect/FileSystem";
1919
import * as Path from "effect/Path";
2020
import * as Schema from "effect/Schema";
21-
import * as Stream from "effect/Stream";
2221
import { HttpClient } from "effect/unstable/http";
2322
import { ChildProcessSpawner } from "effect/unstable/process";
2423

2524
import { ServerConfig } from "../../config.ts";
25+
import { ServerSettingsService } from "../../serverSettings.ts";
2626
import { makeCursorTextGeneration } from "../../textGeneration/CursorTextGeneration.ts";
2727
import { ProviderDriverError } from "../Errors.ts";
2828
import { makeCursorAdapter } from "../Layers/CursorAdapter.ts";
@@ -45,6 +45,11 @@ import {
4545
makeStaticProviderMaintenanceResolver,
4646
resolveProviderMaintenanceCapabilitiesEffect,
4747
} from "../providerMaintenance.ts";
48+
import {
49+
haveProviderSnapshotSettingsChanged,
50+
makeProviderSnapshotSettingsSource,
51+
type ProviderSnapshotSettings,
52+
} from "../providerUpdateSettings.ts";
4853
const decodeCursorSettings = Schema.decodeSync(CursorSettings);
4954

5055
const DRIVER_KIND = ProviderDriverKind.make("cursor");
@@ -66,7 +71,8 @@ export type CursorDriverEnv =
6671
| HttpClient.HttpClient
6772
| Path.Path
6873
| ProviderEventLoggers
69-
| ServerConfig;
74+
| ServerConfig
75+
| ServerSettingsService;
7076

7177
const withInstanceIdentity =
7278
(input: {
@@ -98,6 +104,7 @@ export const CursorDriver: ProviderDriver<CursorSettings, CursorDriverEnv> = {
98104
const fileSystem = yield* FileSystem.FileSystem;
99105
const path = yield* Path.Path;
100106
const httpClient = yield* HttpClient.HttpClient;
107+
const serverSettings = yield* ServerSettingsService;
101108
const eventLoggers = yield* ProviderEventLoggers;
102109
const processEnv = mergeProviderInstanceEnvironment(environment);
103110
const continuationIdentity = defaultProviderContinuationIdentity({
@@ -130,21 +137,23 @@ export const CursorDriver: ProviderDriver<CursorSettings, CursorDriverEnv> = {
130137
Effect.provideService(Path.Path, path),
131138
);
132139

133-
const snapshot = yield* makeManagedServerProvider<CursorSettings>({
140+
const snapshotSettings = makeProviderSnapshotSettingsSource(effectiveConfig, serverSettings);
141+
const snapshot = yield* makeManagedServerProvider<ProviderSnapshotSettings<CursorSettings>>({
134142
maintenanceCapabilities,
135-
getSettings: Effect.succeed(effectiveConfig),
136-
streamSettings: Stream.never,
137-
haveSettingsChanged: () => false,
143+
getSettings: snapshotSettings.getSettings,
144+
streamSettings: snapshotSettings.streamSettings,
145+
haveSettingsChanged: haveProviderSnapshotSettingsChanged,
138146
initialSnapshot: (settings) =>
139-
buildInitialCursorProviderSnapshot(settings).pipe(Effect.map(stampIdentity)),
147+
buildInitialCursorProviderSnapshot(settings.provider).pipe(Effect.map(stampIdentity)),
140148
checkProvider,
141149
// Model catalog and capabilities come exclusively from Cursor's
142150
// list_available_models extension method during provider checks.
143151
enrichSnapshot: ({ settings, snapshot: currentSnapshot, publishSnapshot }) =>
144152
enrichCursorSnapshot({
145-
settings,
153+
settings: settings.provider,
146154
snapshot: currentSnapshot,
147155
maintenanceCapabilities,
156+
enableProviderUpdateChecks: settings.enableProviderUpdateChecks,
148157
publishSnapshot,
149158
stampIdentity,
150159
httpClient,

apps/server/src/provider/Drivers/GrokDriver.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ import * as Effect from "effect/Effect";
55
import * as FileSystem from "effect/FileSystem";
66
import * as Path from "effect/Path";
77
import * as Schema from "effect/Schema";
8-
import * as Stream from "effect/Stream";
98
import { HttpClient } from "effect/unstable/http";
109
import { ChildProcessSpawner } from "effect/unstable/process";
1110

1211
import { ServerConfig } from "../../config.ts";
12+
import { ServerSettingsService } from "../../serverSettings.ts";
1313
import { makeGrokTextGeneration } from "../../textGeneration/GrokTextGeneration.ts";
1414
import { ProviderDriverError } from "../Errors.ts";
1515
import { makeGrokAdapter } from "../Layers/GrokAdapter.ts";
@@ -32,6 +32,11 @@ import {
3232
makeStaticProviderMaintenanceResolver,
3333
resolveProviderMaintenanceCapabilitiesEffect,
3434
} from "../providerMaintenance.ts";
35+
import {
36+
haveProviderSnapshotSettingsChanged,
37+
makeProviderSnapshotSettingsSource,
38+
type ProviderSnapshotSettings,
39+
} from "../providerUpdateSettings.ts";
3540
const decodeGrokSettings = Schema.decodeSync(GrokSettings);
3641

3742
const DRIVER_KIND = ProviderDriverKind.make("grok");
@@ -50,7 +55,8 @@ export type GrokDriverEnv =
5055
| HttpClient.HttpClient
5156
| Path.Path
5257
| ProviderEventLoggers
53-
| ServerConfig;
58+
| ServerConfig
59+
| ServerSettingsService;
5460

5561
const withInstanceIdentity =
5662
(input: {
@@ -80,6 +86,7 @@ export const GrokDriver: ProviderDriver<GrokSettings, GrokDriverEnv> = {
8086
Effect.gen(function* () {
8187
const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
8288
const httpClient = yield* HttpClient.HttpClient;
89+
const serverSettings = yield* ServerSettingsService;
8390
const eventLoggers = yield* ProviderEventLoggers;
8491
const processEnv = mergeProviderInstanceEnvironment(environment);
8592
const continuationIdentity = defaultProviderContinuationIdentity({
@@ -110,18 +117,20 @@ export const GrokDriver: ProviderDriver<GrokSettings, GrokDriverEnv> = {
110117
Effect.provideService(ChildProcessSpawner.ChildProcessSpawner, spawner),
111118
);
112119

113-
const snapshot = yield* makeManagedServerProvider<GrokSettings>({
120+
const snapshotSettings = makeProviderSnapshotSettingsSource(effectiveConfig, serverSettings);
121+
const snapshot = yield* makeManagedServerProvider<ProviderSnapshotSettings<GrokSettings>>({
114122
maintenanceCapabilities,
115-
getSettings: Effect.succeed(effectiveConfig),
116-
streamSettings: Stream.never,
117-
haveSettingsChanged: () => false,
123+
getSettings: snapshotSettings.getSettings,
124+
streamSettings: snapshotSettings.streamSettings,
125+
haveSettingsChanged: haveProviderSnapshotSettingsChanged,
118126
initialSnapshot: (settings) =>
119-
buildInitialGrokProviderSnapshot(settings).pipe(Effect.map(stampIdentity)),
127+
buildInitialGrokProviderSnapshot(settings.provider).pipe(Effect.map(stampIdentity)),
120128
checkProvider,
121-
enrichSnapshot: ({ snapshot: currentSnapshot, publishSnapshot }) =>
129+
enrichSnapshot: ({ settings, snapshot: currentSnapshot, publishSnapshot }) =>
122130
enrichGrokSnapshot({
123131
snapshot: currentSnapshot,
124132
maintenanceCapabilities,
133+
enableProviderUpdateChecks: settings.enableProviderUpdateChecks,
125134
publishSnapshot,
126135
httpClient,
127136
}),

apps/server/src/provider/Drivers/OpenCodeDriver.ts

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ import * as Effect from "effect/Effect";
1919
import * as FileSystem from "effect/FileSystem";
2020
import * as Path from "effect/Path";
2121
import * as Schema from "effect/Schema";
22-
import * as Stream from "effect/Stream";
2322
import { HttpClient } from "effect/unstable/http";
2423
import { ChildProcessSpawner } from "effect/unstable/process";
2524

2625
import { makeOpenCodeTextGeneration } from "../../textGeneration/OpenCodeTextGeneration.ts";
2726
import { ServerConfig } from "../../config.ts";
27+
import { ServerSettingsService } from "../../serverSettings.ts";
2828
import { ProviderDriverError } from "../Errors.ts";
2929
import { makeOpenCodeAdapter } from "../Layers/OpenCodeAdapter.ts";
3030
import {
@@ -47,6 +47,11 @@ import {
4747
normalizeCommandPath,
4848
resolveProviderMaintenanceCapabilitiesEffect,
4949
} from "../providerMaintenance.ts";
50+
import {
51+
haveProviderSnapshotSettingsChanged,
52+
makeProviderSnapshotSettingsSource,
53+
type ProviderSnapshotSettings,
54+
} from "../providerUpdateSettings.ts";
5055
const decodeOpenCodeSettings = Schema.decodeSync(OpenCodeSettings);
5156

5257
const DRIVER_KIND = ProviderDriverKind.make("opencode");
@@ -80,7 +85,8 @@ export type OpenCodeDriverEnv =
8085
| OpenCodeRuntime
8186
| Path.Path
8287
| ProviderEventLoggers
83-
| ServerConfig;
88+
| ServerConfig
89+
| ServerSettingsService;
8490

8591
const withInstanceIdentity =
8692
(input: {
@@ -111,6 +117,7 @@ export const OpenCodeDriver: ProviderDriver<OpenCodeSettings, OpenCodeDriverEnv>
111117
const openCodeRuntime = yield* OpenCodeRuntime;
112118
const serverConfig = yield* ServerConfig;
113119
const httpClient = yield* HttpClient.HttpClient;
120+
const serverSettings = yield* ServerSettingsService;
114121
const eventLoggers = yield* ProviderEventLoggers;
115122
const processEnv = mergeProviderInstanceEnvironment(environment);
116123
const continuationIdentity = defaultProviderContinuationIdentity({
@@ -142,21 +149,26 @@ export const OpenCodeDriver: ProviderDriver<OpenCodeSettings, OpenCodeDriverEnv>
142149
processEnv,
143150
).pipe(Effect.map(stampIdentity), Effect.provideService(OpenCodeRuntime, openCodeRuntime));
144151

145-
const snapshot = yield* makeManagedServerProvider<OpenCodeSettings>({
146-
maintenanceCapabilities,
147-
getSettings: Effect.succeed(effectiveConfig),
148-
streamSettings: Stream.never,
149-
haveSettingsChanged: () => false,
150-
initialSnapshot: (settings) =>
151-
makePendingOpenCodeProvider(settings).pipe(Effect.map(stampIdentity)),
152-
checkProvider,
153-
enrichSnapshot: ({ snapshot, publishSnapshot }) =>
154-
enrichProviderSnapshotWithVersionAdvisory(snapshot, maintenanceCapabilities).pipe(
155-
Effect.provideService(HttpClient.HttpClient, httpClient),
156-
Effect.flatMap((enrichedSnapshot) => publishSnapshot(enrichedSnapshot)),
157-
),
158-
refreshInterval: SNAPSHOT_REFRESH_INTERVAL,
159-
}).pipe(
152+
const snapshotSettings = makeProviderSnapshotSettingsSource(effectiveConfig, serverSettings);
153+
const snapshot = yield* makeManagedServerProvider<ProviderSnapshotSettings<OpenCodeSettings>>(
154+
{
155+
maintenanceCapabilities,
156+
getSettings: snapshotSettings.getSettings,
157+
streamSettings: snapshotSettings.streamSettings,
158+
haveSettingsChanged: haveProviderSnapshotSettingsChanged,
159+
initialSnapshot: (settings) =>
160+
makePendingOpenCodeProvider(settings.provider).pipe(Effect.map(stampIdentity)),
161+
checkProvider,
162+
enrichSnapshot: ({ settings, snapshot, publishSnapshot }) =>
163+
enrichProviderSnapshotWithVersionAdvisory(snapshot, maintenanceCapabilities, {
164+
enableProviderUpdateChecks: settings.enableProviderUpdateChecks,
165+
}).pipe(
166+
Effect.provideService(HttpClient.HttpClient, httpClient),
167+
Effect.flatMap((enrichedSnapshot) => publishSnapshot(enrichedSnapshot)),
168+
),
169+
refreshInterval: SNAPSHOT_REFRESH_INTERVAL,
170+
},
171+
).pipe(
160172
Effect.mapError(
161173
(cause) =>
162174
new ProviderDriverError({

apps/server/src/provider/Layers/CursorProvider.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,7 @@ export const enrichCursorSnapshot = (input: {
11061106
readonly settings: CursorSettings;
11071107
readonly snapshot: ServerProvider;
11081108
readonly maintenanceCapabilities: ProviderMaintenanceCapabilities;
1109+
readonly enableProviderUpdateChecks?: boolean;
11091110
readonly publishSnapshot: (snapshot: ServerProvider) => Effect.Effect<void>;
11101111
readonly stampIdentity?: (snapshot: ServerProvider) => ServerProvider;
11111112
readonly httpClient: HttpClient.HttpClient;
@@ -1117,7 +1118,9 @@ export const enrichCursorSnapshot = (input: {
11171118
return Effect.void;
11181119
}
11191120

1120-
return enrichProviderSnapshotWithVersionAdvisory(snapshot, input.maintenanceCapabilities).pipe(
1121+
return enrichProviderSnapshotWithVersionAdvisory(snapshot, input.maintenanceCapabilities, {
1122+
enableProviderUpdateChecks: input.enableProviderUpdateChecks,
1123+
}).pipe(
11211124
Effect.provideService(HttpClient.HttpClient, input.httpClient),
11221125
Effect.flatMap((enrichedSnapshot) =>
11231126
publishSnapshot(stampIdentity(enrichedSnapshot)).pipe(Effect.as(enrichedSnapshot)),

0 commit comments

Comments
 (0)