import { Layer, ManagedRuntime } from "effect";import { FetchHttpClient } from "effect/unstable/http";import { NodeFileSystem } from "@effect/platform-node"; import { IntegrationsRegistry, integrationsRegistryLayer,} from "@executor-js/integrations-registry"; import { USER_AGENT } from "./installation"; // Module-singleton runtime for the integrations.sh registry. The layer's// scoped fork fetches the registry at startup and refreshes on a 12-hour// cadence for the runtime's lifetime. Shared across every long-running// apps/local surface (HTTP server, stdio MCP) so concurrent surfaces don't// each spin up their own refresh fork.const integrationsRuntime = ManagedRuntime.make( integrationsRegistryLayer({ userAgent: USER_AGENT }).pipe( Layer.provide(FetchHttpClient.layer), Layer.provide(NodeFileSystem.layer), ),); /** * Idempotently trigger the registry layer to build, which forks the boot * fetch and recurring refresh into the runtime's scope. Fire-and-forget: * returns immediately, never throws, never blocks the caller. Failures are * absorbed inside the forked fiber and the layer's catchCause handlers. */export const startIntegrationsRefresh = (): void => { integrationsRuntime.runFork(IntegrationsRegistry.asEffect());};import { Layer, ManagedRuntime } from "effect";
import { FetchHttpClient } from "effect/unstable/http";
import { NodeFileSystem } from "@effect/platform-node";
import {
IntegrationsRegistry,
integrationsRegistryLayer,
} from "@executor-js/integrations-registry";
import { USER_AGENT } from "./installation";
// Module-singleton runtime for the integrations.sh registry. The layer's
// scoped fork fetches the registry at startup and refreshes on a 12-hour
// cadence for the runtime's lifetime. Shared across every long-running
// apps/local surface (HTTP server, stdio MCP) so concurrent surfaces don't
// each spin up their own refresh fork.
const integrationsRuntime = ManagedRuntime.make(
integrationsRegistryLayer({ userAgent: USER_AGENT }).pipe(
Layer.provide(FetchHttpClient.layer),
Layer.provide(NodeFileSystem.layer),
),
);
/**
* Idempotently trigger the registry layer to build, which forks the boot
* fetch and recurring refresh into the runtime's scope. Fire-and-forget:
* returns immediately, never throws, never blocks the caller. Failures are
* absorbed inside the forked fiber and the layer's catchCause handlers.
*/
export const startIntegrationsRefresh = (): void => {
integrationsRuntime.runFork(IntegrationsRegistry.asEffect());
};