mirror of
https://github.com/deepseek-ai/deepseek-harness.git
synced 2026-09-12 04:01:20 +00:00
93 lines
3.0 KiB
TypeScript
93 lines
3.0 KiB
TypeScript
import type { Context } from '@deepseek-ai/cordis'
|
|
import { CredentialProvider } from '../src/index.ts'
|
|
import type {
|
|
CredentialInfo,
|
|
CredentialKey,
|
|
CredentialRecord,
|
|
CredentialRecordEntry,
|
|
CredentialRecordInfo,
|
|
CredentialRef,
|
|
ResolvedCredential,
|
|
} from '../src/index.ts'
|
|
|
|
/**
|
|
* In-memory credentials provider for interface and consumer tests: one
|
|
* always-writable `memory` source seeded from plugin config.
|
|
*/
|
|
export class MemoryCredentials extends CredentialProvider {
|
|
private readonly store = new Map<string, string>()
|
|
private readonly records = new Map<CredentialKey, CredentialRecord>()
|
|
|
|
constructor(ctx: Context, seed: Record<string, string> = {}) {
|
|
super(ctx)
|
|
for (const [key, value] of Object.entries(seed)) this.store.set(key, value)
|
|
}
|
|
|
|
override resolve(ref: CredentialRef): Promise<ResolvedCredential | undefined> {
|
|
const value = this.store.get(ref)
|
|
return Promise.resolve(value === undefined || value.length === 0
|
|
? undefined
|
|
: { value, source: 'memory' })
|
|
}
|
|
|
|
override describe(ref: CredentialRef): Promise<CredentialInfo> {
|
|
const value = this.store.get(ref)
|
|
const configured = value !== undefined && value.length > 0
|
|
return Promise.resolve({
|
|
configured,
|
|
...configured ? { source: 'memory' } : {},
|
|
writable: true,
|
|
})
|
|
}
|
|
|
|
override set(ref: CredentialRef, value: string): Promise<void> {
|
|
if (value.length === 0) {
|
|
return Promise.reject(new Error('memory credentials: an empty value cannot be stored; use unset'))
|
|
}
|
|
this.store.set(ref, value)
|
|
this.ctx.emit('credentials/reference-updated', ref)
|
|
return Promise.resolve()
|
|
}
|
|
|
|
override unset(ref: CredentialRef): Promise<void> {
|
|
if (this.store.delete(ref)) {
|
|
this.ctx.emit('credentials/reference-updated', ref)
|
|
}
|
|
return Promise.resolve()
|
|
}
|
|
|
|
override readRecord(key: CredentialKey): Promise<CredentialRecord | undefined> {
|
|
return Promise.resolve(this.records.get(key))
|
|
}
|
|
|
|
override describeRecord(key: CredentialKey): Promise<CredentialRecordInfo> {
|
|
const stored = this.records.get(key)
|
|
return Promise.resolve(stored === undefined
|
|
? { configured: false, writable: true }
|
|
: { configured: true, kind: stored.kind, writable: true })
|
|
}
|
|
|
|
override listRecords(): Promise<readonly CredentialRecordEntry[]> {
|
|
return Promise.resolve([...this.records].map(([key, record]) => ({ key, kind: record.kind })))
|
|
}
|
|
|
|
override async modifyRecord(
|
|
key: CredentialKey,
|
|
mutate: (current: CredentialRecord | undefined) => Promise<CredentialRecord | undefined>,
|
|
): Promise<CredentialRecord | undefined> {
|
|
const current = this.records.get(key)
|
|
const next = await mutate(current)
|
|
if (next === undefined) return current
|
|
this.records.set(key, next)
|
|
this.ctx.emit('credentials/record-updated', key)
|
|
return next
|
|
}
|
|
|
|
override deleteRecord(key: CredentialKey): Promise<void> {
|
|
if (this.records.delete(key)) {
|
|
this.ctx.emit('credentials/record-updated', key)
|
|
}
|
|
return Promise.resolve()
|
|
}
|
|
}
|