Documentation JavaScript & TypeScript

Custom sources and RunStores

Add trusted source variants or a four-method conditional RunStore.

Custom sources

Pass trusted instances to createLibrarium({ customSources }). Each entry has an id, optional name, and a quick and/or deep provider; engine: true requires callers to select it by name. Built-in names are reserved. Instances belong to a client, not a global registry.

Inline providers implement execute; durable providers implement submit, poll, and retrieve. Deep variants must be durable. Return normalized content, citations, and provider-reported usage without inventing missing cost. Declare requiresApiKey: false only for a credential-free source.

Custom executable code is trusted, not sandboxed. It runs with process permissions. Review it before loading or granting credentials.

Four-method RunStore

import type { RunStore, StoredRun, RunSummary } from 'librarium/core';
import { RunStoreConflict } from 'librarium/core';

class MyStore implements RunStore {
  async get(id: string): Promise<StoredRun | null> { return null; }
  async save(doc: StoredRun, expectedVersion: number | null): Promise<number> {
    // Replace with an atomic version-conditional commit.
    throw new RunStoreConflict();
  }
  async list(opts?: { limit?: number; before?: string }): Promise<RunSummary[]> {
    return [];
  }
  async delete(id: string): Promise<void> { /* idempotent */ }
}

This is an interface skeleton, not a working store. save must atomically require the current version to equal expectedVersion; null means absent. Return the new version or throw RunStoreConflict. Return independent snapshots, list newest first with Run-id cursor paging, and make delete idempotent.

import { runStoreContract } from 'librarium/testing';
await runStoreContract(new MyStore()); // implement first; disposable empty store only

Register a store with createLibrarium({ store }), or configure a Node module whose default export returns it. Librarium redacts evidence before save; stores still own atomicity and schema boundaries.

Local filesystem

The shared unencrypted layout is public run.json, versioned private state.json, answers/<source>.md, and redacted evidence/<source>.json. Write state last. JS and PHP local stores coordinate through a non-expiring, token-owned run.json.lock marker. Do not remove one until its owner is known unable to resume.

This prevents concurrent writers, not partial writes after a crash. Private execution state is language-owned; shared reading is not permission to execute another language’s task state. Preserve signing keys outside the store.