// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { Metadata, Endpoint, HandlerFunction } from './types'; export { Metadata, Endpoint, HandlerFunction }; import create_agent from './agent/create-agent'; import list_agent from './agent/list-agent'; import delete_agent from './agent/delete-agent'; import verify_auth from './auth/verify-auth'; import list_avatar from './avatar/list-avatar'; import list_calls from './calls/list-calls'; import list_messages_calls from './calls/list-messages-calls'; import create_session from './session/create-session'; import retrieve_session from './session/retrieve-session'; import list_session from './session/list-session'; export const endpoints: Endpoint[] = []; function addEndpoint(endpoint: Endpoint) { endpoints.push(endpoint); } addEndpoint(create_agent); addEndpoint(list_agent); addEndpoint(delete_agent); addEndpoint(verify_auth); addEndpoint(list_avatar); addEndpoint(list_calls); addEndpoint(list_messages_calls); addEndpoint(create_session); addEndpoint(retrieve_session); addEndpoint(list_session); export type Filter = { type: 'resource' | 'operation' | 'tag' | 'tool'; op: 'include' | 'exclude'; value: string; }; export function query(filters: Filter[], endpoints: Endpoint[]): Endpoint[] { const allExcludes = filters.length > 0 && filters.every((filter) => filter.op === 'exclude'); const unmatchedFilters = new Set(filters); const filtered = endpoints.filter((endpoint: Endpoint) => { let included = false || allExcludes; for (const filter of filters) { if (match(filter, endpoint)) { unmatchedFilters.delete(filter); included = filter.op === 'include'; } } return included; }); // Check if any filters didn't match const unmatched = Array.from(unmatchedFilters).filter((f) => f.type === 'tool' || f.type === 'resource'); if (unmatched.length > 0) { throw new Error( `The following filters did not match any endpoints: ${unmatched .map((f) => `${f.type}=${f.value}`) .join(', ')}`, ); } return filtered; } function match({ type, value }: Filter, endpoint: Endpoint): boolean { switch (type) { case 'resource': { const regexStr = '^' + normalizeResource(value).replace(/\*/g, '.*') + '$'; const regex = new RegExp(regexStr); return regex.test(normalizeResource(endpoint.metadata.resource)); } case 'operation': return endpoint.metadata.operation === value; case 'tag': return endpoint.metadata.tags.includes(value); case 'tool': return endpoint.tool.name === value; } } function normalizeResource(resource: string): string { return resource.toLowerCase().replace(/[^a-z.*\-_]*/g, ''); }