import { QUARTR_COMPANY_OUTPUT_PROPERTIES, type QuartrCompanyDto, type QuartrListCompaniesParams, type QuartrListCompaniesResponse, type QuartrPaginatedDto, } from '@/tools/quartr/types' import { buildQuartrListQuery, buildQuartrUrl, mapQuartrCompany, normalizeQuartrCommaList, parseQuartrResponse, } from '@/tools/quartr/utils' import type { ToolConfig } from '@/tools/types' export const quartrListCompaniesTool: ToolConfig< QuartrListCompaniesParams, QuartrListCompaniesResponse > = { id: 'quartr_list_companies', name: 'Quartr List Companies', description: 'List companies covered by Quartr, filterable by ticker, ISIN, CIK, OpenFIGI, country, and exchange.', version: '1.0.0', params: { apiKey: { type: 'string', required: true, visibility: 'user-only', description: 'Quartr API key', }, tickers: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Comma-separated list of company tickers (e.g., "AAPL,MSFT")', }, isins: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Comma-separated list of ISINs (e.g., "US0378331005")', }, ciks: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Comma-separated list of SEC CIKs (e.g., "0000320193")', }, countries: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Comma-separated list of ISO 3166-1 alpha-2 country codes (e.g., "US,SE")', }, exchanges: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Comma-separated list of exchange symbols, without whitespace (e.g., "NasdaqGS")', }, companyIds: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Comma-separated list of Quartr company IDs (e.g., "4742,128")', }, openfigis: { type: 'string', required: false, visibility: 'user-or-llm', description: 'Comma-separated list of OpenFIGI codes (figi, compositeFigi, or shareClassFigi)', }, updatedAfter: { type: 'string', required: false, visibility: 'user-only', description: 'Only return data updated after this ISO 8601 date (e.g., "2024-01-01")', }, updatedBefore: { type: 'string', required: false, visibility: 'user-only', description: 'Only return data updated before this ISO 8601 date (e.g., "2024-12-31")', }, limit: { type: 'number', required: false, visibility: 'user-or-llm', description: 'Maximum number of items to return in a single request (default: 10, max: 500)', }, cursor: { type: 'number', required: false, visibility: 'user-or-llm', description: 'Pagination cursor from the previous response (nextCursor) for the next page', }, direction: { type: 'string', required: false, visibility: 'user-only', description: 'Sort direction by id: "asc" or "desc" (default: asc)', }, }, request: { url: (params) => buildQuartrUrl('/companies', { ...buildQuartrListQuery(params), ids: normalizeQuartrCommaList(params.companyIds), openfigis: normalizeQuartrCommaList(params.openfigis), }), method: 'GET', headers: (params) => ({ 'x-api-key': params.apiKey }), }, transformResponse: async (response) => { const data = await parseQuartrResponse>( response, 'list companies' ) return { success: true, output: { companies: (data.data ?? []).map(mapQuartrCompany), nextCursor: data.pagination?.nextCursor ?? null, }, } }, outputs: { companies: { type: 'array', description: 'Companies matching the filters', items: { type: 'object', properties: QUARTR_COMPANY_OUTPUT_PROPERTIES }, }, nextCursor: { type: 'number', description: 'Cursor for fetching the next page of results (null when no more pages)', optional: true, }, }, }