From 909e8c4df988354ed52fe6a6dc4399e2e52e709e Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Mon, 5 Oct 2026 17:53:36 -0700 Subject: [PATCH 1/3] refactor: layer variables are named layer or layerXyz Every Effect Layer-valued variable in apps/, packages/ and infra/ is now `layer` or `layerXyz`. A module's single or primary exported layer is plain `layer`, reached through a namespace import (`import * as ServerLogger` -> `ServerLogger.layer`); modules exporting several layers use `layerXyz` for the rest. Callers that named-imported a layer now import the module as a namespace. Renames were found by type (the checker resolves the variable's type to effect's Layer) and applied with the TypeScript language service, so every reference moved with its declaration. No behavior change. Co-Authored-By: Claude Opus 5.5 (1M context) --- apps/desktop/src/app/DesktopAssets.test.ts | 16 +- .../app/DesktopConnectionCatalogStore.test.ts | 26 +- apps/desktop/src/app/DesktopLifecycle.test.ts | 24 +- .../src/app/DesktopObservability.test.ts | 90 +- apps/desktop/src/app/DesktopObservability.ts | 18 +- .../src/app/DesktopPreReadyPlatform.test.ts | 10 +- .../DesktopBackendConfiguration.test.ts | 56 +- .../src/backend/DesktopBackendManager.test.ts | 110 +- .../DesktopLocalEnvironmentAuth.test.ts | 10 +- .../backend/DesktopNetworkInterfaces.test.ts | 6 +- .../src/backend/DesktopServerExposure.test.ts | 12 +- .../backend/tailscaleEndpointProvider.test.ts | 8 +- .../desktop/src/electron/ElectronMenu.test.ts | 18 +- .../src/electron/ElectronProtocol.test.ts | 14 +- .../src/electron/ElectronWindow.test.ts | 14 +- .../src/ipc/methods/localEnvironment.test.ts | 4 +- apps/desktop/src/ipc/methods/wsl.test.ts | 14 +- apps/desktop/src/main.ts | 74 +- .../BrowserImport/BrowserImport.test.ts | 8 +- .../BrowserImport/ChromiumKeys.test.ts | 8 +- .../BrowserImport/LinuxBrowserSecret.test.ts | 4 +- .../src/preview/BrowserSession.test.ts | 4 +- apps/desktop/src/preview/Manager.test.ts | 12 +- .../DesktopClientSettings.diagnostics.test.ts | 4 +- .../settings/DesktopClientSettings.test.ts | 4 +- .../settings/DesktopSavedEnvironments.test.ts | 16 +- .../src/shell/DesktopShellEnvironment.test.ts | 6 +- .../DesktopTelemetryPublisher.test.ts | 22 +- .../desktop/src/updates/updatesTestHarness.ts | 24 +- .../src/window/DesktopApplicationMenu.test.ts | 12 +- apps/desktop/src/window/DesktopWindow.test.ts | 48 +- .../desktop/src/wsl/DesktopWslBackend.test.ts | 28 +- .../src/wsl/DesktopWslServerTree.test.ts | 4 +- .../src/connection/background-activity.ts | 4 +- apps/mobile/src/connection/platform.ts | 50 +- apps/mobile/src/connection/runtime.ts | 43 +- apps/mobile/src/connection/storage.ts | 2 +- .../liveActivityPreferences.test.ts | 12 +- .../remoteRegistration.test.ts | 50 +- apps/mobile/src/features/cloud/dpop.test.ts | 18 +- apps/mobile/src/features/cloud/dpop.ts | 2 +- .../features/cloud/linkEnvironment.test.ts | 8 +- .../features/cloud/managedRelayLayer.test.ts | 4 +- .../src/features/cloud/managedRelayLayer.ts | 4 +- .../src/features/cloud/managedRelayState.ts | 4 +- .../features/observability/tracing.test.ts | 16 +- .../src/features/observability/tracing.ts | 2 +- apps/mobile/src/lib/runtime.ts | 24 +- apps/mobile/src/persistence/layer.ts | 8 +- apps/mobile/src/state/client-cache-state.ts | 2 +- apps/mobile/src/state/preferences.ts | 2 +- .../NetworkTransferMeasurement.integration.ts | 4 +- .../transferBudgetV2.integration.test.ts | 44 +- apps/server/scripts/measure-pr-preview.ts | 8 +- .../scripts/record-grok-acp-replay-fixture.ts | 4 +- .../scripts/record-pi-rpc-replay-fixture.ts | 4 +- apps/server/scripts/verify-background-live.ts | 8 +- apps/server/src/assets/AssetAccess.test.ts | 80 +- .../src/assets/AttachmentUpload.test.ts | 22 +- .../src/assets/NativeAppIconResolver.test.ts | 10 +- apps/server/src/auth/EnvironmentAuth.test.ts | 6 +- apps/server/src/auth/EnvironmentAuth.ts | 8 +- .../src/auth/EnvironmentAuthAdmin.test.ts | 6 +- .../src/auth/EnvironmentAuthPolicy.test.ts | 2 +- .../server/src/auth/PairingGrantStore.test.ts | 4 +- .../server/src/auth/ServerSecretStore.test.ts | 20 +- apps/server/src/auth/SessionStore.test.ts | 46 +- apps/server/src/auth/http.test.ts | 28 +- apps/server/src/auth/http.ts | 4 +- .../src/background/BackgroundPolicy.test.ts | 8 +- .../src/background/HostPowerMonitor.test.ts | 8 +- apps/server/src/binCli.ts | 4 +- .../src/checkpointing/CheckpointStore.test.ts | 20 +- apps/server/src/cli/auth.ts | 2 +- apps/server/src/cli/config.test.ts | 14 +- apps/server/src/cli/connect.ts | 10 +- apps/server/src/cli/pair.test.ts | 4 +- apps/server/src/cli/pair.ts | 2 +- apps/server/src/cli/project.test.ts | 13 +- apps/server/src/cli/project.ts | 10 +- apps/server/src/cloud/CliTokenManager.ts | 4 +- .../server/src/cloud/CloudPreferences.test.ts | 4 +- .../src/cloud/ManagedEndpointRuntime.test.ts | 6 +- apps/server/src/cloud/http.ts | 2 +- apps/server/src/cloud/relayTracing.ts | 15 +- apps/server/src/device/DeviceHubProxy.test.ts | 4 +- apps/server/src/device/DeviceHubProxy.ts | 6 +- .../diagnostics/ProcessDiagnostics.test.ts | 22 +- .../src/environment/DirectEndpoints.test.ts | 6 +- .../src/environment/ServerEnvironment.test.ts | 16 +- .../src/environment/ServerEnvironment.ts | 4 +- .../ServerEnvironmentLabel.test.ts | 32 +- .../ServerEnvironmentMachine.test.ts | 4 +- apps/server/src/git/GitManager.test.ts | 34 +- .../server/src/git/GitWorkflowService.test.ts | 4 +- .../src/git/linkCreatedPullRequest.test.ts | 18 +- apps/server/src/htmlRender/HtmlRender.test.ts | 10 +- apps/server/src/http.test.ts | 41 +- apps/server/src/http.ts | 18 +- apps/server/src/mcp/McpDeviceToolkit.test.ts | 14 +- apps/server/src/mcp/McpHttpServer.test.ts | 34 +- apps/server/src/mcp/McpHttpServer.ts | 127 +- .../src/mcp/OrchestratorMcpService.test.ts | 50 +- ...OrchestratorMcpToolkit.integration.test.ts | 68 +- .../server/src/mcp/WorktreeMcpService.test.ts | 4 +- .../src/mcp/toolkits/attachment/handlers.ts | 2 +- apps/server/src/mcp/toolkits/core.test.ts | 14 +- .../src/mcp/toolkits/device/handlers.ts | 4 +- .../src/mcp/toolkits/environment/handlers.ts | 2 +- apps/server/src/mcp/toolkits/html/handlers.ts | 4 +- .../src/mcp/toolkits/orchestrator/handlers.ts | 2 +- .../src/mcp/toolkits/preview/handlers.ts | 4 +- .../toolkits/previewControls/handlers.test.ts | 10 +- .../mcp/toolkits/previewControls/handlers.ts | 2 +- .../src/mcp/toolkits/project/handlers.test.ts | 26 +- .../src/mcp/toolkits/project/handlers.ts | 2 +- .../toolkits/pullRequests/handlers.test.ts | 9 +- .../src/mcp/toolkits/pullRequests/handlers.ts | 2 +- .../src/mcp/toolkits/thread/handlers.ts | 2 +- .../src/mcp/toolkits/worktree/handlers.ts | 2 +- .../toolkits/worktree/registration.test.ts | 8 +- .../src/observability/Layers/Observability.ts | 22 +- .../AcpRegistryOrchestratorV2.live.test.ts | 64 +- .../Adapters/AcpAdapterV2.test.ts | 180 +- .../Adapters/AcpRegistryAdapterV2.test.ts | 18 +- .../Adapters/AcpRegistryAdapterV2.testkit.ts | 4 +- .../Adapters/AntigravityAdapterV2.test.ts | 8 +- .../Adapters/ClaudeAdapterV2.testkit.ts | 4 +- .../Adapters/ClaudeAdapterV2.ts | 2 +- .../Adapters/CodexAdapterV2.test.ts | 4 +- .../Adapters/CodexAdapterV2.testkit.ts | 16 +- .../Adapters/CodexAdapterV2.ts | 2 +- .../Adapters/CursorAdapterV2.testkit.ts | 8 +- .../Adapters/CursorAgentSdk.test.ts | 12 +- .../Adapters/CursorAgentSdk.ts | 2 +- .../Adapters/GrokAdapterV2.test.ts | 6 +- .../Adapters/GrokAdapterV2.testkit.ts | 4 +- .../Adapters/OpenCodeAdapterV2.testkit.ts | 4 +- .../Adapters/PiAdapterV2.test.ts | 92 +- .../Adapters/PiAdapterV2.testkit.ts | 4 +- .../orchestration-v2/AttachmentClaims.test.ts | 22 +- .../CheckpointCaptureService.test.ts | 22 +- .../CheckpointRestoreSafety.test.ts | 4 +- .../CheckpointRollbackService.test.ts | 22 +- .../CheckpointScopeOwnership.test.ts | 14 +- .../CheckpointService.test.ts | 4 +- ...laudeAutomaticDelivery.integration.test.ts | 8 +- .../orchestration-v2/CommandReceiptStore.ts | 8 +- .../ContextHandoffService.test.ts | 4 +- .../CursorOrchestratorV2.live.test.ts | 68 +- .../DelegatedCompletionDelivery.test.ts | 46 +- .../src/orchestration-v2/EffectOutbox.ts | 2 +- .../src/orchestration-v2/EffectWorker.test.ts | 66 +- .../src/orchestration-v2/EffectWorker.ts | 4 +- apps/server/src/orchestration-v2/EventSink.ts | 6 +- .../server/src/orchestration-v2/EventStore.ts | 10 +- .../FoundationPersistence.test.ts | 158 +- .../GrokOrchestratorV2.live.test.ts | 64 +- .../OpenCode2OrchestratorV2.live.test.ts | 88 +- .../Orchestrator.control-reads.test.ts | 20 +- ...ProjectSettingsUpgrade.integration.test.ts | 22 +- .../src/orchestration-v2/ProjectStore.test.ts | 4 +- .../ProjectionControlReads.test.ts | 10 +- .../ProjectionRecovery.test.ts | 16 +- .../ProjectionSettlement.test.ts | 16 +- .../orchestration-v2/ProjectionStore.test.ts | 10 +- .../ProviderAdapterRegistry.test.ts | 8 +- .../ProviderContinuationService.test.ts | 42 +- .../ProviderContinuationService.ts | 2 +- .../ProviderEventIngestor.test.ts | 28 +- .../orchestration-v2/ProviderEventIngestor.ts | 2 +- ...ProviderRuntimeRecoveryPerformance.test.ts | 14 +- .../ProviderSessionManager.test.ts | 54 +- .../ProviderSwitchService.test.ts | 4 +- .../ProviderTurnControlService.test.ts | 12 +- .../ProviderTurnStartService.testkit.ts | 2 +- .../PullRequestSyncReactor.test.ts | 4 +- .../ResourceCleanupService.ts | 2 +- .../RestartContinuation.test.ts | 23 +- .../RunCompletionReads.test.ts | 12 +- .../RunExecutionService.test.ts | 56 +- .../RunFinalizationService.test.ts | 2 +- .../RunFinalizationService.ts | 2 +- .../orchestration-v2/RuntimePolicy.test.ts | 4 +- .../RuntimeRequestService.test.ts | 24 +- .../SelectionRestart.integration.test.ts | 16 +- .../ThreadLaunchService.test.ts | 59 +- .../ThreadManagementService.test.ts | 20 +- .../ThreadManagementService.ts | 4 +- .../ThreadMessageIntake.test.ts | 26 +- .../ThreadPullRequestService.test.ts | 8 +- .../src/orchestration-v2/ThreadSearch.test.ts | 8 +- .../ThreadSettlementService.test.ts | 4 +- .../src/orchestration-v2/ThreadStop.test.ts | 28 +- .../ThreadTitleRegenerationService.test.ts | 31 +- .../orchestration-v2/TurnStartReads.test.ts | 12 +- .../UsageLimitRecoveryWorker.ts | 2 +- apps/server/src/orchestration-v2/http.ts | 2 +- .../LegacyV1Cutover.integration.test.ts | 38 +- .../legacy/LegacyV1ThreadImporter.test.ts | 36 +- .../src/orchestration-v2/runtimeLayer.test.ts | 127 +- .../src/orchestration-v2/runtimeLayer.ts | 288 +- ...yRestartBackgroundNote.integration.test.ts | 8 +- .../testkit/ProviderReplayHarness.ts | 218 +- .../ProviderSwitch.integration.test.ts | 112 +- .../Layers/OrchestrationCommandReceipts.ts | 2 +- .../OrchestrationEventStore.sequence.test.ts | 14 +- .../Layers/OrchestrationEventStore.test.ts | 14 +- .../Layers/OrchestrationEventStore.ts | 5 +- .../src/persistence/Layers/Sqlite.test.ts | 9 +- apps/server/src/persistence/Layers/Sqlite.ts | 8 +- .../RepositoryErrorCorrelation.test.ts | 18 +- .../persistence/initializeV2Database.test.ts | 22 +- apps/server/src/preview/PortScanner.test.ts | 12 +- .../src/process/externalLauncher.test.ts | 12 +- .../src/project/AgentSessionImporter.test.ts | 4 +- .../src/project/ManagedProjectFolders.test.ts | 20 +- .../project/ProjectEnrichmentService.test.ts | 24 +- .../project/ProjectFaviconResolver.test.ts | 4 +- .../project/ProjectService.deletion.test.ts | 28 +- .../server/src/project/ProjectService.test.ts | 51 +- .../RepositoryIdentityResolver.test.ts | 16 +- .../src/project/T3ProjectFileLoader.test.ts | 4 +- apps/server/src/project/http.ts | 2 +- .../src/provider/CodexManagedRuntime.test.ts | 4 +- .../Drivers/AntigravityDriver.test.ts | 8 +- .../src/provider/Drivers/CodexDriver.test.ts | 4 +- .../src/provider/Drivers/CursorDriver.test.ts | 4 +- .../src/provider/Drivers/CursorDriver.ts | 2 +- .../src/provider/Drivers/GrokDriver.test.ts | 4 +- .../provider/Drivers/OpenCodeDriver.test.ts | 4 +- .../src/provider/Layers/AcpRegistryCatalog.ts | 2 +- .../Layers/AntigravityProvider.test.ts | 4 +- .../src/provider/Layers/CursorSdkCatalog.ts | 2 +- .../provider/Layers/OpenCodeProvider.test.ts | 6 +- .../provider/Layers/ProviderAuthService.ts | 5 +- .../ProviderInstanceRegistryHydration.ts | 20 +- .../ProviderInstanceRegistryLive.test.ts | 44 +- ...viderOrchestrationAdapterInfrastructure.ts | 8 +- .../provider/Layers/ProviderRegistry.test.ts | 5440 ++++++++--------- .../src/provider/Layers/ProviderRegistry.ts | 2 +- .../Layers/ProviderUsageLimitsIngestion.ts | 2 +- .../src/provider/OpenCodeServerLedger.test.ts | 4 +- .../makeManagedServerProvider.test.ts | 34 +- .../opencode2/OpenCode2Client.test.ts | 4 +- .../opencode2/OpenCode2Server.live.test.ts | 2 +- .../opencode2/OpenCode2Server.test.ts | 8 +- .../opencodeRuntime.environment.test.ts | 2 +- .../opencodeRuntime.inventory.test.ts | 4 +- apps/server/src/provider/opencodeRuntime.ts | 2 +- .../provider/providerCompatibility.test.ts | 6 +- .../providerMaintenanceRunner.test.ts | 34 +- .../pullRequest/PullRequestService.test.ts | 4 +- apps/server/src/pullRequest/http.ts | 2 +- .../src/pullRequest/linkedThreads.test.ts | 4 +- .../ResourceTelemetry.test.ts | 70 +- .../ScheduledTaskService.schedule.test.ts | 14 +- .../ScheduledTaskService.test.ts | 8 +- .../ScheduledTaskService.webhook.test.ts | 8 +- .../src/scheduledTasks/webhookRoute.test.ts | 5 +- .../server/src/scheduledTasks/webhookRoute.ts | 2 +- .../scheduling/Scheduler.integration.test.ts | 14 +- .../server/src/secrets/SecretRequests.test.ts | 4 +- apps/server/src/server.ts | 411 +- apps/server/src/serverLogger.test.ts | 10 +- apps/server/src/serverLogger.ts | 8 +- apps/server/src/serverSettings.test.ts | 40 +- .../src/sourceControl/AzureDevOpsCli.test.ts | 4 +- .../sourceControl/PrTemplateDetection.test.ts | 4 +- .../SourceControlDiscovery.test.ts | 8 +- .../SourceControlProviderRegistry.test.ts | 8 +- .../SourceControlRepositoryService.test.ts | 6 +- .../src/telemetry/AnalyticsService.test.ts | 36 +- apps/server/src/terminal/Manager.test.ts | 4 +- .../src/terminal/NodePtyAdapter.test.ts | 20 +- .../ClaudeTextGeneration.test.ts | 4 +- .../CodexTextGeneration.test.ts | 4 +- .../CursorTextGeneration.test.ts | 24 +- .../textGeneration/GrokTextGeneration.test.ts | 4 +- .../OpenCodeTextGeneration.test.ts | 8 +- apps/server/src/vcs/GitVcsDriver.test.ts | 48 +- apps/server/src/vcs/GitVcsDriver.ts | 2 +- apps/server/src/vcs/GitVcsDriverCore.test.ts | 56 +- apps/server/src/vcs/VcsProcess.test.ts | 4 +- apps/server/src/vcs/VcsProjectConfig.test.ts | 16 +- .../src/vcs/VcsProvisioningService.test.ts | 8 +- .../src/vcs/VcsStatusBroadcaster.test.ts | 24 +- apps/server/src/vcs/VcsStatusBroadcaster.ts | 2 +- .../src/workspace/WorkspaceEntries.test.ts | 4 +- .../src/workspace/WorkspaceFileSystem.test.ts | 8 +- .../src/workspace/WorkspacePaths.test.ts | 4 +- apps/server/src/ws.ts | 2 +- apps/web/src/cloud/dpop.test.ts | 5 +- apps/web/src/cloud/dpop.ts | 2 +- apps/web/src/cloud/linkEnvironment.test.ts | 8 +- apps/web/src/cloud/linkEnvironment.ts | 10 +- apps/web/src/cloud/managedRelayLayer.ts | 4 +- apps/web/src/connection/platform.ts | 53 +- apps/web/src/connection/runtime.ts | 43 +- apps/web/src/connection/storage.ts | 2 +- .../web/src/environments/primary/httpLayer.ts | 12 +- .../web/src/lib/backgroundActivityReporter.ts | 4 +- apps/web/src/lib/runtime.ts | 32 +- apps/web/src/observability/clientTracing.ts | 8 +- infra/relay/alchemy.run.ts | 6 +- infra/relay/scripts/android-push-watch.ts | 12 +- .../AgentActivityPublisher.test.ts | 12 +- .../src/agentActivity/ApnsClient.test.ts | 14 +- .../src/agentActivity/FcmDeliveries.test.ts | 4 +- .../agentActivity/MobileRegistrations.test.ts | 4 +- infra/relay/src/hooks/HeldHooks.test.ts | 4 +- infra/relay/src/hooks/HookForwarder.test.ts | 16 +- infra/relay/src/hooks/HookForwarder.ts | 2 +- infra/relay/src/hooks/HookInboxObject.ts | 6 +- infra/relay/src/http/Api.test.ts | 52 +- infra/relay/src/http/Api.ts | 32 +- infra/relay/src/worker.ts | 89 +- .../client-runtime/src/connection/layer.ts | 18 +- .../src/connection/onboarding.test.ts | 16 +- .../src/connection/registry.test.ts | 4 +- .../src/connection/resolver.test.ts | 44 +- .../src/connection/supervisor.test.ts | 10 +- .../operations/commands.performance.test.ts | 4 +- .../src/operations/commands.test.ts | 44 +- .../src/relay/managedRelay.test.ts | 6 +- packages/client-runtime/src/rpc/http.ts | 4 +- .../client-runtime/src/rpc/session.test.ts | 4 +- packages/client-runtime/src/rpc/session.ts | 8 +- .../state/boundedThreadSnapshotHttp.test.ts | 10 +- .../src/state/boundedThreadSnapshotHttp.ts | 2 +- .../src/state/environmentHttpAuth.test.ts | 14 +- packages/client-runtime/src/state/threads.ts | 2 +- packages/effect-acp/scripts/generate.ts | 4 +- packages/effect-acp/src/agent.ts | 4 +- packages/effect-acp/src/client.test.ts | 16 +- packages/effect-acp/src/client.ts | 4 +- .../src/client.test.ts | 8 +- .../test/examples/codex-app-server-probe.ts | 4 +- packages/shared/src/httpObservability.ts | 2 +- packages/shared/src/otelEnvironment.test.ts | 9 +- packages/shared/src/relayTracing.test.ts | 12 +- packages/shared/src/relayTracing.ts | 4 +- packages/ssh/src/command.test.ts | 18 +- packages/ssh/src/tunnel.test.ts | 30 +- 344 files changed, 6050 insertions(+), 6087 deletions(-) diff --git a/apps/desktop/src/app/DesktopAssets.test.ts b/apps/desktop/src/app/DesktopAssets.test.ts index 78819d06e6cc..6d2179f0256a 100644 --- a/apps/desktop/src/app/DesktopAssets.test.ts +++ b/apps/desktop/src/app/DesktopAssets.test.ts @@ -11,7 +11,7 @@ import * as DesktopAssets from "./DesktopAssets.ts"; import * as DesktopConfig from "./DesktopConfig.ts"; import * as DesktopEnvironment from "./DesktopEnvironment.ts"; -const environmentLayer = DesktopEnvironment.layer({ +const layerEnvironment = DesktopEnvironment.layer({ dirname: "/repo/apps/desktop/dist-electron", homeDirectory: "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/Users/alice", platform: "darwin", @@ -30,7 +30,7 @@ const environmentLayer = DesktopEnvironment.layer({ describe("DesktopAssets", () => { it.effect("uses canonical source-tree icons for unpackaged development", () => Effect.gen(function* () { - const developmentEnvironmentLayer = DesktopEnvironment.layer({ + const layerDevelopmentEnvironment = DesktopEnvironment.layer({ dirname: "/repo/apps/desktop/dist-electron", homeDirectory: "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/Users/alice", platform: "linux", @@ -49,13 +49,13 @@ describe("DesktopAssets", () => { ), ), ); - const fileSystemLayer = FileSystem.layerNoop({ + const layerFileSystem = FileSystem.layerNoop({ exists: (path) => Effect.succeed(String(path).includes("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/assets/dev/")), }); const assets = yield* DesktopAssets.DesktopAssets.pipe( Effect.provide( DesktopAssets.layer.pipe( - Layer.provide(Layer.merge(fileSystemLayer, developmentEnvironmentLayer)), + Layer.provide(Layer.merge(layerFileSystem, layerDevelopmentEnvironment)), ), ), ); @@ -79,13 +79,13 @@ describe("DesktopAssets", () => { pathOrDescriptor: candidatePath, description: "private filesystem diagnostic", }); - const fileSystemLayer = FileSystem.layerNoop({ + const layerFileSystem = FileSystem.layerNoop({ exists: (path) => (path === candidatePath ? Effect.fail(cause) : Effect.succeed(false)), }); - const assetsLayer = DesktopAssets.layer.pipe( - Layer.provide(Layer.merge(fileSystemLayer, environmentLayer)), + const layerAssets = DesktopAssets.layer.pipe( + Layer.provide(Layer.merge(layerFileSystem, layerEnvironment)), ); - const assets = yield* DesktopAssets.DesktopAssets.pipe(Effect.provide(assetsLayer)); + const assets = yield* DesktopAssets.DesktopAssets.pipe(Effect.provide(layerAssets)); const error = yield* assets.resolveResourcePath(fileName).pipe(Effect.flip); diff --git a/apps/desktop/src/app/DesktopConnectionCatalogStore.test.ts b/apps/desktop/src/app/DesktopConnectionCatalogStore.test.ts index 963755adc42b..d57c383dfa5c 100644 --- a/apps/desktop/src/app/DesktopConnectionCatalogStore.test.ts +++ b/apps/desktop/src/app/DesktopConnectionCatalogStore.test.ts @@ -56,7 +56,7 @@ function makeLayer( failDecrypt: Ref.Ref | null = null, fileSystemLayer: Layer.Layer = NodeServices.layer, ) { - const environmentLayer = DesktopEnvironment.layer({ + const layerEnvironment = DesktopEnvironment.layer({ dirname: "/repo/apps/desktop/src", homeDirectory: baseDir, platform: "darwin", @@ -71,20 +71,20 @@ function makeLayer( Layer.mergeAll(NodeServices.layer, DesktopConfig.layerTest({ T3CODE_HOME: baseDir })), ), ); - const safeStorageLayer = makeSafeStorageLayer(encryptionAvailable, failDecrypt); - const dependencies = Layer.mergeAll( - environmentLayer, - safeStorageLayer, + const layerSafeStorage = makeSafeStorageLayer(encryptionAvailable, failDecrypt); + const layerDependencies = Layer.mergeAll( + layerEnvironment, + layerSafeStorage, NodeServices.layer, fileSystemLayer, ); - const savedEnvironmentsLayer = DesktopSavedEnvironments.layer.pipe( - Layer.provideMerge(dependencies), + const layerSavedEnvironments = DesktopSavedEnvironments.layer.pipe( + Layer.provideMerge(layerDependencies), ); return DesktopConnectionCatalogStore.layer.pipe( - Layer.provideMerge(savedEnvironmentsLayer), - Layer.provideMerge(dependencies), + Layer.provideMerge(layerSavedEnvironments), + Layer.provideMerge(layerDependencies), ); } @@ -280,14 +280,14 @@ describe("DesktopConnectionCatalogStore", () => { method: "readFileString", pathOrDescriptor: path.join(baseDir, "userdata", "connection-catalog.json"), }); - const fileSystemLayer = Layer.succeed( + const layerFileSystem = Layer.succeed( FileSystem.FileSystem, FileSystem.makeNoop({ readFileString: () => Effect.fail(permissionError), }), ); const store = yield* DesktopConnectionCatalogStore.DesktopConnectionCatalogStore.pipe( - Effect.provide(makeLayer(baseDir, true, null, fileSystemLayer)), + Effect.provide(makeLayer(baseDir, true, null, layerFileSystem)), ); const error = yield* store.get.pipe(Effect.flip); @@ -318,14 +318,14 @@ describe("DesktopConnectionCatalogStore", () => { method: "makeDirectory", pathOrDescriptor: path.join(baseDir, "userdata"), }); - const fileSystemLayer = Layer.succeed( + const layerFileSystem = Layer.succeed( FileSystem.FileSystem, FileSystem.makeNoop({ makeDirectory: () => Effect.fail(permissionError), }), ); const store = yield* DesktopConnectionCatalogStore.DesktopConnectionCatalogStore.pipe( - Effect.provide(makeLayer(baseDir, true, null, fileSystemLayer)), + Effect.provide(makeLayer(baseDir, true, null, layerFileSystem)), ); const error = yield* store.set("{}").pipe(Effect.flip); diff --git a/apps/desktop/src/app/DesktopLifecycle.test.ts b/apps/desktop/src/app/DesktopLifecycle.test.ts index 9e24f9db3e05..712864193de8 100644 --- a/apps/desktop/src/app/DesktopLifecycle.test.ts +++ b/apps/desktop/src/app/DesktopLifecycle.test.ts @@ -54,7 +54,7 @@ function makeElectronAppLayer( } satisfies ElectronApp.ElectronApp["Service"]); } -const electronThemeLayer = Layer.succeed(ElectronTheme.ElectronTheme, { +const layerElectronTheme = Layer.succeed(ElectronTheme.ElectronTheme, { shouldUseDarkColors: Effect.succeed(false), setSource: () => Effect.void, onUpdated: () => Effect.void, @@ -106,14 +106,14 @@ describe("DesktopLifecycle", () => { (platform) => { const appListeners = new Map void>(); let windowsDestroyed = false; - const environmentLayer = Layer.succeed(DesktopEnvironment.DesktopEnvironment, { + const layerEnvironment = Layer.succeed(DesktopEnvironment.DesktopEnvironment, { platform, isDevelopment: false, } as DesktopEnvironment.DesktopEnvironment["Service"]); const layer = DesktopLifecycle.layer.pipe( Layer.provideMerge(makeElectronAppLayer(appListeners)), - Layer.provideMerge(electronThemeLayer), + Layer.provideMerge(layerElectronTheme), Layer.provideMerge( makeElectronWindowLayer( Effect.sync(() => { @@ -122,7 +122,7 @@ describe("DesktopLifecycle", () => { ), ), Layer.provideMerge(makeDesktopWindowLayer()), - Layer.provideMerge(environmentLayer), + Layer.provideMerge(layerEnvironment), Layer.provideMerge(DesktopShutdown.layer), Layer.provideMerge(DesktopState.layer), ); @@ -174,7 +174,7 @@ describe("DesktopLifecycle", () => { events.push("flush"); }); - const desktopShutdownLayer = Layer.succeed(DesktopShutdown.DesktopShutdown, { + const layerDesktopShutdown = Layer.succeed(DesktopShutdown.DesktopShutdown, { request: Effect.sync(() => { events.push("request"); }).pipe(Effect.andThen(Deferred.succeed(shutdownRequested, undefined)), Effect.asVoid), @@ -184,18 +184,18 @@ describe("DesktopLifecycle", () => { isComplete: Deferred.isDone(allowShutdown), }); - const environmentLayer = Layer.succeed(DesktopEnvironment.DesktopEnvironment, { + const layerEnvironment = Layer.succeed(DesktopEnvironment.DesktopEnvironment, { platform: "darwin", isDevelopment: false, } as DesktopEnvironment.DesktopEnvironment["Service"]); const layer = DesktopLifecycle.layer.pipe( Layer.provideMerge(makeElectronAppLayer(appListeners, quit)), - Layer.provideMerge(electronThemeLayer), + Layer.provideMerge(layerElectronTheme), Layer.provideMerge(makeElectronWindowLayer(destroyAll)), Layer.provideMerge(makeDesktopWindowLayer({ flushMainWindowBounds })), - Layer.provideMerge(environmentLayer), - Layer.provideMerge(desktopShutdownLayer), + Layer.provideMerge(layerEnvironment), + Layer.provideMerge(layerDesktopShutdown), Layer.provideMerge(DesktopState.layer), ); @@ -226,16 +226,16 @@ describe("DesktopLifecycle", () => { const activate = Effect.sync(() => { activationCount += 1; }); - const environmentLayer = Layer.succeed(DesktopEnvironment.DesktopEnvironment, { + const layerEnvironment = Layer.succeed(DesktopEnvironment.DesktopEnvironment, { platform: "darwin", isDevelopment: false, } as DesktopEnvironment.DesktopEnvironment["Service"]); const layer = DesktopLifecycle.layer.pipe( Layer.provideMerge(makeElectronAppLayer(appListeners)), - Layer.provideMerge(electronThemeLayer), + Layer.provideMerge(layerElectronTheme), Layer.provideMerge(makeElectronWindowLayer()), Layer.provideMerge(makeDesktopWindowLayer({ activate })), - Layer.provideMerge(environmentLayer), + Layer.provideMerge(layerEnvironment), Layer.provideMerge(DesktopShutdown.layer), Layer.provideMerge(DesktopState.layer), ); diff --git a/apps/desktop/src/app/DesktopObservability.test.ts b/apps/desktop/src/app/DesktopObservability.test.ts index cf17bf793a82..afb50362e404 100644 --- a/apps/desktop/src/app/DesktopObservability.test.ts +++ b/apps/desktop/src/app/DesktopObservability.test.ts @@ -94,7 +94,7 @@ const collectorLayer = (requests: Array) => ); // A developer's own OTEL_* variables would otherwise pick the endpoints. -const emptyEnv = ConfigProvider.layer(ConfigProvider.fromEnv({ env: {} })); +const layerEmptyEnv = ConfigProvider.layer(ConfigProvider.fromEnv({ env: {} })); const encodeObservabilitySettingsFile = Schema.encodeSync( Schema.fromJsonString( @@ -146,15 +146,15 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-observability-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir); + const layerEnvironment = makeEnvironmentLayer(baseDir); const tracePath = yield* Effect.gen(function* () { const environment = yield* DesktopEnvironment.DesktopEnvironment; return environment.path.join(environment.logDir, "desktop.trace.ndjson"); - }).pipe(Effect.provide(environmentLayer)); + }).pipe(Effect.provide(layerEnvironment)); const logPath = yield* Effect.gen(function* () { const environment = yield* DesktopEnvironment.DesktopEnvironment; return environment.path.join(environment.logDir, "desktop-main.log"); - }).pipe(Effect.provide(environmentLayer)); + }).pipe(Effect.provide(layerEnvironment)); yield* Effect.scoped( Effect.gen(function* () { @@ -162,7 +162,7 @@ describe("DesktopObservability", () => { yield* Effect.logInfo("desktop trace event"); }).pipe( Effect.withSpan("desktop-observability-test"), - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ), ); @@ -185,7 +185,7 @@ describe("DesktopObservability", () => { assert.isFalse(yield* fileSystem.exists(logPath)); }).pipe( Effect.scoped, - Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, emptyEnv)), + Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, layerEmptyEnv)), ), ); @@ -195,15 +195,15 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-backend-output-log-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir, false); + const layerEnvironment = makeEnvironmentLayer(baseDir, false); const logPath = yield* Effect.gen(function* () { const environment = yield* DesktopEnvironment.DesktopEnvironment; return environment.path.join(environment.logDir, "server-child.log"); - }).pipe(Effect.provide(environmentLayer)); + }).pipe(Effect.provide(layerEnvironment)); const tracePath = yield* Effect.gen(function* () { const environment = yield* DesktopEnvironment.DesktopEnvironment; return environment.path.join(environment.logDir, "desktop.trace.ndjson"); - }).pipe(Effect.provide(environmentLayer)); + }).pipe(Effect.provide(layerEnvironment)); yield* Effect.gen(function* () { const factory = yield* DesktopObservability.DesktopBackendOutputLogFactory; @@ -219,7 +219,7 @@ describe("DesktopObservability", () => { yield* outputLog.discardSession; }).pipe( Effect.annotateLogs({ runId: "test-run" }), - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ); const log = yield* fileSystem.readFileString(logPath); @@ -263,7 +263,7 @@ describe("DesktopObservability", () => { ); }).pipe( Effect.scoped, - Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, emptyEnv)), + Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, layerEmptyEnv)), ), ); @@ -273,11 +273,11 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-backend-output-snapshot-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir, false); + const layerEnvironment = makeEnvironmentLayer(baseDir, false); const logPath = yield* Effect.gen(function* () { const environment = yield* DesktopEnvironment.DesktopEnvironment; return environment.path.join(environment.logDir, "server-child.log"); - }).pipe(Effect.provide(environmentLayer)); + }).pipe(Effect.provide(layerEnvironment)); yield* Effect.gen(function* () { const factory = yield* DesktopObservability.DesktopBackendOutputLogFactory; @@ -289,7 +289,7 @@ describe("DesktopObservability", () => { yield* outputLog.persistFailure({ details: "code=1" }); }).pipe( Effect.annotateLogs({ runId: "test-run" }), - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ); const records = yield* Effect.forEach( @@ -303,7 +303,7 @@ describe("DesktopObservability", () => { assert.equal(records.at(-1)?.annotations.details, "code=1"); }).pipe( Effect.scoped, - Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, emptyEnv)), + Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, layerEmptyEnv)), ), ); @@ -313,11 +313,11 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-backend-output-bound-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir, false); + const layerEnvironment = makeEnvironmentLayer(baseDir, false); const logPath = yield* Effect.gen(function* () { const environment = yield* DesktopEnvironment.DesktopEnvironment; return environment.path.join(environment.logDir, "server-child.log"); - }).pipe(Effect.provide(environmentLayer)); + }).pipe(Effect.provide(layerEnvironment)); const maxBufferedBytes = 1024 * 1024; const discardedPrefixBytes = 128; const output = new Uint8Array(maxBufferedBytes + discardedPrefixBytes); @@ -332,7 +332,7 @@ describe("DesktopObservability", () => { yield* outputLog.writeOutputChunk("stderr", output); yield* outputLog.persistFailure({ details: "code=1" }); }).pipe( - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ), ); @@ -347,7 +347,7 @@ describe("DesktopObservability", () => { assert.isFalse(text.includes("y")); }).pipe( Effect.scoped, - Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, emptyEnv)), + Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, layerEmptyEnv)), ), ); @@ -357,11 +357,11 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-backend-output-chunks-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir, false); + const layerEnvironment = makeEnvironmentLayer(baseDir, false); const logPath = yield* Effect.gen(function* () { const environment = yield* DesktopEnvironment.DesktopEnvironment; return environment.path.join(environment.logDir, "server-child.log"); - }).pipe(Effect.provide(environmentLayer)); + }).pipe(Effect.provide(layerEnvironment)); yield* Effect.scoped( Effect.gen(function* () { @@ -373,7 +373,7 @@ describe("DesktopObservability", () => { } yield* outputLog.persistFailure({ details: "code=1" }); }).pipe( - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ), ); @@ -381,7 +381,7 @@ describe("DesktopObservability", () => { assert.equal(lines.length, 258); }).pipe( Effect.scoped, - Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, emptyEnv)), + Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, layerEmptyEnv)), ), ); @@ -392,19 +392,19 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-observability-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir, true, { + const layerEnvironment = makeEnvironmentLayer(baseDir, true, { T3CODE_OTLP_LOGS_URL: "https://collector.example.com/v1/logs", T3CODE_OTLP_HEADERS: "x-scope=desktop", }); const tracePath = yield* Effect.gen(function* () { const environment = yield* DesktopEnvironment.DesktopEnvironment; return environment.path.join(environment.logDir, "desktop.trace.ndjson"); - }).pipe(Effect.provide(environmentLayer)); + }).pipe(Effect.provide(layerEnvironment)); yield* Effect.scoped( Effect.logInfo("desktop log export").pipe( Effect.withSpan("desktop-log-export-test"), - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ), ); @@ -427,7 +427,7 @@ describe("DesktopObservability", () => { assert.lengthOf(record?.events ?? [], 0); }).pipe( Effect.scoped, - Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests), emptyEnv)), + Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests), layerEmptyEnv)), ); }); @@ -438,16 +438,16 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-observability-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir, true, { + const layerEnvironment = makeEnvironmentLayer(baseDir, true, { T3CODE_OTLP_HEADERS: "x-scope=desktop", }); - yield* writeObservabilitySettings(environmentLayer, { + yield* writeObservabilitySettings(layerEnvironment, { otlpLogsUrl: "https://settings.example.com/v1/logs", }); yield* Effect.scoped( Effect.logInfo("desktop otel export").pipe( - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ), ); @@ -484,13 +484,13 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-observability-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir, true, { + const layerEnvironment = makeEnvironmentLayer(baseDir, true, { T3CODE_OTLP_LOGS_URL: "https://collector.example.com/v1/logs", }); yield* Effect.scoped( Effect.logInfo("desktop service name").pipe( - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ), ); @@ -527,16 +527,16 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-observability-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir, true, { + const layerEnvironment = makeEnvironmentLayer(baseDir, true, { T3CODE_OTLP_HEADERS: "x-scope=desktop", }); - yield* writeObservabilitySettings(environmentLayer, { + yield* writeObservabilitySettings(layerEnvironment, { otlpLogsUrl: "https://settings.example.com/v1/logs", }); yield* Effect.scoped( Effect.logInfo("desktop otel off").pipe( - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ), ); @@ -567,13 +567,13 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-observability-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir, true, { + const layerEnvironment = makeEnvironmentLayer(baseDir, true, { T3CODE_OTLP_LOGS_URL: "https://collector.example.com/v1/logs", }); yield* Effect.scoped( Effect.void.pipe( - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ), ); @@ -597,8 +597,8 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-observability-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir); - yield* writeObservabilitySettings(environmentLayer, { + const layerEnvironment = makeEnvironmentLayer(baseDir); + yield* writeObservabilitySettings(layerEnvironment, { otlpTracesUrl: "https://settings.example.com/v1/traces", otlpLogsUrl: "https://settings.example.com/v1/logs", // The main process records no metrics yet, so this endpoint must @@ -609,7 +609,7 @@ describe("DesktopObservability", () => { yield* Effect.scoped( Effect.logInfo("desktop log export from settings").pipe( Effect.withSpan("desktop-settings-export-test"), - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ), ); @@ -627,7 +627,7 @@ describe("DesktopObservability", () => { ); }).pipe( Effect.scoped, - Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests), emptyEnv)), + Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests), layerEmptyEnv)), ); }); @@ -651,7 +651,7 @@ describe("DesktopObservability", () => { assert.lengthOf(requests, 0); }).pipe( Effect.scoped, - Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests), emptyEnv)), + Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests), layerEmptyEnv)), ); }); @@ -662,8 +662,8 @@ describe("DesktopObservability", () => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-desktop-observability-test-", }); - const environmentLayer = makeEnvironmentLayer(baseDir); - yield* writeObservabilitySettings(environmentLayer, { + const layerEnvironment = makeEnvironmentLayer(baseDir); + yield* writeObservabilitySettings(layerEnvironment, { otlpTracesUrl: "https://settings.example.com/v1/traces", otlpLogsUrl: "https://settings.example.com/v1/logs", }); @@ -671,7 +671,7 @@ describe("DesktopObservability", () => { yield* Effect.scoped( Effect.logInfo("desktop log stays local when disabled").pipe( Effect.withSpan("desktop-disabled-test"), - Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(environmentLayer))), + Effect.provide(DesktopObservability.layer.pipe(Layer.provideMerge(layerEnvironment))), ), ); diff --git a/apps/desktop/src/app/DesktopObservability.ts b/apps/desktop/src/app/DesktopObservability.ts index 03e3a8dfe222..c46798c901c7 100644 --- a/apps/desktop/src/app/DesktopObservability.ts +++ b/apps/desktop/src/app/DesktopObservability.ts @@ -559,7 +559,7 @@ const makeBackendOutputLogShape = ( }), }); -const backendOutputLogFactoryLayer = Layer.effect( +const layerBackendOutputLogFactory = Layer.effect( DesktopBackendOutputLogFactory, Effect.gen(function* () { const environment = yield* DesktopEnvironment.DesktopEnvironment; @@ -621,7 +621,7 @@ const backendOutputLogFactoryLayer = Layer.effect( * one read of the environment and Settings, and because a process gets exactly * one logger set. */ -const telemetryLayer = Layer.unwrap( +const layerTelemetry = Layer.unwrap( Effect.gen(function* () { const environment = yield* DesktopEnvironment.DesktopEnvironment; const endpoints = yield* resolveOtlpEndpoints; @@ -645,7 +645,7 @@ const telemetryLayer = Layer.unwrap( // while the OTLP logger carries every message as a log record stamped // with its trace and span ids. Keeping both would export every in-span // message twice. - const loggerLayer = Logger.layer( + const layerLogger = Logger.layer( endpoints.logs === undefined ? [Logger.consolePretty(), Logger.tracerLogger] : [ @@ -665,7 +665,7 @@ const telemetryLayer = Layer.unwrap( ), ); - const tracerLayer = Layer.unwrap( + const layerTracer = Layer.unwrap( Effect.gen(function* () { const tracePath = environment.path.join(environment.logDir, "desktop.trace.ndjson"); const sink = yield* makeTraceSink({ @@ -713,20 +713,20 @@ const telemetryLayer = Layer.unwrap( // }).pipe(Layer.provide(otlpSerializationLayer(endpoints.metrics.export.protocol))); // Logged once the loggers above are installed, so the warnings use them. - const otelWarningsLayer = Layer.effectDiscard( + const layerOtelWarnings = Layer.effectDiscard( Effect.forEach(endpoints.warnings, (warning) => Effect.logWarning(warning)), ); - return otelWarningsLayer.pipe( - Layer.provideMerge(Layer.mergeAll(loggerLayer, tracerLayer)), + return layerOtelWarnings.pipe( + Layer.provideMerge(Layer.mergeAll(layerLogger, layerTracer)), Layer.provide(OtelEnvironment.layerResourceAttributes(endpoints.resourceAttributes)), ); }), ); export const layer = Layer.mergeAll( - backendOutputLogFactoryLayer, - telemetryLayer, + layerBackendOutputLogFactory, + layerTelemetry, Layer.succeed(References.MinimumLogLevel, "Info"), Layer.succeed(Tracer.MinimumTraceLevel, "Info"), Layer.succeed(References.TracerTimingEnabled, true), diff --git a/apps/desktop/src/app/DesktopPreReadyPlatform.test.ts b/apps/desktop/src/app/DesktopPreReadyPlatform.test.ts index a2d4483e6d2b..4fa5d417aa64 100644 --- a/apps/desktop/src/app/DesktopPreReadyPlatform.test.ts +++ b/apps/desktop/src/app/DesktopPreReadyPlatform.test.ts @@ -167,11 +167,11 @@ describe("DesktopPreReadyPlatform", () => { events.push("pre-ready"); }); - const preReadyLayer = DesktopPreReadyPlatform.layer.pipe( + const layerPreReady = DesktopPreReadyPlatform.layer.pipe( Layer.provide(Layer.succeed(HostProcessPlatform, "darwin")), ); - const clerkShapedLayer = Layer.effect( + const layerClerkShaped = Layer.effect( ClerkShaped, Effect.promise(() => Promise.resolve()).pipe( Effect.map(() => { @@ -181,15 +181,15 @@ describe("DesktopPreReadyPlatform", () => { ), ); - const runtimeLayer = clerkShapedLayer.pipe( + const layerRuntime = layerClerkShaped.pipe( Layer.flatMap((clerkContext) => Layer.succeedContext(clerkContext)), - Layer.provideMerge(preReadyLayer), + Layer.provideMerge(layerPreReady), ); const result = yield* Effect.all({ clerk: ClerkShaped, preReady: DesktopPreReadyPlatform.DesktopPreReadyElectronOptions, - }).pipe(Effect.provide(runtimeLayer)); + }).pipe(Effect.provide(layerRuntime)); assert.deepEqual(result, { clerk: { ready: true }, diff --git a/apps/desktop/src/backend/DesktopBackendConfiguration.test.ts b/apps/desktop/src/backend/DesktopBackendConfiguration.test.ts index f3b60a3fdba3..f9260490f9a6 100644 --- a/apps/desktop/src/backend/DesktopBackendConfiguration.test.ts +++ b/apps/desktop/src/backend/DesktopBackendConfiguration.test.ts @@ -35,7 +35,7 @@ const isDesktopBackendObservabilitySettingsReadError = Schema.is( DesktopBackendConfiguration.DesktopBackendObservabilitySettingsReadError, ); -const serverExposureLayer = Layer.succeed(DesktopServerExposure.DesktopServerExposure, { +const layerServerExposure = Layer.succeed(DesktopServerExposure.DesktopServerExposure, { getState: Effect.die("unexpected getState"), backendConfig: Effect.succeed({ port: 4888, @@ -122,7 +122,7 @@ const withHarness = ( return yield* effect.pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslEnvironment.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), @@ -182,7 +182,7 @@ const withPackagedWslHarness = ( mountedAppRoot, mountedEntryPath, } satisfies PackagedWslHarnessContext; - const serverTreeLayer = input.forbidFallback + const layerServerTree = input.forbidFallback ? Layer.succeed( DesktopWslServerTree.DesktopWslServerTree, DesktopWslServerTree.DesktopWslServerTree.of({ @@ -200,9 +200,9 @@ const withPackagedWslHarness = ( return yield* effect(context).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), - Layer.provideMerge(serverTreeLayer), + Layer.provideMerge(layerServerTree), Layer.provideMerge( DesktopWslEnvironment.layerTest({ isAvailable: true, @@ -276,7 +276,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslEnvironment.layerTest()), Layer.provideMerge( @@ -338,7 +338,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge( @@ -660,7 +660,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge( @@ -788,7 +788,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge( @@ -846,7 +846,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge(DesktopWslEnvironment.layerTest()), @@ -877,7 +877,7 @@ describe("DesktopBackendConfiguration", () => { const logger = Logger.make(({ message }) => { messages.push(message); }); - const failingFileSystemLayer = Layer.succeed( + const layerFailingFileSystem = Layer.succeed( FileSystem.FileSystem, FileSystem.makeNoop({ readFileString: () => Effect.fail(cause), @@ -891,12 +891,12 @@ describe("DesktopBackendConfiguration", () => { Effect.provide( Layer.mergeAll( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge(DesktopWslEnvironment.layerTest()), Layer.provideMerge(makeEnvironmentLayer(baseDir)), - Layer.provideMerge(failingFileSystemLayer), + Layer.provideMerge(layerFailingFileSystem), ), Logger.layer([logger], { mergeWithExisting: false }), ), @@ -936,7 +936,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge(DesktopWslEnvironment.layerTest()), @@ -974,7 +974,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge( @@ -1040,7 +1040,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge( @@ -1114,7 +1114,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge( @@ -1162,7 +1162,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge( DesktopAppSettings.layerTest({ ...DesktopAppSettings.DEFAULT_DESKTOP_SETTINGS, @@ -1199,7 +1199,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge( DesktopAppSettings.layerTest({ ...DesktopAppSettings.DEFAULT_DESKTOP_SETTINGS, @@ -1240,7 +1240,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge( @@ -1275,7 +1275,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge( @@ -1309,7 +1309,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge( DesktopWslServerTree.layerTest({ @@ -1350,7 +1350,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge( @@ -1380,7 +1380,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge( DesktopAppSettings.layerTest({ ...DesktopAppSettings.DEFAULT_DESKTOP_SETTINGS, @@ -1429,7 +1429,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge(DesktopWslEnvironment.layerTest()), @@ -1475,7 +1475,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge(DesktopWslEnvironment.layerTest()), @@ -1519,7 +1519,7 @@ describe("DesktopBackendConfiguration", () => { }).pipe( Effect.provide( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge( DesktopAppSettings.layerTest({ ...DesktopAppSettings.DEFAULT_DESKTOP_SETTINGS, @@ -1548,7 +1548,7 @@ describe("DesktopBackendConfiguration", () => { // oxlint-disable-next-line t3code/no-manual-effect-runtime-in-tests -- This test intentionally replicates the sync IPC handler's runSync path to catch a regression to async-only resolution; it.effect would mask it. const runtime = ManagedRuntime.make( DesktopBackendConfiguration.layer.pipe( - Layer.provideMerge(serverExposureLayer), + Layer.provideMerge(layerServerExposure), Layer.provideMerge(DesktopAppSettings.layerTest()), Layer.provideMerge(DesktopWslServerTree.layerTest()), Layer.provideMerge(DesktopWslEnvironment.layer), diff --git a/apps/desktop/src/backend/DesktopBackendManager.test.ts b/apps/desktop/src/backend/DesktopBackendManager.test.ts index 881382519872..9e529d5d1331 100644 --- a/apps/desktop/src/backend/DesktopBackendManager.test.ts +++ b/apps/desktop/src/backend/DesktopBackendManager.test.ts @@ -109,7 +109,7 @@ function httpClientLayer( ); } -const healthyHttpClientLayer = httpClientLayer((request) => +const layerHealthyHttpClient = httpClientLayer((request) => Effect.succeed(responseForRequest(request, 200)), ); @@ -152,12 +152,12 @@ function makeTestInstance(input: MakeInstanceInput) { discardSession: Effect.void, ...input.backendOutputLog, }; - const servicesLayer = Layer.mergeAll( + const layerServices = Layer.mergeAll( FileSystem.layerNoop({ exists: () => Effect.succeed(true), }), input.spawnerLayer, - input.httpClientLayer ?? healthyHttpClientLayer, + input.httpClientLayer ?? layerHealthyHttpClient, Layer.succeed(DesktopObservability.DesktopBackendOutputLogFactory, { forInstance: () => Effect.succeed(stubLog), } satisfies DesktopObservability.DesktopBackendOutputLogFactory["Service"]), @@ -187,7 +187,7 @@ function makeTestInstance(input: MakeInstanceInput) { ...(input.onPreflightFailed ? { onPreflightFailed: input.onPreflightFailed } : {}), }); - return instance.pipe(Effect.provide(servicesLayer)); + return instance.pipe(Effect.provide(layerServices)); } describe("DesktopBackendManager", () => { @@ -201,7 +201,7 @@ describe("DesktopBackendManager", () => { const ready = yield* Deferred.make(); const exited = yield* Queue.unbounded(); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make((command) => Effect.gen(function* () { @@ -229,7 +229,7 @@ describe("DesktopBackendManager", () => { ...baseConfig, bootstrap: configWithObservability, }, - spawnerLayer, + spawnerLayer: layerSpawner, desktopTelemetryStream: Stream.encodeText( Stream.make('{"version":1,"type":"desktopTelemetryHello","electronPid":123}\n'), ), @@ -317,7 +317,7 @@ describe("DesktopBackendManager", () => { it.effect("reports bootstrap encoding failures with stable process context", () => Effect.gen(function* () { - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.die("unexpected backend spawn")), ); @@ -331,7 +331,7 @@ describe("DesktopBackendManager", () => { }).pipe( Effect.flip, Effect.scoped, - Effect.provide(Layer.merge(spawnerLayer, healthyHttpClientLayer)), + Effect.provide(Layer.merge(layerSpawner, layerHealthyHttpClient)), ); if (error._tag !== "BackendProcessBootstrapEncodeError") { @@ -359,7 +359,7 @@ describe("DesktopBackendManager", () => { pathOrDescriptor: baseConfig.executablePath, description: "low-level detail that must not become the public message", }); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.fail(spawnCause)), ); @@ -369,7 +369,7 @@ describe("DesktopBackendManager", () => { }).pipe( Effect.flip, Effect.scoped, - Effect.provide(Layer.merge(spawnerLayer, healthyHttpClientLayer)), + Effect.provide(Layer.merge(layerSpawner, layerHealthyHttpClient)), ); if (error._tag !== "BackendProcessSpawnError") { @@ -397,7 +397,7 @@ describe("DesktopBackendManager", () => { method: "exitCode", description: "exit-status-secret-sentinel", }); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.succeed( @@ -413,7 +413,7 @@ describe("DesktopBackendManager", () => { }).pipe( Effect.flip, Effect.scoped, - Effect.provide(Layer.merge(spawnerLayer, healthyHttpClientLayer)), + Effect.provide(Layer.merge(layerSpawner, layerHealthyHttpClient)), ); if (error._tag !== "BackendProcessExitStatusError") { @@ -440,7 +440,7 @@ describe("DesktopBackendManager", () => { description: "output-stream-secret-sentinel", }); const reported = yield* Deferred.make(); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.succeed( @@ -456,7 +456,7 @@ describe("DesktopBackendManager", () => { ...baseConfig, desktopTelemetryStream: Stream.empty, onOutputFailure: (error) => Deferred.succeed(reported, error).pipe(Effect.asVoid), - }).pipe(Effect.scoped, Effect.provide(Layer.merge(spawnerLayer, healthyHttpClientLayer))); + }).pipe(Effect.scoped, Effect.provide(Layer.merge(layerSpawner, layerHealthyHttpClient))); const error = yield* Deferred.await(reported); assert.equal(exit.code.pipe(Option.getOrUndefined), 0); @@ -483,7 +483,7 @@ describe("DesktopBackendManager", () => { const reported = yield* Deferred.make(); const drained = yield* Deferred.make(); let outputCount = 0; - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.succeed( @@ -505,7 +505,7 @@ describe("DesktopBackendManager", () => { : Deferred.succeed(drained, void 0).pipe(Effect.asVoid); }, onOutputFailure: (error) => Deferred.succeed(reported, error).pipe(Effect.asVoid), - }).pipe(Effect.scoped, Effect.provide(Layer.merge(spawnerLayer, healthyHttpClientLayer))); + }).pipe(Effect.scoped, Effect.provide(Layer.merge(layerSpawner, layerHealthyHttpClient))); const error = yield* Deferred.await(reported); assert.equal(exit.code.pipe(Option.getOrUndefined), 0); @@ -534,7 +534,7 @@ describe("DesktopBackendManager", () => { Effect.gen(function* () { const exitObserved = yield* Deferred.make(); const finishOutputDrain = yield* Deferred.make(); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.succeed( @@ -555,7 +555,7 @@ describe("DesktopBackendManager", () => { desktopTelemetryStream: Stream.empty, onExitObserved: () => Deferred.succeed(exitObserved, void 0).pipe(Effect.asVoid), }).pipe( - Effect.provide(Layer.merge(spawnerLayer, healthyHttpClientLayer)), + Effect.provide(Layer.merge(layerSpawner, layerHealthyHttpClient)), Effect.forkChild, ); @@ -577,7 +577,7 @@ describe("DesktopBackendManager", () => { type: "setDiagnosticsDemand", enabled: true, }); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.succeed( @@ -592,7 +592,7 @@ describe("DesktopBackendManager", () => { ), ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, desktopTelemetryPublisher: { handleControlForSource: (_sourceId, message) => message.type === "setDiagnosticsDemand" @@ -613,7 +613,7 @@ describe("DesktopBackendManager", () => { const persistedOutput = yield* Deferred.make>(); const outputDrainStarted = yield* Deferred.make(); const outputChunks = yield* Ref.make>([]); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.succeed( @@ -630,7 +630,7 @@ describe("DesktopBackendManager", () => { ), ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, httpClientLayer: httpClientLayer(() => Effect.never), backendOutputLog: { writeOutputChunk: (_streamName, chunk) => @@ -665,7 +665,7 @@ describe("DesktopBackendManager", () => { const pruneComplete = yield* Deferred.make(); const exited = yield* Queue.unbounded(); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.succeed( @@ -679,7 +679,7 @@ describe("DesktopBackendManager", () => { ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, config: { ...baseConfig, runningDistro: "Ubuntu", @@ -741,7 +741,7 @@ describe("DesktopBackendManager", () => { const firstProbe = yield* Deferred.make(); const childExit = yield* Deferred.make(); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.succeed( @@ -757,7 +757,7 @@ describe("DesktopBackendManager", () => { // The backend stays 503 through the first *two* readiness budgets // and only becomes healthy (200) for the third round, i.e. it comes // up well after the initial 50ms budget has expired. - const httpLayer = httpClientLayer((request) => + const layerHttp = httpClientLayer((request) => Effect.gen(function* () { requestCount += 1; requestUrls.push(request.url); @@ -778,7 +778,7 @@ describe("DesktopBackendManager", () => { Effect.sync(() => { readinessTimeoutCount += 1; }), - }).pipe(Effect.provide(Layer.merge(spawnerLayer, httpLayer)), Effect.forkChild); + }).pipe(Effect.provide(Layer.merge(layerSpawner, layerHttp)), Effect.forkChild); yield* Deferred.await(firstProbe); assert.equal(readyCount, 0); @@ -823,7 +823,7 @@ describe("DesktopBackendManager", () => { let discardedSessionCount = 0; let removedTelemetrySources = 0; - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.gen(function* () { @@ -852,7 +852,7 @@ describe("DesktopBackendManager", () => { ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, onReady: Ref.set(backendReadyFlag, true).pipe( Effect.andThen(Deferred.succeed(ready, void 0)), Effect.asVoid, @@ -922,7 +922,7 @@ describe("DesktopBackendManager", () => { const finishTeardown = yield* Deferred.make(); let startCount = 0; - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.gen(function* () { @@ -953,7 +953,7 @@ describe("DesktopBackendManager", () => { ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, httpClientLayer: httpClientLayer(() => Effect.never), }); @@ -992,7 +992,7 @@ describe("DesktopBackendManager", () => { method: "configResolve", description: "transient configuration failure", }); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.gen(function* () { @@ -1027,7 +1027,7 @@ describe("DesktopBackendManager", () => { ), ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, configResolve, httpClientLayer: httpClientLayer(() => Effect.never), }); @@ -1062,7 +1062,7 @@ describe("DesktopBackendManager", () => { const finishTeardown = yield* Deferred.make(); let startCount = 0; - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.gen(function* () { @@ -1093,7 +1093,7 @@ describe("DesktopBackendManager", () => { ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, httpClientLayer: httpClientLayer(() => Effect.never), }); @@ -1128,7 +1128,7 @@ describe("DesktopBackendManager", () => { const closed = yield* Deferred.make(); const startedPids = yield* Queue.unbounded(); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.gen(function* () { @@ -1143,7 +1143,7 @@ describe("DesktopBackendManager", () => { ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, httpClientLayer: httpClientLayer(() => Effect.never), onShutdown: Effect.sync(() => { shutdownCount += 1; @@ -1164,7 +1164,7 @@ describe("DesktopBackendManager", () => { const failures = yield* Queue.unbounded(); let startCount = 0; - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.sync(() => { @@ -1179,7 +1179,7 @@ describe("DesktopBackendManager", () => { ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, httpClientLayer: httpClientLayer(() => Effect.never), backendOutputLog: { persistFailure: ({ details }) => Queue.offer(failures, details).pipe(Effect.asVoid), @@ -1209,13 +1209,13 @@ describe("DesktopBackendManager", () => { Effect.gen(function* () { let shutdownCount = 0; - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.die("unexpected backend spawn")), ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, config: { ...baseConfig, preflightFailure: Option.some({ reason: "preflight failed", fatal: false }), @@ -1238,13 +1238,13 @@ describe("DesktopBackendManager", () => { Effect.scoped( Effect.gen(function* () { const failures: string[] = []; - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.die("unexpected backend spawn")), ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, config: { ...baseConfig, preflightFailure: Option.some({ reason: "Node.js not found", fatal: true }), @@ -1279,7 +1279,7 @@ describe("DesktopBackendManager", () => { Effect.gen(function* () { const failing = yield* Ref.make(true); const starts = yield* Queue.unbounded(); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Queue.offer(starts, 123).pipe( @@ -1293,7 +1293,7 @@ describe("DesktopBackendManager", () => { ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, configResolve: Ref.get(failing).pipe( Effect.map((isFailing) => isFailing @@ -1338,13 +1338,13 @@ describe("DesktopBackendManager", () => { Effect.scoped( Effect.gen(function* () { const failures: string[] = []; - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.die("unexpected backend spawn")), ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, config: { ...baseConfig, preflightFailure: Option.some({ reason: "wslpath conversion failed", fatal: false }), @@ -1368,13 +1368,13 @@ describe("DesktopBackendManager", () => { Effect.scoped( Effect.gen(function* () { const failures: string[] = []; - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.die("unexpected backend spawn")), ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, config: { ...baseConfig, preflightFailure: Option.some({ @@ -1406,7 +1406,7 @@ describe("DesktopBackendManager", () => { const secondClosed = yield* Deferred.make(); let startCount = 0; - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.gen(function* () { @@ -1433,7 +1433,7 @@ describe("DesktopBackendManager", () => { ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, httpClientLayer: httpClientLayer(() => Effect.never), }); @@ -1465,7 +1465,7 @@ describe("DesktopBackendManager", () => { const starts = yield* Queue.unbounded(); let startCount = 0; - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.sync(() => { @@ -1480,7 +1480,7 @@ describe("DesktopBackendManager", () => { ); const instance = yield* makeTestInstance({ - spawnerLayer, + spawnerLayer: layerSpawner, httpClientLayer: httpClientLayer(() => Effect.never), }); @@ -1543,7 +1543,7 @@ describe("DesktopBackendManager", () => { yield* instance1.start; yield* instance2.start; - const mockPool = Layer.succeed(DesktopBackendPool.DesktopBackendPool, { + const layerMockPool = Layer.succeed(DesktopBackendPool.DesktopBackendPool, { list: Effect.succeed([instance1, instance2]), get: () => Effect.succeedNone, primary: Effect.die(new Error("primary not implemented")), @@ -1556,7 +1556,7 @@ describe("DesktopBackendManager", () => { // as an ordinary interruptible effect. const quitFiber = yield* Effect.scoped( Effect.addFinalizer(() => DesktopApp.stopAllPoolInstances()), - ).pipe(Effect.provide(mockPool), Effect.forkChild); + ).pipe(Effect.provide(layerMockPool), Effect.forkChild); const started = yield* Queue.takeN(teardownStarted, 2); assert.deepEqual(started.toSorted(), ["instance1", "instance2"]); diff --git a/apps/desktop/src/backend/DesktopLocalEnvironmentAuth.test.ts b/apps/desktop/src/backend/DesktopLocalEnvironmentAuth.test.ts index 20cb51d9714a..948bb041df80 100644 --- a/apps/desktop/src/backend/DesktopLocalEnvironmentAuth.test.ts +++ b/apps/desktop/src/backend/DesktopLocalEnvironmentAuth.test.ts @@ -32,7 +32,7 @@ describe("DesktopLocalEnvironmentAuth", () => { it.effect("exchanges the desktop bootstrap credential only once", () => Effect.gen(function* () { const requestCount = yield* Ref.make(0); - const httpClientLayer = Layer.succeed( + const layerHttpClient = Layer.succeed( HttpClient.HttpClient, HttpClient.make((request) => Ref.update(requestCount, (count) => count + 1).pipe( @@ -54,7 +54,7 @@ describe("DesktopLocalEnvironmentAuth", () => { ), ), ); - const poolLayer = Layer.succeed(DesktopBackendPool.DesktopBackendPool, { + const layerPool = Layer.succeed(DesktopBackendPool.DesktopBackendPool, { list: Effect.succeed([ { id: PRIMARY_LOCAL_ENVIRONMENT_ID, @@ -63,14 +63,14 @@ describe("DesktopLocalEnvironmentAuth", () => { }, ]), } as unknown as DesktopBackendPool.DesktopBackendPool["Service"]); - const testLayer = DesktopLocalEnvironmentAuth.layer.pipe( - Layer.provide(Layer.mergeAll(poolLayer, httpClientLayer)), + const layerTest = DesktopLocalEnvironmentAuth.layer.pipe( + Layer.provide(Layer.mergeAll(layerPool, layerHttpClient)), ); const [first, second] = yield* Effect.gen(function* () { const auth = yield* DesktopLocalEnvironmentAuth.DesktopLocalEnvironmentAuth; return yield* Effect.all([auth.getBearerToken, auth.getBearerToken]); - }).pipe(Effect.provide(testLayer)); + }).pipe(Effect.provide(layerTest)); assert.strictEqual(first, "desktop-bearer-token"); assert.strictEqual(second, "desktop-bearer-token"); diff --git a/apps/desktop/src/backend/DesktopNetworkInterfaces.test.ts b/apps/desktop/src/backend/DesktopNetworkInterfaces.test.ts index 411af7553f91..ab6990ef1767 100644 --- a/apps/desktop/src/backend/DesktopNetworkInterfaces.test.ts +++ b/apps/desktop/src/backend/DesktopNetworkInterfaces.test.ts @@ -15,7 +15,7 @@ vi.mock("node:os", () => ({ import * as DesktopNetworkInterfaces from "./DesktopNetworkInterfaces.ts"; -const TestLayer = DesktopNetworkInterfaces.layer.pipe( +const layerTest = DesktopNetworkInterfaces.layer.pipe( Layer.provide(Layer.succeed(HostProcessPlatform, "linux")), ); @@ -39,7 +39,7 @@ describe("DesktopNetworkInterfaces", () => { return Effect.gen(function* () { const service = yield* DesktopNetworkInterfaces.DesktopNetworkInterfaces; assert.strictEqual(yield* service.read, interfaces); - }).pipe(Effect.provide(TestLayer)); + }).pipe(Effect.provide(layerTest)); }); it.effect("preserves network interface read failures as structured defects", () => { @@ -60,6 +60,6 @@ describe("DesktopNetworkInterfaces", () => { assert.strictEqual(error.cause, cause); assert.equal(error.message, "Failed to read desktop network interfaces on linux."); } - }).pipe(Effect.provide(TestLayer)); + }).pipe(Effect.provide(layerTest)); }); }); diff --git a/apps/desktop/src/backend/DesktopServerExposure.test.ts b/apps/desktop/src/backend/DesktopServerExposure.test.ts index b9c460825561..9aee22ebf4e0 100644 --- a/apps/desktop/src/backend/DesktopServerExposure.test.ts +++ b/apps/desktop/src/backend/DesktopServerExposure.test.ts @@ -94,8 +94,8 @@ function makeLayer(input: { readonly desktopSettingsLayer?: Layer.Layer; }) { const env = { T3CODE_HOME: input.baseDir, ...input.env }; - const environmentLayer = makeEnvironmentLayer(input.baseDir, env); - const networkLayer = Layer.succeed(DesktopNetworkInterfaces.DesktopNetworkInterfaces, { + const layerEnvironment = makeEnvironmentLayer(input.baseDir, env); + const layerNetwork = Layer.succeed(DesktopNetworkInterfaces.DesktopNetworkInterfaces, { read: Effect.succeed(input.networkInterfaces ?? emptyNetworkInterfaces), }); @@ -104,9 +104,9 @@ function makeLayer(input: { Layer.provideMerge(NodeFileSystem.layer), Layer.provideMerge(NodeHttpClient.layerUndici), Layer.provideMerge(input.spawnerLayer ?? mockSpawnerLayer()), - Layer.provideMerge(networkLayer), + Layer.provideMerge(layerNetwork), Layer.provideMerge(DesktopConfig.layerTest(env)), - Layer.provideMerge(environmentLayer), + Layer.provideMerge(layerEnvironment), ); } @@ -247,7 +247,7 @@ describe("DesktopServerExposure", () => { path: "/tmp/desktop-settings.json", cause: diskFailure, }); - const settingsLayer = Layer.succeed(DesktopAppSettings.DesktopAppSettings, { + const layerSettings = Layer.succeed(DesktopAppSettings.DesktopAppSettings, { get: Effect.succeed(DesktopAppSettings.DEFAULT_DESKTOP_SETTINGS), load: Effect.succeed(DesktopAppSettings.DEFAULT_DESKTOP_SETTINGS), setMainWindowBounds: () => Effect.die("unexpected main window bounds update"), @@ -301,7 +301,7 @@ describe("DesktopServerExposure", () => { }), {}, undefined, - settingsLayer, + layerSettings, ); }); diff --git a/apps/desktop/src/backend/tailscaleEndpointProvider.test.ts b/apps/desktop/src/backend/tailscaleEndpointProvider.test.ts index 91e8ec5e7be8..2c0055a0668d 100644 --- a/apps/desktop/src/backend/tailscaleEndpointProvider.test.ts +++ b/apps/desktop/src/backend/tailscaleEndpointProvider.test.ts @@ -9,7 +9,7 @@ import { resolveTailscaleAdvertisedEndpoints, } from "./tailscaleEndpointProvider.ts"; -const unusedTailscaleExternalServicesLayer = Layer.mergeAll( +const layerUnusedTailscaleExternalServices = Layer.mergeAll( Layer.succeed( HttpClient.HttpClient, HttpClient.make(() => Effect.die("unexpected Tailscale HTTPS probe")), @@ -93,7 +93,7 @@ describe("tailscale endpoint provider", () => { description: "MagicDNS hostname. Configure Tailscale Serve for HTTPS access.", }, ]); - }).pipe(Effect.provide(unusedTailscaleExternalServicesLayer)), + }).pipe(Effect.provide(layerUnusedTailscaleExternalServices)), ); it.effect("uses an injected magic DNS name reader instead of spawning tailscale", () => @@ -112,7 +112,7 @@ describe("tailscale endpoint provider", () => { endpoints.map((endpoint) => endpoint.httpBaseUrl), ["https://desktop.tail.ts.net/"], ); - }).pipe(Effect.provide(unusedTailscaleExternalServicesLayer)), + }).pipe(Effect.provide(layerUnusedTailscaleExternalServices)), ); it.effect( @@ -148,6 +148,6 @@ describe("tailscale endpoint provider", () => { description: "HTTPS endpoint served by Tailscale Serve.", }, ]); - }).pipe(Effect.provide(unusedTailscaleExternalServicesLayer)), + }).pipe(Effect.provide(layerUnusedTailscaleExternalServices)), ); }); diff --git a/apps/desktop/src/electron/ElectronMenu.test.ts b/apps/desktop/src/electron/ElectronMenu.test.ts index 2da7d6689599..01b4fe080304 100644 --- a/apps/desktop/src/electron/ElectronMenu.test.ts +++ b/apps/desktop/src/electron/ElectronMenu.test.ts @@ -27,7 +27,7 @@ vi.mock("electron", () => ({ import * as ElectronMenu from "./ElectronMenu.ts"; -const TestLayer = ElectronMenu.layer.pipe( +const layerTest = ElectronMenu.layer.pipe( Layer.provide(Layer.succeed(HostProcessPlatform, "linux")), ); @@ -55,7 +55,7 @@ describe("ElectronMenu", () => { assert.isTrue(Option.isNone(selectedItemId)); assert.equal(buildFromTemplateMock.mock.calls.length, 0); - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("resolves with the clicked leaf item id", () => @@ -82,7 +82,7 @@ describe("ElectronMenu", () => { }); assert.equal(Option.getOrNull(selectedItemId), "copy"); - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("resolves with none when the menu closes without a click", () => @@ -119,7 +119,7 @@ describe("ElectronMenu", () => { ), ["Copy", "separator", "Delete"], ); - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("keeps a preceding non-destructive action in the destructive section", () => @@ -145,7 +145,7 @@ describe("ElectronMenu", () => { ), ["Copy", "separator", "Archive", "Delete"], ); - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("defers popupTemplate side effects until the returned Effect runs", () => @@ -169,7 +169,7 @@ describe("ElectronMenu", () => { assert.equal(buildFromTemplateMock.mock.calls.length, 1); assert.equal(popupMock.mock.calls.length, 1); assert.strictEqual(popupMock.mock.calls[0]?.[0].frame, frame); - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("preserves application-menu failures as structured defects", () => @@ -195,7 +195,7 @@ describe("ElectronMenu", () => { assert.strictEqual(error.cause, cause); assert.notInclude(error.message, cause.message); } - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("preserves popup-template failures with window context", () => @@ -224,7 +224,7 @@ describe("ElectronMenu", () => { assert.equal(error.itemCount, 1); assert.strictEqual(error.cause, cause); } - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("preserves context-menu failures with normalized item context", () => @@ -252,6 +252,6 @@ describe("ElectronMenu", () => { assert.equal(error.itemCount, 1); assert.strictEqual(error.cause, cause); } - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); }); diff --git a/apps/desktop/src/electron/ElectronProtocol.test.ts b/apps/desktop/src/electron/ElectronProtocol.test.ts index 0c2cb2bb7d17..f68b843e7c17 100644 --- a/apps/desktop/src/electron/ElectronProtocol.test.ts +++ b/apps/desktop/src/electron/ElectronProtocol.test.ts @@ -19,7 +19,7 @@ vi.mock("electron", () => ({ import * as ElectronProtocol from "./ElectronProtocol.ts"; -const protocolLayer = ElectronProtocol.layer.pipe(Layer.provide(NodeServices.layer)); +const layerProtocol = ElectronProtocol.layer.pipe(Layer.provide(NodeServices.layer)); describe("ElectronProtocol", () => { beforeEach(() => { @@ -65,7 +65,7 @@ describe("ElectronProtocol", () => { assert.equal((yield* request("/%invalid")).status, 400); assert.equal((yield* request("/", { method: "POST" })).status, 405); assert.equal(netFetchMock.mock.calls.length, 0); - }).pipe(Effect.provide(Layer.merge(protocolLayer, NodeServices.layer)), Effect.scoped), + }).pipe(Effect.provide(Layer.merge(layerProtocol, NodeServices.layer)), Effect.scoped), ); it.effect("proxies the stable renderer origin to the current app server", () => @@ -129,7 +129,7 @@ describe("ElectronProtocol", () => { assert.isNull(forwardedHeaders.get("referer")); assert.isNull(forwardedHeaders.get("sec-fetch-site")); assert.deepEqual(unhandleMock.mock.calls, [["t3code-dev"]]); - }).pipe(Effect.provide(protocolLayer)), + }).pipe(Effect.provide(layerProtocol)), ); it.effect("rejects custom protocol requests for another host", () => @@ -153,7 +153,7 @@ describe("ElectronProtocol", () => { assert.equal(response.status, 404); assert.equal(netFetchMock.mock.calls.length, 0); - }).pipe(Effect.provide(protocolLayer)), + }).pipe(Effect.provide(layerProtocol)), ); it.effect("retries transient renderer target failures", () => @@ -180,7 +180,7 @@ describe("ElectronProtocol", () => { assert.equal(yield* Effect.promise(() => response.text()), "ready"); assert.equal(netFetchMock.mock.calls.length, 2); - }).pipe(Effect.provide(protocolLayer)), + }).pipe(Effect.provide(layerProtocol)), ); it.effect("preserves protocol registration failures", () => @@ -203,7 +203,7 @@ describe("ElectronProtocol", () => { assert.equal(error.scheme, "t3code-dev"); assert.strictEqual(error.cause, cause); assert.equal(error.message, 'Failed to register Electron protocol scheme "t3code-dev".'); - }).pipe(Effect.provide(protocolLayer)), + }).pipe(Effect.provide(layerProtocol)), ); it.effect("preserves protocol unregistration failures", () => @@ -232,7 +232,7 @@ describe("ElectronProtocol", () => { assert.strictEqual(error.cause, cause); assert.equal(error.message, 'Failed to unregister Electron protocol scheme "t3code".'); } - }).pipe(Effect.provide(protocolLayer)), + }).pipe(Effect.provide(layerProtocol)), ); it("keeps executable sources host-restricted while allowing runtime network resources", () => { diff --git a/apps/desktop/src/electron/ElectronWindow.test.ts b/apps/desktop/src/electron/ElectronWindow.test.ts index a8632ee3c1c1..80bc1360a998 100644 --- a/apps/desktop/src/electron/ElectronWindow.test.ts +++ b/apps/desktop/src/electron/ElectronWindow.test.ts @@ -60,7 +60,7 @@ import * as ElectronWindow from "./ElectronWindow.ts"; const testLayer = (platform: NodeJS.Platform) => ElectronWindow.layer.pipe(Layer.provide(Layer.succeed(HostProcessPlatform, platform))); -const TestLayer = testLayer("linux"); +const layerTest = testLayer("linux"); function makeBrowserWindow(input: { readonly id: number; readonly destroyed: boolean }) { return { @@ -169,7 +169,7 @@ describe("ElectronWindow", () => { assert.equal(error.message, 'Failed to create Electron BrowserWindow "T3 Code" (1100x780).'); assert.notInclude(error.message, cause.message); assert.deepEqual(browserWindowMock.mock.calls, [[options]]); - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("skips windows destroyed before appearance sync runs", () => @@ -187,7 +187,7 @@ describe("ElectronWindow", () => { ); assert.deepEqual(syncedWindows, [liveWindow]); - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("preserves window enumeration failures as structured defects", () => @@ -211,7 +211,7 @@ describe("ElectronWindow", () => { assert.strictEqual(error.cause, cause); assert.notInclude(error.message, cause.message); } - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("preserves reveal failures with the target window", () => @@ -238,7 +238,7 @@ describe("ElectronWindow", () => { assert.isNull(error.channel); assert.strictEqual(error.cause, cause); } - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("uses native Windows activation without querying the foreground window", () => @@ -500,7 +500,7 @@ describe("ElectronWindow", () => { assert.equal(error.channel, "desktop:update"); assert.strictEqual(error.cause, cause); } - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("preserves destroy failures and continues with later windows", () => @@ -531,7 +531,7 @@ describe("ElectronWindow", () => { assert.strictEqual(error.cause, cause); } assert.equal(vi.mocked(laterWindow.destroy).mock.calls.length, 1); - }).pipe(Effect.provide(TestLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("an ordinary reveal on Windows does not touch the Win32 foreground helpers", () => Effect.gen(function* () { diff --git a/apps/desktop/src/ipc/methods/localEnvironment.test.ts b/apps/desktop/src/ipc/methods/localEnvironment.test.ts index e17c48948098..c6376554f99a 100644 --- a/apps/desktop/src/ipc/methods/localEnvironment.test.ts +++ b/apps/desktop/src/ipc/methods/localEnvironment.test.ts @@ -14,7 +14,7 @@ import { getLocalEnvironmentEnabled, setLocalEnvironmentEnabled } from "./localE // `relaunch` declares the lifecycle runtime services as requirements even // though the mocked relaunch never touches them. -const unusedLifecycleRuntimeLayer = Layer.mergeAll( +const layerUnusedLifecycleRuntime = Layer.mergeAll( DesktopShutdown.layer, DesktopState.layer, Layer.succeed( @@ -42,7 +42,7 @@ describe("local environment IPC", () => { relaunchReasons.push(reason); }), }), - unusedLifecycleRuntimeLayer, + layerUnusedLifecycleRuntime, ); return Effect.gen(function* () { yield* setLocalEnvironmentEnabled.handler(false); diff --git a/apps/desktop/src/ipc/methods/wsl.test.ts b/apps/desktop/src/ipc/methods/wsl.test.ts index 65137cbbd895..1d2087f5920f 100644 --- a/apps/desktop/src/ipc/methods/wsl.test.ts +++ b/apps/desktop/src/ipc/methods/wsl.test.ts @@ -51,7 +51,7 @@ function makeLifecycleLayer(relaunchReasons: Array) { ); } -const unusedLifecycleRuntimeLayer = Layer.mergeAll( +const layerUnusedLifecycleRuntime = Layer.mergeAll( DesktopShutdown.layer, DesktopState.layer, Layer.succeed( @@ -131,7 +131,7 @@ describe("WSL IPC", () => { DesktopWslEnvironment.layerTest({ isAvailable: true }), makeWslBackendLayer(), makeLifecycleLayer(relaunchReasons), - unusedLifecycleRuntimeLayer, + layerUnusedLifecycleRuntime, ); return Effect.gen(function* () { @@ -162,7 +162,7 @@ describe("WSL IPC", () => { DesktopWslEnvironment.layerTest({ isAvailable: true }), makeWslBackendLayer(), makeLifecycleLayer(relaunchReasons), - unusedLifecycleRuntimeLayer, + layerUnusedLifecycleRuntime, ); return Effect.gen(function* () { @@ -203,7 +203,7 @@ describe("WSL IPC", () => { }), }), makeLifecycleLayer(relaunchReasons), - unusedLifecycleRuntimeLayer, + layerUnusedLifecycleRuntime, ); return Effect.gen(function* () { @@ -238,7 +238,7 @@ describe("WSL IPC", () => { }), }), makeLifecycleLayer(relaunchReasons), - unusedLifecycleRuntimeLayer, + layerUnusedLifecycleRuntime, ); return Effect.gen(function* () { @@ -267,7 +267,7 @@ describe("WSL IPC", () => { }), }), makeLifecycleLayer(relaunchReasons), - unusedLifecycleRuntimeLayer, + layerUnusedLifecycleRuntime, ); return Effect.gen(function* () { @@ -306,7 +306,7 @@ describe("WSL IPC", () => { }), }), makeLifecycleLayer(relaunchReasons), - unusedLifecycleRuntimeLayer, + layerUnusedLifecycleRuntime, ); return Effect.gen(function* () { diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts index ea43ac74a7bb..f2f5234148ac 100644 --- a/apps/desktop/src/main.ts +++ b/apps/desktop/src/main.ts @@ -82,7 +82,7 @@ if (process.argv.includes("--version")) { Electron.app.exit(0); } -const desktopEnvironmentLayer = Layer.unwrap( +const layerDesktopEnvironment = Layer.unwrap( Effect.gen(function* () { const metadata = yield* Effect.service(ElectronApp.ElectronApp).pipe( Effect.flatMap((app) => app.metadata), @@ -115,7 +115,7 @@ const resolveDesktopSshCliRunner = ( return { archiveVersion: environment.appVersion }; }; -const desktopSshEnvironmentLayer = Layer.unwrap( +const layerDesktopSshEnvironment = Layer.unwrap( Effect.gen(function* () { const environment = yield* DesktopEnvironment.DesktopEnvironment; return DesktopSshEnvironment.layer({ @@ -124,7 +124,7 @@ const desktopSshEnvironmentLayer = Layer.unwrap( }), ); -const electronLayer = Layer.mergeAll( +const layerElectron = Layer.mergeAll( ElectronApp.layer, ElectronDialog.layer, ElectronMenu.layer, @@ -138,7 +138,7 @@ const electronLayer = Layer.mergeAll( DesktopIpc.layer(Electron.ipcMain), ); -const desktopFoundationLayer = Layer.mergeAll( +const layerDesktopFoundation = Layer.mergeAll( MacPermissions.layer, DesktopState.layer, DesktopShutdown.layer, @@ -149,36 +149,36 @@ const desktopFoundationLayer = Layer.mergeAll( DesktopAssets.layer, DesktopObservability.layer, DesktopRendererHistory.layer, -).pipe(Layer.provideMerge(desktopEnvironmentLayer)); +).pipe(Layer.provideMerge(layerDesktopEnvironment)); -const desktopSshLayer = desktopSshEnvironmentLayer.pipe( +const layerDesktopSsh = layerDesktopSshEnvironment.pipe( Layer.provideMerge(DesktopSshPasswordPrompts.layer()), ); -const desktopServerExposureLayer = DesktopServerExposure.layer.pipe( +const layerDesktopServerExposure = DesktopServerExposure.layer.pipe( Layer.provideMerge(DesktopNetworkInterfaces.layer), - Layer.provideMerge(desktopFoundationLayer), + Layer.provideMerge(layerDesktopFoundation), ); -const desktopPreviewLayer = PreviewManager.layer.pipe( +const layerDesktopPreview = PreviewManager.layer.pipe( // Merged rather than provided so the IPC handlers can reach the import // service alongside the manager; both sit on the same BrowserSession. Layer.provideMerge(BrowserImport.layer.pipe(Layer.provide(LinuxBrowserSecret.layer))), Layer.provideMerge(BrowserSession.layer), - Layer.provideMerge(desktopFoundationLayer), + Layer.provideMerge(layerDesktopFoundation), ); -const desktopWindowLayer = DesktopWindow.layer.pipe( - Layer.provideMerge(desktopServerExposureLayer), - Layer.provideMerge(desktopPreviewLayer), +const layerDesktopWindow = DesktopWindow.layer.pipe( + Layer.provideMerge(layerDesktopServerExposure), + Layer.provideMerge(layerDesktopPreview), ); -const desktopSnapShotLayer = DesktopSnapShot.layer.pipe( - Layer.provideMerge(desktopWindowLayer), - Layer.provideMerge(desktopFoundationLayer), +const layerDesktopSnapShot = DesktopSnapShot.layer.pipe( + Layer.provideMerge(layerDesktopWindow), + Layer.provideMerge(layerDesktopFoundation), ); -const desktopAppActivationLayer = DesktopAppActivation.layer.pipe( - Layer.provide(desktopWindowLayer), +const layerDesktopAppActivation = DesktopAppActivation.layer.pipe( + Layer.provide(layerDesktopWindow), ); // Pool layer instantiates the backend factory once for the Windows @@ -186,63 +186,63 @@ const desktopAppActivationLayer = DesktopAppActivation.layer.pipe( // the pool now; the legacy DesktopBackendManager service is gone. The // WSL second instance gets registered later in the migration. See // DesktopBackendPool.ts header for the full rollout plan. -const desktopBackendLayer = DesktopBackendPool.layer.pipe( +const layerDesktopBackend = DesktopBackendPool.layer.pipe( Layer.provideMerge(DesktopAppIdentity.layer), Layer.provideMerge(DesktopBackendConfiguration.layer), Layer.provideMerge(DesktopWslEnvironment.layer), Layer.provideMerge(DesktopWslServerTree.layer), Layer.provideMerge(DesktopTelemetryPublisher.layer), - Layer.provideMerge(desktopWindowLayer), + Layer.provideMerge(layerDesktopWindow), ); // WSL orchestrator hangs off the backend layer because it needs the // pool + configuration + serverExposure; it pulls NetService and the // foundation services through the same provideMerge chain. -const desktopWslBackendLayer = DesktopWslBackend.layer.pipe( - Layer.provideMerge(desktopBackendLayer), +const layerDesktopWslBackend = DesktopWslBackend.layer.pipe( + Layer.provideMerge(layerDesktopBackend), ); -const desktopLocalEnvironmentAuthLayer = DesktopLocalEnvironmentAuth.layer.pipe( - Layer.provideMerge(desktopBackendLayer), +const layerDesktopLocalEnvironmentAuth = DesktopLocalEnvironmentAuth.layer.pipe( + Layer.provideMerge(layerDesktopBackend), ); -const desktopApplicationLayer = Layer.mergeAll( +const layerDesktopApplication = Layer.mergeAll( DesktopLifecycle.layer, - desktopAppActivationLayer, + layerDesktopAppActivation, DesktopApplicationMenu.layer, DesktopLinuxUrlHandler.layer, DesktopShellEnvironment.layer, - desktopSshLayer, + layerDesktopSsh, ).pipe( - Layer.provideMerge(desktopSnapShotLayer), + Layer.provideMerge(layerDesktopSnapShot), Layer.provideMerge(DesktopUpdates.layer), - Layer.provideMerge(desktopWslBackendLayer), - Layer.provideMerge(desktopLocalEnvironmentAuthLayer), + Layer.provideMerge(layerDesktopWslBackend), + Layer.provideMerge(layerDesktopLocalEnvironmentAuth), ); // Clerk resolves userData before Electron is ready, so it gets the synchronous FileSystem. -const desktopClerkLayer = DesktopClerk.layer.pipe( +const layerDesktopClerk = DesktopClerk.layer.pipe( Layer.provide(DesktopPreReadyFileSystem.layer), Layer.provideMerge(ElectronShell.layer), - Layer.provideMerge(desktopEnvironmentLayer), + Layer.provideMerge(layerDesktopEnvironment), Layer.provideMerge(NodeServices.layer), Layer.provideMerge(ElectronApp.layer), ); -const desktopApplicationRuntimeLayer = desktopApplicationLayer.pipe( +const layerDesktopApplicationRuntime = layerDesktopApplication.pipe( Layer.provideMerge(NodeServices.layer), Layer.provideMerge(NodeHttpClient.layerUndici), Layer.provideMerge(NetService.layer), - Layer.provideMerge(electronLayer), + Layer.provideMerge(layerElectron), ); // Acquire strict pre-ready setup before Clerk. Nothing before the Clerk bridge // may yield, or Electron can emit ready before Clerk registers its scheme. -const desktopRuntimeLayer = desktopClerkLayer.pipe( +const layerDesktopRuntime = layerDesktopClerk.pipe( Layer.flatMap((clerkContext) => - desktopApplicationRuntimeLayer.pipe(Layer.provideMerge(Layer.succeedContext(clerkContext))), + layerDesktopApplicationRuntime.pipe(Layer.provideMerge(Layer.succeedContext(clerkContext))), ), Layer.provideMerge(DesktopPreReadyPlatform.layer), ); -DesktopApp.program.pipe(Effect.provide(desktopRuntimeLayer), NodeRuntime.runMain); +DesktopApp.program.pipe(Effect.provide(layerDesktopRuntime), NodeRuntime.runMain); diff --git a/apps/desktop/src/preview/BrowserImport/BrowserImport.test.ts b/apps/desktop/src/preview/BrowserImport/BrowserImport.test.ts index 003461085376..0f1e2bd386ce 100644 --- a/apps/desktop/src/preview/BrowserImport/BrowserImport.test.ts +++ b/apps/desktop/src/preview/BrowserImport/BrowserImport.test.ts @@ -34,7 +34,7 @@ const cookie = { * Dies if the import reaches session work: every case here covers a request * that must be rejected before a cookie is read or written. */ -const rejectedBeforeSession = Layer.succeed( +const layerRejectedBeforeSession = Layer.succeed( BrowserSession.BrowserSession, BrowserSession.BrowserSession.of({ getPartition: () => Effect.die("getPartition must not be reached"), @@ -52,7 +52,7 @@ const rejectedBeforeSession = Layer.succeed( const withImporter = Effect.fnUntraced(function* () { const fileSystem = yield* FileSystem.FileSystem; const home = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3code-import-" }); - const environment = Layer.succeed(HostProcessEnvironment, { HOME: home }); + const layerEnvironment = Layer.succeed(HostProcessEnvironment, { HOME: home }); const context = yield* sourcePathContext.pipe( Effect.provideService(HostProcessEnvironment, { HOME: home }), Effect.provideService(HostProcessPlatform, "darwin"), @@ -67,8 +67,8 @@ const withImporter = Effect.fnUntraced(function* () { const importer = yield* BrowserImport.BrowserImport.pipe( Effect.provide( BrowserImport.layer.pipe( - Layer.provide(rejectedBeforeSession), - Layer.provide(environment), + Layer.provide(layerRejectedBeforeSession), + Layer.provide(layerEnvironment), Layer.provide(Layer.succeed(HostProcessPlatform, "darwin")), Layer.provide(Layer.succeed(HostProcessExecutablePath, "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/Applications/T3 Code.app")), Layer.provide(NodeServices.layer), diff --git a/apps/desktop/src/preview/BrowserImport/ChromiumKeys.test.ts b/apps/desktop/src/preview/BrowserImport/ChromiumKeys.test.ts index 8e1c29b6f175..62607be63442 100644 --- a/apps/desktop/src/preview/BrowserImport/ChromiumKeys.test.ts +++ b/apps/desktop/src/preview/BrowserImport/ChromiumKeys.test.ts @@ -83,7 +83,7 @@ describe("macOS Chromium secrets", () => { keychainAccount: "Chrome", linuxSecretApplication: undefined, } as const; - const noProcesses = Layer.succeed( + const layerNoProcesses = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.die("must not spawn")), ); @@ -93,7 +93,7 @@ describe("macOS Chromium secrets", () => { getPassword.mockReturnValue("macos-secret"); const keys = yield* resolveChromiumKeys(request); expect(keys.cbcV10?.toString("hex")).toBe("3df7306fb1eac353289565a2f6b64f74"); - }).pipe(Effect.provide(noProcesses)), + }).pipe(Effect.provide(layerNoProcesses)), ); it.effect("reports a missing keychain entry", () => @@ -101,7 +101,7 @@ describe("macOS Chromium secrets", () => { getPassword.mockReturnValue(null); const error = yield* resolveChromiumKeys(request).pipe(Effect.flip); expect(error.reason).toBe("keychainItemMissing"); - }).pipe(Effect.provide(noProcesses)), + }).pipe(Effect.provide(layerNoProcesses)), ); it.effect("preserves a denied keychain approval", () => @@ -113,7 +113,7 @@ describe("macOS Chromium secrets", () => { const error = yield* resolveChromiumKeys(request).pipe(Effect.flip); expect(error.reason).toBe("needsKeychainApproval"); expect(error.cause).toBe(denied); - }).pipe(Effect.provide(noProcesses)), + }).pipe(Effect.provide(layerNoProcesses)), ); }); diff --git a/apps/desktop/src/preview/BrowserImport/LinuxBrowserSecret.test.ts b/apps/desktop/src/preview/BrowserImport/LinuxBrowserSecret.test.ts index efeab3262de2..8358088bc134 100644 --- a/apps/desktop/src/preview/BrowserImport/LinuxBrowserSecret.test.ts +++ b/apps/desktop/src/preview/BrowserImport/LinuxBrowserSecret.test.ts @@ -38,7 +38,7 @@ it.layer(NodeServices.layer)("Linux browser secret path", (it) => { yield* fileSystem.writeFileString(filename, "helper"); } const resolve = (isPackaged: boolean, platform: NodeJS.Platform = "linux") => { - const environment = DesktopEnvironment.layer({ + const layerEnvironment = DesktopEnvironment.layer({ dirname: path.join(root, "apps", "desktop", "dist-electron"), homeDirectory: root, platform, @@ -50,7 +50,7 @@ it.layer(NodeServices.layer)("Linux browser secret path", (it) => { runningUnderArm64Translation: false, }).pipe(Layer.provide(DesktopConfig.layerTest({}))); return LinuxBrowserSecret.LinuxBrowserSecretPath.pipe( - Effect.provide(LinuxBrowserSecret.layer.pipe(Layer.provide(environment))), + Effect.provide(LinuxBrowserSecret.layer.pipe(Layer.provide(layerEnvironment))), ); }; diff --git a/apps/desktop/src/preview/BrowserSession.test.ts b/apps/desktop/src/preview/BrowserSession.test.ts index 45000736c558..805c684dfbec 100644 --- a/apps/desktop/src/preview/BrowserSession.test.ts +++ b/apps/desktop/src/preview/BrowserSession.test.ts @@ -197,7 +197,7 @@ describe("BrowserSession", () => { method: "digest", cause: nativeCause, }); - const failingCryptoLayer = Layer.succeed( + const layerFailingCrypto = Layer.succeed( Crypto.Crypto, Crypto.make({ randomBytes: (size) => new Uint8Array(size), @@ -218,7 +218,7 @@ describe("BrowserSession", () => { "Failed to derive a desktop preview browser partition for scope environment-a.", ); assert.notInclude(error.message, nativeCause.message); - }).pipe(Effect.provide(BrowserSession.layer.pipe(Layer.provide(failingCryptoLayer)))); + }).pipe(Effect.provide(BrowserSession.layer.pipe(Layer.provide(layerFailingCrypto)))); }); it.effect("preserves session scope, partition, and the Electron failure", () => diff --git a/apps/desktop/src/preview/Manager.test.ts b/apps/desktop/src/preview/Manager.test.ts index 0a949d39b5a4..f731424e021b 100644 --- a/apps/desktop/src/preview/Manager.test.ts +++ b/apps/desktop/src/preview/Manager.test.ts @@ -234,7 +234,7 @@ vi.mock("electron", () => ({ }, })); -const browserSessionLayer = Layer.succeed( +const layerBrowserSession = Layer.succeed( BrowserSession.BrowserSession, BrowserSession.BrowserSession.of({ getPartition: () => Effect.succeed("persist:t3code-preview-test"), @@ -245,7 +245,7 @@ const browserSessionLayer = Layer.succeed( }), ); -const environmentLayer = Layer.succeed( +const layerEnvironment = Layer.succeed( DesktopEnvironment.DesktopEnvironment, DesktopEnvironment.DesktopEnvironment.of({ browserArtifactsDir: "/tmp/t3/dev/browser-artifacts", @@ -256,7 +256,7 @@ const environmentLayer = Layer.succeed( } as DesktopEnvironment.DesktopEnvironment["Service"]), ); -const fileSystemLayer = FileSystem.layerNoop({ +const layerFileSystem = FileSystem.layerNoop({ makeDirectory: (path) => Effect.sync(() => { mkdir(path); @@ -275,9 +275,9 @@ const layer = PreviewManager.layer.pipe( shutdown: Effect.void, }), ), - Layer.provideMerge(browserSessionLayer), - Layer.provideMerge(environmentLayer), - Layer.provideMerge(fileSystemLayer), + Layer.provideMerge(layerBrowserSession), + Layer.provideMerge(layerEnvironment), + Layer.provideMerge(layerFileSystem), Layer.provideMerge(Path.layer), Layer.provideMerge(Layer.succeed(HostProcessPlatform, "darwin")), ); diff --git a/apps/desktop/src/settings/DesktopClientSettings.diagnostics.test.ts b/apps/desktop/src/settings/DesktopClientSettings.diagnostics.test.ts index d2fd166e878c..fafc74507c0c 100644 --- a/apps/desktop/src/settings/DesktopClientSettings.diagnostics.test.ts +++ b/apps/desktop/src/settings/DesktopClientSettings.diagnostics.test.ts @@ -20,7 +20,7 @@ interface LogRecord { const baseDir = "/virtual-home"; function makeLayer(fileSystemLayer: Layer.Layer) { - const environmentLayer = DesktopEnvironment.layer({ + const layerEnvironment = DesktopEnvironment.layer({ dirname: "/repo/apps/desktop/src", homeDirectory: baseDir, platform: "darwin", @@ -37,7 +37,7 @@ function makeLayer(fileSystemLayer: Layer.Layer) { ); return DesktopClientSettings.layer.pipe( - Layer.provideMerge(Layer.mergeAll(environmentLayer, NodeServices.layer, fileSystemLayer)), + Layer.provideMerge(Layer.mergeAll(layerEnvironment, NodeServices.layer, fileSystemLayer)), ); } diff --git a/apps/desktop/src/settings/DesktopClientSettings.test.ts b/apps/desktop/src/settings/DesktopClientSettings.test.ts index 2d88fb80a670..8a8da0e2b075 100644 --- a/apps/desktop/src/settings/DesktopClientSettings.test.ts +++ b/apps/desktop/src/settings/DesktopClientSettings.test.ts @@ -79,7 +79,7 @@ const decodeRecordJson = Schema.decodeEffect( Schema.fromJsonString(Schema.Record(Schema.String, Schema.Unknown)), ); function makeLayer(baseDir: string) { - const environmentLayer = DesktopEnvironment.layer({ + const layerEnvironment = DesktopEnvironment.layer({ dirname: "/repo/apps/desktop/src", homeDirectory: baseDir, platform: "darwin", @@ -96,7 +96,7 @@ function makeLayer(baseDir: string) { ); return DesktopClientSettings.layer.pipe( - Layer.provideMerge(environmentLayer), + Layer.provideMerge(layerEnvironment), Layer.provideMerge(NodeServices.layer), ); } diff --git a/apps/desktop/src/settings/DesktopSavedEnvironments.test.ts b/apps/desktop/src/settings/DesktopSavedEnvironments.test.ts index 3d0e29484674..4abf7695adb2 100644 --- a/apps/desktop/src/settings/DesktopSavedEnvironments.test.ts +++ b/apps/desktop/src/settings/DesktopSavedEnvironments.test.ts @@ -107,7 +107,7 @@ function makeLayer( }, fileSystemLayer: Layer.Layer = NodeServices.layer, ) { - const environmentLayer = DesktopEnvironment.layer({ + const layerEnvironment = DesktopEnvironment.layer({ dirname: "/repo/apps/desktop/src", homeDirectory: baseDir, platform: "darwin", @@ -123,19 +123,19 @@ function makeLayer( ), ); - const safeStorageLayer = makeSafeStorageLayer({ + const layerSafeStorage = makeSafeStorageLayer({ available: options?.availableSecretStorage ?? true, availabilityError: options?.availabilityError, decryptError: options?.decryptError, }); - const dependencies = Layer.mergeAll( - environmentLayer, - safeStorageLayer, + const layerDependencies = Layer.mergeAll( + layerEnvironment, + layerSafeStorage, NodeServices.layer, fileSystemLayer, ); - return DesktopSavedEnvironments.layer.pipe(Layer.provideMerge(dependencies)); + return DesktopSavedEnvironments.layer.pipe(Layer.provideMerge(layerDependencies)); } const withSavedEnvironments = ( @@ -346,14 +346,14 @@ describe("DesktopSavedEnvironments", () => { method: "readFileString", pathOrDescriptor: registryPath, }); - const fileSystemLayer = Layer.succeed( + const layerFileSystem = Layer.succeed( FileSystem.FileSystem, FileSystem.makeNoop({ readFileString: () => Effect.fail(permissionError), }), ); const savedEnvironments = yield* DesktopSavedEnvironments.DesktopSavedEnvironments.pipe( - Effect.provide(makeLayer(baseDir, undefined, fileSystemLayer)), + Effect.provide(makeLayer(baseDir, undefined, layerFileSystem)), ); const error = yield* savedEnvironments.getRegistry.pipe(Effect.flip); diff --git a/apps/desktop/src/shell/DesktopShellEnvironment.test.ts b/apps/desktop/src/shell/DesktopShellEnvironment.test.ts index 6f2b863482d8..5111ea4ee533 100644 --- a/apps/desktop/src/shell/DesktopShellEnvironment.test.ts +++ b/apps/desktop/src/shell/DesktopShellEnvironment.test.ts @@ -70,13 +70,13 @@ function runShellEnvironment(input: { readonly handler: (command: ChildProcess.Command) => string; readonly failure?: PlatformError.PlatformError; }) { - const environmentLayer = Layer.succeed( + const layerEnvironment = Layer.succeed( DesktopEnvironment.DesktopEnvironment, DesktopEnvironment.DesktopEnvironment.of({ platform: input.platform, } as DesktopEnvironment.DesktopEnvironment["Service"]), ); - const spawnerLayer = Layer.succeed( + const layerSpawner = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make((command) => input.failure === undefined @@ -91,7 +91,7 @@ function runShellEnvironment(input: { }).pipe( Effect.provide( DesktopShellEnvironment.layer.pipe( - Layer.provide(Layer.mergeAll(environmentLayer, NodeServices.layer, spawnerLayer)), + Layer.provide(Layer.mergeAll(layerEnvironment, NodeServices.layer, layerSpawner)), ), ), ); diff --git a/apps/desktop/src/telemetry/DesktopTelemetryPublisher.test.ts b/apps/desktop/src/telemetry/DesktopTelemetryPublisher.test.ts index 14403f8c6097..e9da7f828ca7 100644 --- a/apps/desktop/src/telemetry/DesktopTelemetryPublisher.test.ts +++ b/apps/desktop/src/telemetry/DesktopTelemetryPublisher.test.ts @@ -24,7 +24,7 @@ import * as ElectronPowerMonitor from "../electron/ElectronPowerMonitor.ts"; import * as DesktopTelemetryPublisher from "./DesktopTelemetryPublisher.ts"; import * as DesktopRendererHistory from "./DesktopRendererHistory.ts"; -const historyLayer = Layer.succeed(DesktopRendererHistory.DesktopRendererHistory, { +const layerHistory = Layer.succeed(DesktopRendererHistory.DesktopRendererHistory, { register: () => Effect.void, recordMetrics: () => Effect.void, shutdown: Effect.void, @@ -65,7 +65,7 @@ describe("DesktopTelemetryPublisher", () => { Effect.gen(function* () { const pollStarted = yield* Deferred.make(); const blockPoll = yield* Deferred.make(); - const powerLayer = Layer.succeed( + const layerPower = Layer.succeed( ElectronPowerMonitor.ElectronPowerMonitor, ElectronPowerMonitor.ElectronPowerMonitor.of({ isOnBatteryPower: Effect.succeed(false), @@ -81,7 +81,7 @@ describe("DesktopTelemetryPublisher", () => { }), ); const layer = DesktopTelemetryPublisher.layer.pipe( - Layer.provide(Layer.mergeAll(makeElectronAppLayer([]), powerLayer, historyLayer)), + Layer.provide(Layer.mergeAll(makeElectronAppLayer([]), layerPower, layerHistory)), ); const scope = yield* Scope.make(); @@ -124,7 +124,7 @@ describe("DesktopTelemetryPublisher", () => { }, } as Electron.ProcessMetric, ]; - const powerLayer = Layer.succeed( + const layerPower = Layer.succeed( ElectronPowerMonitor.ElectronPowerMonitor, ElectronPowerMonitor.ElectronPowerMonitor.of({ isOnBatteryPower: Ref.get(onBattery), @@ -152,7 +152,7 @@ describe("DesktopTelemetryPublisher", () => { makeElectronAppLayer(metrics, () => { metricsReadCount += 1; }), - powerLayer, + layerPower, Layer.succeed(DesktopRendererHistory.DesktopRendererHistory, { register: () => Effect.void, shutdown: Effect.void, @@ -413,7 +413,7 @@ describe("DesktopTelemetryPublisher", () => { it.effect("routes requestDesktopUpdate control messages and replays update reports", () => Effect.gen(function* () { - const powerLayer = Layer.succeed( + const layerPower = Layer.succeed( ElectronPowerMonitor.ElectronPowerMonitor, ElectronPowerMonitor.ElectronPowerMonitor.of({ isOnBatteryPower: Effect.succeed(false), @@ -426,7 +426,7 @@ describe("DesktopTelemetryPublisher", () => { }), ); const layer = DesktopTelemetryPublisher.layer.pipe( - Layer.provide(Layer.mergeAll(makeElectronAppLayer([]), powerLayer, historyLayer)), + Layer.provide(Layer.mergeAll(makeElectronAppLayer([]), layerPower, layerHistory)), ); yield* Effect.gen(function* () { @@ -562,7 +562,7 @@ describe("DesktopRendererHistory", () => { readonly written: Deferred.Deferred; } | undefined; - const fileLayer = Layer.succeed(FileSystem.FileSystem, { + const layerFile = Layer.succeed(FileSystem.FileSystem, { ...fileSystem, writeFile: (filePath, bytes, options) => fileSystem.writeFile(filePath, bytes, options).pipe( @@ -590,7 +590,7 @@ describe("DesktopRendererHistory", () => { logDir: directory, } as DesktopEnvironment.DesktopEnvironment["Service"]), ), - fileLayer, + layerFile, ), ), ); @@ -735,7 +735,7 @@ describe("DesktopRendererHistory", () => { ); } const written = yield* Deferred.make(); - const fileLayer = Layer.succeed(FileSystem.FileSystem, { + const layerFile = Layer.succeed(FileSystem.FileSystem, { ...fileSystem, writeFile: (target, bytes, options) => fileSystem @@ -751,7 +751,7 @@ describe("DesktopRendererHistory", () => { logDir: directory, } as DesktopEnvironment.DesktopEnvironment["Service"]), ), - fileLayer, + layerFile, ), ), ); diff --git a/apps/desktop/src/updates/updatesTestHarness.ts b/apps/desktop/src/updates/updatesTestHarness.ts index 5455f1602855..9d4556af42b4 100644 --- a/apps/desktop/src/updates/updatesTestHarness.ts +++ b/apps/desktop/src/updates/updatesTestHarness.ts @@ -67,7 +67,7 @@ export function makeHarness(options: UpdatesHarnessOptions = {}) { } }; - const updaterLayer = Layer.succeed(ElectronUpdater.ElectronUpdater, { + const layerUpdater = Layer.succeed(ElectronUpdater.ElectronUpdater, { setFeedURL: (options) => Effect.sync(() => { feedUrls.push(options); @@ -109,7 +109,7 @@ export function makeHarness(options: UpdatesHarnessOptions = {}) { ).pipe(Effect.asVoid), } satisfies ElectronUpdater.ElectronUpdater["Service"]); - const windowLayer = Layer.succeed(ElectronWindow.ElectronWindow, { + const layerWindow = Layer.succeed(ElectronWindow.ElectronWindow, { create: () => Effect.die("unexpected BrowserWindow creation"), main: Effect.succeedNone, currentMainOrFirst: Effect.succeedNone, @@ -145,9 +145,9 @@ export function makeHarness(options: UpdatesHarnessOptions = {}) { }), waitForReady: () => Effect.succeed(true), }; - const backendLayer = DesktopBackendPool.layerTest([stubBackendInstance]); + const layerBackend = DesktopBackendPool.layerTest([stubBackendInstance]); - const environmentLayer = DesktopEnvironment.layer({ + const layerEnvironment = DesktopEnvironment.layer({ dirname: "/repo/apps/desktop/src", homeDirectory: `/tmp/t3-desktop-updates-home-${process.pid}`, platform: options.platform ?? "darwin", @@ -175,7 +175,7 @@ export function makeHarness(options: UpdatesHarnessOptions = {}) { ...DesktopAppSettings.DEFAULT_DESKTOP_SETTINGS, }; const setUpdateChannelError = options.setUpdateChannelError; - const settingsLayer = + const layerSettings = setUpdateChannelError || options.beforeSetUpdateChannel ? Layer.succeed(DesktopAppSettings.DesktopAppSettings, { get: Effect.sync(() => testSettings), @@ -211,7 +211,7 @@ export function makeHarness(options: UpdatesHarnessOptions = {}) { // Tracks the restart markers installs leave, so installs stay free of real // disk I/O that would outrun the tests' settle loops. const updateRestartMarkers = new Set(); - const fileSystemLayer = FileSystem.layerNoop({ + const layerFileSystem = FileSystem.layerNoop({ readFileString: (path) => path === "/missing/resources/package-type" && options.packageType !== undefined ? Effect.succeed(options.packageType) @@ -235,12 +235,12 @@ export function makeHarness(options: UpdatesHarnessOptions = {}) { }); const layer = DesktopUpdates.layer.pipe( - Layer.provide(fileSystemLayer), - Layer.provideMerge(updaterLayer), - Layer.provideMerge(windowLayer), - Layer.provideMerge(backendLayer), + Layer.provide(layerFileSystem), + Layer.provideMerge(layerUpdater), + Layer.provideMerge(layerWindow), + Layer.provideMerge(layerBackend), Layer.provideMerge(DesktopState.layer), - Layer.provideMerge(settingsLayer), + Layer.provideMerge(layerSettings), Layer.provideMerge( DesktopConfig.layerTest({ T3CODE_HOME: `/tmp/t3-desktop-updates-test-${process.pid}`, @@ -249,7 +249,7 @@ export function makeHarness(options: UpdatesHarnessOptions = {}) { ...options.env, }), ), - Layer.provideMerge(environmentLayer), + Layer.provideMerge(layerEnvironment), Layer.provideMerge(NodeServices.layer), ); diff --git a/apps/desktop/src/window/DesktopApplicationMenu.test.ts b/apps/desktop/src/window/DesktopApplicationMenu.test.ts index d24ffdcba48f..dcfc42704ea5 100644 --- a/apps/desktop/src/window/DesktopApplicationMenu.test.ts +++ b/apps/desktop/src/window/DesktopApplicationMenu.test.ts @@ -27,7 +27,7 @@ const environmentInput = { runningUnderArm64Translation: false, } satisfies DesktopEnvironment.MakeDesktopEnvironmentInput; -const electronAppLayer = Layer.succeed(ElectronApp.ElectronApp, { +const layerElectronApp = Layer.succeed(ElectronApp.ElectronApp, { metadata: Effect.die("unexpected metadata read"), name: Effect.succeed("T3 Code"), systemLocale: Effect.succeed("en-US"), @@ -49,14 +49,14 @@ const electronAppLayer = Layer.succeed(ElectronApp.ElectronApp, { on: () => Effect.void, } satisfies ElectronApp.ElectronApp["Service"]); -const electronDialogLayer = Layer.succeed(ElectronDialog.ElectronDialog, { +const layerElectronDialog = Layer.succeed(ElectronDialog.ElectronDialog, { pickFolder: () => Effect.succeedNone, pickFiles: () => Effect.succeed([]), showMessageBox: () => Effect.succeed({ response: 0, checkboxChecked: false }), showErrorBox: () => Effect.void, } satisfies ElectronDialog.ElectronDialog["Service"]); -const desktopUpdatesLayer = Layer.succeed(DesktopUpdates.DesktopUpdates, { +const layerDesktopUpdates = Layer.succeed(DesktopUpdates.DesktopUpdates, { getState: Effect.die("unexpected getState"), isActionActive: Effect.succeed(false), isInstallActive: Effect.succeed(false), @@ -112,9 +112,9 @@ const configureMenu = ( DesktopApplicationMenu.layer.pipe( Layer.provideMerge(makeElectronMenuLayer(applicationMenuTemplate)), Layer.provideMerge(makeDesktopWindowLayer(selectedAction)), - Layer.provideMerge(desktopUpdatesLayer), - Layer.provideMerge(electronDialogLayer), - Layer.provideMerge(electronAppLayer), + Layer.provideMerge(layerDesktopUpdates), + Layer.provideMerge(layerElectronDialog), + Layer.provideMerge(layerElectronApp), Layer.provideMerge( DesktopEnvironment.layer(environmentInput).pipe( Layer.provide(Layer.mergeAll(NodeServices.layer, DesktopConfig.layerTest({}))), diff --git a/apps/desktop/src/window/DesktopWindow.test.ts b/apps/desktop/src/window/DesktopWindow.test.ts index ecf1e386f1ef..2e96b21f035e 100644 --- a/apps/desktop/src/window/DesktopWindow.test.ts +++ b/apps/desktop/src/window/DesktopWindow.test.ts @@ -151,15 +151,15 @@ function makeFakeBrowserWindow() { }; } -const desktopClientSettingsLayer = Layer.mock(DesktopClientSettings.DesktopClientSettings)({ +const layerDesktopClientSettings = Layer.mock(DesktopClientSettings.DesktopClientSettings)({ get: Effect.succeedNone, }); -const electronAppLayer = Layer.mock(ElectronApp.ElectronApp)({ +const layerElectronApp = Layer.mock(ElectronApp.ElectronApp)({ quit: Effect.void, }); -const desktopAssetsLayer = Layer.succeed(DesktopAssets.DesktopAssets, { +const layerDesktopAssets = Layer.succeed(DesktopAssets.DesktopAssets, { iconPaths: Effect.succeed({ ico: Option.none(), icns: Option.none(), @@ -168,7 +168,7 @@ const desktopAssetsLayer = Layer.succeed(DesktopAssets.DesktopAssets, { resolveResourcePath: () => Effect.succeed(Option.none()), } satisfies DesktopAssets.DesktopAssets["Service"]); -const desktopServerExposureLayer = Layer.succeed(DesktopServerExposure.DesktopServerExposure, { +const layerDesktopServerExposure = Layer.succeed(DesktopServerExposure.DesktopServerExposure, { getState: Effect.die("unexpected getState"), backendConfig: Effect.succeed({ port: 3773, @@ -183,19 +183,19 @@ const desktopServerExposureLayer = Layer.succeed(DesktopServerExposure.DesktopSe getAdvertisedEndpoints: Effect.die("unexpected getAdvertisedEndpoints"), } satisfies DesktopServerExposure.DesktopServerExposure["Service"]); -const electronMenuLayer = Layer.succeed(ElectronMenu.ElectronMenu, { +const layerElectronMenu = Layer.succeed(ElectronMenu.ElectronMenu, { setApplicationMenu: () => Effect.void, popupTemplate: () => Effect.void, showContextMenu: () => Effect.succeedNone, } satisfies ElectronMenu.ElectronMenu["Service"]); -const electronThemeLayer = Layer.succeed(ElectronTheme.ElectronTheme, { +const layerElectronTheme = Layer.succeed(ElectronTheme.ElectronTheme, { shouldUseDarkColors: Effect.succeed(false), setSource: () => Effect.void, onUpdated: () => Effect.void, } satisfies ElectronTheme.ElectronTheme["Service"]); -const desktopEnvironmentLayer = DesktopEnvironment.layer(environmentInput).pipe( +const layerDesktopEnvironment = DesktopEnvironment.layer(environmentInput).pipe( Layer.provide( Layer.mergeAll( NodeServices.layer, @@ -229,7 +229,7 @@ function makeTestLayer(input: { readonly onReveal?: (window: Electron.BrowserWindow) => void; }) { let desktopSettings = input.desktopSettings ?? DesktopAppSettings.DEFAULT_DESKTOP_SETTINGS; - const desktopAppSettingsLayer = Layer.succeed(DesktopAppSettings.DesktopAppSettings, { + const layerDesktopAppSettings = Layer.succeed(DesktopAppSettings.DesktopAppSettings, { get: Effect.sync(() => desktopSettings), load: Effect.sync(() => desktopSettings), setMainWindowBounds: (bounds, isMaximized) => @@ -263,7 +263,7 @@ function makeTestLayer(input: { applyWslWindowsFallbackInMemory: Effect.die("unexpected WSL Windows fallback"), } satisfies DesktopAppSettings.DesktopAppSettings["Service"]); - const electronWindowLayer = Layer.succeed(ElectronWindow.ElectronWindow, { + const layerElectronWindow = Layer.succeed(ElectronWindow.ElectronWindow, { create: (options) => Effect.sync(() => { input.createdWindowOptions?.push(options); @@ -286,18 +286,18 @@ function makeTestLayer(input: { return DesktopWindow.layer.pipe( Layer.provide( Layer.mergeAll( - desktopAssetsLayer, + layerDesktopAssets, Layer.succeed(DesktopRendererHistory.DesktopRendererHistory, { register: () => Effect.void, recordMetrics: () => Effect.void, shutdown: Effect.void, }), - desktopEnvironmentLayer, - desktopAppSettingsLayer, - desktopClientSettingsLayer, - desktopServerExposureLayer, + layerDesktopEnvironment, + layerDesktopAppSettings, + layerDesktopClientSettings, + layerDesktopServerExposure, DesktopState.layer, - electronAppLayer, + layerElectronApp, Layer.succeed(ElectronMenu.ElectronMenu, { setApplicationMenu: () => Effect.void, showContextMenu: () => Effect.succeedNone, @@ -315,8 +315,8 @@ function makeTestLayer(input: { input.copiedTexts?.push(text); }), } satisfies ElectronShell.ElectronShell["Service"]), - electronThemeLayer, - electronWindowLayer, + layerElectronTheme, + layerElectronWindow, Layer.mock(PreviewManager.PreviewManager)({ getBrowserSession: () => Effect.succeed({} as Electron.Session), setMainWindow: () => Effect.void, @@ -406,24 +406,24 @@ const makeSplashScenario = (createOutcomes: readonly (Electron.BrowserWindow | n const layer = DesktopWindow.layer.pipe( Layer.provide( Layer.mergeAll( - desktopAssetsLayer, + layerDesktopAssets, Layer.succeed(DesktopRendererHistory.DesktopRendererHistory, { register: () => Effect.void, recordMetrics: () => Effect.void, shutdown: Effect.void, }), - desktopEnvironmentLayer, + layerDesktopEnvironment, DesktopAppSettings.layerTest(), - desktopClientSettingsLayer, - desktopServerExposureLayer, - electronAppLayer, - electronMenuLayer, + layerDesktopClientSettings, + layerDesktopServerExposure, + layerElectronApp, + layerElectronMenu, Layer.succeed(ElectronShell.ElectronShell, { openExternal: () => Effect.succeed(true), openSystemSettings: () => Effect.succeed(true), copyText: () => Effect.void, } satisfies ElectronShell.ElectronShell["Service"]), - electronThemeLayer, + layerElectronTheme, Layer.succeed(ElectronWindow.ElectronWindow, electronWindowShape), Layer.mock(PreviewManager.PreviewManager)({ getBrowserSession: () => Effect.succeed({} as Electron.Session), diff --git a/apps/desktop/src/wsl/DesktopWslBackend.test.ts b/apps/desktop/src/wsl/DesktopWslBackend.test.ts index c2daf352837f..f98f41c3036e 100644 --- a/apps/desktop/src/wsl/DesktopWslBackend.test.ts +++ b/apps/desktop/src/wsl/DesktopWslBackend.test.ts @@ -50,7 +50,7 @@ const primarySnapshot: DesktopBackendSnapshot = { restartScheduled: false, }; -const serverExposureLayer = Layer.succeed(DesktopServerExposure.DesktopServerExposure, { +const layerServerExposure = Layer.succeed(DesktopServerExposure.DesktopServerExposure, { getState: Effect.die("unexpected getState"), backendConfig: Effect.succeed({ port: 3773, @@ -65,7 +65,7 @@ const serverExposureLayer = Layer.succeed(DesktopServerExposure.DesktopServerExp getAdvertisedEndpoints: Effect.succeed([]), } satisfies DesktopServerExposure.DesktopServerExposure["Service"]); -const backendConfigurationLayer = Layer.succeed( +const layerBackendConfiguration = Layer.succeed( DesktopBackendConfiguration.DesktopBackendConfiguration, { resolvePrimary: Effect.die("unexpected resolvePrimary"), @@ -74,7 +74,7 @@ const backendConfigurationLayer = Layer.succeed( } satisfies DesktopBackendConfiguration.DesktopBackendConfiguration["Service"], ); -const netLayer = Layer.succeed(NetService.NetService, { +const layerNet = Layer.succeed(NetService.NetService, { canListenOnHost: () => Effect.succeed(true), isPortAvailableOnLoopback: () => Effect.succeed(true), hasListenerOnHost: () => Effect.succeed(false), @@ -91,9 +91,9 @@ describe("DesktopWslBackend", () => { Effect.provide( DesktopWslBackend.layer.pipe( Layer.provide(Layer.mock(DesktopBackendPool.DesktopBackendPool, {})), - Layer.provide(backendConfigurationLayer), - Layer.provide(serverExposureLayer), - Layer.provide(netLayer), + Layer.provide(layerBackendConfiguration), + Layer.provide(layerServerExposure), + Layer.provide(layerNet), Layer.provide(Layer.mock(DesktopWslEnvironment.DesktopWslEnvironment, {})), Layer.provide( DesktopAppSettings.layerTest({ @@ -118,7 +118,7 @@ describe("DesktopWslBackend", () => { label: "WSL (Ubuntu)", snapshot: primarySnapshot, }); - const poolLayer = Layer.succeed(DesktopBackendPool.DesktopBackendPool, { + const layerPool = Layer.succeed(DesktopBackendPool.DesktopBackendPool, { get: (id) => Effect.succeed( id === DesktopBackendPool.PRIMARY_INSTANCE_ID @@ -160,10 +160,10 @@ describe("DesktopWslBackend", () => { }).pipe( Effect.provide( DesktopWslBackend.layer.pipe( - Layer.provideMerge(poolLayer), - Layer.provideMerge(backendConfigurationLayer), - Layer.provideMerge(serverExposureLayer), - Layer.provideMerge(netLayer), + Layer.provideMerge(layerPool), + Layer.provideMerge(layerBackendConfiguration), + Layer.provideMerge(layerServerExposure), + Layer.provideMerge(layerNet), Layer.provideMerge( DesktopAppSettings.layerTest({ ...DesktopAppSettings.DEFAULT_DESKTOP_SETTINGS, @@ -204,9 +204,9 @@ describe("DesktopWslBackend", () => { Effect.provide( DesktopWslBackend.layer.pipe( Layer.provideMerge(DesktopBackendPool.layerTest([primary, wsl])), - Layer.provideMerge(backendConfigurationLayer), - Layer.provideMerge(serverExposureLayer), - Layer.provideMerge(netLayer), + Layer.provideMerge(layerBackendConfiguration), + Layer.provideMerge(layerServerExposure), + Layer.provideMerge(layerNet), Layer.provideMerge( DesktopAppSettings.layerTest({ ...DesktopAppSettings.DEFAULT_DESKTOP_SETTINGS, diff --git a/apps/desktop/src/wsl/DesktopWslServerTree.test.ts b/apps/desktop/src/wsl/DesktopWslServerTree.test.ts index 0c020806166a..a3ce97972e2e 100644 --- a/apps/desktop/src/wsl/DesktopWslServerTree.test.ts +++ b/apps/desktop/src/wsl/DesktopWslServerTree.test.ts @@ -340,7 +340,7 @@ describe("DesktopWslServerTree", () => { const treeRoot = path.dirname(versionDir); const extractedEntryPath = path.join(versionDir, "apps/server/dist/bin.mjs"); let cleanupFailed = false; - const partialCleanupFileSystem = Layer.effect( + const layerPartialCleanupFileSystem = Layer.effect( FileSystem.FileSystem, Effect.gen(function* () { const realFileSystem = yield* FileSystem.FileSystem; @@ -372,7 +372,7 @@ describe("DesktopWslServerTree", () => { Effect.provide( DesktopWslServerTree.layer.pipe( Layer.provideMerge(environmentLayer({ baseDir: tempDir, resourcesPath })), - Layer.provideMerge(partialCleanupFileSystem), + Layer.provideMerge(layerPartialCleanupFileSystem), ), ), ); diff --git a/apps/mobile/src/connection/background-activity.ts b/apps/mobile/src/connection/background-activity.ts index e436459292a5..80e185b9e05d 100644 --- a/apps/mobile/src/connection/background-activity.ts +++ b/apps/mobile/src/connection/background-activity.ts @@ -36,14 +36,14 @@ function normalizeAppState( return "unknown"; } -export const mobileBackgroundActivityObserverLayer = Layer.succeed( +export const layerObserver = Layer.succeed( EnvironmentRpcSubscriptionObserver, EnvironmentRpcSubscriptionObserver.of({ observe: observeMobileBackgroundActivitySubscription, }), ); -export const mobileBackgroundActivityReporterLayer = Layer.effectDiscard( +export const layerReporter = Layer.effectDiscard( Effect.gen(function* () { const registry = yield* EnvironmentRegistry.EnvironmentRegistry; const storage = yield* MobileStorage.MobileStorage; diff --git a/apps/mobile/src/connection/platform.ts b/apps/mobile/src/connection/platform.ts index 7f1e3e5c344d..a8bf9c8f4b5d 100644 --- a/apps/mobile/src/connection/platform.ts +++ b/apps/mobile/src/connection/platform.ts @@ -29,7 +29,7 @@ import { clearThreadOutboxEnvironment } from "../state/thread-outbox-removal"; import { clearComposerDraftsEnvironment } from "../state/use-composer-drafts"; import { clearThreadComposerErrorsForEnvironment } from "../state/thread-composer-error"; import { mobileApplicationActiveWakeup } from "./app-state-wakeups"; -import { connectionStorageLayer } from "./storage"; +import * as ConnectionStorage from "./storage"; function networkStatus(state: Network.NetworkState): "unknown" | "offline" | "online" { if (state.isConnected === false) { @@ -41,7 +41,7 @@ function networkStatus(state: Network.NetworkState): "unknown" | "offline" | "on return "unknown"; } -const connectivityLayer = Connectivity.layer({ +const layerConnectivity = Connectivity.layer({ status: Effect.tryPromise({ try: () => Network.getNetworkStateAsync(), catch: () => undefined, @@ -122,7 +122,7 @@ const networkPathChanges = Stream.callback<"network-changed">((queue) => ).pipe(Effect.asVoid), ); -const wakeupsLayer = Wakeups.layer({ +const layerWakeups = Wakeups.layer({ changes: Stream.mergeAll( [ Stream.callback<"application-active-probe" | "application-active-reconnect">((queue) => @@ -155,7 +155,7 @@ const wakeupsLayer = Wakeups.layer({ ), }); -const capabilitiesLayer = Layer.effectContext( +const layerCapabilities = Layer.effectContext( Effect.gen(function* () { const storage = yield* MobileStorage.MobileStorage; return Context.make( @@ -243,21 +243,17 @@ const capabilitiesLayer = Layer.effectContext( }), ); -const platformConnectionSourceLayer = Layer.succeed( +const layerPlatformConnectionSource = Layer.succeed( PlatformConnectionSource.PlatformConnectionSource, PlatformConnectionSource.PlatformConnectionSource.of({ registrations: Stream.empty, }), ); -const providedConnectionStorageLayer = connectionStorageLayer.pipe( - Layer.provide(Runtime.runtimeContextLayer), -); -const providedCapabilitiesLayer = capabilitiesLayer.pipe( - Layer.provide(Runtime.runtimeContextLayer), -); +const layerProvidedConnectionStorage = ConnectionStorage.layer.pipe(Layer.provide(Runtime.layer)); +const layerProvidedCapabilities = layerCapabilities.pipe(Layer.provide(Runtime.layer)); -const environmentOwnedDataCleanupLayer = Layer.succeed( +const layerEnvironmentOwnedDataCleanup = Layer.succeed( Persistence.EnvironmentOwnedDataCleanup, Persistence.EnvironmentOwnedDataCleanup.of({ clear: (environmentId) => @@ -280,24 +276,24 @@ const environmentOwnedDataCleanupLayer = Layer.succeed( ); type ConnectionPlatformLayerSource = - | typeof providedConnectionStorageLayer - | typeof Runtime.runtimeContextLayer - | typeof connectivityLayer - | typeof wakeupsLayer - | typeof providedCapabilitiesLayer - | typeof platformConnectionSourceLayer - | typeof environmentOwnedDataCleanupLayer; + | typeof layerProvidedConnectionStorage + | typeof Runtime.layer + | typeof layerConnectivity + | typeof layerWakeups + | typeof layerProvidedCapabilities + | typeof layerPlatformConnectionSource + | typeof layerEnvironmentOwnedDataCleanup; -export const connectionPlatformLayer: Layer.Layer< +export const layer: Layer.Layer< Layer.Success, Layer.Error, Layer.Services > = Layer.mergeAll( - providedConnectionStorageLayer, - Runtime.runtimeContextLayer, - connectivityLayer, - wakeupsLayer, - providedCapabilitiesLayer, - platformConnectionSourceLayer, - environmentOwnedDataCleanupLayer, + layerProvidedConnectionStorage, + Runtime.layer, + layerConnectivity, + layerWakeups, + layerProvidedCapabilities, + layerPlatformConnectionSource, + layerEnvironmentOwnedDataCleanup, ); diff --git a/apps/mobile/src/connection/runtime.ts b/apps/mobile/src/connection/runtime.ts index 7bd16613c842..e86b6acdaec3 100644 --- a/apps/mobile/src/connection/runtime.ts +++ b/apps/mobile/src/connection/runtime.ts @@ -1,7 +1,7 @@ import { Connection } from "@t3tools/client-runtime/connection"; import { ShellSnapshotLoader } from "@t3tools/client-runtime/state/shell"; import { - boundedThreadSnapshotLoaderLayer, + BoundedThreadSnapshotLoader, ThreadHistoryController, } from "@t3tools/client-runtime/state/threads"; import * as Layer from "effect/Layer"; @@ -9,49 +9,44 @@ import { Atom } from "effect/reactivity"; import type { FoundationHotModule } from "../lib/foundation-fast-refresh"; import { hotSwappableAtomRuntime } from "../lib/hot-swappable-atom-runtime"; -import { runtimeContextLayer } from "../lib/runtime"; +import * as Runtime from "../lib/runtime"; import { appAtomRegistry } from "../state/atom-registry"; -import { - mobileBackgroundActivityObserverLayer, - mobileBackgroundActivityReporterLayer, -} from "./background-activity"; -import { connectionPlatformLayer } from "./platform"; +import * as BackgroundActivity from "./background-activity"; +import * as ConnectionPlatform from "./platform"; declare const module: { readonly hot?: FoundationHotModule } | undefined; -const providedConnectionPlatformLayer = connectionPlatformLayer.pipe( - Layer.provide(runtimeContextLayer), -); +const layerProvidedConnectionPlatform = ConnectionPlatform.layer.pipe(Layer.provide(Runtime.layer)); -const snapshotLoaderLayer = Layer.mergeAll( - boundedThreadSnapshotLoaderLayer, +const layerSnapshotLoader = Layer.mergeAll( + BoundedThreadSnapshotLoader.layer, ShellSnapshotLoader.layer, ThreadHistoryController.layer, ); type ConnectionLayerSource = | typeof Connection.layer - | typeof snapshotLoaderLayer - | typeof runtimeContextLayer - | typeof connectionPlatformLayer - | typeof mobileBackgroundActivityObserverLayer - | typeof mobileBackgroundActivityReporterLayer; + | typeof layerSnapshotLoader + | typeof Runtime.layer + | typeof ConnectionPlatform.layer + | typeof BackgroundActivity.layerObserver + | typeof BackgroundActivity.layerReporter; -const providedClientConnectionLayer = snapshotLoaderLayer.pipe( +const layerProvidedClientConnection = layerSnapshotLoader.pipe( Layer.provideMerge( Connection.layerWithOptions({ usageLimitSources: true, usageLimitsCommand: true }), ), Layer.provideMerge( Layer.mergeAll( - runtimeContextLayer, - providedConnectionPlatformLayer, - mobileBackgroundActivityObserverLayer, + Runtime.layer, + layerProvidedConnectionPlatform, + BackgroundActivity.layerObserver, ), ), ); -const connectionLayer = mobileBackgroundActivityReporterLayer.pipe( - Layer.provideMerge(providedClientConnectionLayer), +const layerConnection = BackgroundActivity.layerReporter.pipe( + Layer.provideMerge(layerProvidedClientConnection), ); export const connectionAtomRuntime: Atom.AtomRuntime< @@ -61,5 +56,5 @@ export const connectionAtomRuntime: Atom.AtomRuntime< id: "t3.mobile.connection-runtime", hotModule: typeof module === "undefined" ? undefined : module.hot, registry: appAtomRegistry, - layer: connectionLayer, + layer: layerConnection, }); diff --git a/apps/mobile/src/connection/storage.ts b/apps/mobile/src/connection/storage.ts index 6c1fd326a7b6..0bb20a769ed8 100644 --- a/apps/mobile/src/connection/storage.ts +++ b/apps/mobile/src/connection/storage.ts @@ -39,7 +39,7 @@ function targetPersistenceError( }); } -export const connectionStorageLayer = Layer.effectContext( +export const layer = Layer.effectContext( Effect.gen(function* () { const catalog = yield* CatalogStore.make(); const githubRoutingPermissions = yield* makeGitHubRoutingPermissions({ diff --git a/apps/mobile/src/features/agent-awareness/liveActivityPreferences.test.ts b/apps/mobile/src/features/agent-awareness/liveActivityPreferences.test.ts index b056d7252ce2..74d06207da91 100644 --- a/apps/mobile/src/features/agent-awareness/liveActivityPreferences.test.ts +++ b/apps/mobile/src/features/agent-awareness/liveActivityPreferences.test.ts @@ -43,7 +43,7 @@ const connection: SavedRemoteConnection = { bearerToken: "local-bearer", }; -const testLayer = Layer.mergeAll( +const layerTest = Layer.mergeAll( Layer.succeed(ManagedRelay.ManagedRelayClient, null as never), Layer.succeed( HttpClient.HttpClient, @@ -88,7 +88,7 @@ describe("liveActivityPreferences", () => { connection, liveActivitiesEnabled: false, }); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("pushes enabled Live Activity preferences to relay registrations", () => @@ -108,7 +108,7 @@ describe("liveActivityPreferences", () => { connection, liveActivitiesEnabled: true, }); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("keeps local preferences refreshable when signed out", () => @@ -124,7 +124,7 @@ describe("liveActivityPreferences", () => { liveActivitiesEnabled: false, }); expect(linkEnvironmentToCloudWithPreference).not.toHaveBeenCalled(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("does not try to re-link managed relay connections without bearer credentials", () => { @@ -147,7 +147,7 @@ describe("liveActivityPreferences", () => { connection, liveActivitiesEnabled: true, }); - }).pipe(Effect.provide(testLayer)); + }).pipe(Effect.provide(layerTest)); }); it.effect("restores relay preferences when an environment update fails", () => { @@ -182,6 +182,6 @@ describe("liveActivityPreferences", () => { connection, liveActivitiesEnabled: true, }); - }).pipe(Effect.provide(testLayer)); + }).pipe(Effect.provide(layerTest)); }); }); diff --git a/apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts b/apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts index fb7013fceae8..e22977c488b1 100644 --- a/apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts +++ b/apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts @@ -15,7 +15,7 @@ import { ManagedRelay } from "@t3tools/client-runtime/relay"; import type { EnvironmentId } from "@t3tools/contracts"; import { verifyDpopProof } from "@t3tools/shared/dpop"; import type { SavedRemoteConnection } from "../../lib/connection"; -import { cryptoLayer } from "../cloud/dpop"; +import * as Dpop from "../cloud/dpop"; import { managedRelayClientLayer } from "../cloud/managedRelayLayer"; import { clearAgentAwarenessRegistrationRecord, @@ -220,8 +220,8 @@ function savedConnection(): SavedRemoteConnection { }; } -const relayTestLayer = managedRelayClientLayer("https://relay.example.test").pipe( - Layer.provide(Layer.mergeAll(FetchHttpClient.layer, cryptoLayer)), +const layerRelayTest = managedRelayClientLayer("https://relay.example.test").pipe( + Layer.provide(Layer.mergeAll(FetchHttpClient.layer, Dpop.layer)), ); const runBackgroundOperations = Effect.fn("TestRemoteRegistration.runBackgroundOperations")( @@ -405,7 +405,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { expect(activity.getPushToken).toHaveBeenCalledTimes(2); expect(addPushTokenListener).toHaveBeenCalledTimes(1); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect("preserves Live Activity push-token lookup failures", () => { @@ -427,7 +427,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { cause, message: "Agent awareness operation read-live-activity-push-token failed.", }); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect( @@ -441,7 +441,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { return Effect.gen(function* () { expect(yield* registerLiveActivityPushToken({ activity: activity as never })).toBe(false); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }, ); @@ -465,7 +465,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { expect(activity.start).not.toHaveBeenCalled(); expect(activity.update).not.toHaveBeenCalled(); expect(activity.end).not.toHaveBeenCalled(); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }, ); @@ -495,7 +495,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { } yield* runBackgroundOperations(); expect(activity.getPushToken).toHaveBeenCalled(); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }, ); @@ -525,7 +525,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { yield* refreshAgentAwarenessRegistration(); expect(Notifications.getDevicePushTokenAsync).toHaveBeenCalledTimes(1); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect("registers the APNs device when cloud auth becomes available", () => { @@ -583,7 +583,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { }), ).toMatchObject({ ok: true }); expect(getAgentAwarenessRegistrationStatus()).toBe("registered"); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect("marks registration failed when device registration cannot complete", () => { @@ -604,7 +604,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { // read as enabled. yield* refreshAgentAwarenessRegistration(); expect(getAgentAwarenessRegistrationStatus()).toBe("failed"); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it("clears registration status on cloud sign-out", () => { @@ -642,7 +642,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { return Effect.gen(function* () { yield* runBackgroundOperations(); expect(getAgentAwarenessRegistrationStatus()).toBe("unknown"); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect("keeps a registered status when a later refresh fails", () => { @@ -664,7 +664,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { ); yield* refreshAgentAwarenessRegistration(); expect(getAgentAwarenessRegistrationStatus()).toBe("registered"); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect("does not re-register the same account when nothing has changed", () => { @@ -687,7 +687,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { yield* refreshAgentAwarenessRegistration(); expect(getAgentAwarenessRegistrationStatus()).toBe("registered"); expect(saveAgentAwarenessRegistrationRecord).not.toHaveBeenCalled(); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect("dedupes rapid activity-token re-registrations within the replay window", () => { @@ -735,7 +735,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { vi.mocked(loadOrCreateAgentAwarenessDeviceId).mockClear(); yield* refreshActiveLiveActivityRemoteRegistration(); expect(loadOrCreateAgentAwarenessDeviceId).not.toHaveBeenCalled(); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect("re-registers when the stored account identity differs", () => { @@ -750,7 +750,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { return Effect.gen(function* () { yield* refreshAgentAwarenessRegistration(); expect(saveAgentAwarenessRegistrationRecord).toHaveBeenCalledTimes(1); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect("coalesces simultaneous sign-in and environment connection registrations", () => { @@ -784,7 +784,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { return Effect.gen(function* () { yield* runBackgroundOperations(); expect(Notifications.getPermissionsAsync).toHaveBeenCalledTimes(1); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect("continues queued device registration after a failed auth lookup", () => { @@ -808,7 +808,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { expect(backgroundRuntime.pending).toHaveLength(0); expect(tokenProvider).toHaveBeenCalledTimes(2); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it("only registers again when the authenticated identity changes", () => { @@ -852,7 +852,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { return Effect.gen(function* () { yield* runBackgroundOperations(); expect(Notifications.getDevicePushTokenAsync).toHaveBeenCalledTimes(1); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect( @@ -890,7 +890,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { unregisterAgentAwarenessConnection(savedConnection().environmentId); expect(fetchMock).not.toHaveBeenCalled(); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }, ); @@ -989,7 +989,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { Effect.provideService(FetchHttpClient.Fetch, globalThis.fetch), Effect.provide( managedRelayClientLayer("https://permission-relay.example.test").pipe( - Layer.provide(Layer.mergeAll(FetchHttpClient.layer, cryptoLayer)), + Layer.provide(Layer.mergeAll(FetchHttpClient.layer, Dpop.layer)), ), ), ); @@ -1039,7 +1039,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { } expect(getAgentAwarenessRegistrationStatus()).toBe("failed"); expect(saveAgentAwarenessRegistrationRecord).not.toHaveBeenCalled(); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect("registers an Android FCM token without invoking Apple Live Activities", () => { @@ -1082,7 +1082,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { vi.mocked(clearAndroidAgentNotifications).mockClear(); setAgentAwarenessRelayTokenProvider(() => Promise.resolve("clerk-token-user-b"), "user-b"); expect(clearAndroidAgentNotifications).toHaveBeenCalled(); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }); it.effect( "preserves same-account Android notifications and replays on remount and later foreground", @@ -1120,7 +1120,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { setAgentAwarenessRelayTokenProvider(null); expect(clearAndroidAgentNotifications).toHaveBeenCalled(); expect(clearAgentAwarenessRegistrationRecord).toHaveBeenCalled(); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }, ); @@ -1137,7 +1137,7 @@ describe("makeRelayDeviceRegistrationRequest", () => { yield* runBackgroundOperations(); expect(configureAndroidAgentNotifications).not.toHaveBeenCalled(); expect(saveAgentAwarenessRegistrationRecord).not.toHaveBeenCalled(); - }).pipe(Effect.provide(relayTestLayer)); + }).pipe(Effect.provide(layerRelayTest)); }, ); }); diff --git a/apps/mobile/src/features/cloud/dpop.test.ts b/apps/mobile/src/features/cloud/dpop.test.ts index 8945d148ee94..c609294549ab 100644 --- a/apps/mobile/src/features/cloud/dpop.test.ts +++ b/apps/mobile/src/features/cloud/dpop.test.ts @@ -8,12 +8,8 @@ import * as Crypto from "effect/Crypto"; import * as Effect from "effect/Effect"; import { verifyDpopProof } from "@t3tools/shared/dpop"; -import { - createDpopProof, - generateDpopProofKeyPair, - loadOrCreateDpopProofKeyPair, - cryptoLayer, -} from "./dpop"; +import { createDpopProof, generateDpopProofKeyPair, loadOrCreateDpopProofKeyPair } from "./dpop"; +import * as Dpop from "./dpop"; vi.mock("expo-crypto", () => ({ CryptoDigestAlgorithm: { @@ -75,7 +71,7 @@ describe("mobile DPoP", () => { expect(Buffer.from(digest).toString("hex")).toBe( NodeCrypto.createHash("sha256").update("typed-array").digest("hex"), ); - }).pipe(Effect.provide(cryptoLayer)), + }).pipe(Effect.provide(Dpop.layer)), ); it.effect("persists and reuses the installation proof key", () => @@ -86,7 +82,7 @@ describe("mobile DPoP", () => { expect(second.thumbprint).toBe(first.thumbprint); expect(second.privateJwk).toEqual(first.privateJwk); - }).pipe(Effect.provide(cryptoLayer)), + }).pipe(Effect.provide(Dpop.layer)), ); it.effect("rejects malformed persisted proof keys", () => @@ -96,7 +92,7 @@ describe("mobile DPoP", () => { const error = yield* loadOrCreateDpopProofKeyPair().pipe(Effect.flip); expect(error.message).toBe("Stored DPoP proof key is invalid."); - }).pipe(Effect.provide(cryptoLayer)), + }).pipe(Effect.provide(Dpop.layer)), ); it.effect("signs connect and bootstrap proofs with the same ephemeral proof key", () => @@ -135,7 +131,7 @@ describe("mobile DPoP", () => { nowEpochSeconds: proofIat(bootstrap.proof), }), ).toMatchObject({ ok: true, thumbprint: proofKey.thumbprint }); - }).pipe(Effect.provide(cryptoLayer)), + }).pipe(Effect.provide(Dpop.layer)), ); it.effect("signs DPoP proofs with RFC 9449 htu normalization", () => @@ -161,6 +157,6 @@ describe("mobile DPoP", () => { nowEpochSeconds: proofIat(proof.proof), }), ).toMatchObject({ ok: true }); - }).pipe(Effect.provide(cryptoLayer)), + }).pipe(Effect.provide(Dpop.layer)), ); }); diff --git a/apps/mobile/src/features/cloud/dpop.ts b/apps/mobile/src/features/cloud/dpop.ts index cbd78580f58f..f258a6376e5b 100644 --- a/apps/mobile/src/features/cloud/dpop.ts +++ b/apps/mobile/src/features/cloud/dpop.ts @@ -65,7 +65,7 @@ function toExpoDigestAlgorithm( } } -export const cryptoLayer = Layer.succeed( +export const layer = Layer.succeed( Crypto.Crypto, Crypto.make({ randomBytes: ExpoCrypto.getRandomBytes, diff --git a/apps/mobile/src/features/cloud/linkEnvironment.test.ts b/apps/mobile/src/features/cloud/linkEnvironment.test.ts index cbfea654bd92..316205ce543d 100644 --- a/apps/mobile/src/features/cloud/linkEnvironment.test.ts +++ b/apps/mobile/src/features/cloud/linkEnvironment.test.ts @@ -63,7 +63,7 @@ const createProofMock = vi.fn( (input: { readonly method: string; readonly url: string; readonly accessToken?: string }) => Effect.succeed(`dpop:${input.method}:${input.url}`), ); -const testDpopSignerLayer = Layer.succeed( +const layerTestDpopSigner = Layer.succeed( ManagedRelay.ManagedRelayDpopSigner, ManagedRelay.ManagedRelayDpopSigner.of({ thumbprint: Effect.succeed("client-proof-key-thumbprint"), @@ -72,9 +72,9 @@ const testDpopSignerLayer = Layer.succeed( ); function cloudClientLayer() { - const httpClientLayer = remoteHttpClientLayer((input, init) => globalThis.fetch(input, init)); + const layerHttpClient = remoteHttpClientLayer((input, init) => globalThis.fetch(input, init)); return Layer.mergeAll( - httpClientLayer, + layerHttpClient, Layer.succeed( MobileStorage.MobileStorage, MobileStorage.MobileStorage.of({ @@ -93,7 +93,7 @@ function cloudClientLayer() { ManagedRelay.layer({ relayUrl: "https://relay.example.test", clientId: RelayMobileClientId, - }).pipe(Layer.provideMerge(testDpopSignerLayer), Layer.provide(httpClientLayer)), + }).pipe(Layer.provideMerge(layerTestDpopSigner), Layer.provide(layerHttpClient)), ); } diff --git a/apps/mobile/src/features/cloud/managedRelayLayer.test.ts b/apps/mobile/src/features/cloud/managedRelayLayer.test.ts index 6b8d40413eb7..8be50a45bf94 100644 --- a/apps/mobile/src/features/cloud/managedRelayLayer.test.ts +++ b/apps/mobile/src/features/cloud/managedRelayLayer.test.ts @@ -9,7 +9,7 @@ import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import { FetchHttpClient } from "effect/http"; -import { cryptoLayer } from "./dpop"; +import * as Dpop from "./dpop"; import { managedRelayClientLayer } from "./managedRelayLayer"; vi.mock("expo-crypto", () => ({ @@ -55,7 +55,7 @@ describe("managed relay DPoP signer", () => { }).pipe( Effect.provide( managedRelayClientLayer("https://relay.example.test").pipe( - Layer.provide(Layer.mergeAll(FetchHttpClient.layer, cryptoLayer)), + Layer.provide(Layer.mergeAll(FetchHttpClient.layer, Dpop.layer)), ), ), ), diff --git a/apps/mobile/src/features/cloud/managedRelayLayer.ts b/apps/mobile/src/features/cloud/managedRelayLayer.ts index 98b4d2254f22..dee24cafc049 100644 --- a/apps/mobile/src/features/cloud/managedRelayLayer.ts +++ b/apps/mobile/src/features/cloud/managedRelayLayer.ts @@ -10,7 +10,7 @@ import * as Layer from "effect/Layer"; import { createDpopProof, loadOrCreateDpopProofKeyPair } from "./dpop"; import { managedRelayAccessTokenStore } from "./managedRelayTokenStore"; -const relayDpopSignerLayer = Layer.effect( +const layerRelayDpopSigner = Layer.effect( ManagedRelay.ManagedRelayDpopSigner, Effect.gen(function* () { const crypto = yield* Crypto.Crypto; @@ -69,4 +69,4 @@ export const managedRelayClientLayer = (relayUrl: string) => relayUrl, clientId: RelayMobileClientId, accessTokenStore: managedRelayAccessTokenStore, - }).pipe(Layer.provideMerge(relayDpopSignerLayer)); + }).pipe(Layer.provideMerge(layerRelayDpopSigner)); diff --git a/apps/mobile/src/features/cloud/managedRelayState.ts b/apps/mobile/src/features/cloud/managedRelayState.ts index 5f8da54ef068..75b2658c51c1 100644 --- a/apps/mobile/src/features/cloud/managedRelayState.ts +++ b/apps/mobile/src/features/cloud/managedRelayState.ts @@ -14,11 +14,11 @@ import type { RelayClientEnvironmentRecord } from "@t3tools/contracts/relay"; import { AsyncResult, Atom } from "effect/reactivity"; import { useCallback, useEffect } from "react"; -import { runtimeContextLayer } from "../../lib/runtime"; +import * as Runtime from "../../lib/runtime"; import { appAtomRegistry } from "../../state/atom-registry"; import { cloudDebugLog } from "./cloudDebugLog"; -const managedRelayAtomRuntime = Atom.runtime(runtimeContextLayer); +const managedRelayAtomRuntime = Atom.runtime(Runtime.layer); export const managedRelayQueryManager = createManagedRelayQueryManager(managedRelayAtomRuntime, { onQueryEvent: (event) => diff --git a/apps/mobile/src/features/observability/tracing.test.ts b/apps/mobile/src/features/observability/tracing.test.ts index b0deb15be8cb..7ab2d61bceb4 100644 --- a/apps/mobile/src/features/observability/tracing.test.ts +++ b/apps/mobile/src/features/observability/tracing.test.ts @@ -19,7 +19,7 @@ vi.mock("expo-constants", () => ({ it.effect("exports spans through the scoped mobile OTLP layer", () => { const fetchFn = vi.fn(async () => new Response(null, { status: 202 })); - const tracingLayer = makeTracingLayer( + const layerTracing = makeTracingLayer( { tracesUrl: "https://api.axiom.test/v1/traces", tracesDataset: "mobile-traces", @@ -30,12 +30,12 @@ it.effect("exports spans through the scoped mobile OTLP layer", () => { serviceVersion: "1.2.3", }, ).pipe(Layer.provide(remoteHttpClientLayer(fetchFn))); - const tracedApplication = Layer.effectDiscard( + const layerTracedApplication = Layer.effectDiscard( Effect.void.pipe(Effect.withSpan("mobile.test.span"), withRelayClientTracing), - ).pipe(Layer.provide(tracingLayer)); + ).pipe(Layer.provide(layerTracing)); return Effect.gen(function* () { - yield* Layer.build(tracedApplication); + yield* Layer.build(layerTracedApplication); expect(fetchFn).not.toHaveBeenCalled(); }).pipe( @@ -55,7 +55,7 @@ it.effect("exports spans through the scoped mobile OTLP layer", () => { it.effect("does not let OTLP serialization failures alter application effects", () => { const fetchFn = vi.fn(async () => new Response(null, { status: 202 })); - const tracingLayer = makeTracingLayer( + const layerTracing = makeTracingLayer( { tracesUrl: "https://api.axiom.test/v1/traces", tracesDataset: "mobile-traces", @@ -67,7 +67,7 @@ it.effect("does not let OTLP serialization failures alter application effects", }, ).pipe(Layer.provide(remoteHttpClientLayer(fetchFn))); const failure = { durationNanos: 1n }; - const tracedApplication = Layer.effectDiscard( + const layerTracedApplication = Layer.effectDiscard( Effect.fail(failure).pipe( Effect.withSpan("mobile.test.failed-span"), withRelayClientTracing, @@ -81,9 +81,9 @@ it.effect("does not let OTLP serialization failures alter application effects", : Effect.die(new Error("Expected the original typed failure.")); }), ), - ).pipe(Layer.provide(tracingLayer)); + ).pipe(Layer.provide(layerTracing)); - return Layer.build(tracedApplication).pipe( + return Layer.build(layerTracedApplication).pipe( Effect.scoped, Effect.andThen( Effect.sync(() => { diff --git a/apps/mobile/src/features/observability/tracing.ts b/apps/mobile/src/features/observability/tracing.ts index ae204413e777..2dcdbc81e2db 100644 --- a/apps/mobile/src/features/observability/tracing.ts +++ b/apps/mobile/src/features/observability/tracing.ts @@ -32,7 +32,7 @@ export function makeTracingLayer(config: TracingConfig | null, resource: Tracing }); } -export const tracingLayer = makeTracingLayer(resolveTracingConfig(), { +export const layer = makeTracingLayer(resolveTracingConfig(), { serviceVersion: Constants.expoConfig?.version, appVariant: typeof Constants.expoConfig?.extra?.appVariant === "string" diff --git a/apps/mobile/src/lib/runtime.ts b/apps/mobile/src/lib/runtime.ts index d78117a33b27..5c357e444500 100644 --- a/apps/mobile/src/lib/runtime.ts +++ b/apps/mobile/src/lib/runtime.ts @@ -4,10 +4,10 @@ import * as Socket from "effect/socket/Socket"; import { remoteHttpClientLayer } from "@t3tools/client-runtime/rpc"; -import { cryptoLayer } from "../features/cloud/dpop"; +import * as Dpop from "../features/cloud/dpop"; import { managedRelayClientLayer } from "../features/cloud/managedRelayLayer"; import { resolveCloudPublicConfig } from "../features/cloud/publicConfig"; -import { tracingLayer } from "../features/observability/tracing"; +import * as Tracing from "../features/observability/tracing"; import * as Persistence from "../persistence/layer"; import { disposeOnFoundationReplace, type FoundationHotModule } from "./foundation-fast-refresh"; @@ -17,32 +17,32 @@ function configuredRelayUrl(): string { return resolveCloudPublicConfig().relay.url ?? "http://relay.invalid"; } -const httpClientLayer = remoteHttpClientLayer(fetch); +const layerHttpClient = remoteHttpClientLayer(fetch); type RuntimeLayerSource = | ReturnType | typeof Socket.layerWebSocketConstructorGlobal - | typeof cryptoLayer - | typeof httpClientLayer + | typeof Dpop.layer + | typeof layerHttpClient | typeof Persistence.layer - | typeof tracingLayer; + | typeof Tracing.layer; -const runtimeLayer = Layer.merge( +const layerRuntime = Layer.merge( managedRelayClientLayer(configuredRelayUrl()), Socket.layerWebSocketConstructorGlobal, ).pipe( - Layer.provideMerge(cryptoLayer), - Layer.provideMerge(httpClientLayer), - Layer.provideMerge(tracingLayer.pipe(Layer.provide(httpClientLayer))), + Layer.provideMerge(Dpop.layer), + Layer.provideMerge(layerHttpClient), + Layer.provideMerge(Tracing.layer.pipe(Layer.provide(layerHttpClient))), Layer.provideMerge(Persistence.layer), ); export const runtime: ManagedRuntime.ManagedRuntime< Layer.Success, Layer.Error -> = ManagedRuntime.make(runtimeLayer); +> = ManagedRuntime.make(layerRuntime); -export const runtimeContextLayer: Layer.Layer< +export const layer: Layer.Layer< Layer.Success, Layer.Error > = Layer.effectContext(runtime.contextEffect); diff --git a/apps/mobile/src/persistence/layer.ts b/apps/mobile/src/persistence/layer.ts index 5a9d1dacff33..965a9cc7f4ce 100644 --- a/apps/mobile/src/persistence/layer.ts +++ b/apps/mobile/src/persistence/layer.ts @@ -6,11 +6,11 @@ import * as MobilePreferences from "./mobile-preferences"; import * as MobileSecureStorage from "./mobile-secure-storage"; import * as MobileStorage from "./mobile-storage"; -const baseLayer = Layer.merge(MobileDatabase.layer, MobileSecureStorage.layer); -const dependentLayer = Layer.mergeAll( +const layerBase = Layer.merge(MobileDatabase.layer, MobileSecureStorage.layer); +const layerDependent = Layer.mergeAll( MobilePreferences.layer, MobileStorage.layer, EnvironmentCacheStore.layer, -).pipe(Layer.provide(baseLayer)); +).pipe(Layer.provide(layerBase)); -export const layer = Layer.merge(baseLayer, dependentLayer); +export const layer = Layer.merge(layerBase, layerDependent); diff --git a/apps/mobile/src/state/client-cache-state.ts b/apps/mobile/src/state/client-cache-state.ts index 92dfa0feb866..3a4b453b243c 100644 --- a/apps/mobile/src/state/client-cache-state.ts +++ b/apps/mobile/src/state/client-cache-state.ts @@ -59,7 +59,7 @@ function aggregateCacheSummary( }; } -const clientCacheRuntime = Atom.runtime(Runtime.runtimeContextLayer); +const clientCacheRuntime = Atom.runtime(Runtime.layer); export const clientCacheSummaryAtom = clientCacheRuntime .atom( diff --git a/apps/mobile/src/state/preferences.ts b/apps/mobile/src/state/preferences.ts index a8691e3f91e3..7c28156386bb 100644 --- a/apps/mobile/src/state/preferences.ts +++ b/apps/mobile/src/state/preferences.ts @@ -136,7 +136,7 @@ export function createMobilePreferencesState( return { preferencesAtom, updatePreferencesAtom } as const; } -const mobilePreferencesRuntime = Atom.runtime(Runtime.runtimeContextLayer); +const mobilePreferencesRuntime = Atom.runtime(Runtime.layer); export const mobilePreferencesState = createMobilePreferencesState(mobilePreferencesRuntime); export const mobilePreferencesAtom = mobilePreferencesState.preferencesAtom; diff --git a/apps/server/integration/NetworkTransferMeasurement.integration.ts b/apps/server/integration/NetworkTransferMeasurement.integration.ts index ad5b1f0b7b7f..2d37876e14f7 100644 --- a/apps/server/integration/NetworkTransferMeasurement.integration.ts +++ b/apps/server/integration/NetworkTransferMeasurement.integration.ts @@ -171,13 +171,13 @@ function countingWsRpcProtocolLayer(input: { readonly recorder: WebSocketTransferRecorder; }) { // Socket.makeWebSocket only ever passes its `protocols` option here. - const webSocketConstructorLayer = Layer.succeed(Socket.WebSocketConstructor, (url, protocols) => + const layerWebSocketConstructor = Layer.succeed(Socket.WebSocketConstructor, (url, protocols) => input.recorder.connect(url, protocols as string | string[] | undefined, input.cookie), ); return RpcClient.layerProtocolSocket().pipe( Layer.provide( Socket.layerWebSocket(input.url, { openTimeout: "10 seconds" }).pipe( - Layer.provide(webSocketConstructorLayer), + Layer.provide(layerWebSocketConstructor), ), ), Layer.provide(RpcSerialization.layerJson), diff --git a/apps/server/integration/transferBudgetV2.integration.test.ts b/apps/server/integration/transferBudgetV2.integration.test.ts index 1fafd695abe4..e9aa52c7410d 100644 --- a/apps/server/integration/transferBudgetV2.integration.test.ts +++ b/apps/server/integration/transferBudgetV2.integration.test.ts @@ -35,8 +35,8 @@ import * as HttpApi from "effect/http-api/HttpApi"; import * as HttpApiBuilder from "effect/http-api/HttpApiBuilder"; import { HttpRouter, HttpServer } from "effect/http"; import { Rpc, RpcGroup, RpcServer, RpcSerialization } from "effect/rpc"; -import { SqlitePersistenceMemory } from "../src/persistence/Layers/Sqlite.ts"; -import { OrchestrationEventStoreLive } from "../src/persistence/Layers/OrchestrationEventStore.ts"; +import * as SqlitePersistence from "../src/persistence/Layers/Sqlite.ts"; +import * as OrchestrationEventStore from "../src/persistence/Layers/OrchestrationEventStore.ts"; import * as EventStore from "../src/orchestration-v2/EventStore.ts"; import * as EventSink from "../src/orchestration-v2/EventSink.ts"; import * as ProjectionStore from "../src/orchestration-v2/ProjectionStore.ts"; @@ -44,8 +44,8 @@ import * as ThreadManagementService from "../src/orchestration-v2/ThreadManageme import * as ProjectStore from "../src/orchestration-v2/ProjectStore.ts"; import * as ProjectService from "../src/project/ProjectService.ts"; import * as ProjectEnrichmentService from "../src/project/ProjectEnrichmentService.ts"; -import { orchestrationHttpApiLayer } from "../src/orchestration-v2/http.ts"; -import { httpCompressionLayer } from "../src/http.ts"; +import * as OrchestrationHttp from "../src/orchestration-v2/http.ts"; +import * as ServerHttp from "../src/http.ts"; import { subscribeOrchestrationV2Thread, subscribeOrchestrationV2Shell } from "../src/ws.ts"; import { measureHttpGet, @@ -69,15 +69,15 @@ const decodeShellSnapshot = Schema.decodeUnknownEffect( Schema.fromJsonString(Schema.toCodecJson(OrchestrationV2ShellSnapshot)), ); -const persistence = EventSink.layer.pipe( +const layerPersistence = EventSink.layer.pipe( Layer.provideMerge(EventStore.layerFromOrchestrationEventStore), Layer.provideMerge(ProjectionStore.layer), - Layer.provideMerge(OrchestrationEventStoreLive), - Layer.provideMerge(SqlitePersistenceMemory), + Layer.provideMerge(OrchestrationEventStore.layer), + Layer.provideMerge(SqlitePersistence.layerMemory), ); // The facade's import/command paths are outside this measurement. Its reads and // stream delegate to the real SQL projection and event sink, as the runtime does. -const management = Layer.unwrap( +const layerManagement = Layer.unwrap( Effect.gen(function* () { const projections = yield* ProjectionStore.ProjectionStoreV2; const sink = yield* EventSink.EventSinkV2; @@ -93,7 +93,7 @@ const management = Layer.unwrap( }); }), ); -const enrichment = Layer.unwrap( +const layerEnrichment = Layer.unwrap( Effect.gen(function* () { const changes = yield* PubSub.unbounded(); return Layer.mock(ProjectEnrichmentService.ProjectEnrichmentService)({ @@ -108,16 +108,16 @@ const enrichment = Layer.unwrap( }), ); // The transfer history has no project events, so shell streams never read a project shell. -const services = management.pipe( +const layerServices = layerManagement.pipe( Layer.provideMerge(ProjectStore.layer), Layer.provideMerge(Layer.mock(ProjectService.ProjectService)({})), - Layer.provideMerge(enrichment), - Layer.provideMerge(persistence), + Layer.provideMerge(layerEnrichment), + Layer.provideMerge(layerPersistence), ); class TransferApi extends HttpApi.make("environment").add( EnvironmentHttpApi.groups.orchestration, ) {} -const auth = Layer.succeed(EnvironmentAuthenticatedAuth, (effect) => +const layerAuth = Layer.succeed(EnvironmentAuthenticatedAuth, (effect) => effect.pipe( Effect.provideService(EnvironmentAuthenticatedPrincipal, { sessionId: AuthSessionId.make("transfer-session"), @@ -141,22 +141,22 @@ const group = RpcGroup.make( stream: true, }), ); -const handlers = group.toLayer({ +const layerHandlers = group.toLayer({ [ORCHESTRATION_V2_WS_METHODS.subscribeThread]: (input) => Stream.unwrap(subscribeOrchestrationV2Thread(input)), [ORCHESTRATION_V2_WS_METHODS.subscribeShell]: (input) => Stream.unwrap(subscribeOrchestrationV2Shell(input)), }); -const routes = Layer.mergeAll( +const layerRoutes = Layer.mergeAll( HttpApiBuilder.layer(TransferApi).pipe( - Layer.provide(orchestrationHttpApiLayer), - Layer.provide(auth), + Layer.provide(OrchestrationHttp.layer), + Layer.provide(layerAuth), ), RpcServer.layerHttp({ group, path: "/ws", protocol: "websocket" }).pipe( - Layer.provide(handlers), + Layer.provide(layerHandlers), Layer.provide(RpcSerialization.layerJson), ), -).pipe(Layer.provide(httpCompressionLayer), Layer.provide(NodeHttpPlatform.layer)); +).pipe(Layer.provide(ServerHttp.layerHttpCompression), Layer.provide(NodeHttpPlatform.layer)); function difference( after: { wireBytes: number; decodedBytes: number; messages: number }, @@ -229,9 +229,9 @@ it.live( yield* sink.write({ events: [threadCreated(provider)] }); for (let index = 0; index < TRANSFER_HISTORY_TURN_COUNT; index++) yield* sink.write({ events: turnEvents(provider, index, false) }); - const context = yield* Effect.context>(); + const context = yield* Effect.context>(); const server = yield* Layer.build( - HttpRouter.serve(routes, { disableListenLog: true }).pipe( + HttpRouter.serve(layerRoutes, { disableListenLog: true }).pipe( Layer.provide(Layer.succeedContext(context)), Layer.provideMerge( NodeHttpServer.layer(NodeHttp.createServer, { @@ -334,7 +334,7 @@ it.live( reconnectSqlStatements: counter.count() - reconnectSqlStart, } satisfies TransferBudgetRun; }).pipe( - Effect.provide(Layer.fresh(services).pipe(Layer.provideMerge(NodeServices.layer))), + Effect.provide(Layer.fresh(layerServices).pipe(Layer.provideMerge(NodeServices.layer))), Effect.withTracer(counter.tracer), ), ); diff --git a/apps/server/scripts/measure-pr-preview.ts b/apps/server/scripts/measure-pr-preview.ts index b7938edcac76..1221fb7ff394 100644 --- a/apps/server/scripts/measure-pr-preview.ts +++ b/apps/server/scripts/measure-pr-preview.ts @@ -22,7 +22,7 @@ if (!repository || numbers.length === 0 || numbers.some((number) => !/^\d+$/.tes type Read = { graphqlRequests: number; restRequests: number; cost: number; debug: string }; const reads: Read[] = []; -const measuredProcess = Layer.effect( +const layerMeasuredProcess = Layer.effect( VcsProcess.VcsProcess, Effect.gen(function* () { const vcs = yield* VcsProcess.VcsProcess; @@ -47,9 +47,9 @@ const measuredProcess = Layer.effect( }), ).pipe(Layer.provide(VcsProcess.layer), Layer.provide(NodeServices.layer)); -const services = GitHubPullRequestCli.layer.pipe( +const layerServices = GitHubPullRequestCli.layer.pipe( Layer.provide(GitHubCli.layer), - Layer.provideMerge(measuredProcess), + Layer.provideMerge(layerMeasuredProcess), ); const decodeJson = Schema.decodeSync(Schema.fromJsonString(Schema.Unknown)); @@ -122,7 +122,7 @@ for (const mode of ["detail", "preview"] as const) { }), ); }), - ).pipe(Effect.provide(services)), + ).pipe(Effect.provide(layerServices)), ); for (const row of rows) await Effect.runPromise(Console.log(encodeJson(row))); } diff --git a/apps/server/scripts/record-grok-acp-replay-fixture.ts b/apps/server/scripts/record-grok-acp-replay-fixture.ts index 43aef35a175b..b9c6bf5afc31 100644 --- a/apps/server/scripts/record-grok-acp-replay-fixture.ts +++ b/apps/server/scripts/record-grok-acp-replay-fixture.ts @@ -444,7 +444,7 @@ const recordScenario = Effect.fn("recordGrokScenario")(function* (fixtureName: s const tee = makeWireTee(); const settings = { ...DEFAULT_GROK_SETTINGS, binaryPath: process.env.T3_GROK_BIN ?? "grok" }; - const registryLayer = ProviderAdapterRegistry.makeLayerEffect( + const layerRegistry = ProviderAdapterRegistry.makeLayerEffect( Effect.gen(function* () { const childProcessSpawner = yield* ChildProcessSpawner.ChildProcessSpawner; const environment = yield* HostProcessEnvironment; @@ -534,7 +534,7 @@ const recordScenario = Effect.fn("recordGrokScenario")(function* (fixtureName: s Effect.provide( makeOrchestratorV2ReplayLayerWithRegistry( scenario, - registryLayer, + layerRegistry, variant.runContinuationWorker === true ? { runContinuationWorker: true } : {}, ), ), diff --git a/apps/server/scripts/record-pi-rpc-replay-fixture.ts b/apps/server/scripts/record-pi-rpc-replay-fixture.ts index dc03732d36be..52f30030709a 100644 --- a/apps/server/scripts/record-pi-rpc-replay-fixture.ts +++ b/apps/server/scripts/record-pi-rpc-replay-fixture.ts @@ -251,7 +251,7 @@ const record = Effect.gen(function* () { scenario: fixture.name, entries: [], } satisfies ProviderReplayTranscript; - const recordingSpawner = Layer.effect( + const layerRecordingSpawner = Layer.effect( ChildProcessSpawner.ChildProcessSpawner, Effect.map(Effect.service(ChildProcessSpawner.ChildProcessSpawner), (live) => makePiRecordingSpawner(live, entries), @@ -291,7 +291,7 @@ const record = Effect.gen(function* () { { name: "PI_CODING_AGENT_SESSION_DIR", value: sessionDir, sensitive: false }, { name: "PI_SKIP_VERSION_CHECK", value: "1", sensitive: false }, ], - spawner: recordingSpawner, + spawner: layerRecordingSpawner, }), }, continuationOptions, diff --git a/apps/server/scripts/verify-background-live.ts b/apps/server/scripts/verify-background-live.ts index 5a76f33b2cf9..09cb4ca38edf 100644 --- a/apps/server/scripts/verify-background-live.ts +++ b/apps/server/scripts/verify-background-live.ts @@ -295,11 +295,11 @@ try { const ticket = Schema.decodeUnknownSync(Schema.Struct({ ticket: Schema.String }))( await ticketResponse.json(), ); - const socket = Socket.layerWebSocket( + const layerSocket = Socket.layerWebSocket( `${origin.replace("http:", "ws:")}/ws?orchestrationProtocol=${ORCHESTRATION_PROTOCOL_VERSION}&wsTicket=${encodeURIComponent(ticket.ticket)}`, ).pipe(Layer.provide(Socket.layerWebSocketConstructorGlobal)); - const protocol = RpcClient.layerProtocolSocket().pipe( - Layer.provide(socket), + const layerProtocol = RpcClient.layerProtocolSocket().pipe( + Layer.provide(layerSocket), Layer.provide(RpcSerialization.layerJson), ); const threadId = ThreadId.make(NodeCrypto.randomUUID()); @@ -483,7 +483,7 @@ try { .filter((message) => message.role === "assistant" && message.text.includes(secret)) .map((message) => message.id), }; - }).pipe(Effect.scoped, Effect.provide(protocol), Effect.timeout(timeoutMs)); + }).pipe(Effect.scoped, Effect.provide(layerProtocol), Effect.timeout(timeoutMs)); const finished = await Effect.runPromise(program, { signal: abort.signal }); verdict = finished; // Check persistence through an actual clean server restart on the same SQLite DB. diff --git a/apps/server/src/assets/AssetAccess.test.ts b/apps/server/src/assets/AssetAccess.test.ts index fd94d4ec9df6..b3381befa3ba 100644 --- a/apps/server/src/assets/AssetAccess.test.ts +++ b/apps/server/src/assets/AssetAccess.test.ts @@ -48,7 +48,7 @@ vi.mock("node:os", async (importOriginal) => { return { ...actual, homedir: vi.fn(actual.homedir) }; }); -const configLayer = ServerConfig.ServerConfig.layerTest(process.cwd(), { +const layerConfig = ServerConfig.ServerConfig.layerTest(process.cwd(), { prefix: "t3-asset-access-test-", }); // A PNG header is enough for the dimension read: signature, then IHDR width and height. @@ -103,7 +103,7 @@ const oversizedScreenshotItem = { }, }; -const testLayer = Layer.mergeAll( +const layerTest = Layer.mergeAll( NodeHttpPlatform.layer, Layer.mock(Orchestrator.OrchestratorV2)({ getTurnItem: ({ itemId }) => @@ -115,14 +115,14 @@ const testLayer = Layer.mergeAll( : null, ), }), - configLayer, + layerConfig, WorkspacePaths.layer, ProjectFaviconResolver.layer.pipe( Layer.provide(WorkspacePaths.layer), Layer.provide(T3ProjectFileLoader.layer), ), - NativeAppIconResolver.layer.pipe(Layer.provide(configLayer)), - ServerSecretStore.layer.pipe(Layer.provide(configLayer)), + NativeAppIconResolver.layer.pipe(Layer.provide(layerConfig)), + ServerSecretStore.layer.pipe(Layer.provide(layerConfig)), ).pipe(Layer.provideMerge(NodeServices.layer)); describe("AssetAccess", () => { @@ -198,7 +198,7 @@ describe("AssetAccess", () => { resource: { ...resource, itemId: oversizedScreenshotItem.id }, }).pipe(Effect.flip); expect(oversized._tag).toBe("AssetWorkspaceAssetNotFoundError"); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("issues exact URLs for media and browser documents outside the workspace", () => @@ -234,7 +234,7 @@ describe("AssetAccess", () => { expect(yield* resolveAsset(token, `../${name}`)).toBeNull(); expect(yield* resolveAsset(`${token}tampered`, name)).toBeNull(); } - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("reports pixel dimensions from an image header and nothing for other files", () => @@ -258,7 +258,7 @@ describe("AssetAccess", () => { expect((yield* issue("shot.png")).imageDimensions).toEqual({ width: 1600, height: 900 }); expect((yield* issue("clip.mp4")).imageDimensions).toBeUndefined(); expect((yield* issue("broken.png")).imageDimensions).toBeUndefined(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("resolves relative media paths from the thread workspace, including outside it", () => @@ -284,7 +284,7 @@ describe("AssetAccess", () => { path: yield* fs.realPath(filePath), }); } - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("resolves home-relative media paths independently of the workspace", () => @@ -333,7 +333,7 @@ describe("AssetAccess", () => { } finally { homeSpy.mockRestore(); } - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect.skipIf(!symlinksSupported)( @@ -371,7 +371,7 @@ describe("AssetAccess", () => { }, }).pipe(Effect.flip); expect(directoryError._tag).toBe("AssetWorkspaceAssetNotFoundError"); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect.skipIf(!symlinksSupported)( @@ -403,7 +403,7 @@ describe("AssetAccess", () => { yield* fs.remove(filePath); yield* fs.symlink(replacementPath, filePath); expect(yield* resolveAsset(token, name)).toBeNull(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect.skipIf(!symlinksSupported)( @@ -442,7 +442,7 @@ describe("AssetAccess", () => { yield* fs.remove(filePath); yield* fs.rename(savedPath, filePath); } - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect.skipIf(!symlinksSupported)( @@ -478,7 +478,7 @@ describe("AssetAccess", () => { Effect.provideService(FileSystem.FileSystem, swappingFileSystem), ), ).toBeNull(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect.skipIf(!symlinksSupported)( @@ -512,7 +512,7 @@ describe("AssetAccess", () => { expect(yield* openMediaFile(canonicalPath)).toBeNull(); expect(opened).toBeDefined(); expect(opened?.fd).toBe(-1); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect.skipIf(!symlinksSupported)( @@ -570,7 +570,7 @@ describe("AssetAccess", () => { Effect.provideService(FileSystem.FileSystem, swappingFileSystem), ), ).toBeNull(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("keeps in-place edits readable but requires a new URL after atomic replacement", () => @@ -620,7 +620,7 @@ describe("AssetAccess", () => { renewedSuffix.slice(renewedSeparator + 1), ), ).toBeNull(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("issues workspace URLs that resolve the entry file and sibling assets", () => @@ -661,7 +661,7 @@ describe("AssetAccess", () => { expect(yield* resolveAsset(token, "../secret.txt")).toBeNull(); expect(yield* resolveAsset(token, ".env")).toBeNull(); expect(yield* resolveAsset(`${token}tampered`, "report.html")).toBeNull(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("rejects workspace files outside the authorized root", () => @@ -695,7 +695,7 @@ describe("AssetAccess", () => { }, }); expect(error.cause).toBeInstanceOf(WorkspacePaths.WorkspacePathOutsideRootError); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("issues draft workspace URLs without a thread", () => @@ -729,7 +729,7 @@ describe("AssetAccess", () => { path: canonicalCssPath, }); expect(yield* resolveAsset(token, "../secret.txt")).toBeNull(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("serves absolute draft media files exactly, wherever they live", () => @@ -760,7 +760,7 @@ describe("AssetAccess", () => { mimeType: "video/mp4", }); expect(yield* resolveAsset(token, "other.mp4")).toBeNull(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("falls back to the resource cwd for relative draft paths", () => @@ -785,7 +785,7 @@ describe("AssetAccess", () => { kind: "file", path: canonicalHtmlPath, }); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("preserves non-missing canonical path failures when issuing asset URLs", () => @@ -827,7 +827,7 @@ describe("AssetAccess", () => { }, }); expect(error.cause).toBe(cause); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("issues exact workspace URLs for image previews", () => @@ -863,7 +863,7 @@ describe("AssetAccess", () => { }); expect(yield* resolveAsset(token, "other.png")).toBeNull(); expect(yield* resolveAsset(token, "../icon.png")).toBeNull(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("previews workspace files with literal fragment characters in their paths", () => @@ -906,7 +906,7 @@ describe("AssetAccess", () => { workspaceRoot: root, }).pipe(Effect.flip); expect(error).toBeInstanceOf(AssetPreviewTypeValidationError); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("issues exact attachment capabilities by attachment id", () => @@ -930,7 +930,7 @@ describe("AssetAccess", () => { kind: "file", path: attachmentPath, }); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("serves video attachments inline", () => @@ -962,7 +962,7 @@ describe("AssetAccess", () => { fileName: "demo.mp4", mimeType: "video/mp4", }); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("issues signed native application icon capabilities", () => Effect.gen(function* () { @@ -977,7 +977,7 @@ describe("AssetAccess", () => { new RegExp(`^${ASSET_ROUTE_PREFIX}/[^/]+/native-app-icon\\.png$`, "u"), ); expect(result.expiresAt).toBeGreaterThan(0); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("serves document attachments inline when a viewer requests it", () => @@ -1010,7 +1010,7 @@ describe("AssetAccess", () => { fileName: "report.pdf", mimeType: "application/pdf", }); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("serves audio previews with their stored format and keeps saving explicit", () => @@ -1044,7 +1044,7 @@ describe("AssetAccess", () => { ...(disposition === "attachment" ? { download: true } : {}), }); } - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("keeps inline requests for other attachment types as downloads", () => @@ -1072,7 +1072,7 @@ describe("AssetAccess", () => { expect( yield* resolveAsset(suffix.slice(0, separatorIndex), suffix.slice(separatorIndex + 1)), ).toMatchObject({ kind: "file", path: attachmentPath, download: true }); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("issues project favicon capabilities with a signed fallback", () => Effect.gen(function* () { @@ -1129,7 +1129,7 @@ describe("AssetAccess", () => { fallbackSuffix.slice(fallbackSeparatorIndex + 1), ), ).toBeNull(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("issues project favicon capabilities for a saved override", () => @@ -1150,7 +1150,7 @@ describe("AssetAccess", () => { expect(result.sourcePath).toBe(path.join("brand", "custom.svg")); expect(result.relativeUrl).toMatch(/\/v[0-9a-f]{64}-custom\.svg$/); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("issues an exact capability for a saved favicon outside the workspace", () => @@ -1188,7 +1188,7 @@ describe("AssetAccess", () => { ); expect(tamperedSuffixResult).toEqual({ kind: "file", path: canonicalPath }); expect(tamperedSuffixResult).not.toEqual({ kind: "file", path: canonicalSiblingPath }); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("ignores a client favicon path hint", () => @@ -1209,7 +1209,7 @@ describe("AssetAccess", () => { expect(result.sourcePath).toBe(path.join("brand", "saved.svg")); expect(result.relativeUrl).toMatch(/\/v[0-9a-f]{64}-saved\.svg$/); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("keeps automatic favicon resolution separate from a saved override", () => @@ -1229,7 +1229,7 @@ describe("AssetAccess", () => { expect(result.sourcePath).toBe("favicon.svg"); expect(result.relativeUrl).toMatch(/\/v[0-9a-f]{64}-favicon\.svg$/); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("rejects a resolved project favicon with a non-image extension", () => @@ -1247,7 +1247,7 @@ describe("AssetAccess", () => { }).pipe(Effect.flip); expect(error).toBeInstanceOf(AssetPreviewTypeValidationError); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("buckets project favicon expiry after content hashing", () => @@ -1272,7 +1272,7 @@ describe("AssetAccess", () => { }).pipe(Effect.provideService(Crypto.Crypto, crossingCrypto)); expect(result.expiresAt).toBe(3 * bucketMs); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("preserves structured project favicon resolution causes", () => @@ -1306,7 +1306,7 @@ describe("AssetAccess", () => { expect(error.message).toBe("Failed to resolve project favicon."); expect(error._tag).toBe("AssetProjectFaviconResolutionError"); expect(error.cause).toBe(resolutionCause); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("serves GitHub-hosted pull request media through the repository's credential", () => @@ -1362,6 +1362,6 @@ describe("AssetAccess", () => { const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); expect(encoded).not.toContain(url); } - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); }); diff --git a/apps/server/src/assets/AttachmentUpload.test.ts b/apps/server/src/assets/AttachmentUpload.test.ts index 6fffa1d1f9f2..1bc20d9f68eb 100644 --- a/apps/server/src/assets/AttachmentUpload.test.ts +++ b/apps/server/src/assets/AttachmentUpload.test.ts @@ -24,7 +24,7 @@ import { validateAttachmentUploadToken, } from "./AttachmentUpload.ts"; -const testLayer = ServerSecretStore.layer.pipe( +const layerTest = ServerSecretStore.layer.pipe( Layer.provideMerge(ServerConfig.layerTest(process.cwd(), { prefix: "t3-attachment-upload-" })), Layer.provideMerge(NodeServices.layer), ); @@ -62,7 +62,7 @@ describe("AttachmentUpload", () => { mimeType: "image/png", sizeBytes: 6, }); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("rejects tampered and malformed upload tokens", () => @@ -74,7 +74,7 @@ describe("AttachmentUpload", () => { expect(yield* validateAttachmentUploadToken(`${payload}x.${signature}`)).toBeNull(); expect(yield* validateAttachmentUploadToken(`${token}.extra`)).toBeNull(); expect(yield* validateAttachmentUploadToken("garbage")).toBeNull(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("accepts unexpired image upload tokens issued before file support", () => @@ -99,7 +99,7 @@ describe("AttachmentUpload", () => { type: "image", attachmentId: issued.attachmentId, }); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("rejects expired upload tokens", () => @@ -109,7 +109,7 @@ describe("AttachmentUpload", () => { yield* TestClock.adjust("11 minutes"); expect(yield* validateAttachmentUploadToken(token)).toBeNull(); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("removes expired pending uploads while issuing a new upload URL", () => @@ -124,7 +124,7 @@ describe("AttachmentUpload", () => { yield* issueAttachmentUploadUrl(uploadInput); expect(NodeFS.existsSync(stalePath)).toBe(false); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("stores the expected bytes without leaving temporary files", () => @@ -148,7 +148,7 @@ describe("AttachmentUpload", () => { expect( NodeFS.readdirSync(config.attachmentsDir).filter((entry) => entry.endsWith(".part")), ).toEqual([]); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("streams generic files to a path with their original extension", () => @@ -179,7 +179,7 @@ describe("AttachmentUpload", () => { yield* deletePendingAttachment(issued.attachmentId); expect(NodeFS.readdirSync(config.attachmentsDir)).toEqual([]); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("removes partial streamed uploads that exceed their signed size", () => @@ -197,7 +197,7 @@ describe("AttachmentUpload", () => { status: 400, }); expect(NodeFS.readdirSync(config.attachmentsDir)).toEqual([]); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("removes partial streamed uploads when the upload is interrupted", () => @@ -227,7 +227,7 @@ describe("AttachmentUpload", () => { yield* Fiber.interrupt(upload); expect(NodeFS.readdirSync(config.attachmentsDir)).toEqual([]); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); it.effect("deletes pending uploads without deleting thread-owned copies", () => @@ -245,6 +245,6 @@ describe("AttachmentUpload", () => { expect(NodeFS.existsSync(pendingPath)).toBe(false); expect(NodeFS.existsSync(claimedPath)).toBe(true); - }).pipe(Effect.provide(testLayer)), + }).pipe(Effect.provide(layerTest)), ); }); diff --git a/apps/server/src/assets/NativeAppIconResolver.test.ts b/apps/server/src/assets/NativeAppIconResolver.test.ts index 224ebce7b5df..753f7378285d 100644 --- a/apps/server/src/assets/NativeAppIconResolver.test.ts +++ b/apps/server/src/assets/NativeAppIconResolver.test.ts @@ -39,15 +39,15 @@ describe("resolveNativeAppIcon", () => { return emptyProcessHandle(); }), ); - const configLayer = ServerConfig.ServerConfig.layerTest(process.cwd(), { + const layerConfig = ServerConfig.ServerConfig.layerTest(process.cwd(), { prefix: "t3-native-app-icon-test-", }); - const dependencies = Layer.mergeAll( - configLayer, + const layerDependencies = Layer.mergeAll( + layerConfig, Layer.succeed(HostProcessPlatform, "darwin"), Layer.succeed(ChildProcessSpawner.ChildProcessSpawner, spawner), ).pipe(Layer.provideMerge(NodeServices.layer)); - const testLayer = NativeAppIconResolver.layer.pipe(Layer.provide(dependencies)); + const layerTest = NativeAppIconResolver.layer.pipe(Layer.provide(layerDependencies)); const app = { _tag: "display-name", displayName: "Review * App" } as const; return Effect.gen(function* () { @@ -70,6 +70,6 @@ describe("resolveNativeAppIcon", () => { expect(commands).toHaveLength(257); expect(yield* resolver.resolve(app)).toBeNull(); expect(commands).toHaveLength(258); - }).pipe(Effect.provide(testLayer)); + }).pipe(Effect.provide(layerTest)); }); }); diff --git a/apps/server/src/auth/EnvironmentAuth.test.ts b/apps/server/src/auth/EnvironmentAuth.test.ts index 8145ae489807..0cc227b2f16e 100644 --- a/apps/server/src/auth/EnvironmentAuth.test.ts +++ b/apps/server/src/auth/EnvironmentAuth.test.ts @@ -10,7 +10,7 @@ import * as SqlClient from "effect/sql/SqlClient"; import * as ServerConfig from "../config.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import * as PersistenceErrors from "../persistence/Errors.ts"; -import { SqlitePersistenceMemory } from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; import * as PairingGrantStore from "./PairingGrantStore.ts"; import * as EnvironmentAuth from "./EnvironmentAuth.ts"; @@ -39,9 +39,9 @@ const makeServerConfigLayer = (overrides?: Partial) => EnvironmentAuth.layer.pipe( - Layer.provideMerge(SqlitePersistenceMemory), + Layer.provideMerge(SqlitePersistence.layerMemory), Layer.provide(ServerSecretStore.layer), - Layer.provide(ServerEnvironment.identityLayer), + Layer.provide(ServerEnvironment.layerIdentity), Layer.provide(makeServerConfigLayer(overrides)), ); diff --git a/apps/server/src/auth/EnvironmentAuth.ts b/apps/server/src/auth/EnvironmentAuth.ts index c61c0e9cf9ae..e9e6cdd153c2 100644 --- a/apps/server/src/auth/EnvironmentAuth.ts +++ b/apps/server/src/auth/EnvironmentAuth.ts @@ -1125,9 +1125,9 @@ export const layer = Layer.effect(EnvironmentAuth, make).pipe( Layer.provideMerge(EnvironmentAuthPolicy.layer), ); -const storageLayer = Layer.mergeAll(ServerSecretStore.layer, SqlitePersistence.layerConfig); +const layerStorage = Layer.mergeAll(ServerSecretStore.layer, SqlitePersistence.layerConfig); -export const runtimeLayer = layer.pipe( - Layer.provideMerge(storageLayer), - Layer.provideMerge(ServerEnvironment.identityLayer), +export const layerRuntime = layer.pipe( + Layer.provideMerge(layerStorage), + Layer.provideMerge(ServerEnvironment.layerIdentity), ); diff --git a/apps/server/src/auth/EnvironmentAuthAdmin.test.ts b/apps/server/src/auth/EnvironmentAuthAdmin.test.ts index d8a0e3048c51..9d0f89a20c94 100644 --- a/apps/server/src/auth/EnvironmentAuthAdmin.test.ts +++ b/apps/server/src/auth/EnvironmentAuthAdmin.test.ts @@ -5,7 +5,7 @@ import * as Layer from "effect/Layer"; import * as ServerConfig from "../config.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; -import { SqlitePersistenceMemory } from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; import * as EnvironmentAuth from "./EnvironmentAuth.ts"; import * as ServerSecretStore from "./ServerSecretStore.ts"; import * as SessionStore from "./SessionStore.ts"; @@ -35,8 +35,8 @@ const makeEnvironmentAuthLayer = ( ) => EnvironmentAuth.layer.pipe( Layer.provideMerge(ServerSecretStore.layer), - Layer.provideMerge(SqlitePersistenceMemory), - Layer.provide(ServerEnvironment.identityLayer), + Layer.provideMerge(SqlitePersistence.layerMemory), + Layer.provide(ServerEnvironment.layerIdentity), Layer.provide(makeServerConfigLayer(overrides)), ); diff --git a/apps/server/src/auth/EnvironmentAuthPolicy.test.ts b/apps/server/src/auth/EnvironmentAuthPolicy.test.ts index 982ff397db40..8136adad202f 100644 --- a/apps/server/src/auth/EnvironmentAuthPolicy.test.ts +++ b/apps/server/src/auth/EnvironmentAuthPolicy.test.ts @@ -11,7 +11,7 @@ const makeEnvironmentAuthPolicyLayer = ( overrides?: Partial, ) => EnvironmentAuthPolicy.layer.pipe( - Layer.provide(ServerEnvironment.identityLayer), + Layer.provide(ServerEnvironment.layerIdentity), Layer.provide( Layer.effect( ServerConfig.ServerConfig, diff --git a/apps/server/src/auth/PairingGrantStore.test.ts b/apps/server/src/auth/PairingGrantStore.test.ts index beb07627c66a..6ca8ec577a02 100644 --- a/apps/server/src/auth/PairingGrantStore.test.ts +++ b/apps/server/src/auth/PairingGrantStore.test.ts @@ -10,7 +10,7 @@ import * as TestClock from "effect/testing/TestClock"; import * as ServerConfig from "../config.ts"; import * as AuthPairingLinks from "../persistence/AuthPairingLinks.ts"; import { PersistenceSqlError } from "../persistence/Errors.ts"; -import { SqlitePersistenceMemory } from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; import * as PairingGrantStore from "./PairingGrantStore.ts"; const makeServerConfigLayer = ( @@ -33,7 +33,7 @@ const makePairingGrantStoreLayer = ( overrides?: Partial>, ) => PairingGrantStore.layer.pipe( - Layer.provide(SqlitePersistenceMemory), + Layer.provide(SqlitePersistence.layerMemory), Layer.provide(makeServerConfigLayer(overrides)), ); diff --git a/apps/server/src/auth/ServerSecretStore.test.ts b/apps/server/src/auth/ServerSecretStore.test.ts index 6b7850aa363b..699822d08955 100644 --- a/apps/server/src/auth/ServerSecretStore.test.ts +++ b/apps/server/src/auth/ServerSecretStore.test.ts @@ -18,7 +18,7 @@ const makeServerConfigLayer = () => const makeServerSecretStoreLayer = () => Layer.provide(ServerSecretStore.layer, makeServerConfigLayer()); -const PermissionDeniedFileSystemLayer = Layer.effect( +const layerPermissionDeniedFileSystem = Layer.effect( FileSystem.FileSystem, Effect.gen(function* () { const fileSystem = yield* FileSystem.FileSystem; @@ -42,10 +42,10 @@ const PermissionDeniedFileSystemLayer = Layer.effect( const makePermissionDeniedSecretStoreLayer = () => ServerSecretStore.layer.pipe( Layer.provide(makeServerConfigLayer()), - Layer.provideMerge(PermissionDeniedFileSystemLayer), + Layer.provideMerge(layerPermissionDeniedFileSystem), ); -const RenameFailureFileSystemLayer = Layer.effect( +const layerRenameFailureFileSystem = Layer.effect( FileSystem.FileSystem, Effect.gen(function* () { const fileSystem = yield* FileSystem.FileSystem; @@ -69,10 +69,10 @@ const RenameFailureFileSystemLayer = Layer.effect( const makeRenameFailureSecretStoreLayer = () => ServerSecretStore.layer.pipe( Layer.provide(makeServerConfigLayer()), - Layer.provideMerge(RenameFailureFileSystemLayer), + Layer.provideMerge(layerRenameFailureFileSystem), ); -const RemoveFailureFileSystemLayer = Layer.effect( +const layerRemoveFailureFileSystem = Layer.effect( FileSystem.FileSystem, Effect.gen(function* () { const fileSystem = yield* FileSystem.FileSystem; @@ -96,10 +96,10 @@ const RemoveFailureFileSystemLayer = Layer.effect( const makeRemoveFailureSecretStoreLayer = () => ServerSecretStore.layer.pipe( Layer.provide(makeServerConfigLayer()), - Layer.provideMerge(RemoveFailureFileSystemLayer), + Layer.provideMerge(layerRemoveFailureFileSystem), ); -const ConcurrentReadMissFileSystemLayer = Layer.effect( +const layerConcurrentReadMissFileSystem = Layer.effect( FileSystem.FileSystem, Effect.gen(function* () { const fileSystem = yield* FileSystem.FileSystem; @@ -142,7 +142,7 @@ const ConcurrentReadMissFileSystemLayer = Layer.effect( const makeConcurrentCreateSecretStoreLayer = () => ServerSecretStore.layer.pipe( Layer.provide(makeServerConfigLayer()), - Layer.provideMerge(ConcurrentReadMissFileSystemLayer), + Layer.provideMerge(layerConcurrentReadMissFileSystem), ); it.layer(NodeServices.layer)("ServerSecretStore.layer", (it) => { @@ -189,7 +189,7 @@ it.layer(NodeServices.layer)("ServerSecretStore.layer", (it) => { it.effect("uses restrictive permissions for the secret directory and files", () => Effect.gen(function* () { const chmodCalls: Array<{ readonly path: string; readonly mode: number }> = []; - const recordingFileSystemLayer = Layer.effect( + const layerRecordingFileSystem = Layer.effect( FileSystem.FileSystem, Effect.gen(function* () { const fileSystem = yield* FileSystem.FileSystem; @@ -211,7 +211,7 @@ it.layer(NodeServices.layer)("ServerSecretStore.layer", (it) => { Effect.provide( ServerSecretStore.layer.pipe( Layer.provide(makeServerConfigLayer()), - Layer.provideMerge(recordingFileSystemLayer), + Layer.provideMerge(layerRecordingFileSystem), ), ), ); diff --git a/apps/server/src/auth/SessionStore.test.ts b/apps/server/src/auth/SessionStore.test.ts index 9c3d421144b0..b65da27eb675 100644 --- a/apps/server/src/auth/SessionStore.test.ts +++ b/apps/server/src/auth/SessionStore.test.ts @@ -15,10 +15,8 @@ import * as SqlClient from "effect/sql/SqlClient"; import * as ServerConfig from "../config.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import { PersistenceSqlError } from "../persistence/Errors.ts"; -import { - makeSqlitePersistenceLive, - SqlitePersistenceMemory, -} from "../persistence/Layers/Sqlite.ts"; +import { makeSqlitePersistenceLive } from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; import * as AuthSessions from "../persistence/AuthSessions.ts"; import * as SessionStore from "./SessionStore.ts"; import * as ServerSecretStore from "./ServerSecretStore.ts"; @@ -45,7 +43,7 @@ const makeSessionStoreLayer = ( environmentId = EnvironmentId.make("test-environment"), ) => SessionStore.layer.pipe( - Layer.provide(SqlitePersistenceMemory), + Layer.provide(SqlitePersistence.layerMemory), Layer.provide(ServerSecretStore.layer), Layer.provide(makeServerEnvironmentLayer(environmentId)), Layer.provide(makeServerConfigLayer(overrides)), @@ -68,9 +66,9 @@ const makeDiskSessionStoreLayer = Effect.fn("makeDiskSessionStoreLayer")(functio baseDirIsExplicit: true, }); yield* ServerConfig.ensureServerDirectories(paths); - const persistence = makeSqlitePersistenceLive(paths.dbPath); + const layerPersistence = makeSqlitePersistenceLive(paths.dbPath); return SessionStore.layer.pipe( - Layer.provide(persistence), + Layer.provide(layerPersistence), Layer.provide(ServerSecretStore.layer), Layer.provide(makeServerEnvironmentLayer(EnvironmentId.make(baseDir))), Layer.provide( @@ -90,7 +88,7 @@ const repositoryFailure = new PersistenceSqlError({ detail: "sqlite is unavailable", }); -const failingSessionLookupRepositoryLayer = Layer.succeed(AuthSessions.AuthSessionRepository, { +const layerFailingSessionLookupRepository = Layer.succeed(AuthSessions.AuthSessionRepository, { create: () => Effect.void, createReplacingActive: () => Effect.succeed([]), createIfAbsent: () => Effect.void, @@ -102,13 +100,13 @@ const failingSessionLookupRepositoryLayer = Layer.succeed(AuthSessions.AuthSessi setClientConnection: () => Effect.void, }); -const failingSessionLookupCredentialLayer = Layer.effect( +const layerFailingSessionLookupCredential = Layer.effect( SessionStore.SessionStore, SessionStore.make, ).pipe( - Layer.provide(failingSessionLookupRepositoryLayer), + Layer.provide(layerFailingSessionLookupRepository), Layer.provide(ServerSecretStore.layer), - Layer.provide(SqlitePersistenceMemory), + Layer.provide(SqlitePersistence.layerMemory), Layer.provide(makeServerEnvironmentLayer(EnvironmentId.make("test-environment"))), Layer.provide(makeServerConfigLayer()), ); @@ -164,20 +162,20 @@ it.layer(NodeServices.layer)("SessionStore.layer", (it) => { ); }).pipe(Effect.provide(layerB), Effect.scoped); - const reopenedB = yield* makeDiskSessionStoreLayer(baseB, token); + const layerReopenedB = yield* makeDiskSessionStoreLayer(baseB, token); yield* Effect.gen(function* () { const sessions = yield* SessionStore.SessionStore; const dev = yield* sessions.verify(token); expect(dev.sessionId).toBe(fromA.dev.sessionId); const ticket = yield* sessions.issueWebSocketToken(dev.sessionId); expect((yield* sessions.verifyWebSocketToken(ticket.token)).sessionId).toBe(dev.sessionId); - }).pipe(Effect.provide(reopenedB), Effect.scoped); + }).pipe(Effect.provide(layerReopenedB), Effect.scoped); - const reopenedA = yield* makeDiskSessionStoreLayer(baseA, token); + const layerReopenedA = yield* makeDiskSessionStoreLayer(baseA, token); yield* Effect.gen(function* () { const sessions = yield* SessionStore.SessionStore; expect((yield* Effect.flip(sessions.verify(token)))._tag).toBe("SessionTokenRevokedError"); - }).pipe(Effect.provide(reopenedA), Effect.scoped); + }).pipe(Effect.provide(layerReopenedA), Effect.scoped); }), ); @@ -187,15 +185,15 @@ it.layer(NodeServices.layer)("SessionStore.layer", (it) => { const baseDir = yield* fs.makeTempDirectoryScoped({ prefix: "t3-dev-auth-rotation-" }); const oldToken = "old-reusable-dev-auth-token-that-is-long-enough"; const newToken = "new-reusable-dev-auth-token-that-is-long-enough"; - const initialLayer = yield* makeDiskSessionStoreLayer(baseDir, oldToken); + const layerInitial = yield* makeDiskSessionStoreLayer(baseDir, oldToken); const old = yield* Effect.gen(function* () { const sessions = yield* SessionStore.SessionStore; const dev = yield* sessions.verify(oldToken); const ticket = yield* sessions.issueWebSocketToken(dev.sessionId); return { dev, ticket }; - }).pipe(Effect.provide(initialLayer), Effect.scoped); + }).pipe(Effect.provide(layerInitial), Effect.scoped); - const rotatedLayer = yield* makeDiskSessionStoreLayer(baseDir, newToken); + const layerRotated = yield* makeDiskSessionStoreLayer(baseDir, newToken); const rotated = yield* Effect.gen(function* () { const sessions = yield* SessionStore.SessionStore; expect((yield* Effect.flip(sessions.verify(oldToken)))._tag).toBe( @@ -210,9 +208,9 @@ it.layer(NodeServices.layer)("SessionStore.layer", (it) => { const dev = yield* sessions.verify(newToken); const ticket = yield* sessions.issueWebSocketToken(dev.sessionId); return { dev, ticket }; - }).pipe(Effect.provide(rotatedLayer), Effect.scoped); + }).pipe(Effect.provide(layerRotated), Effect.scoped); - const removedLayer = yield* makeDiskSessionStoreLayer(baseDir); + const layerRemoved = yield* makeDiskSessionStoreLayer(baseDir); yield* Effect.gen(function* () { const sessions = yield* SessionStore.SessionStore; expect((yield* Effect.flip(sessions.verify(newToken)))._tag).toBe( @@ -224,7 +222,7 @@ it.layer(NodeServices.layer)("SessionStore.layer", (it) => { expect( (yield* sessions.listActive()).some((row) => row.sessionId === rotated.dev.sessionId), ).toBe(true); - }).pipe(Effect.provide(removedLayer), Effect.scoped); + }).pipe(Effect.provide(layerRemoved), Effect.scoped); }), ); @@ -321,7 +319,7 @@ it.layer(NodeServices.layer)("SessionStore.layer", (it) => { currentSessionId: issued.sessionId, cause: repositoryFailure, }); - }).pipe(Effect.provide(failingSessionLookupCredentialLayer)), + }).pipe(Effect.provide(layerFailingSessionLookupCredential)), ); it.effect("verifies session tokens against the Effect clock", () => Effect.gen(function* () { @@ -413,7 +411,7 @@ it.layer(NodeServices.layer)("SessionStore.layer", (it) => { expect((yield* sessions.listActive()).map((session) => session.sessionId)).toEqual([ previous.sessionId, ]); - }).pipe(Effect.provide(Layer.mergeAll(makeSessionStoreLayer(), SqlitePersistenceMemory))), + }).pipe(Effect.provide(Layer.mergeAll(makeSessionStoreLayer(), SqlitePersistence.layerMemory))), ); it.effect("rejects websocket tokens once the parent session has expired", () => @@ -728,6 +726,6 @@ it.layer(NodeServices.layer)("SessionStore.layer", (it) => { yield* sessions.recordClientConnection(issued.sessionId, {}); expect((yield* readRow)[0]).toEqual({ surface: "mobile", appVersion: "1.3.0" }); - }).pipe(Effect.provide(Layer.mergeAll(makeSessionStoreLayer(), SqlitePersistenceMemory))), + }).pipe(Effect.provide(Layer.mergeAll(makeSessionStoreLayer(), SqlitePersistence.layerMemory))), ); }); diff --git a/apps/server/src/auth/http.test.ts b/apps/server/src/auth/http.test.ts index 6597944a3efb..db18d5b2b808 100644 --- a/apps/server/src/auth/http.test.ts +++ b/apps/server/src/auth/http.test.ts @@ -15,15 +15,15 @@ import * as HttpRouter from "effect/http/HttpRouter"; import * as ServerConfig from "../config.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; -import { SqlitePersistenceMemory } from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; import * as EnvironmentAuth from "./EnvironmentAuth.ts"; import * as ServerSecretStore from "./ServerSecretStore.ts"; -import { authHttpApiLayer, environmentAuthenticatedAuthLayer } from "./http.ts"; +import * as AuthHttp from "./http.ts"; const DEV_TOKEN = "reusable-dev-auth-token-that-is-long-enough"; class AuthTestApi extends HttpApi.make("environment").add(EnvironmentHttpApi.groups.auth) {} -const configLayer = Layer.effect( +const layerConfig = Layer.effect( ServerConfig.ServerConfig, Effect.gen(function* () { const config = yield* ServerConfig.ServerConfig; @@ -36,17 +36,17 @@ const configLayer = Layer.effect( }), ).pipe(Layer.provide(ServerConfig.layerTest(process.cwd(), { prefix: "t3-auth-http-test-" }))); -const environmentAuthLayer = EnvironmentAuth.layer.pipe( - Layer.provide(SqlitePersistenceMemory), +const layerEnvironmentAuth = EnvironmentAuth.layer.pipe( + Layer.provide(SqlitePersistence.layerMemory), Layer.provide(ServerSecretStore.layer), - Layer.provide(ServerEnvironment.identityLayer), - Layer.provide(configLayer), + Layer.provide(ServerEnvironment.layerIdentity), + Layer.provide(layerConfig), ); -const routesLayer = HttpApiBuilder.layer(AuthTestApi).pipe( - Layer.provide(authHttpApiLayer), - Layer.provide(environmentAuthenticatedAuthLayer), - Layer.provideMerge(environmentAuthLayer), - Layer.provide(configLayer), +const layerRoutes = HttpApiBuilder.layer(AuthTestApi).pipe( + Layer.provide(AuthHttp.layer), + Layer.provide(AuthHttp.layerAuthenticatedAuth), + Layer.provideMerge(layerEnvironmentAuth), + Layer.provide(layerConfig), Layer.provideMerge( HttpPlatform.layer.pipe( Layer.provideMerge(NodeServices.layer), @@ -81,8 +81,8 @@ it.effect("sets the selected browser session cookies through the HTTP route", () Effect.sync( () => [ - HttpRouter.toWebHandler(routesLayer, { disableLogger: true }), - HttpRouter.toWebHandler(routesLayer, { disableLogger: true }), + HttpRouter.toWebHandler(layerRoutes, { disableLogger: true }), + HttpRouter.toWebHandler(layerRoutes, { disableLogger: true }), ] as const, ), ([environmentA, environmentB]) => diff --git a/apps/server/src/auth/http.ts b/apps/server/src/auth/http.ts index 26551f77e8dd..a2180db4ea12 100644 --- a/apps/server/src/auth/http.ts +++ b/apps/server/src/auth/http.ts @@ -198,7 +198,7 @@ export const requireEnvironmentScope = Effect.fn("environment.auth.requireScope" return session; }); -export const environmentAuthenticatedAuthLayer = Layer.effect( +export const layerAuthenticatedAuth = Layer.effect( EnvironmentAuthenticatedAuth, Effect.gen(function* () { const serverAuth = yield* EnvironmentAuth.EnvironmentAuth; @@ -227,7 +227,7 @@ export const environmentAuthenticatedAuthLayer = Layer.effect( }), ); -export const authHttpApiLayer = HttpApiBuilder.group( +export const layer = HttpApiBuilder.group( EnvironmentHttpApi, "auth", Effect.fnUntraced(function* (handlers) { diff --git a/apps/server/src/background/BackgroundPolicy.test.ts b/apps/server/src/background/BackgroundPolicy.test.ts index 7f3e76e34020..5e7433a4d25e 100644 --- a/apps/server/src/background/BackgroundPolicy.test.ts +++ b/apps/server/src/background/BackgroundPolicy.test.ts @@ -57,7 +57,7 @@ function makeLayer( hostPower: HostPowerSnapshot, settingsOverrides: Parameters[0] = {}, ) { - const hostLayer = Layer.effect( + const layerHost = Layer.effect( HostPowerMonitor.HostPowerMonitor, Effect.gen(function* () { const changes = yield* PubSub.sliding(1); @@ -73,7 +73,7 @@ function makeLayer( }), ); return BackgroundPolicy.layer.pipe( - Layer.provide(Layer.merge(hostLayer, ServerSettings.layerTest(settingsOverrides))), + Layer.provide(Layer.merge(layerHost, ServerSettings.layerTest(settingsOverrides))), ); } @@ -144,7 +144,7 @@ describe("BackgroundPolicy", () => { const firstSnapshotStarted = yield* Deferred.make(); const releaseFirstSnapshot = yield* Deferred.make(); const snapshotReads = yield* Ref.make(0); - const hostLayer = Layer.succeed( + const layerHost = Layer.succeed( HostPowerMonitor.HostPowerMonitor, HostPowerMonitor.HostPowerMonitor.of({ snapshot: Ref.updateAndGet(snapshotReads, (count) => count + 1).pipe( @@ -162,7 +162,7 @@ describe("BackgroundPolicy", () => { }), ); const layer = BackgroundPolicy.layer.pipe( - Layer.provide(Layer.merge(hostLayer, ServerSettings.layerTest())), + Layer.provide(Layer.merge(layerHost, ServerSettings.layerTest())), ); yield* Effect.gen(function* () { diff --git a/apps/server/src/background/HostPowerMonitor.test.ts b/apps/server/src/background/HostPowerMonitor.test.ts index 2bd4dc0feb1e..2ccef15fa4fe 100644 --- a/apps/server/src/background/HostPowerMonitor.test.ts +++ b/apps/server/src/background/HostPowerMonitor.test.ts @@ -84,11 +84,11 @@ describe("HostPowerMonitor", () => { const sampledAt = DateTime.makeUnsafe("2026-06-17T12:00:00.000Z"); const desktopChanges = yield* PubSub.sliding(1); const diagnosticsDemandWrites = yield* Ref.make(0); - const receiverLayer = DesktopTelemetryReceiver.layerTest({ + const layerReceiver = DesktopTelemetryReceiver.layerTest({ changes: Stream.fromPubSub(desktopChanges), setDiagnosticsDemand: () => Ref.update(diagnosticsDemandWrites, (count) => count + 1), }); - const layer = HostPowerMonitor.layer.pipe(Layer.provide(receiverLayer)); + const layer = HostPowerMonitor.layer.pipe(Layer.provide(layerReceiver)); yield* Effect.gen(function* () { const monitor = yield* HostPowerMonitor.HostPowerMonitor; @@ -158,7 +158,7 @@ describe("HostPowerMonitor", () => { }, }; const desktopChanges = yield* PubSub.sliding(1); - const receiverLayer = DesktopTelemetryReceiver.layerTest({ + const layerReceiver = DesktopTelemetryReceiver.layerTest({ latest: Effect.succeedSome(initial), changes: Stream.empty, subscribe: Effect.gen(function* () { @@ -170,7 +170,7 @@ describe("HostPowerMonitor", () => { }; }), }); - const layer = HostPowerMonitor.layer.pipe(Layer.provide(receiverLayer)); + const layer = HostPowerMonitor.layer.pipe(Layer.provide(layerReceiver)); yield* Effect.gen(function* () { const monitor = yield* HostPowerMonitor.HostPowerMonitor; diff --git a/apps/server/src/binCli.ts b/apps/server/src/binCli.ts index ffcc7d586e35..8ed7618b0272 100644 --- a/apps/server/src/binCli.ts +++ b/apps/server/src/binCli.ts @@ -27,7 +27,7 @@ import { themeCommand } from "./cli/theme.ts"; import { traceCommand } from "./cli/trace.ts"; import { triageCommand } from "./cli/triage.ts"; -const CliRuntimeLayer = Layer.mergeAll(NodeServices.layer, NetService.layer); +const layerCliRuntime = Layer.mergeAll(NodeServices.layer, NetService.layer); const connectPublicConfigMissingMessage = "T3 Connect commands are unavailable: this build is missing T3 Connect public configuration."; @@ -92,7 +92,7 @@ export const cli = makeCli(); export function runCli() { Command.run(cli, { version: packageJson.version }).pipe( Effect.scoped, - Effect.provide(CliRuntimeLayer), + Effect.provide(layerCliRuntime), NodeRuntime.runMain, ); } diff --git a/apps/server/src/checkpointing/CheckpointStore.test.ts b/apps/server/src/checkpointing/CheckpointStore.test.ts index 8aa58d4afe33..c1ad293d40ab 100644 --- a/apps/server/src/checkpointing/CheckpointStore.test.ts +++ b/apps/server/src/checkpointing/CheckpointStore.test.ts @@ -19,19 +19,19 @@ import * as VcsDriverRegistry from "../vcs/VcsDriverRegistry.ts"; import * as VcsProcess from "../vcs/VcsProcess.ts"; import * as ServerConfig from "../config.ts"; -const ServerConfigLayer = ServerConfig.ServerConfig.layerTest(process.cwd(), { +const layerServerConfig = ServerConfig.ServerConfig.layerTest(process.cwd(), { prefix: "t3-checkpoint-store-test-", }); -const VcsProcessTestLayer = VcsProcess.layer.pipe(Layer.provide(NodeServices.layer)); -const VcsDriverTestLayer = VcsDriverRegistry.layer.pipe(Layer.provide(VcsProcessTestLayer)); -const CheckpointStoreTestLayer = CheckpointStore.layer.pipe( - Layer.provideMerge(VcsDriverTestLayer), +const layerVcsProcessTest = VcsProcess.layer.pipe(Layer.provide(NodeServices.layer)); +const layerVcsDriverTest = VcsDriverRegistry.layer.pipe(Layer.provide(layerVcsProcessTest)); +const layerCheckpointStoreTest = CheckpointStore.layer.pipe( + Layer.provideMerge(layerVcsDriverTest), Layer.provideMerge(NodeServices.layer), ); -const TestLayer = CheckpointStoreTestLayer.pipe( - Layer.provideMerge(VcsProcessTestLayer), - Layer.provideMerge(VcsDriverTestLayer), - Layer.provideMerge(ServerConfigLayer), +const layerTest = layerCheckpointStoreTest.pipe( + Layer.provideMerge(layerVcsProcessTest), + Layer.provideMerge(layerVcsDriverTest), + Layer.provideMerge(layerServerConfig), Layer.provideMerge(NodeServices.layer), ); @@ -94,7 +94,7 @@ function buildLargeText(lineCount = 5_000): string { .concat("\n"); } -it.layer(TestLayer)("CheckpointStore.layer", (it) => { +it.layer(layerTest)("CheckpointStore.layer", (it) => { describe("isGitRepository", () => { it.effect("returns false when no Git repository is detected", () => Effect.gen(function* () { diff --git a/apps/server/src/cli/auth.ts b/apps/server/src/cli/auth.ts index b9c2ae9d8189..6e5437313205 100644 --- a/apps/server/src/cli/auth.ts +++ b/apps/server/src/cli/auth.ts @@ -42,7 +42,7 @@ const runWithEnvironmentAuth = ( return yield* run(environmentAuth); }).pipe( Effect.provide( - Layer.mergeAll(EnvironmentAuth.runtimeLayer).pipe( + Layer.mergeAll(EnvironmentAuth.layerRuntime).pipe( Layer.provide(ServerConfig.layer(config)), Layer.provide(Layer.succeed(References.MinimumLogLevel, minimumLogLevel)), ), diff --git a/apps/server/src/cli/config.test.ts b/apps/server/src/cli/config.test.ts index efb3ec5d73cb..17072a5e1c35 100644 --- a/apps/server/src/cli/config.test.ts +++ b/apps/server/src/cli/config.test.ts @@ -146,7 +146,7 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { tailscaleServeEnabled: Option.none(), tailscaleServePort: Option.none(), }; - const configLayer = ConfigProvider.layer( + const layerConfig = ConfigProvider.layer( ConfigProvider.fromEnv({ env: { T3CODE_DEV_AUTH_TOKEN: " reusable-dev-auth-token-that-is-long-enough ", @@ -154,12 +154,12 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { }), ); const web = yield* resolveServerConfig(flags, Option.none()).pipe( - Effect.provide(Layer.mergeAll(configLayer, NetService.layer)), + Effect.provide(Layer.mergeAll(layerConfig, NetService.layer)), ); const desktop = yield* resolveServerConfig( { ...flags, mode: Option.some("desktop" as const) }, Option.none(), - ).pipe(Effect.provide(Layer.mergeAll(configLayer, NetService.layer))); + ).pipe(Effect.provide(Layer.mergeAll(layerConfig, NetService.layer))); expect(web.devAuthToken).toBeDefined(); if (web.devAuthToken === undefined) { @@ -190,21 +190,21 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { tailscaleServeEnabled: Option.none(), tailscaleServePort: Option.none(), }; - const configLayer = ConfigProvider.layer( + const layerConfig = ConfigProvider.layer( ConfigProvider.fromEnv({ env: { T3CODE_DEV_AUTH_TOKEN: secret } }), ); const error = yield* resolveServerConfig(flags, Option.none()).pipe( - Effect.provide(Layer.mergeAll(configLayer, NetService.layer)), + Effect.provide(Layer.mergeAll(layerConfig, NetService.layer)), Effect.flip, ); const desktop = yield* resolveServerConfig( { ...flags, mode: Option.some("desktop" as const) }, Option.none(), - ).pipe(Effect.provide(Layer.mergeAll(configLayer, NetService.layer))); + ).pipe(Effect.provide(Layer.mergeAll(layerConfig, NetService.layer))); const staticWeb = yield* resolveServerConfig( { ...flags, devUrl: Option.none() }, Option.none(), - ).pipe(Effect.provide(Layer.mergeAll(configLayer, NetService.layer))); + ).pipe(Effect.provide(Layer.mergeAll(layerConfig, NetService.layer))); expect(String(error)).not.toContain(secret); const serialized = yield* encodeUnknownJson(error); diff --git a/apps/server/src/cli/connect.ts b/apps/server/src/cli/connect.ts index 997f403288d1..db17305e9fb5 100644 --- a/apps/server/src/cli/connect.ts +++ b/apps/server/src/cli/connect.ts @@ -37,7 +37,7 @@ import { RELAY_URL_SECRET, } from "../cloud/config.ts"; import { relayUrlConfig } from "../cloud/publicConfig.ts"; -import { headlessRelayClientTracingLayer } from "../cloud/relayTracing.ts"; +import * as RelayTracing from "../cloud/relayTracing.ts"; import * as ServerConfig from "../config.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import * as ExternalLauncher from "../process/externalLauncher.ts"; @@ -434,22 +434,22 @@ const runCloudCommand = Effect.fn("cloud.cli.run_cloud_command")(function* (identity ? ` as ${identity}` : ""); diff --git a/apps/server/src/cli/pair.test.ts b/apps/server/src/cli/pair.test.ts index 1bafd6ce4380..39fe8652ce61 100644 --- a/apps/server/src/cli/pair.test.ts +++ b/apps/server/src/cli/pair.test.ts @@ -32,7 +32,7 @@ import { import packageJson from "../../package.json" with { type: "json" }; -const CliRuntimeLayer = Layer.mergeAll(NodeServices.layer, NetService.layer); +const layerCliRuntime = Layer.mergeAll(NodeServices.layer, NetService.layer); const baseState = { version: 1, @@ -94,7 +94,7 @@ describe("pair tailscale local target", () => { const runCli = (args: ReadonlyArray) => Command.runWith(cli, { version: "0.0.0" })(args); const provideCliTestLayers = (effect: Effect.Effect) => - Effect.provide(effect, Layer.mergeAll(CliRuntimeLayer, TestConsole.layer)); + Effect.provide(effect, Layer.mergeAll(layerCliRuntime, TestConsole.layer)); // Console output accumulates across CLI runs within a test, and each // Console.log call is one entry — so the latest command's output is the last diff --git a/apps/server/src/cli/pair.ts b/apps/server/src/cli/pair.ts index 9687b4aa4e15..452f484e09c4 100644 --- a/apps/server/src/cli/pair.ts +++ b/apps/server/src/cli/pair.ts @@ -437,7 +437,7 @@ const mintPairingLink = Effect.fn("pair.mintPairingLink")(function* (input: { }); }).pipe( Effect.provide( - EnvironmentAuth.runtimeLayer.pipe( + EnvironmentAuth.layerRuntime.pipe( Layer.provide(ServerConfig.layer(input.config)), Layer.provide(Layer.succeed(References.MinimumLogLevel, input.config.logLevel)), ), diff --git a/apps/server/src/cli/project.test.ts b/apps/server/src/cli/project.test.ts index 720ead5e2fb8..b526d7f1824b 100644 --- a/apps/server/src/cli/project.test.ts +++ b/apps/server/src/cli/project.test.ts @@ -30,10 +30,7 @@ import * as ServerConfig from "../config.ts"; import * as EventSink from "../orchestration-v2/EventSink.ts"; import * as EventStore from "../orchestration-v2/EventStore.ts"; import * as ProjectionStore from "../orchestration-v2/ProjectionStore.ts"; -import { - OrchestrationV2EventSinkLayerLive, - ProjectServiceLayerLive, -} from "../orchestration-v2/runtimeLayer.ts"; +import * as RuntimeLayer from "../orchestration-v2/runtimeLayer.ts"; import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; import * as ProjectEnrichmentService from "../project/ProjectEnrichmentService.ts"; import * as ProjectFaviconResolver from "../project/ProjectFaviconResolver.ts"; @@ -47,9 +44,9 @@ import { projectCommandErrorFromLiveServerRequest, } from "./project.ts"; -const CliRuntimeLayer = Layer.mergeAll(NodeServices.layer, NetService.layer); +const layerCliRuntime = Layer.mergeAll(NodeServices.layer, NetService.layer); const runCli = (args: ReadonlyArray) => - Command.runWith(cli, { version: "0.0.0" })(args).pipe(Effect.provide(CliRuntimeLayer)); + Command.runWith(cli, { version: "0.0.0" })(args).pipe(Effect.provide(layerCliRuntime)); const makeConfig = (baseDir: string) => Effect.gen(function* () { @@ -90,7 +87,7 @@ const makeConfig = (baseDir: string) => const readProjects = (baseDir: string) => Effect.gen(function* () { const config = yield* makeConfig(baseDir); - const layer = ProjectServiceLayerLive.pipe( + const layer = RuntimeLayer.layerProjectService.pipe( Layer.provideMerge(ProjectEnrichmentService.layer), Layer.provideMerge(RepositoryIdentityResolver.layer), Layer.provideMerge(ProjectFaviconResolver.layer), @@ -171,7 +168,7 @@ const makeThreadPersistenceLayer = Effect.fn("ProjectCliTest.makeThreadPersisten function* (baseDir: string) { const config = yield* makeConfig(baseDir); return Layer.mergeAll( - OrchestrationV2EventSinkLayerLive, + RuntimeLayer.layerEventSink, ProjectionStore.layer, EventStore.layer, ).pipe( diff --git a/apps/server/src/cli/project.ts b/apps/server/src/cli/project.ts index 0d0c783010c4..3016eb01ff80 100644 --- a/apps/server/src/cli/project.ts +++ b/apps/server/src/cli/project.ts @@ -25,7 +25,7 @@ import * as EnvironmentAuth from "../auth/EnvironmentAuth.ts"; import * as ServerConfig from "../config.ts"; import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; -import { ProjectServiceLayerLive } from "../orchestration-v2/runtimeLayer.ts"; +import * as RuntimeLayer from "../orchestration-v2/runtimeLayer.ts"; import * as ProjectEnrichmentService from "../project/ProjectEnrichmentService.ts"; import * as ProjectFaviconResolver from "../project/ProjectFaviconResolver.ts"; import * as RepositoryIdentityResolver from "../project/RepositoryIdentityResolver.ts"; @@ -196,7 +196,7 @@ const projectCommandUuid = Crypto.Crypto.pipe( ), ); -const ProjectCliRuntimeLive = ProjectServiceLayerLive.pipe( +const layerProjectCliRuntime = RuntimeLayer.layerProjectService.pipe( Layer.provideMerge(ProjectEnrichmentService.layer), Layer.provideMerge(RepositoryIdentityResolver.layer), Layer.provideMerge( @@ -416,7 +416,7 @@ const runProjectMutation = Effect.fn("runProjectMutation")(function* ( ); } - const offlineRuntimeLayer = ProjectCliRuntimeLive.pipe( + const layerOfflineRuntime = layerProjectCliRuntime.pipe( Layer.provide(ServerConfig.layer(config)), Layer.provide(Layer.succeed(References.MinimumLogLevel, minimumLogLevel)), ); @@ -430,10 +430,10 @@ const runProjectMutation = Effect.fn("runProjectMutation")(function* ( mode: "offline", }); yield* Console.log(output); - }).pipe(Effect.provide(offlineRuntimeLayer)); + }).pipe(Effect.provide(layerOfflineRuntime)); }).pipe( Effect.provide( - Layer.mergeAll(EnvironmentAuth.runtimeLayer, WorkspacePaths.layer).pipe( + Layer.mergeAll(EnvironmentAuth.layerRuntime, WorkspacePaths.layer).pipe( Layer.provideMerge(FetchHttpClient.layer), Layer.provide(ServerConfig.layer(config)), Layer.provide(Layer.succeed(References.MinimumLogLevel, minimumLogLevel)), diff --git a/apps/server/src/cloud/CliTokenManager.ts b/apps/server/src/cloud/CliTokenManager.ts index 817b25df2aed..16671606274c 100644 --- a/apps/server/src/cloud/CliTokenManager.ts +++ b/apps/server/src/cloud/CliTokenManager.ts @@ -461,7 +461,7 @@ export const make = Effect.gen(function* () { const hostedAppUrl = yield* hostedAppUrlConfig; const { verifier, challenge, state } = yield* makePkceRequest; const callback = yield* Deferred.make(); - const callbackRoute = HttpRouter.add( + const layerCallbackRoute = HttpRouter.add( "GET", "/callback", Effect.gen(function* () { @@ -477,7 +477,7 @@ export const make = Effect.gen(function* () { return HttpServerResponse.html(renderLoopbackAuthorizationCompleteHtml()); }), ); - yield* HttpRouter.serve(callbackRoute, { + yield* HttpRouter.serve(layerCallbackRoute, { disableListenLog: true, disableLogger: true, }).pipe( diff --git a/apps/server/src/cloud/CloudPreferences.test.ts b/apps/server/src/cloud/CloudPreferences.test.ts index 3f318f83a7b4..9dd41e13a580 100644 --- a/apps/server/src/cloud/CloudPreferences.test.ts +++ b/apps/server/src/cloud/CloudPreferences.test.ts @@ -61,7 +61,7 @@ const withService = ( }, { preconnect: () => {} }, ); - const dependencies = Layer.mergeAll( + const layerDependencies = Layer.mergeAll( Layer.mock(ServerSecretStore.ServerSecretStore)({ get: (name) => (options.failActivityRead && name === PUBLISH_AGENT_ACTIVITY_SECRET) || @@ -93,7 +93,7 @@ const withService = ( const preferences = yield* CloudPreferences.CloudPreferences; return yield* body({ preferences, stored, relayCalls }); }).pipe( - Effect.provide(CloudPreferences.layer.pipe(Layer.provide(dependencies))), + Effect.provide(CloudPreferences.layer.pipe(Layer.provide(layerDependencies))), Effect.provideService(FetchHttpClient.Fetch, fetch), ); }); diff --git a/apps/server/src/cloud/ManagedEndpointRuntime.test.ts b/apps/server/src/cloud/ManagedEndpointRuntime.test.ts index a0490e77446f..42c5d9b20e1d 100644 --- a/apps/server/src/cloud/ManagedEndpointRuntime.test.ts +++ b/apps/server/src/cloud/ManagedEndpointRuntime.test.ts @@ -18,7 +18,7 @@ import * as RelayClient from "@t3tools/shared/relayClient"; import * as ServerSecretStore from "../auth/ServerSecretStore.ts"; import * as ManagedEndpointRuntime from "./ManagedEndpointRuntime.ts"; -const relayClientAvailableLayer = Layer.succeed( +const layerRelayClientAvailable = Layer.succeed( RelayClient.RelayClient, RelayClient.RelayClient.of({ resolve: Effect.succeed({ @@ -34,7 +34,7 @@ const relayClientAvailableLayer = Layer.succeed( const runtimeDependencies = ( spawner: ReturnType, - relayClientLayer = relayClientAvailableLayer, + relayClientLayer = layerRelayClientAvailable, ) => Layer.mergeAll( Layer.succeed(ChildProcessSpawner.ChildProcessSpawner, spawner), @@ -46,7 +46,7 @@ const runtimeDependencies = ( const buildCloudManagedEndpointRuntime = ( spawner: ReturnType, - relayClientLayer = relayClientAvailableLayer, + relayClientLayer = layerRelayClientAvailable, ) => Effect.gen(function* () { const context = yield* Layer.build( diff --git a/apps/server/src/cloud/http.ts b/apps/server/src/cloud/http.ts index 651caa758bd4..1abb2469e719 100644 --- a/apps/server/src/cloud/http.ts +++ b/apps/server/src/cloud/http.ts @@ -1594,7 +1594,7 @@ const cloudMintCredentialHandler = Effect.fn("environment.cloud.mintCredential") ), ); -export const connectHttpApiLayer = HttpApiBuilder.group( +export const layer = HttpApiBuilder.group( EnvironmentHttpApi, "connect", Effect.fnUntraced(function* (handlers) { diff --git a/apps/server/src/cloud/relayTracing.ts b/apps/server/src/cloud/relayTracing.ts index eeea28a2b68f..5f4b22b9acf4 100644 --- a/apps/server/src/cloud/relayTracing.ts +++ b/apps/server/src/cloud/relayTracing.ts @@ -4,16 +4,13 @@ import { resolveRelayClientTracingConfig } from "./publicConfig.ts"; const relayClientTracingConfig = resolveRelayClientTracingConfig(); -export const headlessRelayClientTracingLayer = makeRelayClientTracingLayer( - relayClientTracingConfig, - { - serviceName: "t3code-server", - runtime: "node", - client: "headless-cli", - }, -); +export const layerHeadlessRelayClient = makeRelayClientTracingLayer(relayClientTracingConfig, { + serviceName: "t3code-server", + runtime: "node", + client: "headless-cli", +}); -export const serverRelayBrokerTracingLayer = makeRelayClientTracingLayer(relayClientTracingConfig, { +export const layerServerRelayBroker = makeRelayClientTracingLayer(relayClientTracingConfig, { serviceName: "t3code-server", runtime: "node", client: "environment-server", diff --git a/apps/server/src/device/DeviceHubProxy.test.ts b/apps/server/src/device/DeviceHubProxy.test.ts index 1e7d8e7c1c46..b46bbbafc327 100644 --- a/apps/server/src/device/DeviceHubProxy.test.ts +++ b/apps/server/src/device/DeviceHubProxy.test.ts @@ -11,7 +11,7 @@ import * as Layer from "effect/Layer"; import { HttpClient, HttpClientResponse, HttpRouter } from "effect/http"; import * as EnvironmentAuth from "../auth/EnvironmentAuth.ts"; import * as DeviceService from "./DeviceService.ts"; -import { deviceHubProxyRouteLayer } from "./DeviceHubProxy.ts"; +import * as DeviceHubProxy from "./DeviceHubProxy.ts"; const disposers: Array<() => Promise> = []; afterEach(async () => { @@ -36,7 +36,7 @@ const fixture = ( }), ); const { handler, dispose } = HttpRouter.toWebHandler( - deviceHubProxyRouteLayer.pipe( + DeviceHubProxy.layer.pipe( Layer.provideMerge( Layer.succeed(EnvironmentAuth.EnvironmentAuth, { authenticateWebSocketUpgrade: () => diff --git a/apps/server/src/device/DeviceHubProxy.ts b/apps/server/src/device/DeviceHubProxy.ts index 0caafff1bfa4..5975864d925e 100644 --- a/apps/server/src/device/DeviceHubProxy.ts +++ b/apps/server/src/device/DeviceHubProxy.ts @@ -230,8 +230,4 @@ const handler = Effect.gen(function* () { return yield* proxyHttp(request, `${ready.hub.origin}${upstreamPath}`, ready.hub.origin); }); -export const deviceHubProxyRouteLayer = HttpRouter.add( - "*", - `${DeviceService.DEVICE_HUB_ROUTE_PREFIX}/*`, - handler, -); +export const layer = HttpRouter.add("*", `${DeviceService.DEVICE_HUB_ROUTE_PREFIX}/*`, handler); diff --git a/apps/server/src/diagnostics/ProcessDiagnostics.test.ts b/apps/server/src/diagnostics/ProcessDiagnostics.test.ts index 5bcc74206893..9c0b58ca9917 100644 --- a/apps/server/src/diagnostics/ProcessDiagnostics.test.ts +++ b/apps/server/src/diagnostics/ProcessDiagnostics.test.ts @@ -35,7 +35,7 @@ function makeTelemetryLayer( snapshot: ResourceMonitorSnapshotEvent, desktopSnapshot?: DesktopHostTelemetrySnapshot, ) { - const nativeLayer = NativeTelemetryClient.layerTest({ + const layerNative = NativeTelemetryClient.layerTest({ sampleNow: Effect.succeed({ generation: 0, snapshot }), health: Effect.succeed({ status: "healthy", @@ -46,7 +46,7 @@ function makeTelemetryLayer( sampleIntervalMs: 1_000, }), }); - const desktopLayer = desktopSnapshot + const layerDesktop = desktopSnapshot ? DesktopTelemetryReceiver.layerTest({ latest: Effect.succeedSome(desktopSnapshot), health: Effect.succeed({ @@ -57,7 +57,7 @@ function makeTelemetryLayer( }) : DesktopTelemetryReceiver.layerTest(); return ResourceTelemetry.layer.pipe( - Layer.provide(Layer.mergeAll(nativeLayer, desktopLayer, ResourceAttribution.layer)), + Layer.provide(Layer.mergeAll(layerNative, layerDesktop, ResourceAttribution.layer)), ); } @@ -98,8 +98,8 @@ describe("ProcessDiagnostics", () => { ioSemantics: "storage", }, ]); - const telemetryLayer = makeTelemetryLayer(snapshot); - const layer = ProcessDiagnostics.layer.pipe(Layer.provideMerge(telemetryLayer)); + const layerTelemetry = makeTelemetryLayer(snapshot); + const layer = ProcessDiagnostics.layer.pipe(Layer.provideMerge(layerTelemetry)); const diagnostics = yield* Effect.gen(function* () { const processDiagnostics = yield* ProcessDiagnostics.ProcessDiagnostics; @@ -116,8 +116,8 @@ describe("ProcessDiagnostics", () => { it.effect("rejects stale process identities before signaling", () => Effect.gen(function* () { const snapshot = makeNativeSnapshot([]); - const telemetryLayer = makeTelemetryLayer(snapshot); - const layer = ProcessDiagnostics.layer.pipe(Layer.provide(telemetryLayer)); + const layerTelemetry = makeTelemetryLayer(snapshot); + const layer = ProcessDiagnostics.layer.pipe(Layer.provide(layerTelemetry)); const result = yield* Effect.service(ProcessDiagnostics.ProcessDiagnostics).pipe( Effect.flatMap((processDiagnostics) => @@ -163,7 +163,7 @@ describe("ProcessDiagnostics", () => { Effect.flatMap((telemetry) => telemetry.latest), Effect.provide(makeTelemetryLayer(snapshot)), ); - const telemetryLayer = Layer.succeed( + const layerTelemetry = Layer.succeed( ResourceTelemetry.ResourceTelemetry, ResourceTelemetry.ResourceTelemetry.of({ latest: Effect.succeed(staleTelemetry), @@ -180,7 +180,7 @@ describe("ProcessDiagnostics", () => { retry: Effect.die("unused"), }), ); - const layer = ProcessDiagnostics.layer.pipe(Layer.provide(telemetryLayer)); + const layer = ProcessDiagnostics.layer.pipe(Layer.provide(layerTelemetry)); const result = yield* Effect.service(ProcessDiagnostics.ProcessDiagnostics).pipe( Effect.flatMap((processDiagnostics) => @@ -228,7 +228,7 @@ describe("ProcessDiagnostics", () => { }, ]); const sampledAt = DateTime.makeUnsafe(sampledAtUnixMs); - const telemetryLayer = makeTelemetryLayer(snapshot, { + const layerTelemetry = makeTelemetryLayer(snapshot, { version: 1, type: "desktopTelemetry", sequence: 1, @@ -260,7 +260,7 @@ describe("ProcessDiagnostics", () => { }, ], }); - const layer = ProcessDiagnostics.layer.pipe(Layer.provide(telemetryLayer)); + const layer = ProcessDiagnostics.layer.pipe(Layer.provide(layerTelemetry)); const result = yield* Effect.service(ProcessDiagnostics.ProcessDiagnostics).pipe( Effect.flatMap((processDiagnostics) => diff --git a/apps/server/src/environment/DirectEndpoints.test.ts b/apps/server/src/environment/DirectEndpoints.test.ts index aac94d75ee6f..c52d395a33c8 100644 --- a/apps/server/src/environment/DirectEndpoints.test.ts +++ b/apps/server/src/environment/DirectEndpoints.test.ts @@ -135,7 +135,7 @@ const TAILSCALE_STATUS_JSON = JSON.stringify({ }); /** `tailscale status --json` reporting a MagicDNS name. */ -const tailscaleUpLayer = Layer.succeed( +const layerTailscaleUp = Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make(() => Effect.succeed( @@ -166,7 +166,7 @@ const serveProbeLayer = (status: number) => ); /** A loopback-only server with Tailscale Serve on, so only the Serve name can be listed. */ -const serveConfigLayer = Layer.effect( +const layerServeConfig = Layer.effect( ServerConfig.ServerConfig, Effect.map(ServerConfig.ServerConfig, (config) => ({ ...config, @@ -184,7 +184,7 @@ const resolveWithServe = (probeStatus: number) => Effect.provide( DirectEndpoints.layer.pipe( Layer.provide( - Layer.mergeAll(serveConfigLayer, tailscaleUpLayer, serveProbeLayer(probeStatus)), + Layer.mergeAll(layerServeConfig, layerTailscaleUp, serveProbeLayer(probeStatus)), ), ), ), diff --git a/apps/server/src/environment/ServerEnvironment.test.ts b/apps/server/src/environment/ServerEnvironment.test.ts index 19d4ca5f65c6..defc41b5a5fa 100644 --- a/apps/server/src/environment/ServerEnvironment.test.ts +++ b/apps/server/src/environment/ServerEnvironment.test.ts @@ -37,7 +37,7 @@ const makeServerEnvironmentLayer = (baseDir: string) => Layer.provide(ServerConfig.layerTest(process.cwd(), baseDir)), ); -const emptySecretStoreLayer = Layer.succeed( +const layerEmptySecretStore = Layer.succeed( ServerSecretStore.ServerSecretStore, ServerSecretStore.ServerSecretStore.of({ get: () => Effect.succeedNone, @@ -108,7 +108,7 @@ it.layer(NodeServices.layer)("ServerEnvironmentLive", (it) => { }).pipe( Effect.provide( ServerEnvironment.layer.pipe( - Layer.provide(emptySecretStoreLayer), + Layer.provide(layerEmptySecretStore), Layer.provide(ServerConfig.layer({ ...config, mode })), ), ), @@ -152,7 +152,7 @@ it.layer(NodeServices.layer)("ServerEnvironmentLive", (it) => { return yield* identity.getEnvironmentId; }).pipe( Effect.tap(() => Deferred.succeed(firstInitialized, undefined)), - Effect.provide(Layer.fresh(ServerEnvironment.identityLayer)), + Effect.provide(Layer.fresh(ServerEnvironment.layerIdentity)), Effect.provideService(ServerConfig.ServerConfig, serverConfig), Effect.provideService(FileSystem.FileSystem, { ...fileSystem, @@ -237,7 +237,7 @@ it.layer(NodeServices.layer)("ServerEnvironmentLive", (it) => { const baseDir = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-server-environment-publish-test-", }); - const testLayer = Layer.mergeAll( + const layerTest = Layer.mergeAll( ServerEnvironment.layer.pipe(Layer.provide(ServerSecretStore.layer)), ServerSecretStore.layer, ).pipe(Layer.provide(ServerConfig.layerTest(process.cwd(), baseDir))); @@ -273,7 +273,7 @@ it.layer(NodeServices.layer)("ServerEnvironmentLive", (it) => { yield* secrets.set(PUBLISH_AGENT_ACTIVITY_SECRET, encode("false")); const disabled = yield* serverEnvironment.getDescriptor; expect(disabled.capabilities.agentActivityPublishing).toBe(false); - }).pipe(Effect.provide(testLayer)); + }).pipe(Effect.provide(layerTest)); }), ); @@ -342,7 +342,7 @@ it.layer(NodeServices.layer)("ServerEnvironmentLive", (it) => { description: "permission denied", pathOrDescriptor: environmentIdPath, }); - const failingFileSystemLayer = FileSystem.layerNoop({ + const layerFailingFileSystem = FileSystem.layerNoop({ exists: () => operation === "check" ? Effect.fail(cause) : Effect.succeed(operation === "read"), readFileString: () => Effect.fail(cause), @@ -359,8 +359,8 @@ it.layer(NodeServices.layer)("ServerEnvironmentLive", (it) => { }).pipe( Effect.provide( ServerEnvironment.layer.pipe( - Layer.provide(emptySecretStoreLayer), - Layer.provide(Layer.merge(ServerConfig.layer(serverConfig), failingFileSystemLayer)), + Layer.provide(layerEmptySecretStore), + Layer.provide(Layer.merge(ServerConfig.layer(serverConfig), layerFailingFileSystem)), ), ), Effect.flip, diff --git a/apps/server/src/environment/ServerEnvironment.ts b/apps/server/src/environment/ServerEnvironment.ts index b5e80107de7b..2ccc07b87b79 100644 --- a/apps/server/src/environment/ServerEnvironment.ts +++ b/apps/server/src/environment/ServerEnvironment.ts @@ -275,7 +275,7 @@ export const make = Effect.gen(function* () { }); }); -export const identityLayer = Layer.effect(ServerEnvironmentIdentity, makeIdentity); +export const layerIdentity = Layer.effect(ServerEnvironmentIdentity, makeIdentity); /** * ServerEnvironment is acquired from persisted filesystem and host-process @@ -284,6 +284,6 @@ export const identityLayer = Layer.effect(ServerEnvironmentIdentity, makeIdentit * ServerSecretStore backing the descriptor's publishing capability. */ export const layer = Layer.effect(ServerEnvironment, make).pipe( - Layer.provideMerge(identityLayer), + Layer.provideMerge(layerIdentity), Layer.provide(ProcessRunner.layer), ); diff --git a/apps/server/src/environment/ServerEnvironmentLabel.test.ts b/apps/server/src/environment/ServerEnvironmentLabel.test.ts index 65db791675b5..fd7f8ccb3726 100644 --- a/apps/server/src/environment/ServerEnvironmentLabel.test.ts +++ b/apps/server/src/environment/ServerEnvironmentLabel.test.ts @@ -27,16 +27,16 @@ interface CapturedLog { const runMock = vi.fn(); -const ProcessRunnerTest = Layer.succeed( +const layerProcessRunnerTest = Layer.succeed( ProcessRunner.ProcessRunner, ProcessRunner.ProcessRunner.of({ run: (input) => runMock(input), }), ); -const NoopFileSystemLayer = FileSystem.layerNoop({}); -const TestLayer = Layer.merge(NoopFileSystemLayer, ProcessRunnerTest); -const LinuxMachineInfoLayer = Layer.merge( - ProcessRunnerTest, +const layerNoopFileSystem = FileSystem.layerNoop({}); +const layerTest = Layer.merge(layerNoopFileSystem, layerProcessRunnerTest); +const layerLinuxMachineInfo = Layer.merge( + layerProcessRunnerTest, FileSystem.layerNoop({ exists: (path) => Effect.succeed(path === "/etc/machine-info"), readFileString: (path) => @@ -65,7 +65,7 @@ describe("resolveServerEnvironmentLabel", () => { Effect.gen(function* () { const result = yield* ServerEnvironmentLabel.resolveServerEnvironmentLabel({ cwdBaseName: "t3code", - }).pipe(Effect.provide(withHostPlatform(TestLayer, "win32", "macbook-pro"))); + }).pipe(Effect.provide(withHostPlatform(layerTest, "win32", "macbook-pro"))); expect(result).toBe("macbook-pro"); }), @@ -88,7 +88,7 @@ describe("resolveServerEnvironmentLabel", () => { const result = yield* ServerEnvironmentLabel.resolveServerEnvironmentLabel({ cwdBaseName: "t3code", - }).pipe(Effect.provide(withHostPlatform(TestLayer, "darwin", "macbook-pro"))); + }).pipe(Effect.provide(withHostPlatform(layerTest, "darwin", "macbook-pro"))); expect(result).toBe("Julius's MacBook Pro"); expect(runMock).toHaveBeenCalledWith( @@ -105,7 +105,7 @@ describe("resolveServerEnvironmentLabel", () => { Effect.gen(function* () { const result = yield* ServerEnvironmentLabel.resolveServerEnvironmentLabel({ cwdBaseName: "t3code", - }).pipe(Effect.provide(withHostPlatform(LinuxMachineInfoLayer, "linux", "buildbox"))); + }).pipe(Effect.provide(withHostPlatform(layerLinuxMachineInfo, "linux", "buildbox"))); expect(result).toBe("Build Agent 01"); expect(runMock).not.toHaveBeenCalled(); @@ -129,7 +129,7 @@ describe("resolveServerEnvironmentLabel", () => { const result = yield* ServerEnvironmentLabel.resolveServerEnvironmentLabel({ cwdBaseName: "t3code", - }).pipe(Effect.provide(withHostPlatform(TestLayer, "linux", "runner-01"))); + }).pipe(Effect.provide(withHostPlatform(layerTest, "linux", "runner-01"))); expect(result).toBe("CI Runner"); expect(runMock).toHaveBeenCalledWith( @@ -146,7 +146,7 @@ describe("resolveServerEnvironmentLabel", () => { Effect.gen(function* () { const result = yield* ServerEnvironmentLabel.resolveServerEnvironmentLabel({ cwdBaseName: "t3code", - }).pipe(Effect.provide(withHostPlatform(TestLayer, "win32", "JULIUS-LAPTOP"))); + }).pipe(Effect.provide(withHostPlatform(layerTest, "win32", "JULIUS-LAPTOP"))); expect(result).toBe("JULIUS-LAPTOP"); }), @@ -192,7 +192,7 @@ describe("resolveServerEnvironmentLabel", () => { }).pipe( Effect.provide( Layer.mergeAll( - withHostPlatform(TestLayer, "darwin", "macbook-pro"), + withHostPlatform(layerTest, "darwin", "macbook-pro"), Logger.layer([logger], { mergeWithExisting: false }), Layer.succeed(References.MinimumLogLevel, "Debug"), ), @@ -216,7 +216,7 @@ describe("resolveServerEnvironmentLabel", () => { pathOrDescriptor: "/etc/machine-info", cause: fileCause, }); - const fileSystemLayer = FileSystem.layerNoop({ + const layerFileSystem = FileSystem.layerNoop({ exists: () => Effect.fail(platformError), }); runMock.mockReturnValueOnce( @@ -252,7 +252,11 @@ describe("resolveServerEnvironmentLabel", () => { }).pipe( Effect.provide( Layer.mergeAll( - withHostPlatform(Layer.merge(ProcessRunnerTest, fileSystemLayer), "linux", "buildbox"), + withHostPlatform( + Layer.merge(layerProcessRunnerTest, layerFileSystem), + "linux", + "buildbox", + ), Logger.layer([logger], { mergeWithExisting: false }), Layer.succeed(References.MinimumLogLevel, "Debug"), ), @@ -277,7 +281,7 @@ describe("resolveServerEnvironmentLabel", () => { const result = yield* ServerEnvironmentLabel.resolveServerEnvironmentLabel({ cwdBaseName: "t3code", - }).pipe(Effect.provide(withHostPlatform(TestLayer, "linux", " "))); + }).pipe(Effect.provide(withHostPlatform(layerTest, "linux", " "))); expect(result).toBe("t3code"); }), diff --git a/apps/server/src/environment/ServerEnvironmentMachine.test.ts b/apps/server/src/environment/ServerEnvironmentMachine.test.ts index 509cab5973bd..bbf8f3dcfeba 100644 --- a/apps/server/src/environment/ServerEnvironmentMachine.test.ts +++ b/apps/server/src/environment/ServerEnvironmentMachine.test.ts @@ -16,7 +16,7 @@ import { const runMock = vi.fn(); -const ProcessRunnerTest = Layer.succeed( +const layerProcessRunnerTest = Layer.succeed( ProcessRunner.ProcessRunner, ProcessRunner.ProcessRunner.of({ run: (input) => runMock(input) }), ); @@ -52,7 +52,7 @@ const dmiFileSystem = (files: Readonly>) => }); const withPlatform = (platform: NodeJS.Platform, fileSystem = FileSystem.layerNoop({})) => - Layer.mergeAll(ProcessRunnerTest, fileSystem, Layer.succeed(HostProcessPlatform, platform)); + Layer.mergeAll(layerProcessRunnerTest, fileSystem, Layer.succeed(HostProcessPlatform, platform)); afterEach(() => { runMock.mockReset(); diff --git a/apps/server/src/git/GitManager.test.ts b/apps/server/src/git/GitManager.test.ts index dfd4bed6dea7..23ac9345fb61 100644 --- a/apps/server/src/git/GitManager.test.ts +++ b/apps/server/src/git/GitManager.test.ts @@ -53,7 +53,7 @@ import * as SourceControlProviderRegistry from "../sourceControl/SourceControlPr import * as ServerConfig from "../config.ts"; import * as ProjectionStore from "../orchestration-v2/ProjectionStore.ts"; import * as ProjectStore from "../orchestration-v2/ProjectStore.ts"; -import { SqlitePersistenceMemory } from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; import * as ProjectSetupScriptRunner from "../project/ProjectSetupScriptRunner.ts"; import * as ProviderRegistry from "../provider/Services/ProviderRegistry.ts"; import * as ServerSettings from "../serverSettings.ts"; @@ -679,13 +679,13 @@ function makeManager(input?: { }) { const { service: gitHubCli, ghCalls } = createGitHubCliWithFakeGh(input?.ghScenario); const textGeneration = createTextGeneration(input?.textGeneration); - const serverConfigLayer = ServerConfig.layerTest(process.cwd(), { + const layerServerConfig = ServerConfig.layerTest(process.cwd(), { prefix: "t3-git-manager-test-", }); - const serverSettingsLayer = ServerSettings.ServerSettingsService.layerTest(input?.serverSettings); + const layerServerSettings = ServerSettings.ServerSettingsService.layerTest(input?.serverSettings); - const vcsDriverLayer = input?.gitConfigReads + const layerVcsDriver = input?.gitConfigReads ? Layer.effect( GitVcsDriver.GitVcsDriver, GitVcsDriver.make.pipe( @@ -702,14 +702,14 @@ function makeManager(input?: { ).pipe( Layer.provideMerge(VcsProcess.layer), Layer.provideMerge(NodeServices.layer), - Layer.provideMerge(serverConfigLayer), + Layer.provideMerge(layerServerConfig), ) : GitVcsDriver.layer.pipe( Layer.provideMerge(VcsProcess.layer), Layer.provideMerge(NodeServices.layer), - Layer.provideMerge(serverConfigLayer), + Layer.provideMerge(layerServerConfig), ); - const sourceControlRegistryLayer = Layer.effect( + const layerSourceControlRegistry = Layer.effect( SourceControlProviderRegistry.SourceControlProviderRegistry, (input?.sourceControlProvider === undefined ? GitHubSourceControlProvider.make @@ -728,7 +728,7 @@ function makeManager(input?: { ), ); - const managerLayer = Layer.mergeAll( + const layerManager = Layer.mergeAll( Layer.succeed(TextGeneration.TextGeneration, textGeneration), Layer.mock(ProviderRegistry.ProviderRegistry)({ getProviders: Effect.succeed([]), @@ -739,21 +739,21 @@ function makeManager(input?: { runForThread: () => Effect.succeed({ status: "no-script" as const }), }, ), - vcsDriverLayer, - serverSettingsLayer, - ).pipe(Layer.provideMerge(sourceControlRegistryLayer), Layer.provideMerge(NodeServices.layer)); + layerVcsDriver, + layerServerSettings, + ).pipe(Layer.provideMerge(layerSourceControlRegistry), Layer.provideMerge(NodeServices.layer)); // Built into the test's scope: the manager reads these stores after this returns. - const storesLayer = Layer.merge(ProjectionStore.layer, ProjectStore.layer).pipe( - Layer.provideMerge(SqlitePersistenceMemory), + const layerStores = Layer.merge(ProjectionStore.layer, ProjectStore.layer).pipe( + Layer.provideMerge(SqlitePersistence.layerMemory), ); return Effect.gen(function* () { - const stores = yield* Layer.build(storesLayer); + const stores = yield* Layer.build(layerStores); if (input?.seed !== undefined) { yield* input.seed.pipe(Effect.provideContext(stores), Effect.orDie); } const manager = yield* GitManager.make.pipe( - Effect.provide(managerLayer), + Effect.provide(layerManager), Effect.provideContext(stores), ); return { manager, ghCalls }; @@ -762,13 +762,13 @@ function makeManager(input?: { const asThreadId = (threadId: string) => threadId as ThreadId; -const GitManagerTestLayer = GitVcsDriver.layer.pipe( +const layerGitManagerTest = GitVcsDriver.layer.pipe( Layer.provide(ServerConfig.layerTest(process.cwd(), { prefix: "t3-git-manager-test-" })), Layer.provideMerge(VcsProcess.layer), Layer.provideMerge(NodeServices.layer), ); -it.layer(GitManagerTestLayer)("GitManager", (it) => { +it.layer(layerGitManagerTest)("GitManager", (it) => { it.effect("status includes draft PR metadata when branch already has a draft PR", () => Effect.gen(function* () { const repoDir = yield* makeTempDir("t3code-git-manager-"); diff --git a/apps/server/src/git/GitWorkflowService.test.ts b/apps/server/src/git/GitWorkflowService.test.ts index 5e7545eafdf8..67063745612e 100644 --- a/apps/server/src/git/GitWorkflowService.test.ts +++ b/apps/server/src/git/GitWorkflowService.test.ts @@ -117,7 +117,7 @@ describe("GitWorkflowService", () => { const remoteStatus = vi.fn(); const status = vi.fn(); - const testLayer = GitWorkflowService.layer.pipe( + const layerTest = GitWorkflowService.layer.pipe( Layer.provide( Layer.mock(VcsDriverRegistry.VcsDriverRegistry)({ detect: () => Effect.succeed(null), @@ -142,7 +142,7 @@ describe("GitWorkflowService", () => { assert.equal(localStatus.mock.calls.length, 0); assert.equal(remoteStatus.mock.calls.length, 0); assert.equal(status.mock.calls.length, 0); - }).pipe(Effect.provide(testLayer)); + }).pipe(Effect.provide(layerTest)); }); it.effect("returns an empty ref list when no VCS repository is detected", () => diff --git a/apps/server/src/git/linkCreatedPullRequest.test.ts b/apps/server/src/git/linkCreatedPullRequest.test.ts index 779fb002db9c..2802f21bc8fd 100644 --- a/apps/server/src/git/linkCreatedPullRequest.test.ts +++ b/apps/server/src/git/linkCreatedPullRequest.test.ts @@ -179,17 +179,17 @@ describe("linkCreatedPullRequest", () => { it.effect("dispatches nothing when the action produced no pull request", () => Effect.gen(function* () { const { commands, dispatch } = yield* recordingDispatch(); - const dependencies = makeDependencies(dispatch); + const layerDependencies = makeDependencies(dispatch); yield* linkCreatedPullRequest({ threadId: THREAD_ID, result: prResult({ status: "skipped_not_requested" }), commandId, - }).pipe(Effect.provide(dependencies)); + }).pipe(Effect.provide(layerDependencies)); yield* linkCreatedPullRequest({ threadId: THREAD_ID, result: prResult({ status: "created", url: "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/t3tools/t3code/pull/42" }), commandId, - }).pipe(Effect.provide(dependencies)); + }).pipe(Effect.provide(layerDependencies)); expect(yield* Ref.get(commands)).toEqual([]); }), @@ -229,7 +229,7 @@ it.effect( () => Effect.gen(function* () { const refreshed: string[] = []; - const dependencies = Layer.mergeAll( + const layerDependencies = Layer.mergeAll( Layer.mock(Orchestrator.OrchestratorV2)({ getThreadShell: () => Effect.succeed(v2PullRequestThread(thread)), }), @@ -246,22 +246,22 @@ it.effect( yield* refreshPushedPullRequests( { cwd: "/worktree", threadId: THREAD_ID }, { push: { status: "pushed" } }, - ).pipe(Effect.provide(dependencies)); + ).pipe(Effect.provide(layerDependencies)); yield* refreshPushedPullRequests( { cwd: project.workspaceRoot }, { push: { status: "pushed" } }, - ).pipe(Effect.provide(dependencies)); + ).pipe(Effect.provide(layerDependencies)); yield* refreshPushedPullRequests({ cwd: "/unrelated" }, { push: { status: "pushed" } }).pipe( - Effect.provide(dependencies), + Effect.provide(layerDependencies), ); yield* refreshPushedPullRequests( { cwd: project.workspaceRoot, threadId: THREAD_ID }, { push: { status: "skipped_not_requested" } }, - ).pipe(Effect.provide(dependencies)); + ).pipe(Effect.provide(layerDependencies)); yield* refreshPushedPullRequests( { cwd: "/draft-worktree", projectId: PROJECT_ID }, { push: { status: "pushed" } }, - ).pipe(Effect.provide(dependencies)); + ).pipe(Effect.provide(layerDependencies)); expect(refreshed).toEqual([PROJECT_ID, PROJECT_ID, PROJECT_ID]); }), ); diff --git a/apps/server/src/htmlRender/HtmlRender.test.ts b/apps/server/src/htmlRender/HtmlRender.test.ts index 565f1fee02fa..fa4074a070b6 100644 --- a/apps/server/src/htmlRender/HtmlRender.test.ts +++ b/apps/server/src/htmlRender/HtmlRender.test.ts @@ -52,7 +52,7 @@ const htmlRenderLayer = ( Layer.provideMerge(ServerConfig.layerTest(process.cwd(), { prefix: "t3-html-render-" })), Layer.provideMerge(NodeServices.layer), ); -const testLayer = htmlRenderLayer(); +const layerTest = htmlRenderLayer(); const PNG_BYTES = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); @@ -94,7 +94,7 @@ describe("HtmlRender", () => { // The theme bootstrap opens the head, ahead of the page's own markup. expect(prepared.indexOf("")).toBeLessThan(prepared.indexOf('