| author | |
| committer | |
| log | 9a1c4875a37ea7eeb77db189e2e45db9404d7a47 |
| tree | 67e6a7188471f04bd2fb8223f1a694a2dc6aaebd |
| parent | 7eda6ba5fce8290b3a13d1ab730827fc36a34e53 |
| signature | Signed by PGP key B5690EEEBB952194 |
Co-authored-by: codex <codex@users.noreply.github.com>14 files changed, 69 insertions(+), 123 deletions(-)
apps/desktop/src/app/DesktopObservability.ts+1-5| ... | ... | @@ -50,11 +50,7 @@ export function makeComponentLogger(component: string): DesktopComponentLogger { |
| 50 | 50 | }; |
| 51 | 51 | } |
| 52 | 52 | |
| 53 | const readPersistedOtlpTracesUrl: Effect.Effect< | |
| 54 | Option.Option<string>, | |
| 55 | never, | |
| 56 | FileSystem.FileSystem | DesktopEnvironment.DesktopEnvironment | |
| 57 | > = Effect.gen(function* () { | |
| 53 | const readPersistedOtlpTracesUrl = Effect.gen(function* () { | |
| 58 | 54 | const fileSystem = yield* FileSystem.FileSystem; |
| 59 | 55 | const environment = yield* DesktopEnvironment.DesktopEnvironment; |
| 60 | 56 | const raw = yield* fileSystem.readFileString(environment.serverSettingsPath).pipe(Effect.option); |
apps/desktop/src/backend/DesktopBackendConfiguration.ts+1-5| ... | ... | @@ -54,11 +54,7 @@ const { logWarning: logBackendConfigurationWarning } = DesktopObservability.make |
| 54 | 54 | "desktop-backend-configuration", |
| 55 | 55 | ); |
| 56 | 56 | |
| 57 | const readPersistedBackendObservabilitySettings: Effect.Effect< | |
| 58 | BackendObservabilitySettings, | |
| 59 | never, | |
| 60 | FileSystem.FileSystem | DesktopEnvironment.DesktopEnvironment | |
| 61 | > = Effect.gen(function* () { | |
| 57 | const readPersistedBackendObservabilitySettings = Effect.gen(function* () { | |
| 62 | 58 | const fileSystem = yield* FileSystem.FileSystem; |
| 63 | 59 | const environment = yield* DesktopEnvironment.DesktopEnvironment; |
| 64 | 60 | const exists = yield* fileSystem |
apps/desktop/src/shell/DesktopShellEnvironment.ts+1-5| ... | ... | @@ -211,11 +211,7 @@ const readLoginShellEnvironment = ( |
| 211 | 211 | timeout: LOGIN_SHELL_TIMEOUT, |
| 212 | 212 | }).pipe(Effect.map((output) => extractEnvironment(output, names))); |
| 213 | 213 | |
| 214 | const readLaunchctlPath: Effect.Effect< | |
| 215 | Option.Option<string>, | |
| 216 | never, | |
| 217 | ChildProcessSpawner.ChildProcessSpawner | |
| 218 | > = runCommandOutput({ | |
| 214 | const readLaunchctlPath = runCommandOutput({ | |
| 219 | 215 | command: "/bin/launchctl", |
| 220 | 216 | args: ["getenv", "PATH"], |
| 221 | 217 | timeout: LAUNCHCTL_TIMEOUT, |
apps/desktop/src/window/DesktopApplicationMenu.ts+2-10| ... | ... | @@ -37,11 +37,7 @@ const dispatchMenuAction = Effect.fn("desktop.menu.dispatchMenuAction")(function |
| 37 | 37 | yield* desktopWindow.dispatchMenuAction(action); |
| 38 | 38 | }); |
| 39 | 39 | |
| 40 | const checkForUpdatesFromMenu: Effect.Effect< | |
| 41 | void, | |
| 42 | never, | |
| 43 | DesktopUpdates.DesktopUpdates | ElectronDialog.ElectronDialog | |
| 44 | > = Effect.gen(function* () { | |
| 40 | const checkForUpdatesFromMenu = Effect.gen(function* () { | |
| 45 | 41 | const updates = yield* DesktopUpdates.DesktopUpdates; |
| 46 | 42 | const electronDialog = yield* ElectronDialog.ElectronDialog; |
| 47 | 43 | const result = yield* updates.check("menu"); |
| ... | ... | @@ -65,11 +61,7 @@ const checkForUpdatesFromMenu: Effect.Effect< |
| 65 | 61 | } |
| 66 | 62 | }).pipe(Effect.withSpan("desktop.menu.checkForUpdates")); |
| 67 | 63 | |
| 68 | const handleCheckForUpdatesMenuClick: Effect.Effect< | |
| 69 | void, | |
| 70 | DesktopWindow.DesktopWindowError, | |
| 71 | DesktopUpdates.DesktopUpdates | ElectronDialog.ElectronDialog | DesktopWindow.DesktopWindow | |
| 72 | > = Effect.gen(function* () { | |
| 64 | const handleCheckForUpdatesMenuClick = Effect.gen(function* () { | |
| 73 | 65 | const updates = yield* DesktopUpdates.DesktopUpdates; |
| 74 | 66 | const electronDialog = yield* ElectronDialog.ElectronDialog; |
| 75 | 67 | const disabledReason = yield* updates.disabledReason; |
apps/mobile/src/connection/runtime.ts+7-11| ... | ... | @@ -5,24 +5,20 @@ import { Atom } from "effect/unstable/reactivity"; |
| 5 | 5 | import { runtimeContextLayer } from "../lib/runtime"; |
| 6 | 6 | import { connectionPlatformLayer } from "./platform"; |
| 7 | 7 | |
| 8 | const providedConnectionPlatformLayer: Layer.Layer< | |
| 9 | Layer.Success<typeof connectionPlatformLayer>, | |
| 10 | Layer.Error<typeof connectionPlatformLayer> | |
| 11 | > = connectionPlatformLayer.pipe(Layer.provide(runtimeContextLayer)); | |
| 8 | const providedConnectionPlatformLayer = connectionPlatformLayer.pipe( | |
| 9 | Layer.provide(runtimeContextLayer), | |
| 10 | ); | |
| 12 | 11 | |
| 13 | 12 | type ConnectionLayerSource = |
| 14 | 13 | | typeof Connection.layer |
| 15 | 14 | | typeof runtimeContextLayer |
| 16 | | typeof providedConnectionPlatformLayer; | |
| 15 | | typeof connectionPlatformLayer; | |
| 17 | 16 | |
| 18 | export const connectionLayer: Layer.Layer< | |
| 19 | Layer.Success<ConnectionLayerSource>, | |
| 20 | Layer.Error<ConnectionLayerSource> | |
| 21 | > = Connection.layer.pipe( | |
| 17 | const connectionLayer = Connection.layer.pipe( | |
| 22 | 18 | Layer.provideMerge(Layer.mergeAll(runtimeContextLayer, providedConnectionPlatformLayer)), |
| 23 | 19 | ); |
| 24 | 20 | |
| 25 | 21 | export const connectionAtomRuntime: Atom.AtomRuntime< |
| 26 | Layer.Success<typeof connectionLayer>, | |
| 27 | Layer.Error<typeof connectionLayer> | |
| 22 | Layer.Success<ConnectionLayerSource>, | |
| 23 | Layer.Error<ConnectionLayerSource> | |
| 28 | 24 | > = Atom.runtime(connectionLayer); |
apps/mobile/src/lib/runtime.ts+5-8| ... | ... | @@ -22,10 +22,7 @@ type RuntimeLayerSource = |
| 22 | 22 | | typeof httpClientLayer |
| 23 | 23 | | typeof tracingLayer; |
| 24 | 24 | |
| 25 | export const runtimeLayer: Layer.Layer< | |
| 26 | Layer.Success<RuntimeLayerSource>, | |
| 27 | Layer.Error<RuntimeLayerSource> | |
| 28 | > = Layer.merge( | |
| 25 | const runtimeLayer = Layer.merge( | |
| 29 | 26 | managedRelayClientLayer(configuredRelayUrl()), |
| 30 | 27 | Socket.layerWebSocketConstructorGlobal, |
| 31 | 28 | ).pipe( |
| ... | ... | @@ -35,11 +32,11 @@ export const runtimeLayer: Layer.Layer< |
| 35 | 32 | ); |
| 36 | 33 | |
| 37 | 34 | export const runtime: ManagedRuntime.ManagedRuntime< |
| 38 | Layer.Success<typeof runtimeLayer>, | |
| 39 | Layer.Error<typeof runtimeLayer> | |
| 35 | Layer.Success<RuntimeLayerSource>, | |
| 36 | Layer.Error<RuntimeLayerSource> | |
| 40 | 37 | > = ManagedRuntime.make(runtimeLayer); |
| 41 | 38 | |
| 42 | 39 | export const runtimeContextLayer: Layer.Layer< |
| 43 | Layer.Success<typeof runtimeLayer>, | |
| 44 | Layer.Error<typeof runtimeLayer> | |
| 40 | Layer.Success<RuntimeLayerSource>, | |
| 41 | Layer.Error<RuntimeLayerSource> | |
| 45 | 42 | > = Layer.effectContext(runtime.contextEffect); |
apps/mobile/src/state/relay.ts+1-1| ... | ... | @@ -2,5 +2,5 @@ import { createRelayEnvironmentDiscoveryAtoms } from "@t3tools/client-runtime/st |
| 2 | 2 | |
| 3 | 3 | import { connectionAtomRuntime } from "../connection/runtime"; |
| 4 | 4 | |
| 5 | export const relayEnvironmentDiscovery: ReturnType<typeof createRelayEnvironmentDiscoveryAtoms> = | |
| 5 | export const relayEnvironmentDiscovery = | |
| 6 | 6 | createRelayEnvironmentDiscoveryAtoms(connectionAtomRuntime); |
apps/server/src/mcp/McpSessionRegistry.ts+1-5| ... | ... | @@ -191,11 +191,7 @@ const make = Effect.acquireRelease( |
| 191 | 191 | }), |
| 192 | 192 | ); |
| 193 | 193 | |
| 194 | export const layer: Layer.Layer< | |
| 195 | McpSessionRegistry, | |
| 196 | never, | |
| 197 | Crypto.Crypto | ServerEnvironment.ServerEnvironment | HttpServer.HttpServer | |
| 198 | > = Layer.effect(McpSessionRegistry, make); | |
| 194 | export const layer = Layer.effect(McpSessionRegistry, make); | |
| 199 | 195 | |
| 200 | 196 | export const issueActiveMcpCredential = ( |
| 201 | 197 | request: McpCredentialRequest, |
apps/server/src/provider/Layers/ProviderInstanceRegistryHydration.ts+1-5| ... | ... | @@ -114,11 +114,7 @@ export const deriveProviderInstanceConfigMap = ( |
| 114 | 114 | * configs, so the only way the watcher could fail is a settings stream |
| 115 | 115 | * tear-down, which logs and exits cleanly. |
| 116 | 116 | */ |
| 117 | const SettingsWatcherLive: Layer.Layer< | |
| 118 | never, | |
| 119 | never, | |
| 120 | ProviderInstanceRegistryMutator | ServerSettingsService | |
| 121 | > = Layer.effectDiscard( | |
| 117 | const SettingsWatcherLive = Layer.effectDiscard( | |
| 122 | 118 | Effect.gen(function* () { |
| 123 | 119 | const mutator = yield* ProviderInstanceRegistryMutator; |
| 124 | 120 | const serverSettings = yield* ServerSettingsService; |
apps/web/src/cloud/dpop.ts+34-37| ... | ... | @@ -107,43 +107,40 @@ export function writeStoredBrowserDpopKey( |
| 107 | 107 | ); |
| 108 | 108 | } |
| 109 | 109 | |
| 110 | export const generateBrowserDpopKey: Effect.Effect<BrowserDpopKey, BrowserDpopError> = Effect.gen( | |
| 111 | function* () { | |
| 112 | const generated = yield* Effect.tryPromise({ | |
| 113 | try: () => | |
| 114 | crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, true, [ | |
| 115 | "sign", | |
| 116 | "verify", | |
| 117 | ]) as Promise<CryptoKeyPair>, | |
| 118 | catch: (cause) => dpopError("Could not generate DPoP proof key.", cause), | |
| 119 | }); | |
| 120 | const privateJwk = yield* Effect.tryPromise({ | |
| 121 | try: () => crypto.subtle.exportKey("jwk", generated.privateKey), | |
| 122 | catch: (cause) => dpopError("Could not export DPoP private key.", cause), | |
| 123 | }); | |
| 124 | const publicJwk = yield* Effect.tryPromise({ | |
| 125 | try: () => crypto.subtle.exportKey("jwk", generated.publicKey), | |
| 126 | catch: (cause) => dpopError("Could not export DPoP public key.", cause), | |
| 127 | }).pipe( | |
| 128 | Effect.flatMap((jwk) => decodeDpopPublicJwk(jwk)), | |
| 129 | Effect.mapError((cause) => | |
| 130 | cause instanceof BrowserDpopError | |
| 131 | ? cause | |
| 132 | : dpopError("Generated DPoP public key is invalid.", cause), | |
| 133 | ), | |
| 134 | ); | |
| 135 | const privateKey = yield* Effect.tryPromise({ | |
| 136 | try: () => | |
| 137 | importJWK(privateJwk as JWK, "ES256", { extractable: false }) as Promise<CryptoKey>, | |
| 138 | catch: (cause) => dpopError("Could not import DPoP private key.", cause), | |
| 139 | }); | |
| 140 | return { | |
| 141 | privateKey, | |
| 142 | publicJwk, | |
| 143 | thumbprint: computeDpopJwkThumbprint(publicJwk), | |
| 144 | }; | |
| 145 | }, | |
| 146 | ); | |
| 110 | export const generateBrowserDpopKey = Effect.gen(function* () { | |
| 111 | const generated = yield* Effect.tryPromise({ | |
| 112 | try: () => | |
| 113 | crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, true, [ | |
| 114 | "sign", | |
| 115 | "verify", | |
| 116 | ]) as Promise<CryptoKeyPair>, | |
| 117 | catch: (cause) => dpopError("Could not generate DPoP proof key.", cause), | |
| 118 | }); | |
| 119 | const privateJwk = yield* Effect.tryPromise({ | |
| 120 | try: () => crypto.subtle.exportKey("jwk", generated.privateKey), | |
| 121 | catch: (cause) => dpopError("Could not export DPoP private key.", cause), | |
| 122 | }); | |
| 123 | const publicJwk = yield* Effect.tryPromise({ | |
| 124 | try: () => crypto.subtle.exportKey("jwk", generated.publicKey), | |
| 125 | catch: (cause) => dpopError("Could not export DPoP public key.", cause), | |
| 126 | }).pipe( | |
| 127 | Effect.flatMap((jwk) => decodeDpopPublicJwk(jwk)), | |
| 128 | Effect.mapError((cause) => | |
| 129 | cause instanceof BrowserDpopError | |
| 130 | ? cause | |
| 131 | : dpopError("Generated DPoP public key is invalid.", cause), | |
| 132 | ), | |
| 133 | ); | |
| 134 | const privateKey = yield* Effect.tryPromise({ | |
| 135 | try: () => importJWK(privateJwk as JWK, "ES256", { extractable: false }) as Promise<CryptoKey>, | |
| 136 | catch: (cause) => dpopError("Could not import DPoP private key.", cause), | |
| 137 | }); | |
| 138 | return { | |
| 139 | privateKey, | |
| 140 | publicJwk, | |
| 141 | thumbprint: computeDpopJwkThumbprint(publicJwk), | |
| 142 | }; | |
| 143 | }); | |
| 147 | 144 | |
| 148 | 145 | export function createBrowserDpopProof(input: { |
| 149 | 146 | readonly method: string; |
apps/web/src/connection/runtime.ts+7-11| ... | ... | @@ -5,24 +5,20 @@ import { Atom } from "effect/unstable/reactivity"; |
| 5 | 5 | import { runtimeContextLayer } from "../lib/runtime"; |
| 6 | 6 | import { connectionPlatformLayer } from "./platform"; |
| 7 | 7 | |
| 8 | const providedConnectionPlatformLayer: Layer.Layer< | |
| 9 | Layer.Success<typeof connectionPlatformLayer>, | |
| 10 | Layer.Error<typeof connectionPlatformLayer> | |
| 11 | > = connectionPlatformLayer.pipe(Layer.provide(runtimeContextLayer)); | |
| 8 | const providedConnectionPlatformLayer = connectionPlatformLayer.pipe( | |
| 9 | Layer.provide(runtimeContextLayer), | |
| 10 | ); | |
| 12 | 11 | |
| 13 | 12 | type ConnectionLayerSource = |
| 14 | 13 | | typeof Connection.layer |
| 15 | 14 | | typeof runtimeContextLayer |
| 16 | | typeof providedConnectionPlatformLayer; | |
| 15 | | typeof connectionPlatformLayer; | |
| 17 | 16 | |
| 18 | export const connectionLayer: Layer.Layer< | |
| 19 | Layer.Success<ConnectionLayerSource>, | |
| 20 | Layer.Error<ConnectionLayerSource> | |
| 21 | > = Connection.layer.pipe( | |
| 17 | const connectionLayer = Connection.layer.pipe( | |
| 22 | 18 | Layer.provideMerge(Layer.mergeAll(runtimeContextLayer, providedConnectionPlatformLayer)), |
| 23 | 19 | ); |
| 24 | 20 | |
| 25 | 21 | export const connectionAtomRuntime: Atom.AtomRuntime< |
| 26 | Layer.Success<typeof connectionLayer>, | |
| 27 | Layer.Error<typeof connectionLayer> | |
| 22 | Layer.Success<ConnectionLayerSource>, | |
| 23 | Layer.Error<ConnectionLayerSource> | |
| 28 | 24 | > = Atom.runtime(connectionLayer); |
apps/web/src/lib/runtime.ts+5-8| ... | ... | @@ -54,10 +54,7 @@ export function __setPrimaryHttpRunnerForTests(runner?: PrimaryHttpEffectRunner) |
| 54 | 54 | primaryHttpRunner = runner ?? livePrimaryHttpRunner; |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | export const runtimeLayer: Layer.Layer< | |
| 58 | Layer.Success<RuntimeLayerSource>, | |
| 59 | Layer.Error<RuntimeLayerSource> | |
| 60 | > = Layer.mergeAll( | |
| 57 | const runtimeLayer = Layer.mergeAll( | |
| 61 | 58 | httpClientLayer, |
| 62 | 59 | browserCryptoLayer, |
| 63 | 60 | Socket.layerWebSocketConstructorGlobal, |
| ... | ... | @@ -68,11 +65,11 @@ export const runtimeLayer: Layer.Layer< |
| 68 | 65 | ); |
| 69 | 66 | |
| 70 | 67 | export const runtime: ManagedRuntime.ManagedRuntime< |
| 71 | Layer.Success<typeof runtimeLayer>, | |
| 72 | Layer.Error<typeof runtimeLayer> | |
| 68 | Layer.Success<RuntimeLayerSource>, | |
| 69 | Layer.Error<RuntimeLayerSource> | |
| 73 | 70 | > = ManagedRuntime.make(runtimeLayer); |
| 74 | 71 | |
| 75 | 72 | export const runtimeContextLayer: Layer.Layer< |
| 76 | Layer.Success<typeof runtimeLayer>, | |
| 77 | Layer.Error<typeof runtimeLayer> | |
| 73 | Layer.Success<RuntimeLayerSource>, | |
| 74 | Layer.Error<RuntimeLayerSource> | |
| 78 | 75 | > = Layer.effectContext(runtime.contextEffect); |
packages/client-runtime/src/rpc/client.ts+2-7| ... | ... | @@ -1,4 +1,4 @@ |
| 1 | import { ORCHESTRATION_WS_METHODS, type ServerConfig, WS_METHODS } from "@t3tools/contracts"; | |
| 1 | import { ORCHESTRATION_WS_METHODS, WS_METHODS } from "@t3tools/contracts"; | |
| 2 | 2 | import * as Cause from "effect/Cause"; |
| 3 | 3 | import * as Context from "effect/Context"; |
| 4 | 4 | import type * as Duration from "effect/Duration"; |
| ... | ... | @@ -9,7 +9,6 @@ import * as Stream from "effect/Stream"; |
| 9 | 9 | import * as SubscriptionRef from "effect/SubscriptionRef"; |
| 10 | 10 | import { RpcClientError } from "effect/unstable/rpc"; |
| 11 | 11 | |
| 12 | import type { ConnectionAttemptError } from "../connection/model.ts"; | |
| 13 | 12 | import { EnvironmentSupervisor } from "../connection/supervisor.ts"; |
| 14 | 13 | import type { WsRpcProtocolClient } from "../rpc/protocol.ts"; |
| 15 | 14 | |
| ... | ... | @@ -237,11 +236,7 @@ export function subscribe<TTag extends EnvironmentSubscriptionRpcTag>( |
| 237 | 236 | ); |
| 238 | 237 | } |
| 239 | 238 | |
| 240 | export const config: Effect.Effect< | |
| 241 | ServerConfig, | |
| 242 | EnvironmentRpcUnavailableError | ConnectionAttemptError, | |
| 243 | EnvironmentSupervisor | |
| 244 | > = Effect.gen(function* () { | |
| 239 | export const config = Effect.gen(function* () { | |
| 245 | 240 | const session = yield* currentSession(); |
| 246 | 241 | return yield* session.initialConfig; |
| 247 | 242 | }).pipe(Effect.withSpan("EnvironmentRpc.config")); |
packages/tailscale/src/tailscale.ts+1-5| ... | ... | @@ -135,11 +135,7 @@ export const parseTailscaleStatus = ( |
| 135 | 135 | }), |
| 136 | 136 | ); |
| 137 | 137 | |
| 138 | export const readTailscaleStatus: Effect.Effect< | |
| 139 | TailscaleStatus, | |
| 140 | TailscaleCommandError | TailscaleStatusParseError, | |
| 141 | ChildProcessSpawner.ChildProcessSpawner | |
| 142 | > = Effect.gen(function* () { | |
| 138 | export const readTailscaleStatus = Effect.gen(function* () { | |
| 143 | 139 | const args = ["status", "--json"]; |
| 144 | 140 | const spawner = yield* ChildProcessSpawner.ChildProcessSpawner; |
| 145 | 141 | const hostPlatform = yield* HostProcessPlatform; |