MemoFSMemoFS
API Reference

@memofs/connectors API

API reference for @memofs/connectors: ingestion pipelines, connector registry, deterministic note ID generation, and third-party sources.

The @memofs/connectors package manages ingestion pipelines from external sources (GitHub, Notion, and custom connectors) into MemoFS memory.

Functions

runConnectors

Orchestrates loading .memofs/connectors.json, resolving credentials through SecretResolver, executing enabled ingestion connectors, deduplicating records against existing event logs, and committing notes to MemoFS memory.

function runConnectors(options: RunConnectorsOptions): Promise<RunConnectorsResult>;

createConnectorRegistry

Creates a new ConnectorRegistry seeded with the built-in connectors (GitHubConnector and NotionConnector), plus any optional extra connectors.

function createConnectorRegistry(extras?: readonly Connector[]): ConnectorRegistry;

connectorNoteId

Computes the deterministic conn_<16 hex chars> note ID for a ConnectorRecord using sha256(externalId + ":" + content).slice(0, 16). Pure computation with zero wall-clock dependency.

function connectorNoteId(record: ConnectorRecord): Promise<string>;

readConnectorsFile

Reads and validates .memofs/connectors.json for a given project root. A missing file degrades gracefully to EMPTY_CONNECTORS_FILE ({ connectors: [] }) rather than throwing. Malformed files or files violating secret guardrails throw ConnectorConfigError.

function readConnectorsFile(rootDir: string): Promise<ConnectorsFile>;

validateConnectorsFile

Runs structural and secret-leak validation against a parsed connectors.json JSON payload. Rejects forbidden token keys, recursive substring matches, and credential pattern matches.

function validateConnectorsFile(raw: unknown): ConnectorsFile;

selectConnectors

Filters a ConnectorsFile by enabled state and/or connector type.

function selectConnectors(
  file: ConnectorsFile,
  opts?: { enabled?: boolean; type?: string }
): ConnectorConfig[];

Classes

ConnectorRegistry

Mutable registry mapping a connector type identifier to a Connector implementation instance.

class ConnectorRegistry {
  constructor(builtins?: readonly Connector[]);
  register(connector: Connector): this;
  get(type: string): Connector | undefined;
  has(type: string): boolean;
  types(): readonly string[];
}

GitHubConnector

Built-in connector for GitHub issues, pull requests, and discussions (type: "github"). Implements Connector.

class GitHubConnector implements Connector {
  readonly type = "github";
  readonly displayName = "GitHub";
  ingest(ctx: ConnectorIngestContext): Promise<readonly ConnectorRecord[]>;
}

NotionConnector

Built-in connector for Notion database rows and workspace search pages (type: "notion"). Implements Connector.

class NotionConnector implements Connector {
  readonly type = "notion";
  readonly displayName = "Notion";
  ingest(ctx: ConnectorIngestContext): Promise<readonly ConnectorRecord[]>;
}

EnvSecretResolver

Dev/local fallback resolver. Reads { "secretRef": "token" } maps from .memofs/secrets.json on disk (cached in memory). Implements SecretResolver.

class EnvSecretResolver implements SecretResolver {
  constructor(options: FileSecretResolverOptions);
  resolve(secretRef: string): Promise<string>;
}

StaticSecretResolver

In-memory secret resolver for tests and programmatic embedding. Implements SecretResolver.

class StaticSecretResolver implements SecretResolver {
  constructor(entries: Record<string, string>);
  resolve(secretRef: string): Promise<string>;
}

CloudSecretResolver

Production secret resolver that calls the MemoFS Cloud API endpoint GET {cloudBaseUrl}/projects/:projectId/connectors/secret?ref=:secretRef. Implements SecretResolver.

class CloudSecretResolver implements SecretResolver {
  constructor(options: CloudSecretResolverOptions);
  resolve(secretRef: string): Promise<string>;
}

Interfaces & Types

SecretResolver

Credential plane contract. Implementations resolve an opaque secretRef to a live plaintext token in memory.

interface SecretResolver {
  resolve(secretRef: string): Promise<string>;
}

Connector

Provider-neutral plugin interface for data sources.

interface Connector {
  readonly type: string;
  readonly displayName: string;
  ingest(ctx: ConnectorIngestContext): Promise<readonly ConnectorRecord[]>;
}

ConnectorConfig

Single connector instance row stored in .memofs/connectors.json.

interface ConnectorConfig {
  readonly id: string;
  readonly type: string;
  readonly enabled: boolean;
  readonly schedule?: string;
  readonly sourceMapping?: JsonObject;
  readonly secretRef: string;
}

ConnectorsFile

The parsed on-disk shape of .memofs/connectors.json (the 11th canonical sync unit).

interface ConnectorsFile {
  readonly connectors: readonly ConnectorConfig[];
}

ConnectorRecord

A normalized external item produced by Connector.ingest().

interface ConnectorRecord {
  readonly externalId: string;
  readonly title: string;
  readonly content: string;
  readonly url?: string;
  readonly occurredAt?: string;
  readonly metadata?: JsonObject;
}

ConnectorIngestContext

Runtime context passed into Connector.ingest().

interface ConnectorIngestContext {
  readonly config: ConnectorConfig;
  readonly token: string;
  readonly memo: MemoFS;
  readonly signal?: AbortSignal;
}

RunConnectorsOptions

Configuration options passed to runConnectors().

interface RunConnectorsOptions {
  readonly rootDir: string;
  readonly memo: MemoFS;
  readonly secretResolver: SecretResolver;
  readonly connectorRegistry?: ConnectorRegistry;
  readonly onlyType?: string;
  readonly signal?: AbortSignal;
}

RunConnectorsResult

Aggregated result returned by runConnectors().

interface RunConnectorsResult {
  readonly written: readonly string[];
  readonly skipped: readonly string[];
  readonly errors: readonly ConnectorIngestError[];
  readonly ran: readonly string[];
}

ConnectorIngestResult

Result of a single connector pass before aggregation.

interface ConnectorIngestResult {
  readonly written: readonly string[];
  readonly skipped: readonly string[];
  readonly errors: readonly ConnectorIngestError[];
}

ConnectorIngestError

A recoverable error encountered during a connector pass.

interface ConnectorIngestError {
  readonly connectorType: string;
  readonly message: string;
  readonly externalId?: string;
  readonly cause?: unknown;
}

FileSecretResolverOptions

Constructor options for file-backed secret resolvers (EnvSecretResolver).

interface FileSecretResolverOptions {
  readonly rootDir: string;
}

CloudSecretResolverOptions

Constructor options for CloudSecretResolver.

interface CloudSecretResolverOptions {
  readonly projectId: string;
  readonly apiKey: string;
  readonly cloudBaseUrl: string;
}

Error Classes

All connector errors inherit from ConnectorError and provide a stable .code string:

class ConnectorError extends Error {
  readonly code: string;
  constructor(code: string, message: string, options?: { cause?: unknown });
}
ClassBase.codePropertiesThrown When
ConnectorConfigErrorConnectorError"CONNECTOR_CONFIG_ERROR".memofs/connectors.json is missing required structure, contains malformed rows, or violates token guardrails.
ConnectorSecretErrorConnectorError"CONNECTOR_SECRET_ERROR"readonly secretRef: stringA SecretResolver fails to resolve a secretRef.

Constants

EMPTY_CONNECTORS_FILE

A frozen { connectors: [] } default returned when .memofs/connectors.json is absent.

const EMPTY_CONNECTORS_FILE: ConnectorsFile;

On this page