import { FlowBase, type FlowRunOptions, type ScopeEntry, type ServerRequest } from '../../../common'; declare const inputSchema: import("@frontmcp/lazy-zod").ZodObject<{ request: import("@frontmcp/lazy-zod").ZodObject<{}, import("zod/v4/core").$loose>; response: import("@frontmcp/lazy-zod").ZodObject<{}, import("zod/v4/core").$loose>; next: import("@frontmcp/lazy-zod").ZodOptional>; }, import("zod/v4/core").$strip>; declare const stateSchema: import("@frontmcp/lazy-zod").ZodObject<{ action: import("@frontmcp/lazy-zod").ZodEnum<{ search: "search"; list: "list"; get: "get"; }>; skillId: import("@frontmcp/lazy-zod").ZodOptional; query: import("@frontmcp/lazy-zod").ZodOptional; tags: import("@frontmcp/lazy-zod").ZodOptional>; tools: import("@frontmcp/lazy-zod").ZodOptional>; limit: import("@frontmcp/lazy-zod").ZodOptional; offset: import("@frontmcp/lazy-zod").ZodOptional; category: import("@frontmcp/lazy-zod").ZodOptional; minRating: import("@frontmcp/lazy-zod").ZodOptional; semanticQuery: import("@frontmcp/lazy-zod").ZodOptional; }, import("zod/v4/core").$strip>; declare const outputSchema: import("@frontmcp/lazy-zod").ZodObject<{ kind: import("@frontmcp/lazy-zod").ZodLiteral<"json">; status: import("@frontmcp/lazy-zod").ZodNumber; body: import("@frontmcp/lazy-zod").ZodUnion, import("@frontmcp/lazy-zod").ZodArray, import("@frontmcp/lazy-zod").ZodRecord]>; contentType: import("@frontmcp/lazy-zod").ZodDefault; headers: import("@frontmcp/lazy-zod").ZodOptional]>]>>>>; cookies: import("@frontmcp/lazy-zod").ZodOptional; domain: import("@frontmcp/lazy-zod").ZodOptional; httpOnly: import("@frontmcp/lazy-zod").ZodDefault; secure: import("@frontmcp/lazy-zod").ZodOptional; sameSite: import("@frontmcp/lazy-zod").ZodOptional>; maxAge: import("@frontmcp/lazy-zod").ZodOptional; expires: import("@frontmcp/lazy-zod").ZodOptional; }, import("zod/v4/core").$strip>>>>; }, import("zod/v4/core").$strip>; declare const plan: { readonly pre: ["checkEnabled", "parseRequest"]; readonly execute: ["handleRequest"]; }; declare global { interface ExtendFlows { 'skills-http:api': FlowRunOptions; } } declare const name: "skills-http:api"; /** * Flow for serving skills via JSON API. * * Endpoints: * - GET /skills - List all skills * - GET /skills?query=X - Search skills * - GET /skills?tags=a,b - Filter by tags * - GET /skills/{id} - Get specific skill by ID/name */ export default class SkillsApiFlow extends FlowBase { logger: import("../../../common").FrontMcpLogger; /** * Check if this flow should handle the request. * Matches GET requests to /skills or /skills/{id}. */ static canActivate(request: ServerRequest, scope: ScopeEntry): boolean; checkEnabled(): Promise; parseRequest(): Promise; handleRequest(): Promise; private handleGetSkill; private handleSearchSkills; /** * Lazily resolve the optional semantic-search provider. Wrapped in a * helper so the flow stays a single-class file and tests can stub the * provider via the scope DI container. */ private tryGetSemanticProvider; /** * Best-effort AuthInfo for HTTP authorities evaluation. * * The skills HTTP auth validator (api-key / bearer) is a binary gate and does * not surface claims, so authority-gated skills are evaluated fail-closed on * the HTTP surface. When the server runs in transparent/auth mode the request * MAY carry a verified `authSession` with `user` claims; we forward those so a * JWT bearer with roles/permissions still evaluates correctly. Otherwise an * empty AuthInfo is returned, which denies any role/permission-gated skill. */ private httpAuthInfo; /** * Filter search results (whose projected metadata lacks `authorities`) down * to skills the caller can discover, by resolving the live skill entry to * read its declared authorities. No-op when no engine is configured. */ private filterHttpResultsByAuthorities; private handleListSkills; } export {}; //# sourceMappingURL=skills-api.flow.d.ts.map