authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-06-04 22:47:56-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-06-05 05:47:56+00:00
log9da430c828f6e32a30cd0998485b39670f2ee5ac
treee4aa09aee8b4c85fe635a0a43ef5b17b67a0a5a6
parenta084fbbc0a97fa4e414806a69fd7ab49984ef8ff
signature Signed by PGP key B5690EEEBB952194

Refactor recoverable Effect fallbacks to orElseSucceed (#2968)


42 files changed, 182 insertions(+), 318 deletions(-)

apps/desktop/src/app/DesktopAppIdentity.ts+1-1
...@@ -52,7 +52,7 @@ const make = Effect.gen(function* () {...@@ -52,7 +52,7 @@ const make = Effect.gen(function* () {
52 Effect.map((parsed) =>52 Effect.map((parsed) =>
53 Option.fromNullishOr(parsed.t3codeCommitHash).pipe(Option.flatMap(normalizeCommitHash)),53 Option.fromNullishOr(parsed.t3codeCommitHash).pipe(Option.flatMap(normalizeCommitHash)),
54 ),54 ),
55 Effect.catch(() => Effect.succeed(Option.none<string>())),55 Effect.orElseSucceed(() => Option.none<string>()),
56 ),56 ),
57 });57 });
58 });58 });
apps/desktop/src/backend/tailscaleEndpointProvider.ts+2-2
...@@ -116,11 +116,11 @@ export const resolveTailscaleAdvertisedEndpoints = Effect.fn("resolveTailscaleAd...@@ -116,11 +116,11 @@ export const resolveTailscaleAdvertisedEndpoints = Effect.fn("resolveTailscaleAd
116 input.statusJson === undefined116 input.statusJson === undefined
117 ? yield* readTailscaleStatus.pipe(117 ? yield* readTailscaleStatus.pipe(
118 Effect.map((status) => status.magicDnsName),118 Effect.map((status) => status.magicDnsName),
119 Effect.catch(() => Effect.succeed(null)),119 Effect.orElseSucceed(() => null),
120 )120 )
121 : input.statusJson121 : input.statusJson
122 ? yield* parseTailscaleMagicDnsName(input.statusJson).pipe(122 ? yield* parseTailscaleMagicDnsName(input.statusJson).pipe(
123 Effect.catch(() => Effect.succeed(null)),123 Effect.orElseSucceed(() => null),
124 )124 )
125 : null;125 : null;
126 const magicDnsEndpoint = yield* resolveTailscaleMagicDnsAdvertisedEndpoint({126 const magicDnsEndpoint = yield* resolveTailscaleMagicDnsAdvertisedEndpoint({
apps/desktop/src/settings/DesktopAppSettings.ts+1-1
...@@ -209,7 +209,7 @@ function readSettings(...@@ -209,7 +209,7 @@ function readSettings(
209 onSome: (raw) =>209 onSome: (raw) =>
210 decodeDesktopSettingsJson(raw).pipe(210 decodeDesktopSettingsJson(raw).pipe(
211 Effect.map((parsed) => normalizeDesktopSettingsDocument(parsed, appVersion)),211 Effect.map((parsed) => normalizeDesktopSettingsDocument(parsed, appVersion)),
212 Effect.catch(() => Effect.succeed(defaultSettings)),212 Effect.orElseSucceed(() => defaultSettings),
213 ),213 ),
214 }),214 }),
215 ),215 ),
apps/desktop/src/settings/DesktopClientSettings.ts+1-1
...@@ -63,7 +63,7 @@ const readClientSettings = (...@@ -63,7 +63,7 @@ const readClientSettings = (
63 onSome: (raw) =>63 onSome: (raw) =>
64 decodeClientSettingsJson(raw).pipe(64 decodeClientSettingsJson(raw).pipe(
65 Effect.map((settings) => Option.some(settings)),65 Effect.map((settings) => Option.some(settings)),
66 Effect.catch(() => Effect.succeed(Option.none<ClientSettings>())),66 Effect.orElseSucceed(() => Option.none<ClientSettings>()),
67 ),67 ),
68 }),68 }),
69 ),69 ),
apps/desktop/src/settings/DesktopSavedEnvironments.ts+1-1
...@@ -185,7 +185,7 @@ function readRegistryDocument(...@@ -185,7 +185,7 @@ function readRegistryDocument(
185 onSome: (raw) =>185 onSome: (raw) =>
186 decodeSavedEnvironmentRegistryDocumentJson(raw).pipe(186 decodeSavedEnvironmentRegistryDocumentJson(raw).pipe(
187 Effect.map(normalizeSavedEnvironmentRegistryDocument),187 Effect.map(normalizeSavedEnvironmentRegistryDocument),
188 Effect.catch(() => Effect.succeed({ version: 1, records: [] })),188 Effect.orElseSucceed(() => ({ version: 1, records: [] })),
189 ),189 ),
190 }),190 }),
191 ),191 ),
apps/desktop/src/shell/DesktopShellEnvironment.ts+1-1
...@@ -196,7 +196,7 @@ const runCommandOutput = Effect.fn("desktop.shellEnvironment.runCommandOutput")(...@@ -196,7 +196,7 @@ const runCommandOutput = Effect.fn("desktop.shellEnvironment.runCommandOutput")(
196 .pipe(196 .pipe(
197 Effect.timeoutOption(input.timeout),197 Effect.timeoutOption(input.timeout),
198 Effect.map(Option.getOrElse(() => "")),198 Effect.map(Option.getOrElse(() => "")),
199 Effect.catch(() => Effect.succeed("")),199 Effect.orElseSucceed(() => ""),
200 );200 );
201});201});
202202
apps/desktop/src/updates/DesktopUpdates.ts+1-1
...@@ -120,7 +120,7 @@ function parseAppUpdateYml(raw: string): Effect.Effect<Option.Option<AppUpdateYm...@@ -120,7 +120,7 @@ function parseAppUpdateYml(raw: string): Effect.Effect<Option.Option<AppUpdateYm
120120
121 return decodeAppUpdateYmlConfig(entries).pipe(121 return decodeAppUpdateYmlConfig(entries).pipe(
122 Effect.map((config) => (config.provider ? Option.some(config) : Option.none())),122 Effect.map((config) => (config.provider ? Option.some(config) : Option.none())),
123 Effect.catch(() => Effect.succeed(Option.none<AppUpdateYmlConfig>())),123 Effect.orElseSucceed(() => Option.none<AppUpdateYmlConfig>()),
124 );124 );
125}125}
126126
apps/server/package.json+1-1
...@@ -38,7 +38,7 @@...@@ -38,7 +38,7 @@
38 "@t3tools/shared": "workspace:*",38 "@t3tools/shared": "workspace:*",
39 "@t3tools/tailscale": "workspace:*",39 "@t3tools/tailscale": "workspace:*",
40 "@t3tools/web": "workspace:*",40 "@t3tools/web": "workspace:*",
41 "@types/bun": "catalog:",41 "@types/bun": "1.3.14",
42 "@types/node": "catalog:",42 "@types/node": "catalog:",
43 "effect-acp": "workspace:*",43 "effect-acp": "workspace:*",
44 "effect-codex-app-server": "workspace:*",44 "effect-codex-app-server": "workspace:*",
apps/server/src/checkpointing/Layers/CheckpointStore.ts+1-1
...@@ -35,7 +35,7 @@ const makeCheckpointStore = Effect.gen(function* () {...@@ -35,7 +35,7 @@ const makeCheckpointStore = Effect.gen(function* () {
35 const isGitRepository: CheckpointStoreShape["isGitRepository"] = (cwd) =>35 const isGitRepository: CheckpointStoreShape["isGitRepository"] = (cwd) =>
36 vcsRegistry.resolve({ cwd, requestedKind: "git" }).pipe(36 vcsRegistry.resolve({ cwd, requestedKind: "git" }).pipe(
37 Effect.map(() => true),37 Effect.map(() => true),
38 Effect.catch(() => Effect.succeed(false)),38 Effect.orElseSucceed(() => false),
39 );39 );
4040
41 const captureCheckpoint: CheckpointStoreShape["captureCheckpoint"] = Effect.fn(41 const captureCheckpoint: CheckpointStoreShape["captureCheckpoint"] = Effect.fn(
apps/server/src/cloud/ManagedEndpointRuntime.ts+1-3
...@@ -152,9 +152,7 @@ export const makeCloudManagedEndpointRuntime = Effect.gen(function* () {...@@ -152,9 +152,7 @@ export const makeCloudManagedEndpointRuntime = Effect.gen(function* () {
152 const nextConfigKey = runtimeConfigKey(config);152 const nextConfigKey = runtimeConfigKey(config);
153 const active = yield* Ref.get(activeRef);153 const active = yield* Ref.get(activeRef);
154 if (active?.configKey === nextConfigKey) {154 if (active?.configKey === nextConfigKey) {
155 const isRunning = yield* active.child.isRunning.pipe(155 const isRunning = yield* active.child.isRunning.pipe(Effect.orElseSucceed(() => false));
156 Effect.catch(() => Effect.succeed(false)),
157 );
158 if (isRunning) {156 if (isRunning) {
159 return {157 return {
160 status: "running",158 status: "running",
apps/server/src/git/GitManager.ts+7-7
...@@ -702,7 +702,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {...@@ -702,7 +702,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {
702702
703 const tempDir = process.env.TMPDIR ?? process.env.TEMP ?? process.env.TMP ?? "/tmp";703 const tempDir = process.env.TMPDIR ?? process.env.TEMP ?? process.env.TMP ?? "/tmp";
704 const canonicalizeExistingPath = (value: string) =>704 const canonicalizeExistingPath = (value: string) =>
705 fileSystem.realPath(value).pipe(Effect.catch(() => Effect.succeed(value)));705 fileSystem.realPath(value).pipe(Effect.orElseSucceed(() => value));
706 const normalizeStatusCacheKey = canonicalizeExistingPath;706 const normalizeStatusCacheKey = canonicalizeExistingPath;
707 const nonRepositoryStatusDetails = {707 const nonRepositoryStatusDetails = {
708 isRepo: false,708 isRepo: false,
...@@ -766,7 +766,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {...@@ -766,7 +766,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {
766 if (details.isDefaultBranch && latest.state !== "open") return null;766 if (details.isDefaultBranch && latest.state !== "open") return null;
767 return toStatusPr(latest);767 return toStatusPr(latest);
768 }),768 }),
769 Effect.catch(() => Effect.succeed(null)),769 Effect.orElseSucceed(() => null),
770 )770 )
771 : null;771 : null;
772772
...@@ -788,7 +788,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {...@@ -788,7 +788,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {
788 );788 );
789789
790 const readConfigValueNullable = (cwd: string, key: string) =>790 const readConfigValueNullable = (cwd: string, key: string) =>
791 gitCore.readConfigValue(cwd, key).pipe(Effect.catch(() => Effect.succeed(null)));791 gitCore.readConfigValue(cwd, key).pipe(Effect.orElseSucceed(() => null));
792792
793 const resolveHostingProvider = Effect.fn("resolveHostingProvider")(function* (793 const resolveHostingProvider = Effect.fn("resolveHostingProvider")(function* (
794 cwd: string,794 cwd: string,
...@@ -972,7 +972,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {...@@ -972,7 +972,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {
972 ) {972 ) {
973 const terms = yield* sourceControlProvider(cwd).pipe(973 const terms = yield* sourceControlProvider(cwd).pipe(
974 Effect.map((provider) => getChangeRequestTerminologyForKind(provider.kind)),974 Effect.map((provider) => getChangeRequestTerminologyForKind(provider.kind)),
975 Effect.catch(() => Effect.succeed(getChangeRequestTerminologyForKind("unknown"))),975 Effect.orElseSucceed(() => getChangeRequestTerminologyForKind("unknown")),
976 );976 );
977 const summary = summarizeGitActionResult(result, terms);977 const summary = summarizeGitActionResult(result, terms);
978 let latestOpenPr: PullRequestInfo | null = null;978 let latestOpenPr: PullRequestInfo | null = null;
...@@ -1016,7 +1016,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {...@@ -1016,7 +1016,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {
1016 upstreamRef: finalBranchContext.upstreamRef,1016 upstreamRef: finalBranchContext.upstreamRef,
1017 }).pipe(1017 }).pipe(
1018 Effect.flatMap((headContext) => findOpenPr(cwd, headContext)),1018 Effect.flatMap((headContext) => findOpenPr(cwd, headContext)),
1019 Effect.catch(() => Effect.succeed(null)),1019 Effect.orElseSucceed(() => null),
1020 );1020 );
1021 }1021 }
10221022
...@@ -1080,7 +1080,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {...@@ -1080,7 +1080,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {
10801080
1081 const defaultFromProvider = yield* sourceControlProvider(cwd).pipe(1081 const defaultFromProvider = yield* sourceControlProvider(cwd).pipe(
1082 Effect.flatMap((provider) => provider.getDefaultBranch({ cwd })),1082 Effect.flatMap((provider) => provider.getDefaultBranch({ cwd })),
1083 Effect.catch(() => Effect.succeed(null)),1083 Effect.orElseSucceed(() => null),
1084 );1084 );
1085 if (defaultFromProvider) {1085 if (defaultFromProvider) {
1086 return defaultFromProvider;1086 return defaultFromProvider;
...@@ -1686,7 +1686,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {...@@ -1686,7 +1686,7 @@ export const makeGitManager = Effect.fn("makeGitManager")(function* () {
1686 const changeRequestTerms = wantsPr1686 const changeRequestTerms = wantsPr
1687 ? yield* sourceControlProvider(input.cwd).pipe(1687 ? yield* sourceControlProvider(input.cwd).pipe(
1688 Effect.map((provider) => getChangeRequestTerminologyForKind(provider.kind)),1688 Effect.map((provider) => getChangeRequestTerminologyForKind(provider.kind)),
1689 Effect.catch(() => Effect.succeed(getChangeRequestTerminologyForKind("unknown"))),1689 Effect.orElseSucceed(() => getChangeRequestTerminologyForKind("unknown")),
1690 )1690 )
1691 : null;1691 : null;
16921692
apps/server/src/http.ts+8-18
...@@ -156,8 +156,8 @@ export const otlpTracesProxyRouteLayer = HttpRouter.add(...@@ -156,8 +156,8 @@ export const otlpTracesProxyRouteLayer = HttpRouter.add(
156 otlpTracesUrl,156 otlpTracesUrl,
157 }),157 }),
158 ),158 ),
159 Effect.catch(() =>159 Effect.orElseSucceed(() =>
160 Effect.succeed(HttpServerResponse.text("Trace export failed.", { status: 502 })),160 HttpServerResponse.text("Trace export failed.", { status: 502 }),
161 ),161 ),
162 );162 );
163 }).pipe(163 }).pipe(
...@@ -205,9 +205,7 @@ export const attachmentsRouteLayer = HttpRouter.add(...@@ -205,9 +205,7 @@ export const attachmentsRouteLayer = HttpRouter.add(
205 }205 }
206206
207 const fileSystem = yield* FileSystem.FileSystem;207 const fileSystem = yield* FileSystem.FileSystem;
208 const fileInfo = yield* fileSystem208 const fileInfo = yield* fileSystem.stat(filePath).pipe(Effect.orElseSucceed(() => null));
209 .stat(filePath)
210 .pipe(Effect.catch(() => Effect.succeed(null)));
211 if (!fileInfo || fileInfo.type !== "File") {209 if (!fileInfo || fileInfo.type !== "File") {
212 return HttpServerResponse.text("Not Found", { status: 404 });210 return HttpServerResponse.text("Not Found", { status: 404 });
213 }211 }
...@@ -218,9 +216,7 @@ export const attachmentsRouteLayer = HttpRouter.add(...@@ -218,9 +216,7 @@ export const attachmentsRouteLayer = HttpRouter.add(
218 "Cache-Control": "public, max-age=31536000, immutable",216 "Cache-Control": "public, max-age=31536000, immutable",
219 },217 },
220 }).pipe(218 }).pipe(
221 Effect.catch(() =>219 Effect.orElseSucceed(() => HttpServerResponse.text("Internal Server Error", { status: 500 })),
222 Effect.succeed(HttpServerResponse.text("Internal Server Error", { status: 500 })),
223 ),
224 );220 );
225 }).pipe(221 }).pipe(
226 Effect.catchTags({222 Effect.catchTags({
...@@ -265,9 +261,7 @@ export const projectFaviconRouteLayer = HttpRouter.add(...@@ -265,9 +261,7 @@ export const projectFaviconRouteLayer = HttpRouter.add(
265 "Cache-Control": PROJECT_FAVICON_CACHE_CONTROL,261 "Cache-Control": PROJECT_FAVICON_CACHE_CONTROL,
266 },262 },
267 }).pipe(263 }).pipe(
268 Effect.catch(() =>264 Effect.orElseSucceed(() => HttpServerResponse.text("Internal Server Error", { status: 500 })),
269 Effect.succeed(HttpServerResponse.text("Internal Server Error", { status: 500 })),
270 ),
271 );265 );
272 }).pipe(266 }).pipe(
273 Effect.catchTags({267 Effect.catchTags({
...@@ -337,14 +331,12 @@ export const staticAndDevRouteLayer = HttpRouter.add(...@@ -337,14 +331,12 @@ export const staticAndDevRouteLayer = HttpRouter.add(
337 }331 }
338 }332 }
339333
340 const fileInfo = yield* fileSystem334 const fileInfo = yield* fileSystem.stat(filePath).pipe(Effect.orElseSucceed(() => null));
341 .stat(filePath)
342 .pipe(Effect.catch(() => Effect.succeed(null)));
343 if (!fileInfo || fileInfo.type !== "File") {335 if (!fileInfo || fileInfo.type !== "File") {
344 const indexPath = path.resolve(staticRoot, "index.html");336 const indexPath = path.resolve(staticRoot, "index.html");
345 const indexData = yield* fileSystem337 const indexData = yield* fileSystem
346 .readFile(indexPath)338 .readFile(indexPath)
347 .pipe(Effect.catch(() => Effect.succeed(null)));339 .pipe(Effect.orElseSucceed(() => null));
348 if (!indexData) {340 if (!indexData) {
349 return HttpServerResponse.text("Not Found", { status: 404 });341 return HttpServerResponse.text("Not Found", { status: 404 });
350 }342 }
...@@ -355,9 +347,7 @@ export const staticAndDevRouteLayer = HttpRouter.add(...@@ -355,9 +347,7 @@ export const staticAndDevRouteLayer = HttpRouter.add(
355 }347 }
356348
357 const contentType = Mime.getType(filePath) ?? "application/octet-stream";349 const contentType = Mime.getType(filePath) ?? "application/octet-stream";
358 const data = yield* fileSystem350 const data = yield* fileSystem.readFile(filePath).pipe(Effect.orElseSucceed(() => null));
359 .readFile(filePath)
360 .pipe(Effect.catch(() => Effect.succeed(null)));
361 if (!data) {351 if (!data) {
362 return HttpServerResponse.text("Internal Server Error", { status: 500 });352 return HttpServerResponse.text("Internal Server Error", { status: 500 });
363 }353 }
apps/server/src/orchestration/Layers/ProjectionPipeline.ts+2-4
...@@ -335,7 +335,7 @@ const runAttachmentSideEffects = Effect.fn("runAttachmentSideEffects")(function*...@@ -335,7 +335,7 @@ const runAttachmentSideEffects = Effect.fn("runAttachmentSideEffects")(function*
335 const attachmentsRootDir = serverConfig.attachmentsDir;335 const attachmentsRootDir = serverConfig.attachmentsDir;
336 const readAttachmentRootEntries = fileSystem336 const readAttachmentRootEntries = fileSystem
337 .readDirectory(attachmentsRootDir, { recursive: false })337 .readDirectory(attachmentsRootDir, { recursive: false })
338 .pipe(Effect.catch(() => Effect.succeed([] as Array<string>)));338 .pipe(Effect.orElseSucceed(() => [] as Array<string>));
339339
340 const removeDeletedThreadAttachmentEntry = Effect.fn("removeDeletedThreadAttachmentEntry")(340 const removeDeletedThreadAttachmentEntry = Effect.fn("removeDeletedThreadAttachmentEntry")(
341 function* (threadSegment: string, entry: string) {341 function* (threadSegment: string, entry: string) {
...@@ -397,9 +397,7 @@ const runAttachmentSideEffects = Effect.fn("runAttachmentSideEffects")(function*...@@ -397,9 +397,7 @@ const runAttachmentSideEffects = Effect.fn("runAttachmentSideEffects")(function*
397 }397 }
398398
399 const absolutePath = path.join(attachmentsRootDir, relativePath);399 const absolutePath = path.join(attachmentsRootDir, relativePath);
400 const fileInfo = yield* fileSystem400 const fileInfo = yield* fileSystem.stat(absolutePath).pipe(Effect.orElseSucceed(() => null));
401 .stat(absolutePath)
402 .pipe(Effect.catch(() => Effect.succeed(null)));
403 if (!fileInfo || fileInfo.type !== "File") {401 if (!fileInfo || fileInfo.type !== "File") {
404 return;402 return;
405 }403 }
apps/server/src/project/Layers/ProjectFaviconResolver.ts+2-4
...@@ -80,9 +80,7 @@ export const makeProjectFaviconResolver = Effect.gen(function* () {...@@ -80,9 +80,7 @@ export const makeProjectFaviconResolver = Effect.gen(function* () {
80 if (!isPathWithinProject(projectCwd, candidate)) {80 if (!isPathWithinProject(projectCwd, candidate)) {
81 continue;81 continue;
82 }82 }
83 const stats = yield* fileSystem83 const stats = yield* fileSystem.stat(candidate).pipe(Effect.orElseSucceed(() => null));
84 .stat(candidate)
85 .pipe(Effect.catch(() => Effect.succeed(null)));
86 if (stats?.type === "File") {84 if (stats?.type === "File") {
87 return candidate;85 return candidate;
88 }86 }
...@@ -105,7 +103,7 @@ export const makeProjectFaviconResolver = Effect.gen(function* () {...@@ -105,7 +103,7 @@ export const makeProjectFaviconResolver = Effect.gen(function* () {
105 const sourcePath = path.join(cwd, sourceFile);103 const sourcePath = path.join(cwd, sourceFile);
106 const source = yield* fileSystem104 const source = yield* fileSystem
107 .readFileString(sourcePath)105 .readFileString(sourcePath)
108 .pipe(Effect.catch(() => Effect.succeed(null)));106 .pipe(Effect.orElseSucceed(() => null));
109 if (!source) {107 if (!source) {
110 continue;108 continue;
111 }109 }
apps/server/src/provider/providerMaintenance.ts+3-3
...@@ -347,7 +347,7 @@ export const resolveProviderMaintenanceCapabilitiesEffect = Effect.fn(...@@ -347,7 +347,7 @@ export const resolveProviderMaintenanceCapabilitiesEffect = Effect.fn(
347 const fileSystem = yield* FileSystem.FileSystem;347 const fileSystem = yield* FileSystem.FileSystem;
348 const realCommandPath = yield* fileSystem348 const realCommandPath = yield* fileSystem
349 .realPath(resolvedCommandPath)349 .realPath(resolvedCommandPath)
350 .pipe(Effect.catch(() => Effect.succeed(resolvedCommandPath)));350 .pipe(Effect.orElseSucceed(() => resolvedCommandPath));
351 return resolver.resolve({351 return resolver.resolve({
352 ...options,352 ...options,
353 realCommandPath,353 realCommandPath,
...@@ -406,7 +406,7 @@ const fetchNpmLatestVersion = Effect.fn("fetchNpmLatestVersion")(function* (pack...@@ -406,7 +406,7 @@ const fetchNpmLatestVersion = Effect.fn("fetchNpmLatestVersion")(function* (pack
406 ).pipe(HttpClientRequest.setHeader("accept", "application/json"));406 ).pipe(HttpClientRequest.setHeader("accept", "application/json"));
407 const response = yield* client.execute(request).pipe(407 const response = yield* client.execute(request).pipe(
408 Effect.timeoutOption(LATEST_VERSION_TIMEOUT_MS),408 Effect.timeoutOption(LATEST_VERSION_TIMEOUT_MS),
409 Effect.catch(() => Effect.succeed(Option.none())),409 Effect.orElseSucceed(() => Option.none()),
410 );410 );
411 if (Option.isNone(response)) {411 if (Option.isNone(response)) {
412 return null;412 return null;
...@@ -417,7 +417,7 @@ const fetchNpmLatestVersion = Effect.fn("fetchNpmLatestVersion")(function* (pack...@@ -417,7 +417,7 @@ const fetchNpmLatestVersion = Effect.fn("fetchNpmLatestVersion")(function* (pack
417 }417 }
418 const payload = yield* httpResponse.json.pipe(418 const payload = yield* httpResponse.json.pipe(
419 Effect.flatMap(Schema.decodeUnknownEffect(NpmLatestVersionResponse)),419 Effect.flatMap(Schema.decodeUnknownEffect(NpmLatestVersionResponse)),
420 Effect.catch(() => Effect.succeed(null)),420 Effect.orElseSucceed(() => null),
421 );421 );
422 return payload ? nonEmptyString(payload.version) : null;422 return payload ? nonEmptyString(payload.version) : null;
423});423});
apps/server/src/review/ReviewService.ts+1-3
...@@ -35,9 +35,7 @@ export const make = Effect.fn("makeReviewService")(function* () {...@@ -35,9 +35,7 @@ export const make = Effect.fn("makeReviewService")(function* () {
35 const git = yield* GitVcsDriver.GitVcsDriver;35 const git = yield* GitVcsDriver.GitVcsDriver;
3636
37 const canonicalizePath = (value: string) =>37 const canonicalizePath = (value: string) =>
38 fileSystem38 fileSystem.realPath(path.resolve(value)).pipe(Effect.orElseSucceed(() => path.resolve(value)));
39 .realPath(path.resolve(value))
40 .pipe(Effect.catch(() => Effect.succeed(path.resolve(value))));
4139
42 const isWithinRoot = (candidate: string, root: string) => {40 const isWithinRoot = (candidate: string, root: string) => {
43 const relative = path.relative(root, candidate);41 const relative = path.relative(root, candidate);
apps/server/src/sourceControl/BitbucketApi.ts+6-6
...@@ -359,7 +359,7 @@ function responseError(...@@ -359,7 +359,7 @@ function responseError(
359 response: HttpClientResponse.HttpClientResponse,359 response: HttpClientResponse.HttpClientResponse,
360): Effect.Effect<never, BitbucketApiError> {360): Effect.Effect<never, BitbucketApiError> {
361 return response.text.pipe(361 return response.text.pipe(
362 Effect.catch(() => Effect.succeed("")),362 Effect.orElseSucceed(() => ""),
363 Effect.flatMap((body) =>363 Effect.flatMap((body) =>
364 Effect.fail(364 Effect.fail(
365 new BitbucketApiError({365 new BitbucketApiError({
...@@ -524,7 +524,7 @@ export const make = Effect.fn("makeBitbucketApi")(function* () {...@@ -524,7 +524,7 @@ export const make = Effect.fn("makeBitbucketApi")(function* () {
524 );524 );
525525
526 const readConfigValueNullable = (cwd: string, key: string) =>526 const readConfigValueNullable = (cwd: string, key: string) =>
527 git.readConfigValue(cwd, key).pipe(Effect.catch(() => Effect.succeed(null)));527 git.readConfigValue(cwd, key).pipe(Effect.orElseSucceed(() => null));
528528
529 const resolveCheckoutRemote = Effect.fn("BitbucketApi.resolveCheckoutRemote")(function* (input: {529 const resolveCheckoutRemote = Effect.fn("BitbucketApi.resolveCheckoutRemote")(function* (input: {
530 readonly cwd: string;530 readonly cwd: string;
...@@ -544,7 +544,7 @@ export const make = Effect.fn("makeBitbucketApi")(function* () {...@@ -544,7 +544,7 @@ export const make = Effect.fn("makeBitbucketApi")(function* () {
544 if (!input.isCrossRepository) {544 if (!input.isCrossRepository) {
545 const remoteName = yield* git545 const remoteName = yield* git
546 .resolvePrimaryRemoteName(input.cwd)546 .resolvePrimaryRemoteName(input.cwd)
547 .pipe(Effect.catch(() => Effect.succeed(null)));547 .pipe(Effect.orElseSucceed(() => null));
548 if (remoteName) return remoteName;548 if (remoteName) return remoteName;
549 }549 }
550550
...@@ -575,7 +575,7 @@ export const make = Effect.fn("makeBitbucketApi")(function* () {...@@ -575,7 +575,7 @@ export const make = Effect.fn("makeBitbucketApi")(function* () {
575 host: Option.some("bitbucket.org"),575 host: Option.some("bitbucket.org"),
576 detail: Option.none<string>(),576 detail: Option.none<string>(),
577 })),577 })),
578 Effect.catch(() => Effect.succeed(authFromConfig(config))),578 Effect.orElseSucceed(() => authFromConfig(config)),
579 ),579 ),
580 listPullRequests: (input) =>580 listPullRequests: (input) =>
581 resolveRepository(input).pipe(581 resolveRepository(input).pipe(
...@@ -685,8 +685,8 @@ export const make = Effect.fn("makeBitbucketApi")(function* () {...@@ -685,8 +685,8 @@ export const make = Effect.fn("makeBitbucketApi")(function* () {
685 {685 {
686 repository: getRepositoryFromLocator(locator),686 repository: getRepositoryFromLocator(locator),
687 branchingModel: getBranchingModelFromLocator(locator).pipe(687 branchingModel: getBranchingModelFromLocator(locator).pipe(
688 Effect.catch(() =>688 Effect.orElseSucceed(
689 Effect.succeed<typeof RawBitbucketBranchingModelSchema.Type | null>(null),689 (): typeof RawBitbucketBranchingModelSchema.Type | null => null,
690 ),690 ),
691 ),691 ),
692 },692 },
apps/server/src/sourceControl/SourceControlProviderDiscovery.ts+1-1
...@@ -299,7 +299,7 @@ export const refineUnknownRemoteProvider = Effect.fn("refineUnknownRemoteProvide...@@ -299,7 +299,7 @@ export const refineUnknownRemoteProvider = Effect.fn("refineUnknownRemoteProvide
299 auth,299 auth,
300 }),300 }),
301 ),301 ),
302 Effect.catch(() => Effect.succeed(null)),302 Effect.orElseSucceed(() => null),
303 ),303 ),
304 );304 );
305 const provider = providers.find((candidate) => candidate !== null);305 const provider = providers.find((candidate) => candidate !== null);
apps/server/src/sourceControl/SourceControlRepositoryService.ts+2-4
...@@ -277,12 +277,10 @@ export const make = Effect.fn("makeSourceControlRepositoryService")(function* ()...@@ -277,12 +277,10 @@ export const make = Effect.fn("makeSourceControlRepositoryService")(function* ()
277 })277 })
278 .pipe(278 .pipe(
279 Effect.map(() => true),279 Effect.map(() => true),
280 Effect.catch(() => Effect.succeed(false)),280 Effect.orElseSucceed(() => false),
281 );281 );
282 if (!hasCommits) {282 if (!hasCommits) {
283 const details = yield* git283 const details = yield* git.statusDetails(input.cwd).pipe(Effect.orElseSucceed(() => null));
284 .statusDetails(input.cwd)
285 .pipe(Effect.catch(() => Effect.succeed(null)));
286 return {284 return {
287 repository: toRepositoryInfo(providerKind, urls),285 repository: toRepositoryInfo(providerKind, urls),
288 remoteName,286 remoteName,
apps/server/src/telemetry/Layers/AnalyticsService.test.ts+1-1
...@@ -62,7 +62,7 @@ it.layer(NodeServices.layer)("AnalyticsService test", (it) => {...@@ -62,7 +62,7 @@ it.layer(NodeServices.layer)("AnalyticsService test", (it) => {
6262
63 const payload = yield* request.json.pipe(63 const payload = yield* request.json.pipe(
64 Effect.map((body) => body as RecordedBatchRequest["body"]),64 Effect.map((body) => body as RecordedBatchRequest["body"]),
65 Effect.catch(() => Effect.succeed(null)),65 Effect.orElseSucceed(() => null),
66 );66 );
6767
68 capturedRequests.push({ path: request.url, body: payload });68 capturedRequests.push({ path: request.url, body: payload });
apps/server/src/terminal/Layers/BunPTY.ts+2
...@@ -1,3 +1,5 @@...@@ -1,3 +1,5 @@
1/// <reference types="bun" />
2
1import * as Effect from "effect/Effect";3import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";4import * as Layer from "effect/Layer";
3import { PtyAdapter } from "../Services/PTY.ts";5import { PtyAdapter } from "../Services/PTY.ts";
apps/server/src/terminal/Layers/Manager.ts+1-1
...@@ -1289,7 +1289,7 @@ export const makeTerminalManagerWithOptions = Effect.fn("makeTerminalManagerWith...@@ -1289,7 +1289,7 @@ export const makeTerminalManagerWithOptions = Effect.fn("makeTerminalManagerWith
1289 const threadPrefix = `${toSafeThreadId(threadId)}_`;1289 const threadPrefix = `${toSafeThreadId(threadId)}_`;
1290 const entries = yield* fileSystem1290 const entries = yield* fileSystem
1291 .readDirectory(logsDir, { recursive: false })1291 .readDirectory(logsDir, { recursive: false })
1292 .pipe(Effect.catch(() => Effect.succeed([] as Array<string>)));1292 .pipe(Effect.orElseSucceed(() => [] as Array<string>));
1293 yield* Effect.forEach(1293 yield* Effect.forEach(
1294 entries.filter(1294 entries.filter(
1295 (name) =>1295 (name) =>
apps/server/src/textGeneration/CodexTextGeneration.ts+1-3
...@@ -140,9 +140,7 @@ export const makeCodexTextGeneration = Effect.fn("makeCodexTextGeneration")(func...@@ -140,9 +140,7 @@ export const makeCodexTextGeneration = Effect.fn("makeCodexTextGeneration")(func
140 if (!resolvedPath || !path.isAbsolute(resolvedPath)) {140 if (!resolvedPath || !path.isAbsolute(resolvedPath)) {
141 continue;141 continue;
142 }142 }
143 const fileInfo = yield* fileSystem143 const fileInfo = yield* fileSystem.stat(resolvedPath).pipe(Effect.orElseSucceed(() => null));
144 .stat(resolvedPath)
145 .pipe(Effect.catch(() => Effect.succeed(null)));
146 if (!fileInfo || fileInfo.type !== "File") {144 if (!fileInfo || fileInfo.type !== "File") {
147 continue;145 continue;
148 }146 }
apps/server/src/vcs/GitVcsDriver.ts+1-1
...@@ -403,7 +403,7 @@ export const makeVcsDriverShape = Effect.fn("makeGitVcsDriverShape")(function* (...@@ -403,7 +403,7 @@ export const makeVcsDriverShape = Effect.fn("makeGitVcsDriverShape")(function* (
403 "GitVcsDriver.detectRepository.commonDir",403 "GitVcsDriver.detectRepository.commonDir",
404 cwd,404 cwd,
405 ["rev-parse", "--git-common-dir"],405 ["rev-parse", "--git-common-dir"],
406 ).pipe(Effect.catch(() => Effect.succeed(null)));406 ).pipe(Effect.orElseSucceed(() => null));
407407
408 return {408 return {
409 kind: "git" as const,409 kind: "git" as const,
apps/server/src/vcs/GitVcsDriverCore.ts+29-37
...@@ -885,7 +885,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -885,7 +885,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
885885
886 const remoteNames = yield* runGitStdout("GitVcsDriver.listRemoteNames", cwd, ["remote"]).pipe(886 const remoteNames = yield* runGitStdout("GitVcsDriver.listRemoteNames", cwd, ["remote"]).pipe(
887 Effect.map(parseRemoteNames),887 Effect.map(parseRemoteNames),
888 Effect.catch(() => Effect.succeed<ReadonlyArray<string>>([])),888 Effect.orElseSucceed((): ReadonlyArray<string> => []),
889 );889 );
890 return (890 return (
891 parseUpstreamRefWithRemoteNames(upstreamRef, remoteNames) ??891 parseUpstreamRefWithRemoteNames(upstreamRef, remoteNames) ??
...@@ -996,7 +996,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -996,7 +996,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
996 cwd: string,996 cwd: string,
997 branchName: string,997 branchName: string,
998 ) {998 ) {
999 const remoteNames = yield* listRemoteNames(cwd).pipe(Effect.catch(() => Effect.succeed([])));999 const remoteNames = yield* listRemoteNames(cwd).pipe(Effect.orElseSucceed(() => []));
1000 const parsedRemoteRef = parseRemoteRefWithRemoteNames(branchName, remoteNames);1000 const parsedRemoteRef = parseRemoteRefWithRemoteNames(branchName, remoteNames);
1001 return parsedRemoteRef?.branchName ?? branchName;1001 return parsedRemoteRef?.branchName ?? branchName;
1002 });1002 });
...@@ -1042,7 +1042,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1042,7 +1042,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1042 return pushDefaultRemote;1042 return pushDefaultRemote;
1043 }1043 }
10441044
1045 return yield* resolvePrimaryRemoteName(cwd).pipe(Effect.catch(() => Effect.succeed(null)));1045 return yield* resolvePrimaryRemoteName(cwd).pipe(Effect.orElseSucceed(() => null));
1046 });1046 });
10471047
1048 const ensureRemote: GitVcsDriver.GitVcsDriverShape["ensureRemote"] = Effect.fn("ensureRemote")(1048 const ensureRemote: GitVcsDriver.GitVcsDriverShape["ensureRemote"] = Effect.fn("ensureRemote")(
...@@ -1090,7 +1090,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1090,7 +1090,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1090 ).pipe(Effect.map((stdout) => stdout.trim()));1090 ).pipe(Effect.map((stdout) => stdout.trim()));
10911091
1092 const primaryRemoteName = yield* resolvePrimaryRemoteName(cwd).pipe(1092 const primaryRemoteName = yield* resolvePrimaryRemoteName(cwd).pipe(
1093 Effect.catch(() => Effect.succeed(null)),1093 Effect.orElseSucceed(() => null),
1094 );1094 );
1095 const defaultBranch =1095 const defaultBranch =
1096 primaryRemoteName === null ? null : yield* resolveDefaultBranchName(cwd, primaryRemoteName);1096 primaryRemoteName === null ? null : yield* resolveDefaultBranchName(cwd, primaryRemoteName);
...@@ -1231,7 +1231,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1231,7 +1231,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1231 allowNonZeroExit: true,1231 allowNonZeroExit: true,
1232 },1232 },
1233 ),1233 ),
1234 originRemoteExists(cwd).pipe(Effect.catch(() => Effect.succeed(false))),1234 originRemoteExists(cwd).pipe(Effect.orElseSucceed(() => false)),
1235 ],1235 ],
1236 { concurrency: "unbounded" },1236 { concurrency: "unbounded" },
1237 );1237 );
...@@ -1276,9 +1276,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1276,9 +1276,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
12761276
1277 const fallbackAheadCount =1277 const fallbackAheadCount =
1278 !upstreamRef && refName1278 !upstreamRef && refName
1279 ? yield* computeAheadCountAgainstBase(cwd, refName).pipe(1279 ? yield* computeAheadCountAgainstBase(cwd, refName).pipe(Effect.orElseSucceed(() => 0))
1280 Effect.catch(() => Effect.succeed(0)),
1281 )
1282 : null;1280 : null;
12831281
1284 if (fallbackAheadCount !== null) {1282 if (fallbackAheadCount !== null) {
...@@ -1294,9 +1292,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1294,9 +1292,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1294 aheadOfDefaultCount =1292 aheadOfDefaultCount =
1295 fallbackAheadCount !== null1293 fallbackAheadCount !== null
1296 ? fallbackAheadCount1294 ? fallbackAheadCount
1297 : yield* computeAheadCountAgainstBase(cwd, refName).pipe(1295 : yield* computeAheadCountAgainstBase(cwd, refName).pipe(Effect.orElseSucceed(() => 0));
1298 Effect.catch(() => Effect.succeed(0)),
1299 );
1300 }1296 }
13011297
1302 const stagedEntries = parseNumstatEntries(stagedNumstatStdout);1298 const stagedEntries = parseNumstatEntries(stagedNumstatStdout);
...@@ -1494,11 +1490,11 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1494,11 +1490,11 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1494 }1490 }
14951491
1496 const comparableBaseBranch = yield* resolveBaseBranchForNoUpstream(cwd, branch).pipe(1492 const comparableBaseBranch = yield* resolveBaseBranchForNoUpstream(cwd, branch).pipe(
1497 Effect.catch(() => Effect.succeed(null)),1493 Effect.orElseSucceed(() => null),
1498 );1494 );
1499 if (comparableBaseBranch) {1495 if (comparableBaseBranch) {
1500 const publishRemoteName = yield* resolvePushRemoteName(cwd, branch).pipe(1496 const publishRemoteName = yield* resolvePushRemoteName(cwd, branch).pipe(
1501 Effect.catch(() => Effect.succeed(null)),1497 Effect.orElseSucceed(() => null),
1502 );1498 );
1503 if (!publishRemoteName) {1499 if (!publishRemoteName) {
1504 return {1500 return {
...@@ -1508,7 +1504,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1508,7 +1504,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1508 }1504 }
15091505
1510 const hasRemoteBranch = yield* remoteBranchExists(cwd, publishRemoteName, branch).pipe(1506 const hasRemoteBranch = yield* remoteBranchExists(cwd, publishRemoteName, branch).pipe(
1511 Effect.catch(() => Effect.succeed(false)),1507 Effect.orElseSucceed(() => false),
1512 );1508 );
1513 if (hasRemoteBranch) {1509 if (hasRemoteBranch) {
1514 return {1510 return {
...@@ -1545,7 +1541,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1545,7 +1541,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1545 }1541 }
15461542
1547 const currentUpstream = yield* resolveCurrentUpstream(cwd).pipe(1543 const currentUpstream = yield* resolveCurrentUpstream(cwd).pipe(
1548 Effect.catch(() => Effect.succeed(null)),1544 Effect.orElseSucceed(() => null),
1549 );1545 );
1550 if (currentUpstream) {1546 if (currentUpstream) {
1551 yield* runGit("GitVcsDriver.pushCurrentBranch.pushUpstream", cwd, [1547 yield* runGit("GitVcsDriver.pushCurrentBranch.pushUpstream", cwd, [
...@@ -1716,7 +1712,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1716,7 +1712,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1716 input.baseRef ??1712 input.baseRef ??
1717 (branch1713 (branch
1718 ? yield* resolveBaseBranchForNoUpstream(input.cwd, branch).pipe(1714 ? yield* resolveBaseBranchForNoUpstream(input.cwd, branch).pipe(
1719 Effect.catch(() => Effect.succeed(null)),1715 Effect.orElseSucceed(() => null),
1720 )1716 )
1721 : null);1717 : null);
17221718
...@@ -1729,18 +1725,16 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1729,18 +1725,16 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1729 appendTruncationMarker: true,1725 appendTruncationMarker: true,
1730 },1726 },
1731 ).pipe(1727 ).pipe(
1732 Effect.catch(() =>1728 Effect.orElseSucceed(() => ({
1733 Effect.succeed({1729 exitCode: 0,
1734 exitCode: 0,1730 stdout: "",
1735 stdout: "",1731 stderr: "",
1736 stderr: "",1732 stdoutTruncated: false,
1737 stdoutTruncated: false,1733 stderrTruncated: false,
1738 stderrTruncated: false,1734 })),
1739 }),
1740 ),
1741 );1735 );
1742 const dirtyUntracked = yield* readUntrackedReviewDiffs(input.cwd).pipe(1736 const dirtyUntracked = yield* readUntrackedReviewDiffs(input.cwd).pipe(
1743 Effect.catch(() => Effect.succeed({ diff: "", truncated: false })),1737 Effect.orElseSucceed(() => ({ diff: "", truncated: false })),
1744 );1738 );
1745 const dirtyDiff = [dirtyTrackedResult.stdout.trimEnd(), dirtyUntracked.diff.trimEnd()]1739 const dirtyDiff = [dirtyTrackedResult.stdout.trimEnd(), dirtyUntracked.diff.trimEnd()]
1746 .filter((diff) => diff.length > 0)1740 .filter((diff) => diff.length > 0)
...@@ -1757,15 +1751,13 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1757,15 +1751,13 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1757 appendTruncationMarker: true,1751 appendTruncationMarker: true,
1758 },1752 },
1759 ).pipe(1753 ).pipe(
1760 Effect.catch(() =>1754 Effect.orElseSucceed(() => ({
1761 Effect.succeed({1755 exitCode: 0,
1762 exitCode: 0,1756 stdout: "",
1763 stdout: "",1757 stderr: "",
1764 stderr: "",1758 stdoutTruncated: false,
1765 stdoutTruncated: false,1759 stderrTruncated: false,
1766 stderrTruncated: false,1760 })),
1767 }),
1768 ),
1769 )1761 )
1770 : null;1762 : null;
1771 const baseDiff = baseResult?.stdout ?? "";1763 const baseDiff = baseResult?.stdout ?? "";
...@@ -1827,7 +1819,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1827,7 +1819,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1827 const listRefs: GitVcsDriver.GitVcsDriverShape["listRefs"] = Effect.fn("listRefs")(1819 const listRefs: GitVcsDriver.GitVcsDriverShape["listRefs"] = Effect.fn("listRefs")(
1828 function* (input) {1820 function* (input) {
1829 const branchRecencyPromise = readBranchRecency(input.cwd).pipe(1821 const branchRecencyPromise = readBranchRecency(input.cwd).pipe(
1830 Effect.catch(() => Effect.succeed(new Map<string, number>())),1822 Effect.orElseSucceed(() => new Map<string, number>()),
1831 );1823 );
1832 const localBranchResult = yield* executeGit(1824 const localBranchResult = yield* executeGit(
1833 "GitVcsDriver.listRefs.branchNoColor",1825 "GitVcsDriver.listRefs.branchNoColor",
...@@ -1970,7 +1962,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*...@@ -1970,7 +1962,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function*
1970 const candidatePath = line.slice("worktree ".length);1962 const candidatePath = line.slice("worktree ".length);
1971 const exists = yield* fileSystem.stat(candidatePath).pipe(1963 const exists = yield* fileSystem.stat(candidatePath).pipe(
1972 Effect.map(() => true),1964 Effect.map(() => true),
1973 Effect.catch(() => Effect.succeed(false)),1965 Effect.orElseSucceed(() => false),
1974 );1966 );
1975 currentPath = exists ? candidatePath : null;1967 currentPath = exists ? candidatePath : null;
1976 } else if (line.startsWith("branch refs/heads/") && currentPath) {1968 } else if (line.startsWith("branch refs/heads/") && currentPath) {
apps/server/src/workspace/Layers/WorkspaceEntries.ts+6-6
...@@ -188,7 +188,7 @@ export const makeWorkspaceEntries = Effect.gen(function* () {...@@ -188,7 +188,7 @@ export const makeWorkspaceEntries = Effect.gen(function* () {
188 const isInsideVcsWorkTree = (cwd: string): Effect.Effect<boolean> =>188 const isInsideVcsWorkTree = (cwd: string): Effect.Effect<boolean> =>
189 vcsRegistry.detect({ cwd }).pipe(189 vcsRegistry.detect({ cwd }).pipe(
190 Effect.map((handle) => handle !== null),190 Effect.map((handle) => handle !== null),
191 Effect.catch(() => Effect.succeed(false)),191 Effect.orElseSucceed(() => false),
192 );192 );
193193
194 const filterVcsIgnoredPaths = (194 const filterVcsIgnoredPaths = (
...@@ -200,23 +200,23 @@ export const makeWorkspaceEntries = Effect.gen(function* () {...@@ -200,23 +200,23 @@ export const makeWorkspaceEntries = Effect.gen(function* () {
200 handle200 handle
201 ? handle.driver.filterIgnoredPaths(cwd, relativePaths).pipe(201 ? handle.driver.filterIgnoredPaths(cwd, relativePaths).pipe(
202 Effect.map((paths) => [...paths]),202 Effect.map((paths) => [...paths]),
203 Effect.catch(() => Effect.succeed(relativePaths)),203 Effect.orElseSucceed(() => relativePaths),
204 )204 )
205 : Effect.succeed(relativePaths),205 : Effect.succeed(relativePaths),
206 ),206 ),
207 Effect.catch(() => Effect.succeed(relativePaths)),207 Effect.orElseSucceed(() => relativePaths),
208 );208 );
209209
210 const buildWorkspaceIndexFromVcs = Effect.fn("WorkspaceEntries.buildWorkspaceIndexFromVcs")(210 const buildWorkspaceIndexFromVcs = Effect.fn("WorkspaceEntries.buildWorkspaceIndexFromVcs")(
211 function* (cwd: string) {211 function* (cwd: string) {
212 const vcs = yield* vcsRegistry.detect({ cwd }).pipe(Effect.catch(() => Effect.succeed(null)));212 const vcs = yield* vcsRegistry.detect({ cwd }).pipe(Effect.orElseSucceed(() => null));
213 if (!vcs) {213 if (!vcs) {
214 return null;214 return null;
215 }215 }
216216
217 const listedFiles = yield* vcs.driver217 const listedFiles = yield* vcs.driver
218 .listWorkspaceFiles(cwd)218 .listWorkspaceFiles(cwd)
219 .pipe(Effect.catch(() => Effect.succeed(null)));219 .pipe(Effect.orElseSucceed(() => null));
220220
221 if (!listedFiles) {221 if (!listedFiles) {
222 return null;222 return null;
...@@ -431,7 +431,7 @@ export const makeWorkspaceEntries = Effect.gen(function* () {...@@ -431,7 +431,7 @@ export const makeWorkspaceEntries = Effect.gen(function* () {
431 const invalidate: WorkspaceEntriesShape["invalidate"] = Effect.fn("WorkspaceEntries.invalidate")(431 const invalidate: WorkspaceEntriesShape["invalidate"] = Effect.fn("WorkspaceEntries.invalidate")(
432 function* (cwd) {432 function* (cwd) {
433 const normalizedCwd = yield* normalizeWorkspaceRoot(cwd).pipe(433 const normalizedCwd = yield* normalizeWorkspaceRoot(cwd).pipe(
434 Effect.catch(() => Effect.succeed(cwd)),434 Effect.orElseSucceed(() => cwd),
435 );435 );
436 yield* Cache.invalidate(workspaceIndexCache, cwd);436 yield* Cache.invalidate(workspaceIndexCache, cwd);
437 if (normalizedCwd !== cwd) {437 if (normalizedCwd !== cwd) {
apps/server/src/workspace/Layers/WorkspaceFileSystem.test.ts+1-1
...@@ -132,7 +132,7 @@ it.layer(TestLayer)("WorkspaceFileSystemLive", (it) => {...@@ -132,7 +132,7 @@ it.layer(TestLayer)("WorkspaceFileSystemLive", (it) => {
132 const escapedPath = path.resolve(cwd, "..", "escape.md");132 const escapedPath = path.resolve(cwd, "..", "escape.md");
133 const escapedStat = yield* fileSystem133 const escapedStat = yield* fileSystem
134 .stat(escapedPath)134 .stat(escapedPath)
135 .pipe(Effect.catch(() => Effect.succeed(null)));135 .pipe(Effect.orElseSucceed(() => null));
136 expect(escapedStat).toBeNull();136 expect(escapedStat).toBeNull();
137 }),137 }),
138 );138 );
apps/server/src/workspace/Layers/WorkspacePaths.ts+2-2
...@@ -37,7 +37,7 @@ export const makeWorkspacePaths = Effect.gen(function* () {...@@ -37,7 +37,7 @@ export const makeWorkspacePaths = Effect.gen(function* () {
37 const normalizedWorkspaceRoot = path.resolve(expandHomePath(workspaceRoot.trim(), path));37 const normalizedWorkspaceRoot = path.resolve(expandHomePath(workspaceRoot.trim(), path));
38 let workspaceStat = yield* fileSystem38 let workspaceStat = yield* fileSystem
39 .stat(normalizedWorkspaceRoot)39 .stat(normalizedWorkspaceRoot)
40 .pipe(Effect.catch(() => Effect.succeed(null)));40 .pipe(Effect.orElseSucceed(() => null));
41 if (!workspaceStat && options?.createIfMissing) {41 if (!workspaceStat && options?.createIfMissing) {
42 yield* fileSystem.makeDirectory(normalizedWorkspaceRoot, { recursive: true }).pipe(42 yield* fileSystem.makeDirectory(normalizedWorkspaceRoot, { recursive: true }).pipe(
43 Effect.mapError(43 Effect.mapError(
...@@ -50,7 +50,7 @@ export const makeWorkspacePaths = Effect.gen(function* () {...@@ -50,7 +50,7 @@ export const makeWorkspacePaths = Effect.gen(function* () {
50 );50 );
51 workspaceStat = yield* fileSystem51 workspaceStat = yield* fileSystem
52 .stat(normalizedWorkspaceRoot)52 .stat(normalizedWorkspaceRoot)
53 .pipe(Effect.catch(() => Effect.succeed(null)));53 .pipe(Effect.orElseSucceed(() => null));
54 }54 }
55 if (!workspaceStat) {55 if (!workspaceStat) {
56 return yield* new WorkspaceRootNotExistsError({56 return yield* new WorkspaceRootNotExistsError({
apps/server/src/ws.ts+5-5
...@@ -436,7 +436,7 @@ const makeWsRpcLayer = (currentSession: AuthenticatedSession) =>...@@ -436,7 +436,7 @@ const makeWsRpcLayer = (currentSession: AuthenticatedSession) =>
436 repositoryIdentity,436 repositoryIdentity,
437 },437 },
438 } satisfies OrchestrationEvent;438 } satisfies OrchestrationEvent;
439 }).pipe(Effect.catch(() => Effect.succeed(event)));439 }).pipe(Effect.orElseSucceed(() => event));
440 default:440 default:
441 return Effect.succeed(event);441 return Effect.succeed(event);
442 }442 }
...@@ -459,7 +459,7 @@ const makeWsRpcLayer = (currentSession: AuthenticatedSession) =>...@@ -459,7 +459,7 @@ const makeWsRpcLayer = (currentSession: AuthenticatedSession) =>
459 project: nextProject,459 project: nextProject,
460 })),460 })),
461 ),461 ),
462 Effect.catch(() => Effect.succeed(Option.none())),462 Effect.orElseSucceed(() => Option.none()),
463 );463 );
464 case "project.deleted":464 case "project.deleted":
465 return Effect.succeed(465 return Effect.succeed(
...@@ -487,7 +487,7 @@ const makeWsRpcLayer = (currentSession: AuthenticatedSession) =>...@@ -487,7 +487,7 @@ const makeWsRpcLayer = (currentSession: AuthenticatedSession) =>
487 thread: nextThread,487 thread: nextThread,
488 })),488 })),
489 ),489 ),
490 Effect.catch(() => Effect.succeed(Option.none())),490 Effect.orElseSucceed(() => Option.none()),
491 );491 );
492 default:492 default:
493 if (event.aggregateKind !== "thread") {493 if (event.aggregateKind !== "thread") {
...@@ -503,7 +503,7 @@ const makeWsRpcLayer = (currentSession: AuthenticatedSession) =>...@@ -503,7 +503,7 @@ const makeWsRpcLayer = (currentSession: AuthenticatedSession) =>
503 thread: nextThread,503 thread: nextThread,
504 })),504 })),
505 ),505 ),
506 Effect.catch(() => Effect.succeed(Option.none())),506 Effect.orElseSucceed(() => Option.none()),
507 );507 );
508 }508 }
509 };509 };
...@@ -777,7 +777,7 @@ const makeWsRpcLayer = (currentSession: AuthenticatedSession) =>...@@ -777,7 +777,7 @@ const makeWsRpcLayer = (currentSession: AuthenticatedSession) =>
777 thread.session !== null && thread.session.status !== "stopped",777 thread.session !== null && thread.session.status !== "stopped",
778 }),778 }),
779 ),779 ),
780 Effect.catch(() => Effect.succeed(false)),780 Effect.orElseSucceed(() => false),
781 )781 )
782 : false;782 : false;
783 const result = yield* dispatchNormalizedCommand(normalizedCommand);783 const result = yield* dispatchNormalizedCommand(normalizedCommand);
apps/server/tsconfig.json+1-1
...@@ -1,7 +1,7 @@...@@ -1,7 +1,7 @@
1{1{
2 "extends": "../../tsconfig.base.json",2 "extends": "../../tsconfig.base.json",
3 "compilerOptions": {3 "compilerOptions": {
4 "types": ["node", "bun"],4 "types": ["node"],
5 "lib": ["ESNext", "esnext.disposable"]5 "lib": ["ESNext", "esnext.disposable"]
6 },6 },
7 "include": ["src", "vite.config.ts", "scripts", "integration", "../../scripts/lib"]7 "include": ["src", "vite.config.ts", "scripts", "integration", "../../scripts/lib"]
infra/relay/scripts/deploy.ts+1-1
...@@ -95,7 +95,7 @@ const loadDeployConfigProvider = Effect.fn("relay.deploy.loadConfigProvider")(fu...@@ -95,7 +95,7 @@ const loadDeployConfigProvider = Effect.fn("relay.deploy.loadConfigProvider")(fu
95 }95 }
9696
97 return yield* ConfigProvider.fromDotEnv({ path: path.join(root, ".env") }).pipe(97 return yield* ConfigProvider.fromDotEnv({ path: path.join(root, ".env") }).pipe(
98 Effect.catch(() => Effect.succeed(ConfigProvider.fromEnv())),98 Effect.orElseSucceed(() => ConfigProvider.fromEnv()),
99 );99 );
100});100});
101101
infra/relay/src/auth/RelayTokens.ts+1-1
...@@ -161,7 +161,7 @@ const make = Effect.gen(function* () {...@@ -161,7 +161,7 @@ const make = Effect.gen(function* () {
161 }161 }
162 return claims;162 return claims;
163 }),163 }),
164 Effect.catch(() => Effect.succeed(null)),164 Effect.orElseSucceed(() => null),
165 ),165 ),
166 );166 );
167167
infra/relay/src/environments/ManagedEndpointProvider.ts+1-1
...@@ -242,7 +242,7 @@ const make = Effect.gen(function* () {...@@ -242,7 +242,7 @@ const make = Effect.gen(function* () {
242 .updateRecord(preferredDnsRecordId, dnsRecord)242 .updateRecord(preferredDnsRecordId, dnsRecord)
243 .pipe(243 .pipe(
244 Effect.as(true),244 Effect.as(true),
245 Effect.catch(() => Effect.succeed(false)),245 Effect.orElseSucceed(() => false),
246 );246 );
247 if (checkpointedRecordUpdated) {247 if (checkpointedRecordUpdated) {
248 return preferredDnsRecordId;248 return preferredDnsRecordId;
oxlint-plugin-t3code/package.json-1
...@@ -13,7 +13,6 @@...@@ -13,7 +13,6 @@
13 },13 },
14 "devDependencies": {14 "devDependencies": {
15 "@effect/vitest": "catalog:",15 "@effect/vitest": "catalog:",
16 "@types/bun": "catalog:",
17 "vite-plus": "catalog:"16 "vite-plus": "catalog:"
18 }17 }
19}18}
oxlint-plugin-t3code/tsconfig.json+1-1
...@@ -2,7 +2,7 @@...@@ -2,7 +2,7 @@
2 "extends": "../tsconfig.base.json",2 "extends": "../tsconfig.base.json",
3 "compilerOptions": {3 "compilerOptions": {
4 "composite": true,4 "composite": true,
5 "types": ["bun", "node"],5 "types": ["node"],
6 "lib": ["ESNext", "esnext.disposable"]6 "lib": ["ESNext", "esnext.disposable"]
7 },7 },
8 "include": ["**/*.ts"]8 "include": ["**/*.ts"]
package.json+1
...@@ -17,6 +17,7 @@...@@ -17,6 +17,7 @@
17 "build:marketing": "vp run --filter @t3tools/marketing build",17 "build:marketing": "vp run --filter @t3tools/marketing build",
18 "build:desktop": "vp run --filter @t3tools/desktop --filter t3 build",18 "build:desktop": "vp run --filter @t3tools/desktop --filter t3 build",
19 "typecheck": "vp run -r --concurrency-limit 2 typecheck",19 "typecheck": "vp run -r --concurrency-limit 2 typecheck",
20 "tc": "vp run -r --concurrency-limit 2 typecheck",
20 "lint": "vp lint --report-unused-disable-directives",21 "lint": "vp lint --report-unused-disable-directives",
21 "lint:mobile": "node scripts/mobile-native-static-check.ts",22 "lint:mobile": "node scripts/mobile-native-static-check.ts",
22 "test": "vp run -r test",23 "test": "vp run -r test",
packages/tailscale/src/tailscale.ts+1-1
...@@ -297,7 +297,7 @@ export const probeTailscaleHttpsEndpoint = (input: {...@@ -297,7 +297,7 @@ export const probeTailscaleHttpsEndpoint = (input: {
297 onNone: () => false,297 onNone: () => false,
298 onSome: (httpResponse) => httpResponse.status >= 200 && httpResponse.status < 300,298 onSome: (httpResponse) => httpResponse.status >= 200 && httpResponse.status < 300,
299 });299 });
300 }).pipe(Effect.catch(() => Effect.succeed(false)));300 }).pipe(Effect.orElseSucceed(() => false));
301301
302export const resolveTailscaleHttpsBaseUrl = (302export const resolveTailscaleHttpsBaseUrl = (
303 input: {303 input: {
pnpm-lock.yaml+69-169
...@@ -10,8 +10,8 @@ catalogs:...@@ -10,8 +10,8 @@ catalogs:
10 specifier: 4.0.0-beta.7810 specifier: 4.0.0-beta.78
11 version: 4.0.0-beta.7811 version: 4.0.0-beta.78
12 '@effect/tsgo':12 '@effect/tsgo':
13 specifier: 0.11.413 specifier: 0.13.2
14 version: 0.11.414 version: 0.13.2
15 '@noble/curves':15 '@noble/curves':
16 specifier: 1.9.116 specifier: 1.9.1
17 version: 1.9.117 version: 1.9.1
...@@ -21,12 +21,9 @@ catalogs:...@@ -21,12 +21,9 @@ catalogs:
21 '@pierre/diffs':21 '@pierre/diffs':
22 specifier: 1.1.2022 specifier: 1.1.20
23 version: 1.1.2023 version: 1.1.20
24 '@types/bun':
25 specifier: ^1.3.11
26 version: 1.3.14
27 '@typescript/native-preview':24 '@typescript/native-preview':
28 specifier: 7.0.0-dev.20260527.225 specifier: 7.0.0-dev.20260604.1
29 version: 7.0.0-dev.20260527.226 version: 7.0.0-dev.20260604.1
30 jose:27 jose:
31 specifier: 6.2.228 specifier: 6.2.2
32 version: 6.2.229 version: 6.2.2
...@@ -87,7 +84,7 @@ importers:...@@ -87,7 +84,7 @@ importers:
87 version: 7.28.6(@babel/core@7.29.7)84 version: 7.28.6(@babel/core@7.29.7)
88 '@effect/tsgo':85 '@effect/tsgo':
89 specifier: 'catalog:'86 specifier: 'catalog:'
90 version: 0.11.487 version: 0.13.2
91 '@oxlint/plugins':88 '@oxlint/plugins':
92 specifier: ^1.63.089 specifier: ^1.63.0
93 version: 1.68.090 version: 1.68.0
...@@ -96,7 +93,7 @@ importers:...@@ -96,7 +93,7 @@ importers:
96 version: 24.12.493 version: 24.12.4
97 '@typescript/native-preview':94 '@typescript/native-preview':
98 specifier: 'catalog:'95 specifier: 'catalog:'
99 version: 7.0.0-dev.20260527.296 version: 7.0.0-dev.20260604.1
100 vite-plus:97 vite-plus:
101 specifier: 'catalog:'98 specifier: 'catalog:'
102 version: 0.1.24(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)99 version: 0.1.24(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
...@@ -417,7 +414,7 @@ importers:...@@ -417,7 +414,7 @@ importers:
417 specifier: workspace:*414 specifier: workspace:*
418 version: link:../web415 version: link:../web
419 '@types/bun':416 '@types/bun':
420 specifier: 'catalog:'417 specifier: 1.3.14
421 version: 1.3.14418 version: 1.3.14
422 '@types/node':419 '@types/node':
423 specifier: 24.12.4420 specifier: 24.12.4
...@@ -644,9 +641,6 @@ importers:...@@ -644,9 +641,6 @@ importers:
644 '@effect/vitest':641 '@effect/vitest':
645 specifier: 4.0.0-beta.78642 specifier: 4.0.0-beta.78
646 version: 4.0.0-beta.78(patch_hash=42b87cc47e70d74e62496e7a8261b3fd298ecad4464d209348ab04b96f853a5f)(effect@4.0.0-beta.78(patch_hash=883249d8efbb462e928e21fefef96027b66aec50751178cafdce45f08eee3754))643 version: 4.0.0-beta.78(patch_hash=42b87cc47e70d74e62496e7a8261b3fd298ecad4464d209348ab04b96f853a5f)(effect@4.0.0-beta.78(patch_hash=883249d8efbb462e928e21fefef96027b66aec50751178cafdce45f08eee3754))
647 '@types/bun':
648 specifier: 'catalog:'
649 version: 1.3.14
650 vite-plus:644 vite-plus:
651 specifier: 'catalog:'645 specifier: 'catalog:'
652 version: 0.1.24(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)646 version: 0.1.24(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
...@@ -807,9 +801,6 @@ importers:...@@ -807,9 +801,6 @@ importers:
807801
808 scripts:802 scripts:
809 dependencies:803 dependencies:
810 '@anthropic-ai/claude-agent-sdk':
811 specifier: ^0.2.77
812 version: 0.2.141(zod@4.4.3)
813 '@effect/platform-node':804 '@effect/platform-node':
814 specifier: 4.0.0-beta.78805 specifier: 4.0.0-beta.78
815 version: 4.0.0-beta.78(bufferutil@4.1.0)(effect@4.0.0-beta.78(patch_hash=883249d8efbb462e928e21fefef96027b66aec50751178cafdce45f08eee3754))(ioredis@5.11.0)(utf-8-validate@6.0.6)806 version: 4.0.0-beta.78(bufferutil@4.1.0)(effect@4.0.0-beta.78(patch_hash=883249d8efbb462e928e21fefef96027b66aec50751178cafdce45f08eee3754))(ioredis@5.11.0)(utf-8-validate@6.0.6)
...@@ -829,9 +820,6 @@ importers:...@@ -829,9 +820,6 @@ importers:
829 '@effect/vitest':820 '@effect/vitest':
830 specifier: 4.0.0-beta.78821 specifier: 4.0.0-beta.78
831 version: 4.0.0-beta.78(patch_hash=42b87cc47e70d74e62496e7a8261b3fd298ecad4464d209348ab04b96f853a5f)(effect@4.0.0-beta.78(patch_hash=883249d8efbb462e928e21fefef96027b66aec50751178cafdce45f08eee3754))822 version: 4.0.0-beta.78(patch_hash=42b87cc47e70d74e62496e7a8261b3fd298ecad4464d209348ab04b96f853a5f)(effect@4.0.0-beta.78(patch_hash=883249d8efbb462e928e21fefef96027b66aec50751178cafdce45f08eee3754))
832 '@types/bun':
833 specifier: 'catalog:'
834 version: 1.3.14
835 vite-plus:823 vite-plus:
836 specifier: 'catalog:'824 specifier: 'catalog:'
837 version: 0.1.24(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)825 version: 0.1.24(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
...@@ -851,92 +839,46 @@ packages:...@@ -851,92 +839,46 @@ packages:
851 '@alchemy.run/node-utils@0.0.4':839 '@alchemy.run/node-utils@0.0.4':
852 resolution: {integrity: sha512-TiIhPXCTCi3tk0zmdYJJ14CNSesSfsJxXdIOP0HTSItQ1mZWLocrF7qCuEWKyW/IEFzp6kaiOf19aIA/mbCp1g==}840 resolution: {integrity: sha512-TiIhPXCTCi3tk0zmdYJJ14CNSesSfsJxXdIOP0HTSItQ1mZWLocrF7qCuEWKyW/IEFzp6kaiOf19aIA/mbCp1g==}
853841
854 '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.2.141':
855 resolution: {integrity: sha512-9HZ0ot6+FwOfQ1aeMqQLH4IJGMm/DcP08SysDxscVjBm6l2JjqleHohxi3zid0DurfGweqT+4x9GScJffwg55g==}
856 cpu: [arm64]
857 os: [darwin]
858
859 '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.159':842 '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.159':
860 resolution: {integrity: sha512-3nnH4yUNJVSyaU5DBlGw2yxc4zlnVvAnc9UOe+La47QVG7/dN+rWAgn4zCbqKk9bWFLDQ1Ek0r56EZE1Qo4UKQ==}843 resolution: {integrity: sha512-3nnH4yUNJVSyaU5DBlGw2yxc4zlnVvAnc9UOe+La47QVG7/dN+rWAgn4zCbqKk9bWFLDQ1Ek0r56EZE1Qo4UKQ==}
861 cpu: [arm64]844 cpu: [arm64]
862 os: [darwin]845 os: [darwin]
863846
864 '@anthropic-ai/claude-agent-sdk-darwin-x64@0.2.141':
865 resolution: {integrity: sha512-4iAdarJaQ+2R58s6QJswZCzUdz2WQmL5lYG7Y+FLzWbRSROFfcH0QYpmOqSaPXd2KRQhIJwEacqecDZd/Q1XKQ==}
866 cpu: [x64]
867 os: [darwin]
868
869 '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.159':847 '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.159':
870 resolution: {integrity: sha512-iv+NRjz+t4Q1R2+kLdDbccSo3b0wedVJ9jMT3noznOVojZHzgkxVpTvt36/XkXV0rqIDQ5H18bBYIZZzOXu7mg==}848 resolution: {integrity: sha512-iv+NRjz+t4Q1R2+kLdDbccSo3b0wedVJ9jMT3noznOVojZHzgkxVpTvt36/XkXV0rqIDQ5H18bBYIZZzOXu7mg==}
871 cpu: [x64]849 cpu: [x64]
872 os: [darwin]850 os: [darwin]
873851
874 '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.2.141':
875 resolution: {integrity: sha512-6H1AJ/AVaWNnV22kubUPkOTRzZFH0+qP9k7WlhriHMN9gtgZcVAsITMddDeGjQsQJMCAdhXFd6sgi7TM1LdeOQ==}
876 cpu: [arm64]
877 os: [linux]
878
879 '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.159':852 '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.159':
880 resolution: {integrity: sha512-WvwiQBWt3tdu5EwqjpDZszI6p2uetYsw4Cxc6ptO/SmLIYXcDienP8nmirZdsZrS+Gzk6imgY0IY5mmNaRhelQ==}853 resolution: {integrity: sha512-WvwiQBWt3tdu5EwqjpDZszI6p2uetYsw4Cxc6ptO/SmLIYXcDienP8nmirZdsZrS+Gzk6imgY0IY5mmNaRhelQ==}
881 cpu: [arm64]854 cpu: [arm64]
882 os: [linux]855 os: [linux]
883856
884 '@anthropic-ai/claude-agent-sdk-linux-arm64@0.2.141':
885 resolution: {integrity: sha512-Jdf0ZEwJzOP8sE6rPqdJN+SxMb0/L8sxJg4twCv/7S+Qzk0hJtls+wxSi+0Tjh6EEMaNxJqEGc7S3fx99Wi99Q==}
886 cpu: [arm64]
887 os: [linux]
888
889 '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.159':857 '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.159':
890 resolution: {integrity: sha512-FlsS5M4GCpzsQVaNDFF8dRgFGR3QwyAHZFl/xM/2Y2BqVBH+NH17RpKQSJxr1qr41QnsNkinMnu2iSKoc33hKg==}858 resolution: {integrity: sha512-FlsS5M4GCpzsQVaNDFF8dRgFGR3QwyAHZFl/xM/2Y2BqVBH+NH17RpKQSJxr1qr41QnsNkinMnu2iSKoc33hKg==}
891 cpu: [arm64]859 cpu: [arm64]
892 os: [linux]860 os: [linux]
893861
894 '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.2.141':
895 resolution: {integrity: sha512-fTI1YuM4cxOa4nSgsyMAdB5ELizkWp+w5Ispo4JnnYtcczMAL4D9GBNjWPW0sUzKvjsJOUVim68SmWLWhUOpXQ==}
896 cpu: [x64]
897 os: [linux]
898
899 '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.159':862 '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.159':
900 resolution: {integrity: sha512-kFH6RC2YJbPc8XWRNy/wL4YU7LzdJjSwAdH488sVzIif3q+TrvVrV5y/IW0+MLmta+CKIqtFYpGaucsJYvj7Eg==}863 resolution: {integrity: sha512-kFH6RC2YJbPc8XWRNy/wL4YU7LzdJjSwAdH488sVzIif3q+TrvVrV5y/IW0+MLmta+CKIqtFYpGaucsJYvj7Eg==}
901 cpu: [x64]864 cpu: [x64]
902 os: [linux]865 os: [linux]
903866
904 '@anthropic-ai/claude-agent-sdk-linux-x64@0.2.141':
905 resolution: {integrity: sha512-DVjp72f3HmrRYpbneWZZWIqkUht5kTZXS7wXGFiwzLz6eNYEgjjh+GcsnhIi8UOwZUtNiKUrjZnoP38ovFqV8A==}
906 cpu: [x64]
907 os: [linux]
908
909 '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.159':867 '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.159':
910 resolution: {integrity: sha512-uNPEC/iRzVb4bEdzs0KAz1zV7i1PVGEZZnJTQyi1OtgVa81sAoH/H0CbbzDiTsquKdaESf+1DSSEkUlfZmMUEw==}868 resolution: {integrity: sha512-uNPEC/iRzVb4bEdzs0KAz1zV7i1PVGEZZnJTQyi1OtgVa81sAoH/H0CbbzDiTsquKdaESf+1DSSEkUlfZmMUEw==}
911 cpu: [x64]869 cpu: [x64]
912 os: [linux]870 os: [linux]
913871
914 '@anthropic-ai/claude-agent-sdk-win32-arm64@0.2.141':
915 resolution: {integrity: sha512-Wm10J6kfbufbPGFELokiJ/7Y5Oqug4Uag3HXFsV8g7TWCpaItx/oqVaJoiGptuAtXQB7xGLQVTuk082wER+Y5w==}
916 cpu: [arm64]
917 os: [win32]
918
919 '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.159':872 '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.159':
920 resolution: {integrity: sha512-WN1QEZGgWXz9GMl61QU6j9E+LEF5plki87bL2xsGwuCPzK+OeVPQU55pabuP8P+vFBFHUo3Y9OlTVyZHnUzmAQ==}873 resolution: {integrity: sha512-WN1QEZGgWXz9GMl61QU6j9E+LEF5plki87bL2xsGwuCPzK+OeVPQU55pabuP8P+vFBFHUo3Y9OlTVyZHnUzmAQ==}
921 cpu: [arm64]874 cpu: [arm64]
922 os: [win32]875 os: [win32]
923876
924 '@anthropic-ai/claude-agent-sdk-win32-x64@0.2.141':
925 resolution: {integrity: sha512-IXuP29YJuWbR5Q6xOHrjFVGG54V2s1FC61UVNwEN5fpxL09MwPnbwtQL6fqgzt/U1MP7vWAwpXZriYAklkH/mg==}
926 cpu: [x64]
927 os: [win32]
928
929 '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.159':877 '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.159':
930 resolution: {integrity: sha512-Ty4seccD+dTDX5hhj89IUELZd/LkxO5O43Uiz5Mo8ZJktoX38SK4XMZlBS935QdqTFLRvPL0hvK4Lt4dTOqzPw==}878 resolution: {integrity: sha512-Ty4seccD+dTDX5hhj89IUELZd/LkxO5O43Uiz5Mo8ZJktoX38SK4XMZlBS935QdqTFLRvPL0hvK4Lt4dTOqzPw==}
931 cpu: [x64]879 cpu: [x64]
932 os: [win32]880 os: [win32]
933881
934 '@anthropic-ai/claude-agent-sdk@0.2.141':
935 resolution: {integrity: sha512-AIBacMWGcZIUcXlUoObqjwJ6pmJI3BayAqPAFXuvSq3DHJXdiuZVs7l/zTB5l3nRhRv5cqSrI2XbiDeHgZWizw==}
936 engines: {node: '>=18.0.0'}
937 peerDependencies:
938 zod: ^4.0.0
939
940 '@anthropic-ai/claude-agent-sdk@0.3.159':882 '@anthropic-ai/claude-agent-sdk@0.3.159':
941 resolution: {integrity: sha512-Xh1oVMIK6N3KsiNIhqNH8ZK90zjRmAEL9d1Md8ZlGdHJE+HhdMYdBadujc3KEkV0uufsEUvYp+A3fDenfypGSA==}883 resolution: {integrity: sha512-Xh1oVMIK6N3KsiNIhqNH8ZK90zjRmAEL9d1Md8ZlGdHJE+HhdMYdBadujc3KEkV0uufsEUvYp+A3fDenfypGSA==}
942 engines: {node: '>=18.0.0'}884 engines: {node: '>=18.0.0'}
...@@ -1776,43 +1718,43 @@ packages:...@@ -1776,43 +1718,43 @@ packages:
1776 peerDependencies:1718 peerDependencies:
1777 effect: 4.0.0-beta.781719 effect: 4.0.0-beta.78
17781720
1779 '@effect/tsgo-darwin-arm64@0.11.4':1721 '@effect/tsgo-darwin-arm64@0.13.2':
1780 resolution: {integrity: sha512-rslT4W8tWY8pdd48kDpY7Q+yo0xkrmcEySG1+sJfb06w7TwbywjHsGlC0BmcUaQt0qmLY+BApbWWDfZw7fgwjw==}1722 resolution: {integrity: sha512-AlYlxU2sD3urNCmNCQWtatPJS/+m2r3CvgZdDTs9KEz2YcyQc2GV1g2RWFkoMwmgzYBx69DBLu1oscqJO2qAog==}
1781 cpu: [arm64]1723 cpu: [arm64]
1782 os: [darwin]1724 os: [darwin]
17831725
1784 '@effect/tsgo-darwin-x64@0.11.4':1726 '@effect/tsgo-darwin-x64@0.13.2':
1785 resolution: {integrity: sha512-p3v3j+zp7L7yx5ctjvA1W85I4WjOpbOcga8kUu5MFEKfYfsApxUHXwsunCVbUKwrpXqcTc0sw9AjnCNs6i6GRw==}1727 resolution: {integrity: sha512-oGWIUsWuzCGBRaxB3R4ZjzmqaWb20OtLpBc8HKf3mGstyiCpGUtb7arqncpSq04nN9yb+mM5yBpGKZ9EJAYuEA==}
1786 cpu: [x64]1728 cpu: [x64]
1787 os: [darwin]1729 os: [darwin]
17881730
1789 '@effect/tsgo-linux-arm64@0.11.4':1731 '@effect/tsgo-linux-arm64@0.13.2':
1790 resolution: {integrity: sha512-dz5ZIQUnRzN9mpVcELYCmVERpmstes5rVHbKUb7DOWCbrbupT3tV1LCzOaNX9sIsoBKmpvdGvAWEPLHgymSgTQ==}1732 resolution: {integrity: sha512-v9PIgdLR6jREQk42EIm/mtFBwmB4Xzuq70l1Uf/7MnV/eivrZP+Wjfex/UuzMRbjM5eLRP3FFMj2HZvjkFQv6Q==}
1791 cpu: [arm64]1733 cpu: [arm64]
1792 os: [linux]1734 os: [linux]
17931735
1794 '@effect/tsgo-linux-arm@0.11.4':1736 '@effect/tsgo-linux-arm@0.13.2':
1795 resolution: {integrity: sha512-uXsw+IbO+ltn/fbhOWWqXK8ZW3Qa5EZD+wnGbF3gIGWINthbF+/7X+CgRzvcgLBWeBfV6F83hAmOaEZ4hQmd+w==}1737 resolution: {integrity: sha512-y5aTN7MrwnsStcSJ4Z8J93Nszeh9yf8kbaHk+03bRm9n0TrhVea/bJZoi9cprLJSy01Umt+xC3jFyvOSMrWB8g==}
1796 cpu: [arm]1738 cpu: [arm]
1797 os: [linux]1739 os: [linux]
17981740
1799 '@effect/tsgo-linux-x64@0.11.4':1741 '@effect/tsgo-linux-x64@0.13.2':
1800 resolution: {integrity: sha512-P3m7Y4FJtziL13Muffyb99AnQeTRvo0/knfYRqoHKNwYUaNM59RO3qFi5y57Hasgd8rKat0xTPmUkK6koZPPFQ==}1742 resolution: {integrity: sha512-MzrApKfCL0DnFGvoyJUKtW39PGDykJZkkB/tOZSuTSurcYAzkmUIOUwuTASeNqDjj4/DixT7Ha4CMVeCQgg6hg==}
1801 cpu: [x64]1743 cpu: [x64]
1802 os: [linux]1744 os: [linux]
18031745
1804 '@effect/tsgo-win32-arm64@0.11.4':1746 '@effect/tsgo-win32-arm64@0.13.2':
1805 resolution: {integrity: sha512-FKLm9Y+luZSdLpfkbdw8VXa8xy0zR+Asg078qemqHHGwRQLDVGjvIk7tj1HxBM6VQN+TwsofDd225ht83kMk8w==}1747 resolution: {integrity: sha512-WwYLSrgCa4iiSIZe5KkG2P1q+JmIloDI6tbqHqpvumrz3uU8fg33e5A7wQ68sRgr4ofqrTYPQhJ6b+Eyeadazg==}
1806 cpu: [arm64]1748 cpu: [arm64]
1807 os: [win32]1749 os: [win32]
18081750
1809 '@effect/tsgo-win32-x64@0.11.4':1751 '@effect/tsgo-win32-x64@0.13.2':
1810 resolution: {integrity: sha512-oc4Y8TbLlv0b1deAILAEep1N6pnSS1d4pk7gJJM4NDXrTKWDyEulO6tXwRQ6vWkO2lhLTUVWHDFfzmMJj3HxPQ==}1752 resolution: {integrity: sha512-M4Cf98tlCzCWig61QNoPxhE0LyMJtlVIQY2hed0Y1uYpwv0W1BMyOACLcj6ll+vuLWmXvVlOfXC+BuDOqPo9fg==}
1811 cpu: [x64]1753 cpu: [x64]
1812 os: [win32]1754 os: [win32]
18131755
1814 '@effect/tsgo@0.11.4':1756 '@effect/tsgo@0.13.2':
1815 resolution: {integrity: sha512-wliq5Dis2gLoIUKoCRT3Iv5kpO+fKrUBJPPxIsHADeirk9HMQevKvYaBpGS3Khw1tNLmoQWsSX559owJAdHgBA==}1757 resolution: {integrity: sha512-zPQMHBdCN1k7Jbxjxq0HVAbzsZd+LAoRPzBEZ3F4y/uxNK0K/XGvFXUUw/CUAsD6rhUtC2VahZY1tp0owb5lgg==}
1816 hasBin: true1758 hasBin: true
18171759
1818 '@effect/vitest@4.0.0-beta.78':1760 '@effect/vitest@4.0.0-beta.78':
...@@ -4505,50 +4447,50 @@ packages:...@@ -4505,50 +4447,50 @@ packages:
4505 '@types/yauzl@2.10.3':4447 '@types/yauzl@2.10.3':
4506 resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}4448 resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
45074449
4508 '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260527.2':4450 '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260604.1':
4509 resolution: {integrity: sha512-3LqSu4DlxkEfeC/Z/29QMCJn5jjkDtXI7LYuxfmjdmAatS6umDKqm8J17fnP/7fyrZUMBTIYRwSDpChGV3G1ew==}4451 resolution: {integrity: sha512-zs616um9UuaODLsNlCu5Aw95rFcTV4u3hVt090r6k0lVvTxfaJOv8HKA6BpIotcEYlZlMQowrMSYCCdedo7iyA==}
4510 engines: {node: '>=16.20.0'}4452 engines: {node: '>=16.20.0'}
4511 cpu: [arm64]4453 cpu: [arm64]
4512 os: [darwin]4454 os: [darwin]
45134455
4514 '@typescript/native-preview-darwin-x64@7.0.0-dev.20260527.2':4456 '@typescript/native-preview-darwin-x64@7.0.0-dev.20260604.1':
4515 resolution: {integrity: sha512-H4+sxE9qaBbLF83wMdWE0FsgfK0Pom+/O+/oxqyGzhVkDJlNt3vfpgQZMit48/Gm44AacGfBggJ9Dhbi3aeSFw==}4457 resolution: {integrity: sha512-pOdNAf2pwc9JBjo8gUsvLs5uqg7d0AhYXfE8/3zvPKBlIZG+mTcvEWW1hPawlWxXzf/vxnP4dgYwUHAMDghhKA==}
4516 engines: {node: '>=16.20.0'}4458 engines: {node: '>=16.20.0'}
4517 cpu: [x64]4459 cpu: [x64]
4518 os: [darwin]4460 os: [darwin]
45194461
4520 '@typescript/native-preview-linux-arm64@7.0.0-dev.20260527.2':4462 '@typescript/native-preview-linux-arm64@7.0.0-dev.20260604.1':
4521 resolution: {integrity: sha512-BGUDMjC2Z3TTdZRkGGwhBLelkP5UYgO2rbep8aF4dS3fu7T5lFPPrnfS6EgqJgie+cF5Fsev7xEq8wWyBDM+lg==}4463 resolution: {integrity: sha512-GjIrt6YHP3bbOWBCCE08SlBSDf84Lnjn3Td822/lOX9nm6ODlA/HI7rtGh7KzS/fxehep2Vy4dXU4Il12X1s5A==}
4522 engines: {node: '>=16.20.0'}4464 engines: {node: '>=16.20.0'}
4523 cpu: [arm64]4465 cpu: [arm64]
4524 os: [linux]4466 os: [linux]
45254467
4526 '@typescript/native-preview-linux-arm@7.0.0-dev.20260527.2':4468 '@typescript/native-preview-linux-arm@7.0.0-dev.20260604.1':
4527 resolution: {integrity: sha512-6I9Cv9ozwfS9zB9vRQDPIYseLX3artEO9jl3yVgLj4ishwlSF4cWAbIsjl5IztPaEgHv8coej/6tX1D0uaBzXg==}4469 resolution: {integrity: sha512-IKaZL3i5HKmKqwb2IZEXW1j68fVg1HsvAaXkbrkOIG/J5Eyksu5tEnTzucrIY1oPdzgHT+y2HpDIYp2sGeHFvw==}
4528 engines: {node: '>=16.20.0'}4470 engines: {node: '>=16.20.0'}
4529 cpu: [arm]4471 cpu: [arm]
4530 os: [linux]4472 os: [linux]
45314473
4532 '@typescript/native-preview-linux-x64@7.0.0-dev.20260527.2':4474 '@typescript/native-preview-linux-x64@7.0.0-dev.20260604.1':
4533 resolution: {integrity: sha512-vpazOu+ozlxBo8U57YJMzsOPuxAV8H7fu36KJ8ea8At/D8pdGmOAy5TuB+9OBQV9JDe0OXJMy2kmbhOpmkTAmA==}4475 resolution: {integrity: sha512-twQ7XDjsmaHIevN1MjeRYIVLUPL0fBm8A0jg1FhGYPckhTxEBiHIpJf9E//eFidAdrEHjeTSBP1jJw3GNAensg==}
4534 engines: {node: '>=16.20.0'}4476 engines: {node: '>=16.20.0'}
4535 cpu: [x64]4477 cpu: [x64]
4536 os: [linux]4478 os: [linux]
45374479
4538 '@typescript/native-preview-win32-arm64@7.0.0-dev.20260527.2':4480 '@typescript/native-preview-win32-arm64@7.0.0-dev.20260604.1':
4539 resolution: {integrity: sha512-DBFnFE3V6AITkPO1K1VxXf3yEZKjU2FwtXlNwRqhzDu0rrL2SsJHOSrBDX+OacTxQFzZMxFcpiuhV8jHZALPEg==}4481 resolution: {integrity: sha512-QBRxaVT3SFiNfOhwYb/56ddpHWPMFdfiJ4zkFJIjaAXeZ/ssWNHM9lH7yR++GrE9VTsUZ4eVSZfOmQbzRERhgw==}
4540 engines: {node: '>=16.20.0'}4482 engines: {node: '>=16.20.0'}
4541 cpu: [arm64]4483 cpu: [arm64]
4542 os: [win32]4484 os: [win32]
45434485
4544 '@typescript/native-preview-win32-x64@7.0.0-dev.20260527.2':4486 '@typescript/native-preview-win32-x64@7.0.0-dev.20260604.1':
4545 resolution: {integrity: sha512-1tBlErMvQgcMqqYwsx4tytupcjCJcOUXD3vBn1Wb/kAvus1FzWQAFE0fcKBvLfcqLQfTiiEwKKEtbLjGmakqqg==}4487 resolution: {integrity: sha512-hR7YHoRpm88Q86gK6/IMayWUA+ROdHGzOPKK8EBp1xD/Cg2Bh5AXbut8HcyUDx/bcGQvnuht/XsW47bT3to9mg==}
4546 engines: {node: '>=16.20.0'}4488 engines: {node: '>=16.20.0'}
4547 cpu: [x64]4489 cpu: [x64]
4548 os: [win32]4490 os: [win32]
45494491
4550 '@typescript/native-preview@7.0.0-dev.20260527.2':4492 '@typescript/native-preview@7.0.0-dev.20260604.1':
4551 resolution: {integrity: sha512-piqkDwikVeizCFqA1lcwI5F4wOAtBdxuliWe77ApBNRyBPPvfCJB+u/HYi9/8t5nd0sWvFs6/qt/AzJ1CCoykQ==}4493 resolution: {integrity: sha512-A3/9yZTt2V5NlDURcVJ4mN2YjfeQTXCRyLuENKrNdGhO+y59mC/2UDr7UvpB3Li+83TRAuhDN8SBoM+7gkHdzQ==}
4552 engines: {node: '>=16.20.0'}4494 engines: {node: '>=16.20.0'}
4553 hasBin: true4495 hasBin: true
45544496
...@@ -9698,72 +9640,30 @@ snapshots:...@@ -9698,72 +9640,30 @@ snapshots:
96989640
9699 '@alchemy.run/node-utils@0.0.4': {}9641 '@alchemy.run/node-utils@0.0.4': {}
97009642
9701 '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.2.141':
9702 optional: true
9703
9704 '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.159':9643 '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.159':
9705 optional: true9644 optional: true
97069645
9707 '@anthropic-ai/claude-agent-sdk-darwin-x64@0.2.141':
9708 optional: true
9709
9710 '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.159':9646 '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.159':
9711 optional: true9647 optional: true
97129648
9713 '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.2.141':
9714 optional: true
9715
9716 '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.159':9649 '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.159':
9717 optional: true9650 optional: true
97189651
9719 '@anthropic-ai/claude-agent-sdk-linux-arm64@0.2.141':
9720 optional: true
9721
9722 '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.159':9652 '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.159':
9723 optional: true9653 optional: true
97249654
9725 '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.2.141':
9726 optional: true
9727
9728 '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.159':9655 '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.159':
9729 optional: true9656 optional: true
97309657
9731 '@anthropic-ai/claude-agent-sdk-linux-x64@0.2.141':
9732 optional: true
9733
9734 '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.159':9658 '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.159':
9735 optional: true9659 optional: true
97369660
9737 '@anthropic-ai/claude-agent-sdk-win32-arm64@0.2.141':
9738 optional: true
9739
9740 '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.159':9661 '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.159':
9741 optional: true9662 optional: true
97429663
9743 '@anthropic-ai/claude-agent-sdk-win32-x64@0.2.141':
9744 optional: true
9745
9746 '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.159':9664 '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.159':
9747 optional: true9665 optional: true
97489666
9749 '@anthropic-ai/claude-agent-sdk@0.2.141(zod@4.4.3)':
9750 dependencies:
9751 '@anthropic-ai/sdk': 0.93.0(zod@4.4.3)
9752 '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3)
9753 zod: 4.4.3
9754 optionalDependencies:
9755 '@anthropic-ai/claude-agent-sdk-darwin-arm64': 0.2.141
9756 '@anthropic-ai/claude-agent-sdk-darwin-x64': 0.2.141
9757 '@anthropic-ai/claude-agent-sdk-linux-arm64': 0.2.141
9758 '@anthropic-ai/claude-agent-sdk-linux-arm64-musl': 0.2.141
9759 '@anthropic-ai/claude-agent-sdk-linux-x64': 0.2.141
9760 '@anthropic-ai/claude-agent-sdk-linux-x64-musl': 0.2.141
9761 '@anthropic-ai/claude-agent-sdk-win32-arm64': 0.2.141
9762 '@anthropic-ai/claude-agent-sdk-win32-x64': 0.2.141
9763 transitivePeerDependencies:
9764 - '@cfworker/json-schema'
9765 - supports-color
9766
9767 '@anthropic-ai/claude-agent-sdk@0.3.159(@anthropic-ai/sdk@0.93.0(zod@4.4.3))(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(zod@4.4.3)':9667 '@anthropic-ai/claude-agent-sdk@0.3.159(@anthropic-ai/sdk@0.93.0(zod@4.4.3))(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(zod@4.4.3)':
9768 dependencies:9668 dependencies:
9769 '@anthropic-ai/sdk': 0.93.0(zod@4.4.3)9669 '@anthropic-ai/sdk': 0.93.0(zod@4.4.3)
...@@ -10931,36 +10831,36 @@ snapshots:...@@ -10931,36 +10831,36 @@ snapshots:
10931 dependencies:10831 dependencies:
10932 effect: 4.0.0-beta.78(patch_hash=883249d8efbb462e928e21fefef96027b66aec50751178cafdce45f08eee3754)10832 effect: 4.0.0-beta.78(patch_hash=883249d8efbb462e928e21fefef96027b66aec50751178cafdce45f08eee3754)
1093310833
10934 '@effect/tsgo-darwin-arm64@0.11.4':10834 '@effect/tsgo-darwin-arm64@0.13.2':
10935 optional: true10835 optional: true
1093610836
10937 '@effect/tsgo-darwin-x64@0.11.4':10837 '@effect/tsgo-darwin-x64@0.13.2':
10938 optional: true10838 optional: true
1093910839
10940 '@effect/tsgo-linux-arm64@0.11.4':10840 '@effect/tsgo-linux-arm64@0.13.2':
10941 optional: true10841 optional: true
1094210842
10943 '@effect/tsgo-linux-arm@0.11.4':10843 '@effect/tsgo-linux-arm@0.13.2':
10944 optional: true10844 optional: true
1094510845
10946 '@effect/tsgo-linux-x64@0.11.4':10846 '@effect/tsgo-linux-x64@0.13.2':
10947 optional: true10847 optional: true
1094810848
10949 '@effect/tsgo-win32-arm64@0.11.4':10849 '@effect/tsgo-win32-arm64@0.13.2':
10950 optional: true10850 optional: true
1095110851
10952 '@effect/tsgo-win32-x64@0.11.4':10852 '@effect/tsgo-win32-x64@0.13.2':
10953 optional: true10853 optional: true
1095410854
10955 '@effect/tsgo@0.11.4':10855 '@effect/tsgo@0.13.2':
10956 optionalDependencies:10856 optionalDependencies:
10957 '@effect/tsgo-darwin-arm64': 0.11.410857 '@effect/tsgo-darwin-arm64': 0.13.2
10958 '@effect/tsgo-darwin-x64': 0.11.410858 '@effect/tsgo-darwin-x64': 0.13.2
10959 '@effect/tsgo-linux-arm': 0.11.410859 '@effect/tsgo-linux-arm': 0.13.2
10960 '@effect/tsgo-linux-arm64': 0.11.410860 '@effect/tsgo-linux-arm64': 0.13.2
10961 '@effect/tsgo-linux-x64': 0.11.410861 '@effect/tsgo-linux-x64': 0.13.2
10962 '@effect/tsgo-win32-arm64': 0.11.410862 '@effect/tsgo-win32-arm64': 0.13.2
10963 '@effect/tsgo-win32-x64': 0.11.410863 '@effect/tsgo-win32-x64': 0.13.2
1096410864
10965 '@effect/vitest@4.0.0-beta.78(patch_hash=42b87cc47e70d74e62496e7a8261b3fd298ecad4464d209348ab04b96f853a5f)(effect@4.0.0-beta.78(patch_hash=883249d8efbb462e928e21fefef96027b66aec50751178cafdce45f08eee3754))':10865 '@effect/vitest@4.0.0-beta.78(patch_hash=42b87cc47e70d74e62496e7a8261b3fd298ecad4464d209348ab04b96f853a5f)(effect@4.0.0-beta.78(patch_hash=883249d8efbb462e928e21fefef96027b66aec50751178cafdce45f08eee3754))':
10966 dependencies:10866 dependencies:
...@@ -13581,36 +13481,36 @@ snapshots:...@@ -13581,36 +13481,36 @@ snapshots:
13581 '@types/node': 24.12.413481 '@types/node': 24.12.4
13582 optional: true13482 optional: true
1358313483
13584 '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260527.2':13484 '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260604.1':
13585 optional: true13485 optional: true
1358613486
13587 '@typescript/native-preview-darwin-x64@7.0.0-dev.20260527.2':13487 '@typescript/native-preview-darwin-x64@7.0.0-dev.20260604.1':
13588 optional: true13488 optional: true
1358913489
13590 '@typescript/native-preview-linux-arm64@7.0.0-dev.20260527.2':13490 '@typescript/native-preview-linux-arm64@7.0.0-dev.20260604.1':
13591 optional: true13491 optional: true
1359213492
13593 '@typescript/native-preview-linux-arm@7.0.0-dev.20260527.2':13493 '@typescript/native-preview-linux-arm@7.0.0-dev.20260604.1':
13594 optional: true13494 optional: true
1359513495
13596 '@typescript/native-preview-linux-x64@7.0.0-dev.20260527.2':13496 '@typescript/native-preview-linux-x64@7.0.0-dev.20260604.1':
13597 optional: true13497 optional: true
1359813498
13599 '@typescript/native-preview-win32-arm64@7.0.0-dev.20260527.2':13499 '@typescript/native-preview-win32-arm64@7.0.0-dev.20260604.1':
13600 optional: true13500 optional: true
1360113501
13602 '@typescript/native-preview-win32-x64@7.0.0-dev.20260527.2':13502 '@typescript/native-preview-win32-x64@7.0.0-dev.20260604.1':
13603 optional: true13503 optional: true
1360413504
13605 '@typescript/native-preview@7.0.0-dev.20260527.2':13505 '@typescript/native-preview@7.0.0-dev.20260604.1':
13606 optionalDependencies:13506 optionalDependencies:
13607 '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260527.213507 '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260604.1
13608 '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260527.213508 '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260604.1
13609 '@typescript/native-preview-linux-arm': 7.0.0-dev.20260527.213509 '@typescript/native-preview-linux-arm': 7.0.0-dev.20260604.1
13610 '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260527.213510 '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260604.1
13611 '@typescript/native-preview-linux-x64': 7.0.0-dev.20260527.213511 '@typescript/native-preview-linux-x64': 7.0.0-dev.20260604.1
13612 '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260527.213512 '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260604.1
13613 '@typescript/native-preview-win32-x64': 7.0.0-dev.20260527.213513 '@typescript/native-preview-win32-x64': 7.0.0-dev.20260604.1
1361413514
13615 '@ungap/structured-clone@1.3.1': {}13515 '@ungap/structured-clone@1.3.1': {}
1361613516
pnpm-workspace.yaml+2-4
...@@ -25,16 +25,14 @@ catalog:...@@ -25,16 +25,14 @@ catalog:
25 "@effect/sql-pg": 4.0.0-beta.7825 "@effect/sql-pg": 4.0.0-beta.78
26 "@effect/sql-sqlite-bun": 4.0.0-beta.7826 "@effect/sql-sqlite-bun": 4.0.0-beta.78
27 "@effect/vitest": 4.0.0-beta.7827 "@effect/vitest": 4.0.0-beta.78
28 "@effect/tsgo": 0.11.428 "@effect/tsgo": 0.13.2
29 "@noble/curves": 1.9.129 "@noble/curves": 1.9.1
30 "@noble/hashes": 1.8.030 "@noble/hashes": 1.8.0
31 "@pierre/diffs": 1.1.2031 "@pierre/diffs": 1.1.20
32 "@vitest/runner": 4.1.832 "@vitest/runner": 4.1.8
33 "@types/bun": ^1.3.11
34 "@types/node": 24.12.433 "@types/node": 24.12.4
35 "@typescript/native-preview": 7.0.0-dev.20260527.234 "@typescript/native-preview": 7.0.0-dev.20260604.1
36 jose: 6.2.235 jose: 6.2.2
37 tsdown: ^0.20.3
38 typescript: ~6.0.336 typescript: ~6.0.3
39 vitest: npm:@voidzero-dev/vite-plus-test@0.1.2437 vitest: npm:@voidzero-dev/vite-plus-test@0.1.24
40 vite: npm:@voidzero-dev/vite-plus-core@0.1.2438 vite: npm:@voidzero-dev/vite-plus-core@0.1.24
scripts/build-desktop-artifact.ts+11-15
...@@ -178,13 +178,11 @@ const resolveGitCommitHash = Effect.fn("resolveGitCommitHash")(function* (repoRo...@@ -178,13 +178,11 @@ const resolveGitCommitHash = Effect.fn("resolveGitCommitHash")(function* (repoRo
178 cwd: repoRoot,178 cwd: repoRoot,
179 }),179 }),
180 ).pipe(180 ).pipe(
181 Effect.catch(() =>181 Effect.orElseSucceed(() => ({
182 Effect.succeed({182 stdout: "",
183 stdout: "",183 stderr: "",
184 stderr: "",184 exitCode: 1,
185 exitCode: 1,185 })),
186 }),
187 ),
188 );186 );
189187
190 if (result.exitCode !== 0) {188 if (result.exitCode !== 0) {
...@@ -220,13 +218,11 @@ const resolvePythonForNodeGyp = Effect.fn("resolvePythonForNodeGyp")(function* (...@@ -220,13 +218,11 @@ const resolvePythonForNodeGyp = Effect.fn("resolvePythonForNodeGyp")(function* (
220 const probe = yield* spawnAndCollectOutput(218 const probe = yield* spawnAndCollectOutput(
221 ChildProcess.make("python", ["-c", "import sys;print(sys.executable)"]),219 ChildProcess.make("python", ["-c", "import sys;print(sys.executable)"]),
222 ).pipe(220 ).pipe(
223 Effect.catch(() =>221 Effect.orElseSucceed(() => ({
224 Effect.succeed({222 stdout: "",
225 stdout: "",223 stderr: "",
226 stderr: "",224 exitCode: 1,
227 exitCode: 1,225 })),
228 }),
229 ),
230 );226 );
231227
232 if (probe.exitCode !== 0) {228 if (probe.exitCode !== 0) {
...@@ -1008,7 +1004,7 @@ const buildDesktopArtifact = Effect.fn("buildDesktopArtifact")(function* (...@@ -1008,7 +1004,7 @@ const buildDesktopArtifact = Effect.fn("buildDesktopArtifact")(function* (
1008 const copiedArtifacts: string[] = [];1004 const copiedArtifacts: string[] = [];
1009 for (const entry of stageEntries) {1005 for (const entry of stageEntries) {
1010 const from = path.join(stageDistDir, entry);1006 const from = path.join(stageDistDir, entry);
1011 const stat = yield* fs.stat(from).pipe(Effect.catch(() => Effect.succeed(null)));1007 const stat = yield* fs.stat(from).pipe(Effect.orElseSucceed(() => null));
1012 if (!stat || stat.type !== "File") continue;1008 if (!stat || stat.type !== "File") continue;
10131009
1014 const to = path.join(options.outputDir, entry);1010 const to = path.join(options.outputDir, entry);
scripts/mobile-native-static-check.ts+1-1
...@@ -73,7 +73,7 @@ const commandExists = Effect.fn("commandExists")(function* (command: string) {...@@ -73,7 +73,7 @@ const commandExists = Effect.fn("commandExists")(function* (command: string) {
73 return yield* spawner.spawn(lookupCommand).pipe(73 return yield* spawner.spawn(lookupCommand).pipe(
74 Effect.flatMap((child) => child.exitCode),74 Effect.flatMap((child) => child.exitCode),
75 Effect.map((exitCode) => exitCode === 0),75 Effect.map((exitCode) => exitCode === 0),
76 Effect.catch(() => Effect.succeed(false)),76 Effect.orElseSucceed(() => false),
77 );77 );
78});78});
7979
scripts/package.json-2
...@@ -7,7 +7,6 @@...@@ -7,7 +7,6 @@
7 "test": "vp test run"7 "test": "vp test run"
8 },8 },
9 "dependencies": {9 "dependencies": {
10 "@anthropic-ai/claude-agent-sdk": "^0.2.77",
11 "@effect/platform-node": "catalog:",10 "@effect/platform-node": "catalog:",
12 "@t3tools/contracts": "workspace:*",11 "@t3tools/contracts": "workspace:*",
13 "@t3tools/shared": "workspace:*",12 "@t3tools/shared": "workspace:*",
...@@ -16,7 +15,6 @@...@@ -16,7 +15,6 @@
16 },15 },
17 "devDependencies": {16 "devDependencies": {
18 "@effect/vitest": "catalog:",17 "@effect/vitest": "catalog:",
19 "@types/bun": "catalog:",
20 "vite-plus": "catalog:"18 "vite-plus": "catalog:"
21 }19 }
22}20}