import { EnvironmentId, OrchestrationV2ShellSnapshotJson, OrchestrationV2ThreadDetailSnapshot, OrchestrationV2ThreadProjectionJson, ThreadId, } from "@t3tools/contracts"; import * as Effect from "effect/Effect"; import * as Option from "effect/Option"; import * as Schema from "effect/Schema"; export const ORCHESTRATION_CACHE_SCHEMA_VERSION = 3 as const; export const StoredOrchestrationShellSnapshot = Schema.Struct({ schemaVersion: Schema.Literal(ORCHESTRATION_CACHE_SCHEMA_VERSION), environmentId: EnvironmentId, snapshot: OrchestrationV2ShellSnapshotJson, }); export const StoredOrchestrationThreadSnapshot = Schema.Struct({ schemaVersion: Schema.Literal(ORCHESTRATION_CACHE_SCHEMA_VERSION), environmentId: EnvironmentId, threadId: ThreadId, snapshot: OrchestrationV2ThreadDetailSnapshot.mapFields((fields) => ({ ...fields, projection: OrchestrationV2ThreadProjectionJson, })), }); /** Invalid orchestration caches are disposable and must never block live synchronization. */ export function decodeOrDiscardOrchestrationCache( decode: Effect.Effect, E, R>, discard: Effect.Effect, ) { return decode.pipe(Effect.catch(() => discard.pipe(Effect.as(Option.none())))); }