Eight compiler-locked methods: settings.describe/update/replace serve redacted layered namespace views (secrets structurally absent from every layer, write-only in the update direction) and fold seam refusals into settings-rejected; credentials.describe/set/unset expose value-free views with credential-rejected on shadowed writes; llm.providers merges the configurable directory with live routes and llm.models claims the host-scoped catalog reservation through the buildModelCatalog extraction session.models now shares. Three HostFrame invalidations bridge the seam events (host/settings-changed, host/credentials-changed, host/models-changed), and the connection route generalizes the native- dialog check into a privileged-method set covering all four writes. The fixture and both fake clients grow the same face.
49 lines
2.1 KiB
TypeScript
49 lines
2.1 KiB
TypeScript
/**
|
|
* credentials domain zod schemas (names derived from map keys:
|
|
* credentialsDescribeRequestSchema / credentialsDescribeValueSchema / …).
|
|
* The reference-name pattern mirrors the seam's `credentialRef` guard so an
|
|
* invalid name fails as `bad-request` before reaching the service.
|
|
*/
|
|
|
|
import { z } from 'zod'
|
|
import type { RequestPayload, ResponseValue } from './rpc-map.ts'
|
|
import type { Wire } from './rpc.schema.ts'
|
|
import type { CredentialView } from './credentials.ts'
|
|
|
|
/** POSIX-portable environment-variable name (the seam's `credentialRef` pattern). */
|
|
export const credentialRefNameSchema = z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/)
|
|
|
|
/** CredentialView entry of credentials.describe. */
|
|
export const credentialViewSchema = z.object({
|
|
configured: z.boolean(),
|
|
source: z.string().optional(),
|
|
writable: z.boolean(),
|
|
}) satisfies z.ZodType<Wire<CredentialView>>
|
|
|
|
/** credentials.describe request payload. */
|
|
export const credentialsDescribeRequestSchema = z.object({
|
|
refs: z.array(credentialRefNameSchema).max(64),
|
|
}) satisfies z.ZodType<Wire<RequestPayload<'credentials.describe'>>>
|
|
|
|
/** credentials.describe response value. */
|
|
export const credentialsDescribeValueSchema = z.object({
|
|
credentials: z.record(z.string(), credentialViewSchema),
|
|
}) satisfies z.ZodType<Wire<ResponseValue<'credentials.describe'>>>
|
|
|
|
/** credentials.set request payload: the one direction a value crosses this wire. */
|
|
export const credentialsSetRequestSchema = z.object({
|
|
ref: credentialRefNameSchema,
|
|
value: z.string().min(1),
|
|
}) satisfies z.ZodType<Wire<RequestPayload<'credentials.set'>>>
|
|
|
|
/** credentials.set response value. */
|
|
export const credentialsSetValueSchema = z.object({}) satisfies z.ZodType<Wire<ResponseValue<'credentials.set'>>>
|
|
|
|
/** credentials.unset request payload. */
|
|
export const credentialsUnsetRequestSchema = z.object({
|
|
ref: credentialRefNameSchema,
|
|
}) satisfies z.ZodType<Wire<RequestPayload<'credentials.unset'>>>
|
|
|
|
/** credentials.unset response value. */
|
|
export const credentialsUnsetValueSchema = z.object({}) satisfies z.ZodType<Wire<ResponseValue<'credentials.unset'>>>
|