/**
 * Tool-handler middleware:
 *   1. Quota check (`checkQuota`) перед основным запросом.
 *   2. AI quota check (`checkAiQuota`) для AI-tools (см. `isAiTool`).
 *   3. Audit log + usage tracker (fire-and-forget) после.
 *   4. Redaction items в response (если ENV redactionEnabled = true).
 *   5. Prometheus метрики (`mcp_requests_total`, `mcp_request_duration_seconds`,
 *      `mcp_errors_total`, `mcp_auth_rejections_total`).
 *
 * Не вносит изменений в существующие tool handlers — оборачивает их в
 * registry.
 */
import type { Logger } from 'pino';
import type { ToolResult } from '../types.js';
import { type RedactionConfig } from '../redaction/index.js';
import { type AuditService } from '../audit/service.js';
import { type UsageTracker } from '../billing/tracker.js';
import { type Tier, type QuotaDecision } from '../billing/limits.js';
export interface ToolContext {
    /** Текущий app (из API-key / OAuth claim / config.defaultAppId). */
    appId: string;
    /** Prefix API-key (8 chars). */
    keyId: string;
    /** Tier для quota-check. */
    tier: Tier;
    /** Optional logger. */
    log?: Logger;
    /** Optional request meta для audit (ip/userAgent/sessionId). */
    ip?: string | null;
    userAgent?: string | null;
    sessionId?: string | null;
}
export interface MiddlewareDeps {
    audit?: AuditService;
    usage?: UsageTracker;
    redactionConfig?: RedactionConfig;
    /** Опциональный override основной (per-day) quota check; default — usage tracker. */
    quotaCheck?: (ctx: ToolContext) => Promise<QuotaDecision>;
    /** Опциональный override AI-quota check (используется только для AI-tools). */
    aiQuotaCheck?: (ctx: ToolContext) => Promise<QuotaDecision>;
}
type AnyArgs = Record<string, unknown>;
type Handler<TArgs extends AnyArgs, TClient> = (args: TArgs, client: TClient) => Promise<ToolResult>;
/**
 * Оборачивает существующий tool handler.
 *
 * Семантика:
 *   - Если `quotaCheck`-result `allowed=false` → возвращаем ToolError('TIER_QUOTA_EXCEEDED').
 *   - При `overage=true` (grace) добавляем `_meta.overage=true` к ответу.
 *   - После handler-вызова прогоняем items / log через redaction.
 *   - Audit + usage пишутся fire-and-forget (void).
 */
export declare function withMiddleware<TArgs extends AnyArgs, TClient>(toolName: string, handler: Handler<TArgs, TClient>, getContext: (args: TArgs, client: TClient) => ToolContext, deps?: MiddlewareDeps): Handler<TArgs, TClient>;
export {};
//# sourceMappingURL=withMiddleware.d.ts.map