BID · Console
Baseline · Intelligence · Decision
src/tools/retrieval/connectors/sec-filing-document.ts 1,856 bytes · typescript
/**
 * SEC EDGAR single-filing-document connector.
 *
 * Downloads a specific filing's primary document from sec.gov, strips
 * HTML to plain text, and truncates at maxChars (default 50,000).
 * Only sec.gov hosts are accepted.
 */

import {
  RetrievalError,
  type FetchParams,
  type RawPayload,
  type RetrievalConnector,
} from '../interface.js';
import { secFilingDocument, type SecFilingDocument } from './sec-edgar.js';

const DEFAULT_MAX_CHARS = 50_000;

export class SecFilingDocumentConnector implements RetrievalConnector {
  readonly name = 'sec-filing-document';
  readonly authRequired = false;
  readonly rateLimit = { requestsPerSecond: 10, burstSize: 10 };

  async isAvailable(): Promise<boolean> {
    return true;
  }

  async fetch(params: FetchParams): Promise<RawPayload> {
    const documentUrl =
      typeof params.query?.documentUrl === 'string' ? (params.query.documentUrl as string) : '';
    if (!documentUrl) {
      throw new RetrievalError(
        'invalid-request',
        'sec-filing-document: query.documentUrl is required (sec.gov host).',
      );
    }
    const maxChars =
      typeof params.query?.maxChars === 'number' ? (params.query.maxChars as number) : DEFAULT_MAX_CHARS;
    const doc = await secFilingDocument(documentUrl, maxChars);
    return {
      source: this.name,
      sourceUrl: doc.url,
      capturedAt: doc.capturedAt,
      contentType: doc.contentType,
      rawContent: doc.text,
      metadata: {
        originalBytes: doc.originalBytes,
        truncated: doc.truncated,
        maxChars,
      },
    };
  }
}

/** Standalone fetcher mirroring the documented signature. */
export async function fetchSecFilingDocument(
  documentUrl: string,
  maxChars?: number,
): Promise<SecFilingDocument> {
  return secFilingDocument(documentUrl, maxChars);
}

export type { SecFilingDocument };