import { type EnvironmentId, type OrchestrationShellSnapshot, type OrchestrationThreadDetailSnapshot, type ServerConfig, type ThreadId, type VcsListRefsResult, } from "@t3tools/contracts"; import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Option from "effect/Option"; import * as Schema from "effect/Schema"; import type { ConnectionRegistration } from "../connection/catalog.ts"; import type { ConnectionTarget } from "../connection/model.ts"; export class ConnectionPersistenceError extends Schema.TaggedError()( "ConnectionPersistenceError", { operation: Schema.Literals([ "list-targets", "register-connection", "remove-connection", "load-shell", "save-shell", "load-thread", "save-thread", "remove-thread", "load-server-config", "save-server-config", "load-vcs-refs", "save-vcs-refs", "remove-vcs-refs", "clear-vcs-refs", "clear-environment", ]), message: Schema.String, }, ) {} export class ConnectionTargetStore extends Context.Service< ConnectionTargetStore, { readonly list: Effect.Effect, ConnectionPersistenceError>; } >()("@t3tools/client-runtime/platform/persistence/ConnectionTargetStore") {} export class ConnectionRegistrationStore extends Context.Service< ConnectionRegistrationStore, { readonly register: ( registration: ConnectionRegistration, ) => Effect.Effect; readonly remove: (target: ConnectionTarget) => Effect.Effect; } >()("@t3tools/client-runtime/platform/persistence/ConnectionRegistrationStore") {} export class EnvironmentCacheStore extends Context.Service< EnvironmentCacheStore, { readonly loadShell: ( environmentId: EnvironmentId, ) => Effect.Effect, ConnectionPersistenceError>; readonly saveShell: ( environmentId: EnvironmentId, snapshot: OrchestrationShellSnapshot, ) => Effect.Effect; readonly loadThread: ( environmentId: EnvironmentId, threadId: ThreadId, ) => Effect.Effect< Option.Option, ConnectionPersistenceError >; readonly saveThread: ( environmentId: EnvironmentId, snapshot: OrchestrationThreadDetailSnapshot, ) => Effect.Effect; readonly removeThread: ( environmentId: EnvironmentId, threadId: ThreadId, ) => Effect.Effect; /** * The last complete server configuration. This deliberately includes provider * metadata so offline task creation can still offer the models a user last saw. */ readonly loadServerConfig: ( environmentId: EnvironmentId, ) => Effect.Effect, ConnectionPersistenceError>; readonly saveServerConfig: ( environmentId: EnvironmentId, config: ServerConfig, ) => Effect.Effect; /** * The unfiltered branch list for a workspace. Query-specific lists are not * cached because they are incomplete and unsafe to present as a full picker. */ readonly loadVcsRefs: ( environmentId: EnvironmentId, cwd: string, ) => Effect.Effect, ConnectionPersistenceError>; readonly saveVcsRefs: ( environmentId: EnvironmentId, cwd: string, refs: VcsListRefsResult, ) => Effect.Effect; readonly removeVcsRefs: ( environmentId: EnvironmentId, cwd: string, ) => Effect.Effect; /** * Removes every persisted branch-list snapshot for an environment. Git ref * mutations are repository-wide, and linked worktrees may have cached the * same refs under different working-directory keys. */ readonly clearVcsRefs: ( environmentId: EnvironmentId, ) => Effect.Effect; readonly clear: ( environmentId: EnvironmentId, ) => Effect.Effect; } >()("@t3tools/client-runtime/platform/persistence/EnvironmentCacheStore") {} export class EnvironmentOwnedDataCleanup extends Context.Reference<{ readonly clear: (environmentId: EnvironmentId) => Effect.Effect; }>("@t3tools/client-runtime/platform/persistence/EnvironmentOwnedDataCleanup", { defaultValue: () => ({ clear: () => Effect.void, }), }) {}