diff options
| author | Adam Malczewski <[email protected]> | 2026-06-05 00:50:05 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-05 00:50:05 +0900 |
| commit | ab74946c3b6e1c2e55e47690d11ad838468d5c2f (patch) | |
| tree | 7c12ea79b1817dbff939d85d1690866313d4b0f9 /packages/kernel/src | |
| parent | efb4737fd22572f757e7a9eb1034dd96ae1b6593 (diff) | |
| download | dispatch-ab74946c3b6e1c2e55e47690d11ad838468d5c2f.tar.gz dispatch-ab74946c3b6e1c2e55e47690d11ad838468d5c2f.zip | |
feat(auth): provider resolves credentials via AuthContract, not config
- kernel HostAPI: add getAuthProviders()/getAuthProvider(id) read-views (mirrors getProviders)
- provider-openai-compat: activate() resolves creds via host.getAuthProvider("apikey").resolve(); dependsOn auth-apikey; model stays config-driven
- host-bin: mirror the new getters in post-activation HostAPI stub
- auth-apikey is no longer vestigial; auth seam exercised end-to-end
- 185 tests pass; typecheck + biome clean; verified live (curl returns real response)
Diffstat (limited to 'packages/kernel/src')
| -rw-r--r-- | packages/kernel/src/contracts/extension.ts | 6 | ||||
| -rw-r--r-- | packages/kernel/src/host/host.test.ts | 27 | ||||
| -rw-r--r-- | packages/kernel/src/host/host.ts | 6 |
3 files changed, 39 insertions, 0 deletions
diff --git a/packages/kernel/src/contracts/extension.ts b/packages/kernel/src/contracts/extension.ts index 7078a9a..424f714 100644 --- a/packages/kernel/src/contracts/extension.ts +++ b/packages/kernel/src/contracts/extension.ts @@ -230,6 +230,12 @@ export interface HostAPI { /** Read-only view of all registered tools. */ readonly getTools: () => ReadonlyMap<string, ToolContract>; + /** Read-only view of all registered auth providers. */ + readonly getAuthProviders: () => ReadonlyMap<string, AuthContract>; + + /** Look up a single auth provider by id. */ + readonly getAuthProvider: (id: string) => AuthContract | undefined; + /** Register a scheduled job with the host's scheduler. */ readonly scheduler: { readonly register: (job: ScheduledJob) => void; diff --git a/packages/kernel/src/host/host.test.ts b/packages/kernel/src/host/host.test.ts index f7b7eba..82d5177 100644 --- a/packages/kernel/src/host/host.test.ts +++ b/packages/kernel/src/host/host.test.ts @@ -632,6 +632,33 @@ describe("createHost", () => { expect(capturedProviders?.size).toBe(1); expect(capturedProviders?.get("anthropic")).toBe(provider); }); + + it("getAuthProviders/getAuthProvider returns registered auth via HostAPI", async () => { + const auth = createFakeAuth("apikey"); + let capturedAuth: ReadonlyMap<string, AuthContract> | undefined; + let capturedSingle: AuthContract | undefined; + + const producer = createExtension("auth-apikey", { + activate: (host) => { + host.defineAuth(auth); + }, + }); + const consumer = createExtension("consumer", { + dependsOn: ["auth-apikey"], + activate: (host) => { + capturedAuth = host.getAuthProviders(); + capturedSingle = host.getAuthProvider("apikey"); + }, + }); + + const host = createHost([producer, consumer], deps); + await host.activate(); + + expect(capturedAuth).toBeDefined(); + expect(capturedAuth?.size).toBe(1); + expect(capturedAuth?.get("apikey")).toBe(auth); + expect(capturedSingle).toBe(auth); + }); }); describe("DAG errors", () => { diff --git a/packages/kernel/src/host/host.ts b/packages/kernel/src/host/host.ts index e0ca5d5..8592a16 100644 --- a/packages/kernel/src/host/host.ts +++ b/packages/kernel/src/host/host.ts @@ -132,6 +132,12 @@ export function createHost(extensions: readonly Extension[], deps: HostDeps): Ho getTools() { return tools; }, + getAuthProviders() { + return authProviders; + }, + getAuthProvider(id: string) { + return authProviders.get(id); + }, scheduler: { register(job: ScheduledJob) { scheduledJobs.push(job); |
