diff options
| author | Adam Malczewski <[email protected]> | 2026-06-26 22:03:19 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-26 22:23:39 +0900 |
| commit | 727c98c9dae516a2070eb950410314380a20c974 (patch) | |
| tree | 52aa1022c54f11770be7e4e2a324f0a8b8b8deec /packages/credential-store/src | |
| parent | e59dc11f63b1df51142259bb2c406af8c9c8c2bb (diff) | |
| download | dispatch-727c98c9dae516a2070eb950410314380a20c974.tar.gz dispatch-727c98c9dae516a2070eb950410314380a20c974.zip | |
style: switch from tabs to 2-space indentation
Diffstat (limited to 'packages/credential-store/src')
| -rw-r--r-- | packages/credential-store/src/extension.ts | 36 | ||||
| -rw-r--r-- | packages/credential-store/src/index.ts | 8 | ||||
| -rw-r--r-- | packages/credential-store/src/registry.test.ts | 118 | ||||
| -rw-r--r-- | packages/credential-store/src/registry.ts | 176 |
4 files changed, 169 insertions, 169 deletions
diff --git a/packages/credential-store/src/extension.ts b/packages/credential-store/src/extension.ts index 8f2a826..9cfae14 100644 --- a/packages/credential-store/src/extension.ts +++ b/packages/credential-store/src/extension.ts @@ -4,26 +4,26 @@ import { createCredentialStore } from "./registry.js"; import { credentialStoreHandle } from "./service.js"; export const manifest: Manifest = { - id: "credential-store", - name: "Credential Store", - version: "0.0.0", - apiVersion: "^0.1.0", - trust: "bundled", - activation: "eager", - contributes: { services: ["credential-store/registry"] }, + id: "credential-store", + name: "Credential Store", + version: "0.0.0", + apiVersion: "^0.1.0", + trust: "bundled", + activation: "eager", + contributes: { services: ["credential-store/registry"] }, }; export function createCredentialStoreExtension(deps: { - credentials: readonly Credential[]; + credentials: readonly Credential[]; }): Extension { - return { - manifest, - activate(host) { - const store = createCredentialStore({ - credentials: deps.credentials, - getProvider: (id) => host.getProviders().get(id), - }); - host.provideService(credentialStoreHandle, store); - }, - }; + return { + manifest, + activate(host) { + const store = createCredentialStore({ + credentials: deps.credentials, + getProvider: (id) => host.getProviders().get(id), + }); + host.provideService(credentialStoreHandle, store); + }, + }; } diff --git a/packages/credential-store/src/index.ts b/packages/credential-store/src/index.ts index 749abed..010cf1c 100644 --- a/packages/credential-store/src/index.ts +++ b/packages/credential-store/src/index.ts @@ -1,9 +1,9 @@ export { createCredentialStoreExtension, manifest } from "./extension.js"; export type { - Credential, - CredentialStore, - CredentialStoreDeps, - ResolvedModel, + Credential, + CredentialStore, + CredentialStoreDeps, + ResolvedModel, } from "./registry.js"; export { createCredentialStore } from "./registry.js"; export { credentialStoreHandle } from "./service.js"; diff --git a/packages/credential-store/src/registry.test.ts b/packages/credential-store/src/registry.test.ts index e67b5d4..8edae0c 100644 --- a/packages/credential-store/src/registry.test.ts +++ b/packages/credential-store/src/registry.test.ts @@ -3,79 +3,79 @@ import { describe, expect, it } from "vitest"; import { createCredentialStore } from "./registry.js"; function fakeProvider( - id: string, - listModels?: () => Promise<readonly { id: string }[]>, + id: string, + listModels?: () => Promise<readonly { id: string }[]>, ): ProviderContract { - return { - id, - stream: async function* () {}, - ...(listModels ? { listModels } : {}), - }; + return { + id, + stream: async function* () {}, + ...(listModels ? { listModels } : {}), + }; } describe("createCredentialStore", () => { - const credentials = [{ name: "opencode", providerId: "openai-compat" }]; - const providers = new Map<string, ProviderContract>(); + const credentials = [{ name: "opencode", providerId: "openai-compat" }]; + const providers = new Map<string, ProviderContract>(); - const store = createCredentialStore({ - credentials, - getProvider: (id) => providers.get(id), - }); + const store = createCredentialStore({ + credentials, + getProvider: (id) => providers.get(id), + }); - describe("resolve", () => { - it("resolves a simple model name", () => { - providers.set("openai-compat", fakeProvider("openai-compat")); - const result = store.resolve("opencode/deepseek-v4-flash"); - expect(result).toEqual({ providerId: "openai-compat", model: "deepseek-v4-flash" }); - }); + describe("resolve", () => { + it("resolves a simple model name", () => { + providers.set("openai-compat", fakeProvider("openai-compat")); + const result = store.resolve("opencode/deepseek-v4-flash"); + expect(result).toEqual({ providerId: "openai-compat", model: "deepseek-v4-flash" }); + }); - it("resolves a model name with slashes", () => { - const result = store.resolve("opencode/a/b"); - expect(result).toEqual({ providerId: "openai-compat", model: "a/b" }); - }); + it("resolves a model name with slashes", () => { + const result = store.resolve("opencode/a/b"); + expect(result).toEqual({ providerId: "openai-compat", model: "a/b" }); + }); - it("returns undefined for unknown credential name", () => { - const result = store.resolve("unknown/x"); - expect(result).toBeUndefined(); - }); + it("returns undefined for unknown credential name", () => { + const result = store.resolve("unknown/x"); + expect(result).toBeUndefined(); + }); - it("returns undefined for no slash", () => { - const result = store.resolve("noslash"); - expect(result).toBeUndefined(); - }); + it("returns undefined for no slash", () => { + const result = store.resolve("noslash"); + expect(result).toBeUndefined(); + }); - it("returns undefined for empty model segment", () => { - const result = store.resolve("opencode/"); - expect(result).toBeUndefined(); - }); - }); + it("returns undefined for empty model segment", () => { + const result = store.resolve("opencode/"); + expect(result).toBeUndefined(); + }); + }); - describe("listCatalog", () => { - it("lists models from providers with listModels", async () => { - providers.set( - "openai-compat", - fakeProvider("openai-compat", async () => [{ id: "m1" }, { id: "m2" }]), - ); + describe("listCatalog", () => { + it("lists models from providers with listModels", async () => { + providers.set( + "openai-compat", + fakeProvider("openai-compat", async () => [{ id: "m1" }, { id: "m2" }]), + ); - const catalog = await store.listCatalog(); - expect(catalog).toEqual(["opencode/m1", "opencode/m2"]); - }); + const catalog = await store.listCatalog(); + expect(catalog).toEqual(["opencode/m1", "opencode/m2"]); + }); - it("skips credentials whose provider has no listModels", async () => { - providers.set("openai-compat", fakeProvider("openai-compat")); + it("skips credentials whose provider has no listModels", async () => { + providers.set("openai-compat", fakeProvider("openai-compat")); - const catalog = await store.listCatalog(); - expect(catalog).toEqual([]); - }); + const catalog = await store.listCatalog(); + expect(catalog).toEqual([]); + }); - it("skips credentials whose provider is missing", async () => { - const emptyStore = createCredentialStore({ - credentials: [{ name: "missing", providerId: "nonexistent" }], - getProvider: () => undefined, - }); + it("skips credentials whose provider is missing", async () => { + const emptyStore = createCredentialStore({ + credentials: [{ name: "missing", providerId: "nonexistent" }], + getProvider: () => undefined, + }); - const catalog = await emptyStore.listCatalog(); - expect(catalog).toEqual([]); - }); - }); + const catalog = await emptyStore.listCatalog(); + expect(catalog).toEqual([]); + }); + }); }); diff --git a/packages/credential-store/src/registry.ts b/packages/credential-store/src/registry.ts index 89d8084..70abf9a 100644 --- a/packages/credential-store/src/registry.ts +++ b/packages/credential-store/src/registry.ts @@ -1,104 +1,104 @@ import type { ModelInfo, ProviderContract } from "@dispatch/kernel"; export interface Credential { - readonly name: string; - readonly providerId: string; + readonly name: string; + readonly providerId: string; } export interface ResolvedModel { - readonly providerId: string; - readonly model: string; + readonly providerId: string; + readonly model: string; } export interface CredentialStore { - /** - * Split a model name on the FIRST "/": name=before, model=after (model may contain "/"). - * Look up the credential by name; return its providerId + the model id, or undefined if - * the name is unknown or there is no model segment. - */ - resolve(modelName: string): ResolvedModel | undefined; - - /** - * The model catalog: for each credential, look up its provider and call listModels(), - * emitting `${credential.name}/${modelInfo.id}`. Skip credentials whose provider is - * missing or has no listModels. - */ - listCatalog(): Promise<readonly string[]>; - - /** - * Returns the full `ModelInfo` for a `<credentialName>/<model>` string, or - * undefined if unknown. Caches the result of `listModels` per credential. - * Used to look up `contextWindow` for auto-compaction. - */ - getModelInfo(modelName: string): Promise<ModelInfo | undefined>; + /** + * Split a model name on the FIRST "/": name=before, model=after (model may contain "/"). + * Look up the credential by name; return its providerId + the model id, or undefined if + * the name is unknown or there is no model segment. + */ + resolve(modelName: string): ResolvedModel | undefined; + + /** + * The model catalog: for each credential, look up its provider and call listModels(), + * emitting `${credential.name}/${modelInfo.id}`. Skip credentials whose provider is + * missing or has no listModels. + */ + listCatalog(): Promise<readonly string[]>; + + /** + * Returns the full `ModelInfo` for a `<credentialName>/<model>` string, or + * undefined if unknown. Caches the result of `listModels` per credential. + * Used to look up `contextWindow` for auto-compaction. + */ + getModelInfo(modelName: string): Promise<ModelInfo | undefined>; } export interface CredentialStoreDeps { - readonly credentials: readonly Credential[]; - readonly getProvider: (id: string) => ProviderContract | undefined; + readonly credentials: readonly Credential[]; + readonly getProvider: (id: string) => ProviderContract | undefined; } export function createCredentialStore(deps: CredentialStoreDeps): CredentialStore { - const credentialMap = new Map<string, string>(); - for (const credential of deps.credentials) { - credentialMap.set(credential.name, credential.providerId); - } - - return { - resolve(modelName: string): ResolvedModel | undefined { - const slashIndex = modelName.indexOf("/"); - if (slashIndex === -1) { - return undefined; - } - - const credentialName = modelName.slice(0, slashIndex); - const model = modelName.slice(slashIndex + 1); - - if (!model) { - return undefined; - } - - const providerId = credentialMap.get(credentialName); - if (!providerId) { - return undefined; - } - - return { providerId, model }; - }, - - async listCatalog(): Promise<readonly string[]> { - const results: string[] = []; - - for (const credential of deps.credentials) { - const provider = deps.getProvider(credential.providerId); - if (!provider?.listModels) { - continue; - } - - const models = await provider.listModels(); - for (const model of models) { - results.push(`${credential.name}/${model.id}`); - } - } - - return results; - }, - - async getModelInfo(modelName: string): Promise<ModelInfo | undefined> { - const slashIndex = modelName.indexOf("/"); - if (slashIndex === -1) return undefined; - const credentialName = modelName.slice(0, slashIndex); - const modelId = modelName.slice(slashIndex + 1); - if (!modelId) return undefined; - - const providerId = credentialMap.get(credentialName); - if (providerId === undefined) return undefined; - - const provider = deps.getProvider(providerId); - if (provider?.listModels === undefined) return undefined; - - const models = await provider.listModels(); - return models.find((m) => m.id === modelId); - }, - }; + const credentialMap = new Map<string, string>(); + for (const credential of deps.credentials) { + credentialMap.set(credential.name, credential.providerId); + } + + return { + resolve(modelName: string): ResolvedModel | undefined { + const slashIndex = modelName.indexOf("/"); + if (slashIndex === -1) { + return undefined; + } + + const credentialName = modelName.slice(0, slashIndex); + const model = modelName.slice(slashIndex + 1); + + if (!model) { + return undefined; + } + + const providerId = credentialMap.get(credentialName); + if (!providerId) { + return undefined; + } + + return { providerId, model }; + }, + + async listCatalog(): Promise<readonly string[]> { + const results: string[] = []; + + for (const credential of deps.credentials) { + const provider = deps.getProvider(credential.providerId); + if (!provider?.listModels) { + continue; + } + + const models = await provider.listModels(); + for (const model of models) { + results.push(`${credential.name}/${model.id}`); + } + } + + return results; + }, + + async getModelInfo(modelName: string): Promise<ModelInfo | undefined> { + const slashIndex = modelName.indexOf("/"); + if (slashIndex === -1) return undefined; + const credentialName = modelName.slice(0, slashIndex); + const modelId = modelName.slice(slashIndex + 1); + if (!modelId) return undefined; + + const providerId = credentialMap.get(credentialName); + if (providerId === undefined) return undefined; + + const provider = deps.getProvider(providerId); + if (provider?.listModels === undefined) return undefined; + + const models = await provider.listModels(); + return models.find((m) => m.id === modelId); + }, + }; } |
