//#region src/auth-resolver.d.ts declare class AuthError extends Error { name: string; } interface ResolveTokenInput { /** From `--token` CLI flag. */ cliToken?: string; /** Env vars; passed in for testability. Defaults to `process.env`. */ env?: NodeJS.ProcessEnv; /** Keyring lookup fn; passed in for testability. */ keyring?: (provider: string) => string | null; /** Active org name — drives namespaced keyring lookup (`.`). */ org?: string; } interface ResolveTokenConfig { /** HOLOCRON_* env var (e.g. `"HOLOCRON_GH_TOKEN"`). */ envName: string; /** Vendor's own env var (e.g. `"GITHUB_TOKEN"`). */ vendorEnvName: string; /** Keyring service key (e.g. `"github"`). */ keyringService: string; /** Full error message shown when no token is found. */ errorMessage: string; /** Keyring backend — injected by the CLI layer. Defaults to no-op. */ getKeyringToken?: (provider: string) => string | null; } /** * Returns a `resolveToken(input?)` function wired to the given env vars * and keyring service. Plugins call this once at module level: * * ```ts * export const resolveToken = createResolveToken({ * envName: "HOLOCRON_GITHUB_TOKEN", * vendorEnvName: "GITHUB_TOKEN", * keyringService: "github", * errorMessage: "no GitHub token found ...", * getKeyringToken, // injected from @theholocron/cli * }); * ``` */ declare function createResolveToken(config: ResolveTokenConfig): (input?: ResolveTokenInput) => string; //#endregion //#region src/errors.d.ts /** * Surfaced from every capability call that hits a vendor API. Wraps * the underlying error with `status` (HTTP) and `details` so * orchestrators can soft-skip rather than abort. */ declare class ProviderApiError extends Error { readonly status: number | undefined; readonly details?: unknown | undefined; name: string; constructor(message: string, status: number | undefined, details?: unknown | undefined); } //#endregion //#region src/rest-client.d.ts interface RestClientConfig { /** Default base URL (e.g. "https://api.github.com"). */ baseUrl: string; /** Auth token. */ token: string; /** * How the token is sent. * - `"bearer"` (default): `Authorization: Bearer ` * - `"basic"`: `Authorization: Basic ` * - `"apikey"`: uses `apiKeyHeader` (e.g. `x-api-key`) */ tokenScheme?: "bearer" | "basic" | "apikey"; /** Header name when `tokenScheme` is `"apikey"`. Defaults to `"x-api-key"`. */ apiKeyHeader?: string; /** * Static headers merged into every request. Applied after the auth header * so they can override defaults (e.g. GitHub's `accept` override). */ extraHeaders?: Record; /** Query params appended to every request URL (e.g. Vercel's `teamId`). */ defaultQuery?: Record; /** Vendor label used in error messages (e.g. `"GitHub"`). */ vendor?: string; /** Override `fetch` for tests. Defaults to `globalThis.fetch`. */ fetch?: typeof fetch; } interface RequestOptions { method?: "GET" | "POST" | "PATCH" | "PUT" | "DELETE"; body?: unknown; /** Per-request query params, merged after `defaultQuery`. */ query?: Record; /** Return `undefined` without parsing even on a 200 response. */ expectNoContent?: boolean; } interface RestClient { readonly baseUrl: string; request(path: string, opts?: RequestOptions): Promise; } declare function createRestClient(config: RestClientConfig): RestClient; //#endregion export { AuthError, ProviderApiError, type RequestOptions, type ResolveTokenConfig, type ResolveTokenInput, type RestClient, type RestClientConfig, createResolveToken, createRestClient };