summaryrefslogtreecommitdiffhomepage
path: root/packages/credential-store/src
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-06-26 22:03:19 +0900
committerAdam Malczewski <[email protected]>2026-06-26 22:23:39 +0900
commit727c98c9dae516a2070eb950410314380a20c974 (patch)
tree52aa1022c54f11770be7e4e2a324f0a8b8b8deec /packages/credential-store/src
parente59dc11f63b1df51142259bb2c406af8c9c8c2bb (diff)
downloaddispatch-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.ts36
-rw-r--r--packages/credential-store/src/index.ts8
-rw-r--r--packages/credential-store/src/registry.test.ts118
-rw-r--r--packages/credential-store/src/registry.ts176
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);
+ },
+ };
}