300 lines · 9.1 KB · TypeScript
RawDownload
import * as NodeServices from "@effect/platform-node/NodeServices";import {  defaultInstanceIdForDriver,  ProviderDriverKind,  ProviderInstanceId,  type ServerProvider,} from "@t3tools/contracts";import { createModelCapabilities } from "@t3tools/shared/model";import { assert, it } from "@effect/vitest";import * as Effect from "effect/Effect";import * as FileSystem from "effect/FileSystem";import * as Logger from "effect/Logger"; import {  hydrateCachedProvider,  isCachedProviderCorrelated,  readProviderStatusCache,  resolveProviderStatusCachePath,  writeProviderStatusCache,} from "./providerStatusCache.ts"; const emptyCapabilities = createModelCapabilities({ optionDescriptors: [] });const CODEX_DRIVER = ProviderDriverKind.make("codex");const CLAUDE_AGENT_DRIVER = ProviderDriverKind.make("claudeAgent");const OPENCODE_DRIVER = ProviderDriverKind.make("opencode"); const makeProvider = (  provider: ProviderDriverKind,  overrides?: Partial<ServerProvider>,): ServerProvider => ({  instanceId: defaultInstanceIdForDriver(provider),  driver: provider,  enabled: true,  installed: true,  version: "1.0.0",  status: "ready",  auth: { status: "authenticated" },  checkedAt: "2026-04-11T00:00:00.000Z",  models: [],  slashCommands: [],  skills: [],  ...overrides,}); it.layer(NodeServices.layer)("providerStatusCache", (it) => {  it.effect("logs structural diagnostics without retaining invalid cache contents", () => {    const messages: Array<unknown> = [];    const logger = Logger.make<unknown, void>((options) => {      if (Array.isArray(options.message)) {        messages.push(...options.message);      } else {        messages.push(options.message);      }    });     return Effect.gen(function* () {      const fs = yield* FileSystem.FileSystem;      const tempDir = yield* fs.makeTempDirectoryScoped({ prefix: "t3-provider-cache-invalid-" });      const cachePath = `${tempDir}/provider.json`;      const secretCacheValue = "secret-cache-value";      yield* fs.writeFileString(cachePath, `{ "token": "${secretCacheValue}" }`);       const result = yield* readProviderStatusCache(cachePath);       assert.strictEqual(result, undefined);      const failure = messages.find(        (message): message is Record<string, unknown> =>          typeof message === "object" && message !== null && "path" in message,      );      assert.exists(failure);      assert.strictEqual(failure.path, cachePath);      assert.strictEqual(typeof failure.errorTag, "string");      assert.ok(!("cause" in failure));      assert.ok(!("issues" in failure));      assert.ok(!Object.values(failure).map(String).join("\n").includes(secretCacheValue));    }).pipe(Effect.provide(Logger.layer([logger], { mergeWithExisting: false })));  });   it.effect("writes and reads provider status snapshots", () =>    Effect.gen(function* () {      const fs = yield* FileSystem.FileSystem;      const tempDir = yield* fs.makeTempDirectoryScoped({ prefix: "t3-provider-cache-" });      const codexProvider = makeProvider(CODEX_DRIVER);      const claudeProvider = makeProvider(CLAUDE_AGENT_DRIVER, {        status: "warning",        auth: { status: "unknown" },      });      const openCodeProvider = makeProvider(OPENCODE_DRIVER, {        status: "warning",        auth: { status: "unknown", type: "opencode" },      });      const codexPath = yield* resolveProviderStatusCachePath({        cacheDir: tempDir,        instanceId: defaultInstanceIdForDriver(ProviderDriverKind.make("codex")),      });      const claudePath = yield* resolveProviderStatusCachePath({        cacheDir: tempDir,        instanceId: defaultInstanceIdForDriver(ProviderDriverKind.make("claudeAgent")),      });      const openCodePath = yield* resolveProviderStatusCachePath({        cacheDir: tempDir,        instanceId: defaultInstanceIdForDriver(ProviderDriverKind.make("opencode")),      });       yield* writeProviderStatusCache({        filePath: codexPath,        provider: codexProvider,      });      yield* writeProviderStatusCache({        filePath: claudePath,        provider: claudeProvider,      });      yield* writeProviderStatusCache({        filePath: openCodePath,        provider: openCodeProvider,      });       assert.deepStrictEqual(yield* readProviderStatusCache(codexPath), codexProvider);      assert.deepStrictEqual(yield* readProviderStatusCache(claudePath), claudeProvider);      assert.deepStrictEqual(yield* readProviderStatusCache(openCodePath), openCodeProvider);    }),  );   it("hydrates cached provider status while preserving current settings-derived models", () => {    const cachedCodex = makeProvider(CODEX_DRIVER, {      checkedAt: "2026-04-10T12:00:00.000Z",      models: [        {          slug: "gpt-5-mini",          name: "GPT-5 Mini",          isCustom: false,          capabilities: emptyCapabilities,        },      ],      message: "Cached message",      skills: [        {          name: "github:gh-fix-ci",          path: "/tmp/skills/gh-fix-ci/SKILL.md",          enabled: true,          displayName: "CI Debug",        },      ],    });    const fallbackCodex = makeProvider(CODEX_DRIVER, {      models: [        {          slug: "gpt-5.4",          name: "GPT-5.4",          isCustom: false,          capabilities: emptyCapabilities,        },      ],      message: "Pending refresh",    });     assert.deepStrictEqual(      hydrateCachedProvider({        cachedProvider: cachedCodex,        fallbackProvider: fallbackCodex,      }),      {        ...fallbackCodex,        models: [          ...fallbackCodex.models,          {            slug: "gpt-5-mini",            name: "GPT-5 Mini",            isCustom: false,            capabilities: emptyCapabilities,          },        ],        installed: cachedCodex.installed,        version: cachedCodex.version,        status: cachedCodex.status,        auth: cachedCodex.auth,        checkedAt: cachedCodex.checkedAt,        slashCommands: cachedCodex.slashCommands,        skills: cachedCodex.skills,        message: cachedCodex.message,      },    );  });   it("does not resurrect cached custom models that settings no longer declare", () => {    const builtIn = {      slug: "gpt-5.4",      name: "GPT-5.4",      isCustom: false,      capabilities: emptyCapabilities,    } as const;    const cachedCodex = makeProvider(CODEX_DRIVER, {      models: [        builtIn,        {          slug: "removed-custom",          name: "removed-custom",          isCustom: true,          capabilities: emptyCapabilities,        },      ],    });    const fallbackCodex = makeProvider(CODEX_DRIVER, { models: [builtIn] });     assert.deepStrictEqual(      hydrateCachedProvider({        cachedProvider: cachedCodex,        fallbackProvider: fallbackCodex,      }).models,      [builtIn],    );  });   it("ignores stale cached enabled state when the provider is now disabled", () => {    const cachedCodex = makeProvider(CODEX_DRIVER, {      checkedAt: "2026-04-10T12:00:00.000Z",      message: "Cached ready status",    });    const disabledFallback = makeProvider(CODEX_DRIVER, {      enabled: false,      installed: false,      version: null,      status: "disabled",      auth: { status: "unknown" },      message: "Codex is disabled in T3 Code settings.",    });     assert.deepStrictEqual(      hydrateCachedProvider({        cachedProvider: cachedCodex,        fallbackProvider: disabledFallback,      }),      disabledFallback,    );  });   it("rejects cached snapshots that are not correlated to the fallback instance", () => {    const fallbackCodex = makeProvider(CODEX_DRIVER, {      models: [        {          slug: "gpt-5.4",          name: "GPT-5.4",          isCustom: false,          capabilities: emptyCapabilities,        },      ],    });    const legacyCachedCodex = {      provider: ProviderDriverKind.make("codex"),      enabled: true,      installed: true,      version: "1.0.0",      status: "ready",      auth: { status: "authenticated" },      checkedAt: "2026-04-10T12:00:00.000Z",      models: [        {          slug: "cached-legacy-model",          name: "Cached Legacy Model",          isCustom: false,          capabilities: emptyCapabilities,        },      ],      slashCommands: [],      skills: [],    } as unknown as ServerProvider;    const mismatchedCachedCodex = makeProvider(CODEX_DRIVER, {      instanceId: ProviderInstanceId.make("codex_personal"),    });     assert.strictEqual(      isCachedProviderCorrelated({        cachedProvider: legacyCachedCodex,        fallbackProvider: fallbackCodex,      }),      false,    );    assert.deepStrictEqual(      hydrateCachedProvider({        cachedProvider: legacyCachedCodex,        fallbackProvider: fallbackCodex,      }),      fallbackCodex,    );    assert.strictEqual(      isCachedProviderCorrelated({        cachedProvider: mismatchedCachedCodex,        fallbackProvider: fallbackCodex,      }),      false,    );    assert.deepStrictEqual(      hydrateCachedProvider({        cachedProvider: mismatchedCachedCodex,        fallbackProvider: fallbackCodex,      }),      fallbackCodex,    );  });});