summaryrefslogtreecommitdiffhomepage
path: root/packages/provider-umans
diff options
context:
space:
mode:
Diffstat (limited to 'packages/provider-umans')
-rw-r--r--packages/provider-umans/package.json20
-rw-r--r--packages/provider-umans/src/extension.test.ts68
-rw-r--r--packages/provider-umans/src/extension.ts58
-rw-r--r--packages/provider-umans/src/index.ts8
-rw-r--r--packages/provider-umans/src/reasoning.test.ts36
-rw-r--r--packages/provider-umans/src/reasoning.ts18
-rw-r--r--packages/provider-umans/src/resolver.test.ts64
-rw-r--r--packages/provider-umans/src/resolver.ts22
-rw-r--r--packages/provider-umans/tsconfig.json8
9 files changed, 151 insertions, 151 deletions
diff --git a/packages/provider-umans/package.json b/packages/provider-umans/package.json
index ca09e06..83b9306 100644
--- a/packages/provider-umans/package.json
+++ b/packages/provider-umans/package.json
@@ -1,12 +1,12 @@
{
- "name": "@dispatch/provider-umans",
- "version": "0.0.0",
- "type": "module",
- "private": true,
- "main": "dist/index.js",
- "types": "dist/index.d.ts",
- "dependencies": {
- "@dispatch/kernel": "workspace:*",
- "@dispatch/openai-stream": "workspace:*"
- }
+ "name": "@dispatch/provider-umans",
+ "version": "0.0.0",
+ "type": "module",
+ "private": true,
+ "main": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "dependencies": {
+ "@dispatch/kernel": "workspace:*",
+ "@dispatch/openai-stream": "workspace:*"
+ }
}
diff --git a/packages/provider-umans/src/extension.test.ts b/packages/provider-umans/src/extension.test.ts
index 59efddc..07b4f4c 100644
--- a/packages/provider-umans/src/extension.test.ts
+++ b/packages/provider-umans/src/extension.test.ts
@@ -4,49 +4,49 @@ import { activate, manifest } from "./extension.js";
import type { EnvSource } from "./resolver.js";
function makeFakeHost(overrides: { configGet?: (key: string) => unknown }): {
- host: HostAPI;
- defineProvider: ReturnType<typeof vi.fn>;
- warn: ReturnType<typeof vi.fn>;
- info: ReturnType<typeof vi.fn>;
+ host: HostAPI;
+ defineProvider: ReturnType<typeof vi.fn>;
+ warn: ReturnType<typeof vi.fn>;
+ info: ReturnType<typeof vi.fn>;
} {
- const defineProvider = vi.fn();
- const warn = vi.fn();
- const info = vi.fn();
- const host = {
- defineProvider,
- config: { get: overrides.configGet ?? (() => undefined) },
- logger: { debug: vi.fn(), info, warn, error: vi.fn() },
- } as unknown as HostAPI;
- return { host, defineProvider, warn, info };
+ const defineProvider = vi.fn();
+ const warn = vi.fn();
+ const info = vi.fn();
+ const host = {
+ defineProvider,
+ config: { get: overrides.configGet ?? (() => undefined) },
+ logger: { debug: vi.fn(), info, warn, error: vi.fn() },
+ } as unknown as HostAPI;
+ return { host, defineProvider, warn, info };
}
describe("provider-umans activation", () => {
- it('activate registers the "umans" provider when UMANS_API_KEY is set (defineProvider called with id "umans")', async () => {
- const { host, defineProvider } = makeFakeHost({});
- const env: EnvSource = { UMANS_API_KEY: "sk-test" };
+ it('activate registers the "umans" provider when UMANS_API_KEY is set (defineProvider called with id "umans")', async () => {
+ const { host, defineProvider } = makeFakeHost({});
+ const env: EnvSource = { UMANS_API_KEY: "sk-test" };
- await activate(host, env);
+ await activate(host, env);
- expect(defineProvider).toHaveBeenCalledTimes(1);
- expect(defineProvider.mock.calls[0]?.[0]?.id).toBe("umans");
- });
+ expect(defineProvider).toHaveBeenCalledTimes(1);
+ expect(defineProvider.mock.calls[0]?.[0]?.id).toBe("umans");
+ });
- it("activate does NOT register + warns when UMANS_API_KEY is unset", async () => {
- const { host, defineProvider, warn } = makeFakeHost({});
- const env: EnvSource = {};
+ it("activate does NOT register + warns when UMANS_API_KEY is unset", async () => {
+ const { host, defineProvider, warn } = makeFakeHost({});
+ const env: EnvSource = {};
- await activate(host, env);
+ await activate(host, env);
- expect(defineProvider).not.toHaveBeenCalled();
- expect(warn).toHaveBeenCalledWith("provider-umans: no UMANS_API_KEY. Provider not registered.");
- });
+ expect(defineProvider).not.toHaveBeenCalled();
+ expect(warn).toHaveBeenCalledWith("provider-umans: no UMANS_API_KEY. Provider not registered.");
+ });
- it("declares no dependsOn (self-contained, reads env directly)", () => {
- expect(manifest.dependsOn).toBeUndefined();
- });
+ it("declares no dependsOn (self-contained, reads env directly)", () => {
+ expect(manifest.dependsOn).toBeUndefined();
+ });
- it("declares the umans provider contribution + network capability", () => {
- expect(manifest.contributes?.providers).toEqual(["umans"]);
- expect(manifest.capabilities?.network).toBe(true);
- });
+ it("declares the umans provider contribution + network capability", () => {
+ expect(manifest.contributes?.providers).toEqual(["umans"]);
+ expect(manifest.capabilities?.network).toBe(true);
+ });
});
diff --git a/packages/provider-umans/src/extension.ts b/packages/provider-umans/src/extension.ts
index 74f8481..da77724 100644
--- a/packages/provider-umans/src/extension.ts
+++ b/packages/provider-umans/src/extension.ts
@@ -4,14 +4,14 @@ import { transformBody } from "./reasoning.js";
import { type EnvSource, resolveUmansConfig } from "./resolver.js";
export const manifest: Manifest = {
- id: "provider-umans",
- name: "Umans AI Coding Plan",
- version: "0.0.0",
- apiVersion: "^0.1.0",
- trust: "bundled",
- activation: "eager",
- capabilities: { network: true },
- contributes: { providers: ["umans"] },
+ id: "provider-umans",
+ name: "Umans AI Coding Plan",
+ version: "0.0.0",
+ apiVersion: "^0.1.0",
+ trust: "bundled",
+ activation: "eager",
+ capabilities: { network: true },
+ contributes: { providers: ["umans"] },
};
/**
@@ -26,30 +26,30 @@ export const manifest: Manifest = {
* No `UMANS_API_KEY` is a config state, not an error — warn + skip registration.
*/
export async function activate(host: HostAPI, env: EnvSource = process.env): Promise<void> {
- const configModel = host.config.get<string>("provider.umans.model");
- const cfg = resolveUmansConfig(env, configModel);
- if (!cfg) {
- host.logger.warn("provider-umans: no UMANS_API_KEY. Provider not registered.");
- return;
- }
+ const configModel = host.config.get<string>("provider.umans.model");
+ const cfg = resolveUmansConfig(env, configModel);
+ if (!cfg) {
+ host.logger.warn("provider-umans: no UMANS_API_KEY. Provider not registered.");
+ return;
+ }
- const credentials: ApiKeyCredentials = {
- type: "api-key",
- apiKey: cfg.apiKey,
- baseURL: cfg.baseURL,
- };
+ const credentials: ApiKeyCredentials = {
+ type: "api-key",
+ apiKey: cfg.apiKey,
+ baseURL: cfg.baseURL,
+ };
- const provider = createOpenAICompatProvider({
- credentials,
- model: cfg.model,
- id: "umans",
- transformBody,
- });
- host.defineProvider(provider);
- host.logger.info(`provider-umans: registered (model=${cfg.model})`);
+ const provider = createOpenAICompatProvider({
+ credentials,
+ model: cfg.model,
+ id: "umans",
+ transformBody,
+ });
+ host.defineProvider(provider);
+ host.logger.info(`provider-umans: registered (model=${cfg.model})`);
}
export const extension: Extension = {
- manifest,
- activate,
+ manifest,
+ activate,
};
diff --git a/packages/provider-umans/src/index.ts b/packages/provider-umans/src/index.ts
index d4d143b..241028e 100644
--- a/packages/provider-umans/src/index.ts
+++ b/packages/provider-umans/src/index.ts
@@ -1,8 +1,8 @@
export { activate, extension, manifest } from "./extension.js";
export { mapReasoningEffort, transformBody } from "./reasoning.js";
export {
- type EnvSource,
- resolveUmansConfig,
- toUmansCredentials,
- type UmansConfig,
+ type EnvSource,
+ resolveUmansConfig,
+ toUmansCredentials,
+ type UmansConfig,
} from "./resolver.js";
diff --git a/packages/provider-umans/src/reasoning.test.ts b/packages/provider-umans/src/reasoning.test.ts
index 2e57e25..a31b8cf 100644
--- a/packages/provider-umans/src/reasoning.test.ts
+++ b/packages/provider-umans/src/reasoning.test.ts
@@ -2,27 +2,27 @@ import { describe, expect, it } from "vitest";
import { mapReasoningEffort, transformBody } from "./reasoning.js";
describe("mapReasoningEffort", () => {
- it('mapReasoningEffort: low → "low", medium → "medium", high → "high", xhigh → "high", max → "high"', () => {
- expect(mapReasoningEffort("low")).toBe("low");
- expect(mapReasoningEffort("medium")).toBe("medium");
- expect(mapReasoningEffort("high")).toBe("high");
- expect(mapReasoningEffort("xhigh")).toBe("high");
- expect(mapReasoningEffort("max")).toBe("high");
- });
+ it('mapReasoningEffort: low → "low", medium → "medium", high → "high", xhigh → "high", max → "high"', () => {
+ expect(mapReasoningEffort("low")).toBe("low");
+ expect(mapReasoningEffort("medium")).toBe("medium");
+ expect(mapReasoningEffort("high")).toBe("high");
+ expect(mapReasoningEffort("xhigh")).toBe("high");
+ expect(mapReasoningEffort("max")).toBe("high");
+ });
- it("mapReasoningEffort: undefined → undefined (no field)", () => {
- expect(mapReasoningEffort(undefined)).toBe(undefined);
- });
+ it("mapReasoningEffort: undefined → undefined (no field)", () => {
+ expect(mapReasoningEffort(undefined)).toBe(undefined);
+ });
});
describe("transformBody", () => {
- it("transformBody adds reasoning_effort when opts.reasoningEffort is set", () => {
- const result = transformBody({}, { reasoningEffort: "high" });
- expect(result).toEqual({ reasoning_effort: "high" });
- });
+ it("transformBody adds reasoning_effort when opts.reasoningEffort is set", () => {
+ const result = transformBody({}, { reasoningEffort: "high" });
+ expect(result).toEqual({ reasoning_effort: "high" });
+ });
- it("transformBody adds nothing when opts.reasoningEffort is absent (byte-stable)", () => {
- const result = transformBody({}, {});
- expect(result).toEqual({});
- });
+ it("transformBody adds nothing when opts.reasoningEffort is absent (byte-stable)", () => {
+ const result = transformBody({}, {});
+ expect(result).toEqual({});
+ });
});
diff --git a/packages/provider-umans/src/reasoning.ts b/packages/provider-umans/src/reasoning.ts
index 9015848..22b3202 100644
--- a/packages/provider-umans/src/reasoning.ts
+++ b/packages/provider-umans/src/reasoning.ts
@@ -12,11 +12,11 @@ import type { ProviderStreamOptions, ReasoningEffort } from "@dispatch/kernel";
* Pure: the `transformBody` decision, factored out for direct unit testing.
*/
export function mapReasoningEffort(
- effort: ReasoningEffort | undefined,
+ effort: ReasoningEffort | undefined,
): "low" | "medium" | "high" | undefined {
- if (effort === undefined) return undefined;
- if (effort === "xhigh" || effort === "max") return "high";
- return effort;
+ if (effort === undefined) return undefined;
+ if (effort === "xhigh" || effort === "max") return "high";
+ return effort;
}
/**
@@ -27,10 +27,10 @@ export function mapReasoningEffort(
* byte-stable for calls with no reasoning preference.
*/
export function transformBody(
- _body: Record<string, unknown>,
- opts: ProviderStreamOptions,
+ _body: Record<string, unknown>,
+ opts: ProviderStreamOptions,
): Record<string, unknown> {
- const mapped = mapReasoningEffort(opts.reasoningEffort);
- if (mapped === undefined) return {};
- return { reasoning_effort: mapped };
+ const mapped = mapReasoningEffort(opts.reasoningEffort);
+ if (mapped === undefined) return {};
+ return { reasoning_effort: mapped };
}
diff --git a/packages/provider-umans/src/resolver.test.ts b/packages/provider-umans/src/resolver.test.ts
index 47d436e..966c1bf 100644
--- a/packages/provider-umans/src/resolver.test.ts
+++ b/packages/provider-umans/src/resolver.test.ts
@@ -2,42 +2,42 @@ import { describe, expect, it } from "vitest";
import { resolveUmansConfig } from "./resolver.js";
describe("resolveUmansConfig", () => {
- it("activate uses UMANS_BASE_URL override when set (default otherwise)", () => {
- const override = resolveUmansConfig(
- { UMANS_API_KEY: "sk-test", UMANS_BASE_URL: "https://custom.example.com/v1" },
- undefined,
- );
- expect(override?.baseURL).toBe("https://custom.example.com/v1");
+ it("activate uses UMANS_BASE_URL override when set (default otherwise)", () => {
+ const override = resolveUmansConfig(
+ { UMANS_API_KEY: "sk-test", UMANS_BASE_URL: "https://custom.example.com/v1" },
+ undefined,
+ );
+ expect(override?.baseURL).toBe("https://custom.example.com/v1");
- const fallback = resolveUmansConfig({ UMANS_API_KEY: "sk-test" }, undefined);
- expect(fallback?.baseURL).toBe("https://api.code.umans.ai/v1");
- });
+ const fallback = resolveUmansConfig({ UMANS_API_KEY: "sk-test" }, undefined);
+ expect(fallback?.baseURL).toBe("https://api.code.umans.ai/v1");
+ });
- it('activate uses config provider.umans.model → UMANS_MODEL → "umans-coder" resolution', () => {
- // config wins over env + default
- const fromConfig = resolveUmansConfig(
- { UMANS_API_KEY: "sk-test", UMANS_MODEL: "env-model" },
- "config-model",
- );
- expect(fromConfig?.model).toBe("config-model");
+ it('activate uses config provider.umans.model → UMANS_MODEL → "umans-coder" resolution', () => {
+ // config wins over env + default
+ const fromConfig = resolveUmansConfig(
+ { UMANS_API_KEY: "sk-test", UMANS_MODEL: "env-model" },
+ "config-model",
+ );
+ expect(fromConfig?.model).toBe("config-model");
- // env wins when config is absent
- const fromEnv = resolveUmansConfig(
- { UMANS_API_KEY: "sk-test", UMANS_MODEL: "env-model" },
- undefined,
- );
- expect(fromEnv?.model).toBe("env-model");
+ // env wins when config is absent
+ const fromEnv = resolveUmansConfig(
+ { UMANS_API_KEY: "sk-test", UMANS_MODEL: "env-model" },
+ undefined,
+ );
+ expect(fromEnv?.model).toBe("env-model");
- // default when neither is set
- const fromDefault = resolveUmansConfig({ UMANS_API_KEY: "sk-test" }, undefined);
- expect(fromDefault?.model).toBe("umans-coder");
- });
+ // default when neither is set
+ const fromDefault = resolveUmansConfig({ UMANS_API_KEY: "sk-test" }, undefined);
+ expect(fromDefault?.model).toBe("umans-coder");
+ });
- it("returns null when UMANS_API_KEY is unset", () => {
- expect(resolveUmansConfig({}, undefined)).toBeNull();
- });
+ it("returns null when UMANS_API_KEY is unset", () => {
+ expect(resolveUmansConfig({}, undefined)).toBeNull();
+ });
- it("returns null when UMANS_API_KEY is empty string", () => {
- expect(resolveUmansConfig({ UMANS_API_KEY: "" }, undefined)).toBeNull();
- });
+ it("returns null when UMANS_API_KEY is empty string", () => {
+ expect(resolveUmansConfig({ UMANS_API_KEY: "" }, undefined)).toBeNull();
+ });
});
diff --git a/packages/provider-umans/src/resolver.ts b/packages/provider-umans/src/resolver.ts
index 416a281..5f0e76e 100644
--- a/packages/provider-umans/src/resolver.ts
+++ b/packages/provider-umans/src/resolver.ts
@@ -8,9 +8,9 @@ const DEFAULT_MODEL = "umans-coder";
* and model that `activate` threads into `createOpenAICompatProvider`.
*/
export interface UmansConfig {
- readonly apiKey: string;
- readonly baseURL: string;
- readonly model: string;
+ readonly apiKey: string;
+ readonly baseURL: string;
+ readonly model: string;
}
/**
@@ -32,14 +32,14 @@ export type EnvSource = Readonly<Record<string, string | undefined>>;
* unit testing with zero mocks.
*/
export function resolveUmansConfig(
- env: EnvSource,
- configModel: string | undefined,
+ env: EnvSource,
+ configModel: string | undefined,
): UmansConfig | null {
- const apiKey = env.UMANS_API_KEY;
- if (!apiKey) return null;
- const baseURL = env.UMANS_BASE_URL ?? DEFAULT_BASE_URL;
- const model = configModel ?? env.UMANS_MODEL ?? DEFAULT_MODEL;
- return { apiKey, baseURL, model };
+ const apiKey = env.UMANS_API_KEY;
+ if (!apiKey) return null;
+ const baseURL = env.UMANS_BASE_URL ?? DEFAULT_BASE_URL;
+ const model = configModel ?? env.UMANS_MODEL ?? DEFAULT_MODEL;
+ return { apiKey, baseURL, model };
}
/**
@@ -47,5 +47,5 @@ export function resolveUmansConfig(
* — `baseURL` on the credential so it is overridable per-credential.
*/
export function toUmansCredentials(cfg: UmansConfig): ApiKeyCredentials {
- return { type: "api-key", apiKey: cfg.apiKey, baseURL: cfg.baseURL };
+ return { type: "api-key", apiKey: cfg.apiKey, baseURL: cfg.baseURL };
}
diff --git a/packages/provider-umans/tsconfig.json b/packages/provider-umans/tsconfig.json
index f450b9a..3883d12 100644
--- a/packages/provider-umans/tsconfig.json
+++ b/packages/provider-umans/tsconfig.json
@@ -1,6 +1,6 @@
{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": { "rootDir": "src", "outDir": "dist", "composite": true },
- "include": ["src/**/*.ts"],
- "references": [{ "path": "../kernel" }, { "path": "../openai-stream" }]
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": { "rootDir": "src", "outDir": "dist", "composite": true },
+ "include": ["src/**/*.ts"],
+ "references": [{ "path": "../kernel" }, { "path": "../openai-stream" }]
}