From c4eeefe0f138ea37b8468ebb122474a70901f032 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Fri, 21 Aug 2026 19:17:29 -0400 Subject: [PATCH] refactor: reuse undefined effect (#44010) --- packages/ai/src/protocols/openai-images.ts | 2 +- packages/ai/src/protocols/utils/image-input.ts | 2 +- packages/codemode/src/interpreter/runtime.ts | 6 +++--- packages/core/src/config/plugin/skill.ts | 2 +- packages/core/src/file-mutation.ts | 2 +- packages/core/src/location-mutation.ts | 5 ++--- packages/core/src/models-dev.ts | 4 ++-- packages/core/src/permission.ts | 2 +- packages/core/src/plugin/provider/opencode.ts | 2 +- packages/core/src/plugin/websearch/mcp.ts | 2 +- packages/core/src/ripgrep.ts | 2 +- packages/core/src/snapshot.ts | 2 +- packages/core/src/tool/plugin/write.ts | 2 +- packages/core/src/worktree/git.ts | 2 +- packages/core/test/fixture/config-nodes.ts | 2 +- packages/core/test/fixture/mcp.ts | 4 ++-- packages/core/test/generate.test.ts | 4 ++-- packages/core/test/instruction-discovery.test.ts | 2 +- packages/core/test/integration.test.ts | 2 +- packages/core/test/model-resolver.test.ts | 2 +- packages/core/test/plugin/fixture.ts | 2 +- packages/core/test/plugin/provider-dynamic.test.ts | 2 +- packages/core/test/plugin/provider-sap-ai-core.test.ts | 2 +- packages/core/test/session-prompt.test.ts | 2 +- packages/core/test/session-runner-recorded.test.ts | 8 ++++---- packages/core/test/session-runner.test.ts | 8 ++++---- packages/httpapi-codegen/src/index.ts | 2 +- packages/util/src/fs-util.ts | 4 ++-- 28 files changed, 41 insertions(+), 42 deletions(-) diff --git a/packages/ai/src/protocols/openai-images.ts b/packages/ai/src/protocols/openai-images.ts index feae659c96..c07b5a0035 100644 --- a/packages/ai/src/protocols/openai-images.ts +++ b/packages/ai/src/protocols/openai-images.ts @@ -110,7 +110,7 @@ export const model = (input: ModelInput) => { const multipartImages = yield* Effect.forEach(sourceImages, (image) => { if (image.type === "bytes") return Effect.succeed({ data: image.data, mediaType: image.mediaType }) if (image.type === "url") return ImageInputs.decodeDataUrl(image.url, ADAPTER) - return Effect.succeed(undefined) + return Effect.undefined }) const multipartMask = mask === undefined diff --git a/packages/ai/src/protocols/utils/image-input.ts b/packages/ai/src/protocols/utils/image-input.ts index 7376699d2a..18cad3e72e 100644 --- a/packages/ai/src/protocols/utils/image-input.ts +++ b/packages/ai/src/protocols/utils/image-input.ts @@ -16,7 +16,7 @@ export const decodeDataUrl = ( url: string, module: string, ): Effect.Effect<{ readonly mediaType: string; readonly data: Uint8Array } | undefined, AIError> => { - if (!url.startsWith("data:")) return Effect.succeed(undefined) + if (!url.startsWith("data:")) return Effect.undefined const match = /^data:([^;,]+);base64,(.*)$/s.exec(url) if (!match) return Effect.fail(invalid(module, "Image data URLs must contain a MIME type and base64 data")) return Effect.fromResult(Encoding.decodeBase64(match[2])).pipe( diff --git a/packages/codemode/src/interpreter/runtime.ts b/packages/codemode/src/interpreter/runtime.ts index 2659533346..4457ec6add 100644 --- a/packages/codemode/src/interpreter/runtime.ts +++ b/packages/codemode/src/interpreter/runtime.ts @@ -841,17 +841,17 @@ export class Interpreter { private customIterator(value: unknown, node: AstNode, allowAsync = true) { if (value instanceof CodeModeGenerator) { - if (value.asynchronous && !allowAsync) return Effect.succeed(undefined) + if (value.asynchronous && !allowAsync) return Effect.undefined return Effect.succeed({ iterator: value, next: new GeneratorMethodReference(value, "next"), asynchronous: value.asynchronous, }) } - if (!isRecord(value) || isRuntimeReference(value)) return Effect.succeed(undefined) + if (!isRecord(value) || isRuntimeReference(value)) return Effect.undefined const asyncMethod = allowAsync ? Reflect.get(value, AsyncIteratorSymbol) : undefined const method = asyncMethod ?? Reflect.get(value, IteratorSymbol) - if (method === undefined || method === null) return Effect.succeed(undefined) + if (method === undefined || method === null) return Effect.undefined const self = this return Effect.map( this.invokeCallable(this.requireIteratorMethod(method, "Iterator method", node), [], node), diff --git a/packages/core/src/config/plugin/skill.ts b/packages/core/src/config/plugin/skill.ts index 2a77006a4d..bc2837762a 100644 --- a/packages/core/src/config/plugin/skill.ts +++ b/packages/core/src/config/plugin/skill.ts @@ -46,7 +46,7 @@ export const Plugin = define({ function firstMissing(target: string): Effect.Effect { const parent = path.dirname(target) - if (parent === target) return Effect.succeed(undefined) + if (parent === target) return Effect.undefined return fs.isDir(parent).pipe(Effect.flatMap((exists) => (exists ? Effect.succeed(target) : firstMissing(parent)))) } diff --git a/packages/core/src/file-mutation.ts b/packages/core/src/file-mutation.ts index 8444ca84ac..84e3fd62f9 100644 --- a/packages/core/src/file-mutation.ts +++ b/packages/core/src/file-mutation.ts @@ -109,7 +109,7 @@ const layer = Layer.effect( const next = Bom.split(input.content) const current = yield* environment.files.read(input.target.absolute, { offset: 0, length: 3 }).pipe( Effect.map((result) => result.bytes), - Effect.catchTag("Environment.NotFound", () => Effect.succeed(undefined)), + Effect.catchTag("Environment.NotFound", () => Effect.undefined), ) yield* environment.files.write( input.target.absolute, diff --git a/packages/core/src/location-mutation.ts b/packages/core/src/location-mutation.ts index ae2057e34f..07d3ef8bff 100644 --- a/packages/core/src/location-mutation.ts +++ b/packages/core/src/location-mutation.ts @@ -78,9 +78,8 @@ const layer = Layer.effect( ? "Directory" : input.kind === "file" ? "File" - : (yield* fs - .stat(absolute) - .pipe(Effect.catchReason("PlatformError", "NotFound", () => Effect.succeed(undefined))))?.type + : (yield* fs.stat(absolute).pipe(Effect.catchReason("PlatformError", "NotFound", () => Effect.undefined))) + ?.type const externalDirectory = type === "Directory" ? absolute : path.dirname(absolute) const externalResource = slash(path.join(externalDirectory, "*")) return { diff --git a/packages/core/src/models-dev.ts b/packages/core/src/models-dev.ts index f04eea732e..948a000178 100644 --- a/packages/core/src/models-dev.ts +++ b/packages/core/src/models-dev.ts @@ -624,11 +624,11 @@ export const layer = (options?: Options) => Effect.map((input) => input as Record), Effect.orElseSucceed(() => undefined), ) - : Effect.succeed(undefined) + : Effect.undefined // The bundled snapshot is the boot-time floor for the catalog; the // periodic fetch below still refreshes on top. - const loadSnapshot = options?.snapshot === false ? Effect.succeed(undefined) : bundledSnapshot + const loadSnapshot = options?.snapshot === false ? Effect.undefined : bundledSnapshot const fetchAndWrite = Effect.fn("ModelsDev.fetchAndWrite")(function* () { const text = yield* fetchApi() diff --git a/packages/core/src/permission.ts b/packages/core/src/permission.ts index 36140bf4fb..5c35f89b9f 100644 --- a/packages/core/src/permission.ts +++ b/packages/core/src/permission.ts @@ -302,7 +302,7 @@ const layer = Layer.effect( const rememberedRules = yield* savedRules() for (const [id, item] of pending) { const rules = yield* configured(item.request.sessionID, item.agent).pipe( - Effect.catchTag("Session.NotFoundError", () => Effect.succeed(undefined)), + Effect.catchTag("Session.NotFoundError", () => Effect.undefined), ) if (!rules) continue if (denied(item.request, rules)) continue diff --git a/packages/core/src/plugin/provider/opencode.ts b/packages/core/src/plugin/provider/opencode.ts index f65feb9b22..1b4c650020 100644 --- a/packages/core/src/plugin/provider/opencode.ts +++ b/packages/core/src/plugin/provider/opencode.ts @@ -213,7 +213,7 @@ function fetchProviders(http: HttpClient.HttpClient, value: Credential.Value) { ) .pipe( Effect.flatMap((response) => { - if (response.status === 404) return Effect.succeed(undefined) + if (response.status === 404) return Effect.undefined return HttpClientResponse.filterStatusOk(response).pipe( Effect.flatMap(HttpClientResponse.schemaBodyJson(RemoteResponse)), Effect.map((remote) => remote.config.provider), diff --git a/packages/core/src/plugin/websearch/mcp.ts b/packages/core/src/plugin/websearch/mcp.ts index d733ca23f3..0946d1d114 100644 --- a/packages/core/src/plugin/websearch/mcp.ts +++ b/packages/core/src/plugin/websearch/mcp.ts @@ -10,7 +10,7 @@ export const parseResponse = (body: string, resu const decode = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Struct({ result }))) const parse = (payload: string) => { const trimmed = payload.trim() - if (!trimmed.startsWith("{")) return Effect.succeed(undefined) + if (!trimmed.startsWith("{")) return Effect.undefined return decode(trimmed).pipe(Effect.map((response) => response.result)) } return Effect.gen(function* () { diff --git a/packages/core/src/ripgrep.ts b/packages/core/src/ripgrep.ts index ee07b10c13..0b092fe51b 100644 --- a/packages/core/src/ripgrep.ts +++ b/packages/core/src/ripgrep.ts @@ -235,7 +235,7 @@ const layer = Layer.effect( Effect.mapError((cause) => failure("Invalid ripgrep JSON output", cause)), Effect.flatMap((json) => { if (!json || typeof json !== "object" || !("type" in json) || json.type !== "match") - return Effect.succeed(undefined) + return Effect.undefined return Schema.decodeUnknownEffect(RawMatch)(json).pipe( Effect.map((match) => ({ ...match.data, diff --git a/packages/core/src/snapshot.ts b/packages/core/src/snapshot.ts index db91f73482..fc5c2ea509 100644 --- a/packages/core/src/snapshot.ts +++ b/packages/core/src/snapshot.ts @@ -201,7 +201,7 @@ export const noopLayer = Layer.succeed( Service.of({ transform: () => Effect.succeed({ dispose: Effect.void }), reload: () => Effect.void, - capture: () => Effect.succeed(undefined), + capture: () => Effect.undefined, files: () => Effect.succeed([]), diff: () => Effect.succeed([]), restore: () => Effect.void, diff --git a/packages/core/src/tool/plugin/write.ts b/packages/core/src/tool/plugin/write.ts index ec8bc3c6d2..a0e96e65a9 100644 --- a/packages/core/src/tool/plugin/write.ts +++ b/packages/core/src/tool/plugin/write.ts @@ -78,7 +78,7 @@ export const Plugin = { source, }) const current = yield* FileMutation.readText(environment.files, target.absolute).pipe( - Effect.catchTag("Environment.NotFound", () => Effect.succeed(undefined)), + Effect.catchTag("Environment.NotFound", () => Effect.undefined), ) const next = Bom.split(input.content) const preview = fileDiff(target.resource, current?.text ?? "", next.text, current ? "modified" : "added") diff --git a/packages/core/src/worktree/git.ts b/packages/core/src/worktree/git.ts index 7b6a7557f7..10b27086a1 100644 --- a/packages/core/src/worktree/git.ts +++ b/packages/core/src/worktree/git.ts @@ -31,7 +31,7 @@ export const make = Effect.gen(function* () { return yield* Effect.forEach(entries, (entry) => canonical(fs, entry.directory).pipe( Effect.map((directory) => ({ directory, type: entry.kind === "main" ? "root" : "worktree" }) as const), - Effect.catchTag("Worktree.DirectoryUnavailableError", () => Effect.succeed(undefined)), + Effect.catchTag("Worktree.DirectoryUnavailableError", () => Effect.undefined), ), ).pipe(Effect.map((items) => items.filter((item): item is ListEntry => item !== undefined))) }), diff --git a/packages/core/test/fixture/config-nodes.ts b/packages/core/test/fixture/config-nodes.ts index 93a2e4e8c6..1fb59efa92 100644 --- a/packages/core/test/fixture/config-nodes.ts +++ b/packages/core/test/fixture/config-nodes.ts @@ -10,7 +10,7 @@ export const emptyCredentialNode = makeGlobalNode({ Credential.Service.of({ all: () => Effect.succeed([]), list: () => Effect.succeed([]), - get: () => Effect.succeed(undefined), + get: () => Effect.undefined, create: () => Effect.die("unused Credential.create"), update: () => Effect.die("unused Credential.update"), remove: () => Effect.die("unused Credential.remove"), diff --git a/packages/core/test/fixture/mcp.ts b/packages/core/test/fixture/mcp.ts index e22318facc..8b282de5e3 100644 --- a/packages/core/test/fixture/mcp.ts +++ b/packages/core/test/fixture/mcp.ts @@ -19,9 +19,9 @@ export const emptyMcpLayer = Layer.succeed( callTool: () => Effect.die("unused mcp.callTool"), instructions: () => Effect.succeed([]), prompts: () => Effect.succeed([]), - prompt: () => Effect.succeed(undefined), + prompt: () => Effect.undefined, resourceCatalog: () => Effect.succeed(MCP.ResourceCatalog.make({ resources: [], templates: [] })), - readResource: () => Effect.succeed(undefined), + readResource: () => Effect.undefined, }), ) diff --git a/packages/core/test/generate.test.ts b/packages/core/test/generate.test.ts index 46ecba66e0..3d5e63d38a 100644 --- a/packages/core/test/generate.test.ts +++ b/packages/core/test/generate.test.ts @@ -21,7 +21,7 @@ const runtime = LanguageModel.make({ id: "gemini", provider: "test-provider", ro const catalog = Layer.mock(Catalog.Service, { provider: { - get: () => Effect.succeed(undefined), + get: () => Effect.undefined, all: () => Effect.die("unused"), available: () => Effect.die("unused"), }, @@ -35,7 +35,7 @@ const catalog = Layer.mock(Catalog.Service, { }) const integrations = Layer.mock(Integration.Service, { connection: { - active: () => Effect.succeed(undefined), + active: () => Effect.undefined, resolve: () => Effect.die("unused"), key: () => Effect.die("unused"), update: () => Effect.die("unused"), diff --git a/packages/core/test/instruction-discovery.test.ts b/packages/core/test/instruction-discovery.test.ts index 44b932abeb..538f5a8486 100644 --- a/packages/core/test/instruction-discovery.test.ts +++ b/packages/core/test/instruction-discovery.test.ts @@ -405,7 +405,7 @@ describe("ConfigInstructionPlugin.Plugin", () => { FSUtil.Service.of({ ...fs, up: () => Effect.succeed([discovered]), - readFileStringSafe: () => Effect.succeed(undefined), + readFileStringSafe: () => Effect.undefined, }), ), ), diff --git a/packages/core/test/integration.test.ts b/packages/core/test/integration.test.ts index 8597c9bbdb..9cabcec256 100644 --- a/packages/core/test/integration.test.ts +++ b/packages/core/test/integration.test.ts @@ -17,7 +17,7 @@ const failingCredentialNode = makeGlobalNode({ Credential.Service.of({ all: () => Effect.succeed([]), list: () => Effect.succeed([]), - get: () => Effect.succeed(undefined), + get: () => Effect.undefined, create: () => Effect.die(new Error("credential persistence failed")), update: () => Effect.void, remove: () => Effect.void, diff --git a/packages/core/test/model-resolver.test.ts b/packages/core/test/model-resolver.test.ts index 7570d09d05..d0ff352a9e 100644 --- a/packages/core/test/model-resolver.test.ts +++ b/packages/core/test/model-resolver.test.ts @@ -309,7 +309,7 @@ describe("ModelResolver", () => { }) const integrations = Layer.mock(Integration.Service, { connection: { - active: () => Effect.succeed(undefined), + active: () => Effect.undefined, resolve: () => Effect.die("unused"), key: () => Effect.die("unused"), update: () => Effect.die("unused"), diff --git a/packages/core/test/plugin/fixture.ts b/packages/core/test/plugin/fixture.ts index cb1142998c..868de9bce6 100644 --- a/packages/core/test/plugin/fixture.ts +++ b/packages/core/test/plugin/fixture.ts @@ -33,7 +33,7 @@ const npmLayer = Layer.succeed( Npm.Service.of({ add: () => Effect.succeed({ directory: "", entrypoint: undefined }), resolve: () => Effect.succeed({ directory: "", entrypoint: undefined }), - which: () => Effect.succeed(undefined), + which: () => Effect.undefined, }), ) diff --git a/packages/core/test/plugin/provider-dynamic.test.ts b/packages/core/test/plugin/provider-dynamic.test.ts index b70da8f6a0..731bda5abb 100644 --- a/packages/core/test/plugin/provider-dynamic.test.ts +++ b/packages/core/test/plugin/provider-dynamic.test.ts @@ -24,7 +24,7 @@ function npmEntrypoint(entrypoint?: string) { return Npm.Service.of({ add: () => Effect.succeed({ directory: "", entrypoint }), resolve: () => Effect.succeed({ directory: "", entrypoint }), - which: () => Effect.succeed(undefined), + which: () => Effect.undefined, }) } diff --git a/packages/core/test/plugin/provider-sap-ai-core.test.ts b/packages/core/test/plugin/provider-sap-ai-core.test.ts index 456af2cbcb..2d2d1a027f 100644 --- a/packages/core/test/plugin/provider-sap-ai-core.test.ts +++ b/packages/core/test/plugin/provider-sap-ai-core.test.ts @@ -15,7 +15,7 @@ const it = testEffect(PluginTestLayer) const npm = Npm.Service.of({ add: () => Effect.succeed({ directory: "", entrypoint: undefined }), resolve: () => Effect.succeed({ directory: "", entrypoint: undefined }), - which: () => Effect.succeed(undefined), + which: () => Effect.undefined, }) const addPlugin = Effect.fn(function* () { diff --git a/packages/core/test/session-prompt.test.ts b/packages/core/test/session-prompt.test.ts index d6b81dd2a5..0fb6ade454 100644 --- a/packages/core/test/session-prompt.test.ts +++ b/packages/core/test/session-prompt.test.ts @@ -74,7 +74,7 @@ const locations = Layer.effect( }), Layer.mock(Snapshot.Service, { capture: () => - ready ? Effect.succeed(undefined) : Effect.die(new Error("Snapshot used before plugins were ready")), + ready ? Effect.undefined : Effect.die(new Error("Snapshot used before plugins were ready")), restore: () => ready ? Effect.void : Effect.die(new Error("Snapshot used before plugins were ready")), }), diff --git a/packages/core/test/session-runner-recorded.test.ts b/packages/core/test/session-runner-recorded.test.ts index 1d29c9bddf..9b7b4f6114 100644 --- a/packages/core/test/session-runner-recorded.test.ts +++ b/packages/core/test/session-runner-recorded.test.ts @@ -88,16 +88,16 @@ const config = Config.testLayer() const pluginSupervisor = Layer.succeed(PluginSupervisor.Service, PluginSupervisor.Service.of({ flush: Effect.void })) const promptCatalog = Layer.mock(Catalog.Service, { provider: { - get: () => Effect.succeed(undefined), + get: () => Effect.undefined, all: () => Effect.succeed([]), available: () => Effect.succeed([]), }, model: { - get: () => Effect.succeed(undefined), + get: () => Effect.undefined, all: () => Effect.succeed([]), available: () => Effect.succeed([]), - default: () => Effect.succeed(undefined), - small: () => Effect.succeed(undefined), + default: () => Effect.undefined, + small: () => Effect.undefined, }, }) const runnerLayer = (llmClient: Layer.Layer) => diff --git a/packages/core/test/session-runner.test.ts b/packages/core/test/session-runner.test.ts index 2ab49fa7c6..b44f15d4b5 100644 --- a/packages/core/test/session-runner.test.ts +++ b/packages/core/test/session-runner.test.ts @@ -378,16 +378,16 @@ const pluginSupervisor = Layer.succeed( ) const promptCatalog = Layer.mock(Catalog.Service, { provider: { - get: () => Effect.succeed(undefined), + get: () => Effect.undefined, all: () => Effect.succeed([]), available: () => Effect.succeed([]), }, model: { - get: () => Effect.succeed(undefined), + get: () => Effect.undefined, all: () => Effect.succeed([]), available: () => Effect.succeed([]), - default: () => Effect.succeed(undefined), - small: () => Effect.succeed(undefined), + default: () => Effect.undefined, + small: () => Effect.undefined, }, }) const runnerLayer = AppNodeBuilder.build(SessionRunnerLLM.node, [ diff --git a/packages/httpapi-codegen/src/index.ts b/packages/httpapi-codegen/src/index.ts index f93cee3243..25626efa89 100644 --- a/packages/httpapi-codegen/src/index.ts +++ b/packages/httpapi-codegen/src/index.ts @@ -1426,7 +1426,7 @@ export function write( output.files, (file) => fs.exists(join(directory, file.path)).pipe( - Effect.flatMap((exists) => (exists ? fs.stat(join(directory, file.path)) : Effect.succeed(undefined))), + Effect.flatMap((exists) => (exists ? fs.stat(join(directory, file.path)) : Effect.undefined)), Effect.flatMap((info) => info?.type === "SymbolicLink" ? new GenerationError({ reason: `Unsafe output path: ${file.path}` }) diff --git a/packages/util/src/fs-util.ts b/packages/util/src/fs-util.ts index b82a5d8e66..70c9a84935 100644 --- a/packages/util/src/fs-util.ts +++ b/packages/util/src/fs-util.ts @@ -70,8 +70,8 @@ export namespace FSUtil { const readFileStringSafe = Effect.fn("FileSystem.readFileStringSafe")(function* (path: string) { return yield* fs.readFileString(path).pipe( - Effect.catchReason("PlatformError", "NotFound", () => Effect.succeed(undefined)), - Effect.catchReason("PlatformError", "PermissionDenied", () => Effect.succeed(undefined)), + Effect.catchReason("PlatformError", "NotFound", () => Effect.undefined), + Effect.catchReason("PlatformError", "PermissionDenied", () => Effect.undefined), ) })