Skip to content
Source
Sign inSign up
Open History to see the last commit

unavailableProviderSnapshot.ts

55 lines1.7 KB

1import {
2 ProviderDriverKind,
3 type ProviderInstanceId,
4 type ServerProvider,
5} from "@t3tools/contracts";
6import * as DateTime from "effect/DateTime";
7import * as Effect from "effect/Effect";
8​
9import { buildServerProvider } from "@t3tools/provider-core/server/snapshotProbe";
10​
11export interface UnavailableProviderSnapshotInput {
12 readonly driverKind: ProviderDriverKind | string;
13 readonly instanceId: ProviderInstanceId;
14 readonly displayName?: string | undefined;
15 readonly accentColor?: string | undefined;
16 readonly reason: string;
17 readonly checkedAt?: string;
19​
20const nowIso = Effect.map(DateTime.now, DateTime.formatIso);
21​
22export const buildUnavailableProviderSnapshot = Effect.fn(
23 "unavailableProviderSnapshot.buildUnavailableProviderSnapshot",
24)(function* (input: UnavailableProviderSnapshotInput): Effect.fn.Return<ServerProvider> {
25 const checkedAt = input.checkedAt ?? (yield* nowIso);
26 const displayName = input.displayName?.trim() || (input.driverKind as string);
27​
28 // No driver ran, so its setup capabilities are still unknown.
29 const { setup: _setup, ...base } = buildServerProvider({
30 presentation: { displayName },
31 enabled: false,
32 checkedAt,
33 models: [],
34 skills: [],
35 probe: {
36 installed: false,
37 version: null,
38 status: "error",
39 auth: { status: "unknown" },
40 message: input.reason,
41 },
42 });
43​
44 return {
45 ...base,
46 instanceId: input.instanceId,
47 ...(input.accentColor ? { accentColor: input.accentColor } : {}),
48 driver:
49 typeof input.driverKind === "string"
50 ? ProviderDriverKind.make(input.driverKind)
51 : input.driverKind,
52 availability: "unavailable",
53 unavailableReason: input.reason,
54 };
55});