@fortemi/core 2026.6.8 → 2026.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/uuid.ts","../src/event-bus.ts","../src/db.ts","../src/migrations/0001_initial_schema.ts","../src/migrations/0002_skos_tagging.ts","../src/migrations/0003_attachments.ts","../src/migrations/0004_embeddings.ts","../src/migrations/0005_link_confidence.ts","../src/migrations/0006_embedding_set_metadata.ts","../src/migrations/0007_virtual_embedding_sets.ts","../src/migrations/0008_graph_community_artifacts.ts","../src/migrations/0009_vector_selector_performance.ts","../src/migrations/index.ts","../src/data-archive.ts","../src/hash.ts","../src/repositories/notes-repository.ts","../src/repositories/condition-builder.ts","../src/repositories/embedding-sets-repository.ts","../src/repositories/search-repository.ts","../src/repositories/links-repository.ts","../src/tools/schemas.ts","../src/tools/manage-note.ts","../src/data-backend.ts","../src/worker/worker-client.ts","../src/storage-backend.ts","../src/capability-manager.ts","../src/migration-runner.ts","../src/archive-manager.ts","../src/create-fortemi.ts","../src/service-worker/register.ts","../src/service-worker/routes.ts","../src/blob-store.ts","../src/repositories/graph-repository.ts","../src/repositories/communities-repository.ts","../src/capabilities/llm-handler.ts","../src/job-queue-worker.ts","../src/repositories/tags-repository.ts","../src/repositories/collections-repository.ts","../src/repositories/skos-repository.ts","../src/repositories/provenance-repository.ts","../src/tools/capture-knowledge.ts","../src/tools/search.ts","../src/tools/manifest.ts","../src/tools/get-note.ts","../src/tools/list-notes.ts","../src/tools/manage-tags.ts","../src/tools/manage-collections.ts","../src/tools/manage-links.ts","../src/tools/manage-archive.ts","../src/tools/manage-capabilities.ts","../src/repositories/attachments-repository.ts","../src/tools/manage-attachments.ts","../src/capabilities/gpu-detect.ts","../src/capabilities/inference-detect.ts","../src/capabilities/chunking.ts","../src/capabilities/embedding-handler.ts","../src/capabilities/auto-tag.ts","../src/capabilities/embed-worker-transport.ts","../src/capabilities/semantic-loader.ts","../src/capabilities/llm-loader.ts","../src/capabilities/provider-registry.ts","../src/capabilities/openai-provider.ts","../src/capabilities/local-discovery.ts","../src/capabilities/fallback-router.ts","../src/fortemi-bridge.ts","../src/security/plugin-content.ts","../src/shard/types.ts","../src/shard/shard-tar.ts","../src/shard/checksum.ts","../src/shard/field-mapper.ts","../src/shard/shard-export.ts","../src/shard/shard-import.ts","../src/shard/shard-reader.ts","../src/shard/semantic-providers.ts","../src/shard/prefetch.ts","../src/aiwg-index.ts","../src/index.ts"],"names":["uuidv7","vector","json","hashJson","graph","llmFn","title","z","embedFn","decoder","jsonObject","parseVector","iso","yieldToEventLoop","maybeYield","manifest","sha256"],"mappings":"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","file":"index.js","sourcesContent":["import { v7 as uuidv7 } from 'uuid'\n\n/**\n * Generate a RFC 9562 UUIDv7 identifier.\n *\n * UUIDv7 embeds a Unix timestamp in the high bits, making IDs\n * time-sortable and monotonic within the same millisecond.\n */\nexport function generateId(): string {\n return uuidv7()\n}\n","/**\n * Typed event bus with IDisposable subscriptions (Monaco-style).\n * SSE-style pub/sub across all layers.\n *\n * Features:\n * - Exact event subscriptions via on() and once()\n * - Wildcard prefix subscriptions: on('note.*', handler)\n * - Cross-context bridging via bridge(port: MessagePort)\n */\n\nexport interface IDisposable {\n dispose(): void\n}\n\nexport interface EventMap {\n 'note.created': { id: string }\n 'note.updated': { id: string }\n 'note.deleted': { id: string }\n 'note.restored': { id: string }\n 'note.revised': { id: string; revisionNumber: number }\n 'search.reindexed': Record<string, never>\n 'embedding.ready': { noteId: string }\n 'capability.ready': { name: string }\n 'capability.disabled': { name: string }\n 'capability.loading': { name: string; progress?: number }\n 'capability.required': { name: string; jobId: string; noteId: string; type: string; message: string }\n 'job.completed': { id: string; noteId: string; type: string }\n 'job.failed': { id: string; noteId: string; type: string; error: string }\n 'job.blocked': { id: string; noteId: string; type: string; capability: string; message: string }\n 'archive.switched': { name: string }\n 'migration.applied': { version: number }\n 'provider.added': { id: string; name: string }\n 'provider.removed': { id: string }\n 'provider.active': { id: string; name: string }\n 'provider.fallback': { fromProvider: string; toProvider: string; errorCategory: string; error: string }\n 'provider.cooldown': { providerId: string; errorCategory: string; cooldownMs: number; expiresAt: number }\n}\n\ntype EventHandler<T> = (payload: T) => void\n\n/** Wildcard pattern: a string literal ending with '.*' */\ntype WildcardPattern = `${string}.*`\n\n/** Bridge message envelope sent over a MessagePort */\ninterface BridgeMessage {\n type: 'event'\n event: string\n payload: unknown\n}\n\nexport class TypedEventBus {\n private listeners = new Map<string, Set<EventHandler<unknown>>>()\n private wildcardListeners = new Map<string, Set<EventHandler<unknown>>>()\n\n // ---------------------------------------------------------------------------\n // on() — exact subscription\n // ---------------------------------------------------------------------------\n\n on<K extends keyof EventMap>(\n event: K,\n handler: EventHandler<EventMap[K]>,\n ): IDisposable\n\n on(\n pattern: WildcardPattern,\n handler: EventHandler<unknown>,\n ): IDisposable\n\n on(\n eventOrPattern: string,\n handler: EventHandler<unknown>,\n ): IDisposable {\n if (eventOrPattern.endsWith('.*')) {\n return this._onWildcard(eventOrPattern as WildcardPattern, handler)\n }\n return this._onExact(eventOrPattern, handler)\n }\n\n private _onExact(event: string, handler: EventHandler<unknown>): IDisposable {\n let set = this.listeners.get(event)\n if (!set) {\n set = new Set()\n this.listeners.set(event, set)\n }\n set.add(handler)\n\n return {\n dispose: () => {\n set!.delete(handler)\n if (set!.size === 0) {\n this.listeners.delete(event)\n }\n },\n }\n }\n\n private _onWildcard(pattern: WildcardPattern, handler: EventHandler<unknown>): IDisposable {\n // Store under the prefix (everything before '.*')\n const prefix = pattern.slice(0, -2)\n let set = this.wildcardListeners.get(prefix)\n if (!set) {\n set = new Set()\n this.wildcardListeners.set(prefix, set)\n }\n set.add(handler)\n\n return {\n dispose: () => {\n set!.delete(handler)\n if (set!.size === 0) {\n this.wildcardListeners.delete(prefix)\n }\n },\n }\n }\n\n // ---------------------------------------------------------------------------\n // once() — auto-disposing subscription\n // ---------------------------------------------------------------------------\n\n once<K extends keyof EventMap>(\n event: K,\n handler: EventHandler<EventMap[K]>,\n ): IDisposable {\n // eslint-disable-next-line prefer-const\n let sub: IDisposable | undefined\n\n const wrapper: EventHandler<EventMap[K]> = (payload) => {\n sub?.dispose()\n handler(payload)\n }\n\n sub = this._onExact(event as string, wrapper as EventHandler<unknown>)\n return sub\n }\n\n // ---------------------------------------------------------------------------\n // emit() — fire event to exact + wildcard listeners\n // ---------------------------------------------------------------------------\n\n emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): void {\n // Exact listeners\n const exactSet = this.listeners.get(event as string)\n if (exactSet) {\n for (const handler of exactSet) {\n handler(payload)\n }\n }\n\n // Wildcard listeners — match prefix before the first '.'\n // e.g. 'note.created' matches prefix 'note'\n const dotIndex = (event as string).indexOf('.')\n if (dotIndex !== -1) {\n const prefix = (event as string).slice(0, dotIndex)\n const wildcardSet = this.wildcardListeners.get(prefix)\n if (wildcardSet) {\n for (const handler of wildcardSet) {\n handler(payload)\n }\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // bridge() — cross-context forwarding via MessagePort\n // ---------------------------------------------------------------------------\n\n bridge(port: MessagePort): IDisposable {\n // Forward all locally emitted events to the port.\n // We intercept emit by wrapping it — instead, subscribe to every possible\n // event via a broadcast interceptor added around emit.\n const forwardingInterceptor = (event: string, payload: unknown): void => {\n port.postMessage({ type: 'event', event, payload } satisfies BridgeMessage)\n }\n\n // Track bridging state so dispose can stop forwarding.\n let active = true\n\n // Patch emit to forward when bridge is active.\n const originalEmit = this.emit.bind(this)\n this.emit = <K extends keyof EventMap>(event: K, payload: EventMap[K]): void => {\n originalEmit(event, payload)\n if (active) {\n forwardingInterceptor(event as string, payload)\n }\n }\n\n // Listen on the port for incoming events and re-emit locally.\n const messageHandler = (e: MessageEvent): void => {\n const data = e.data as BridgeMessage\n if (data?.type === 'event' && typeof data.event === 'string') {\n // Re-emit without triggering the bridge forward (would cause loops).\n // Use the original emit to avoid forwarding back.\n originalEmit(data.event as keyof EventMap, data.payload as never)\n }\n }\n\n port.addEventListener('message', messageHandler)\n\n return {\n dispose: () => {\n active = false\n this.emit = originalEmit\n port.removeEventListener('message', messageHandler)\n },\n }\n }\n\n // ---------------------------------------------------------------------------\n // removeAllListeners()\n // ---------------------------------------------------------------------------\n\n removeAllListeners(): void {\n this.listeners.clear()\n this.wildcardListeners.clear()\n }\n}\n","/**\n * PGlite database factory.\n * Enforces PGlite 0.4.x conventions (explicit database: 'postgres').\n * Selects persistence adapter based on config.\n */\n\nimport { PGlite } from '@electric-sql/pglite'\nimport { vector } from '@electric-sql/pglite/vector'\n\nexport type PersistenceMode = 'opfs' | 'idb' | 'memory'\n\nfunction getDataDir(persistence: PersistenceMode, archiveName: string): string | undefined {\n switch (persistence) {\n case 'opfs':\n return `opfs-ahp://fortemi-${archiveName}`\n case 'idb':\n return `idb://fortemi-${archiveName}`\n case 'memory':\n return undefined\n }\n}\n\nexport interface CreatePGliteOptions {\n /**\n * Restore the instance from a physical data-dir snapshot (issue #187) — schema\n * + rows + INDEXES in one binary load, with no migration / import / reindex.\n * The blob comes from PGlite's `dumpDataDir`; see `dumpDbSnapshot`/`restoreDbSnapshot`.\n * When set, callers MUST NOT run migrations — the restored dir already carries them.\n */\n loadDataDir?: Blob | File\n}\n\nexport async function createPGliteInstance(\n persistence: PersistenceMode,\n archiveName: string = 'default',\n options: CreatePGliteOptions = {},\n): Promise<PGlite> {\n const dataDir = getDataDir(persistence, archiveName)\n\n const pgliteOptions: Record<string, unknown> = {\n database: 'postgres', // PGlite 0.4.x breaking change: explicit required\n extensions: { vector },\n }\n\n if (dataDir) {\n pgliteOptions.dataDir = dataDir\n }\n\n if (options.loadDataDir) {\n pgliteOptions.loadDataDir = options.loadDataDir\n }\n\n const db = await PGlite.create(pgliteOptions)\n\n // Enable pgvector extension (idempotent — already present on a restored dir).\n await db.exec('CREATE EXTENSION IF NOT EXISTS vector')\n\n return db\n}\n","/**\n * Migration 0001: Core tables.\n * Creates: archive, note, note_original, note_revised_current,\n * note_revision, collection, job_queue, api_key, link,\n * provenance_edge.\n * All tables use UUIDv7 PKs, soft-delete (deleted_at), timestamps.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0001: Migration = {\n version: 1,\n name: '0001_initial_schema',\n sql: `\n -- Archive (multi-database tracking)\n CREATE TABLE IF NOT EXISTS archive (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n schema_version INTEGER NOT NULL DEFAULT 0,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Note (core entity)\n CREATE TABLE IF NOT EXISTS note (\n id TEXT PRIMARY KEY,\n archive_id TEXT REFERENCES archive(id),\n title TEXT,\n format TEXT NOT NULL DEFAULT 'markdown',\n source TEXT NOT NULL DEFAULT 'user',\n visibility TEXT NOT NULL DEFAULT 'private',\n revision_mode TEXT NOT NULL DEFAULT 'standard',\n is_starred BOOLEAN NOT NULL DEFAULT false,\n is_pinned BOOLEAN NOT NULL DEFAULT false,\n is_archived BOOLEAN NOT NULL DEFAULT false,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ,\n tsv tsvector GENERATED ALWAYS AS (to_tsvector('english', coalesce(title, ''))) STORED\n );\n\n -- Note original content (immutable)\n CREATE TABLE IF NOT EXISTS note_original (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n content TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Note revised current (mutable, latest revision)\n CREATE TABLE IF NOT EXISTS note_revised_current (\n note_id TEXT PRIMARY KEY REFERENCES note(id),\n content TEXT NOT NULL,\n ai_metadata JSONB,\n generation_count INTEGER NOT NULL DEFAULT 0,\n model TEXT,\n is_user_edited BOOLEAN NOT NULL DEFAULT false,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Note revision history\n CREATE TABLE IF NOT EXISTS note_revision (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n revision_number INTEGER NOT NULL,\n type TEXT NOT NULL DEFAULT 'ai',\n content TEXT NOT NULL,\n ai_metadata JSONB,\n model TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (note_id, revision_number)\n );\n\n -- Collection (folders/categories)\n CREATE TABLE IF NOT EXISTS collection (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n parent_id TEXT REFERENCES collection(id),\n position INTEGER NOT NULL DEFAULT 0,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n -- Collection membership\n CREATE TABLE IF NOT EXISTS collection_note (\n collection_id TEXT NOT NULL REFERENCES collection(id),\n note_id TEXT NOT NULL REFERENCES note(id),\n position INTEGER NOT NULL DEFAULT 0,\n added_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n PRIMARY KEY (collection_id, note_id)\n );\n\n -- Job queue (async processing)\n CREATE TABLE IF NOT EXISTS job_queue (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n job_type TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n priority INTEGER NOT NULL DEFAULT 5,\n required_capability TEXT,\n retry_count INTEGER NOT NULL DEFAULT 0,\n max_retries INTEGER NOT NULL DEFAULT 3,\n error TEXT,\n result JSONB,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- API key\n CREATE TABLE IF NOT EXISTS api_key (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n key_hash TEXT NOT NULL,\n permissions JSONB NOT NULL DEFAULT '[]',\n expires_at TIMESTAMPTZ,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n -- Link (bidirectional note links)\n CREATE TABLE IF NOT EXISTS link (\n id TEXT PRIMARY KEY,\n source_note_id TEXT NOT NULL REFERENCES note(id),\n target_note_id TEXT NOT NULL REFERENCES note(id),\n link_type TEXT NOT NULL DEFAULT 'related',\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n -- Provenance edge\n CREATE TABLE IF NOT EXISTS provenance_edge (\n id TEXT PRIMARY KEY,\n entity_type TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n activity TEXT NOT NULL,\n agent TEXT NOT NULL,\n started_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n ended_at TIMESTAMPTZ,\n attributes JSONB\n );\n\n CREATE INDEX IF NOT EXISTS idx_note_deleted_at ON note(deleted_at);\n CREATE INDEX IF NOT EXISTS idx_note_created_at ON note(created_at);\n CREATE INDEX IF NOT EXISTS idx_note_tsv ON note USING gin(tsv);\n CREATE INDEX IF NOT EXISTS idx_job_queue_status ON job_queue(status, priority DESC);\n CREATE INDEX IF NOT EXISTS idx_job_queue_note ON job_queue(note_id);\n CREATE INDEX IF NOT EXISTS idx_collection_parent ON collection(parent_id);\n CREATE INDEX IF NOT EXISTS idx_link_source ON link(source_note_id);\n CREATE INDEX IF NOT EXISTS idx_link_target ON link(target_note_id);\n CREATE INDEX IF NOT EXISTS idx_provenance_entity ON provenance_edge(entity_type, entity_id);\n `,\n}\n","/**\n * Migration 0002: SKOS tagging schema.\n * Creates: skos_scheme, skos_concept, skos_concept_relation,\n * note_tag, note_skos_tag.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0002: Migration = {\n version: 2,\n name: '0002_skos_tagging',\n sql: `\n -- SKOS Scheme (taxonomy container)\n CREATE TABLE IF NOT EXISTS skos_scheme (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n description TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n -- SKOS Concept (individual taxonomy term)\n CREATE TABLE IF NOT EXISTS skos_concept (\n id TEXT PRIMARY KEY,\n scheme_id TEXT NOT NULL REFERENCES skos_scheme(id),\n pref_label TEXT NOT NULL,\n alt_labels JSONB DEFAULT '[]',\n definition TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n CREATE INDEX IF NOT EXISTS idx_skos_concept_scheme ON skos_concept(scheme_id);\n\n -- SKOS Concept Relation (broader/narrower/related)\n CREATE TABLE IF NOT EXISTS skos_concept_relation (\n id TEXT PRIMARY KEY,\n source_concept_id TEXT NOT NULL REFERENCES skos_concept(id),\n target_concept_id TEXT NOT NULL REFERENCES skos_concept(id),\n relation_type TEXT NOT NULL CHECK (relation_type IN ('broader', 'narrower', 'related')),\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n CREATE INDEX IF NOT EXISTS idx_skos_relation_source ON skos_concept_relation(source_concept_id);\n CREATE INDEX IF NOT EXISTS idx_skos_relation_target ON skos_concept_relation(target_concept_id);\n\n -- Note tag (free-form tags)\n CREATE TABLE IF NOT EXISTS note_tag (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n tag TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (note_id, tag)\n );\n\n CREATE INDEX IF NOT EXISTS idx_note_tag_note ON note_tag(note_id);\n CREATE INDEX IF NOT EXISTS idx_note_tag_tag ON note_tag(tag);\n\n -- Note SKOS tag (structured taxonomy tags)\n CREATE TABLE IF NOT EXISTS note_skos_tag (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n concept_id TEXT NOT NULL REFERENCES skos_concept(id),\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (note_id, concept_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_note_skos_tag_note ON note_skos_tag(note_id);\n CREATE INDEX IF NOT EXISTS idx_note_skos_tag_concept ON note_skos_tag(concept_id);\n `,\n}\n","/**\n * Migration 0003: Attachments schema.\n * Creates: document_type, attachment_blob, attachment.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0003: Migration = {\n version: 3,\n name: '0003_attachments',\n sql: `\n -- Document type (MIME classification)\n CREATE TABLE IF NOT EXISTS document_type (\n id TEXT PRIMARY KEY,\n mime_type TEXT NOT NULL UNIQUE,\n label TEXT NOT NULL,\n category TEXT NOT NULL DEFAULT 'other',\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Attachment blob (content-addressable storage metadata)\n CREATE TABLE IF NOT EXISTS attachment_blob (\n id TEXT PRIMARY KEY,\n content_hash TEXT NOT NULL UNIQUE,\n size_bytes INTEGER NOT NULL,\n storage_path TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Attachment (links note to blob)\n CREATE TABLE IF NOT EXISTS attachment (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n blob_id TEXT NOT NULL REFERENCES attachment_blob(id),\n document_type_id TEXT REFERENCES document_type(id),\n filename TEXT NOT NULL,\n display_name TEXT,\n position INTEGER NOT NULL DEFAULT 0,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n CREATE INDEX IF NOT EXISTS idx_attachment_note ON attachment(note_id);\n CREATE INDEX IF NOT EXISTS idx_attachment_blob ON attachment(blob_id);\n `,\n}\n","/**\n * Migration 0004: Embeddings and vector linking schema.\n * Creates: embedding_set, embedding, embedding_set_member.\n * Requires: pgvector extension (loaded via PGlite vector extension).\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0004: Migration = {\n version: 4,\n name: '0004_embeddings',\n sql: `\n -- Embedding set (model configuration)\n CREATE TABLE IF NOT EXISTS embedding_set (\n id TEXT PRIMARY KEY,\n model_name TEXT NOT NULL,\n dimensions INTEGER NOT NULL DEFAULT 384,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Embedding (vector per note)\n CREATE TABLE IF NOT EXISTS embedding (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n embedding_set_id TEXT NOT NULL REFERENCES embedding_set(id),\n vector vector(384) NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (note_id, embedding_set_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_embedding_note ON embedding(note_id);\n CREATE INDEX IF NOT EXISTS idx_embedding_set ON embedding(embedding_set_id);\n CREATE INDEX IF NOT EXISTS idx_embedding_vector ON embedding USING hnsw (vector vector_cosine_ops)\n WITH (m = 16, ef_construction = 64);\n\n -- Embedding set member (tracks which notes have embeddings)\n CREATE TABLE IF NOT EXISTS embedding_set_member (\n embedding_set_id TEXT NOT NULL REFERENCES embedding_set(id),\n note_id TEXT NOT NULL REFERENCES note(id),\n embedding_id TEXT NOT NULL REFERENCES embedding(id),\n PRIMARY KEY (embedding_set_id, note_id)\n );\n `,\n}\n","/**\n * Migration 0005: Add confidence score and updated_at to link table.\n * The linkingHandler stores similarity confidence (1 - cosine distance)\n * and the server's link table includes these columns.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0005: Migration = {\n version: 5,\n name: '0005_link_confidence',\n sql: `\n ALTER TABLE link ADD COLUMN IF NOT EXISTS confidence REAL;\n ALTER TABLE link ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ DEFAULT now();\n `,\n}\n","/**\n * Migration 0006: Embedding set authoring metadata.\n * Adds human-facing labels so multiple embedding sets can be selected in UI.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0006: Migration = {\n version: 6,\n name: '0006_embedding_set_metadata',\n sql: `\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS name TEXT NOT NULL DEFAULT 'Full content';\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS purpose TEXT;\n `,\n}\n","/**\n * Migration 0007: Virtual embedding set metadata.\n * Adds durable selector-definition fields while preserving existing physical sets.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0007: Migration = {\n version: 7,\n name: '0007_virtual_embedding_sets',\n sql: `\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS kind TEXT NOT NULL DEFAULT 'physical';\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS mode TEXT;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS truncate_dimension INTEGER;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS criteria_json JSONB;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS source_json JSONB;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS compatibility_json JSONB;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS materialization_json JSONB;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS freshness_json JSONB;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ NOT NULL DEFAULT now();\n `,\n}\n","/**\n * Migration 0008: Persisted graph and community shard artifacts.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0008: Migration = {\n version: 8,\n name: '0008_graph_community_artifacts',\n sql: `\n CREATE TABLE IF NOT EXISTS graph_source (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n kind TEXT NOT NULL,\n source_table TEXT,\n embedding_set_id TEXT,\n virtual_set_id TEXT,\n model TEXT,\n dimension INTEGER,\n truncate_dimension INTEGER,\n metric TEXT,\n algorithm TEXT,\n parameters_json JSONB,\n input_hash TEXT NOT NULL,\n freshness_json JSONB NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n CREATE TABLE IF NOT EXISTS graph_edge_artifact (\n graph_source_id TEXT NOT NULL REFERENCES graph_source(id) ON DELETE CASCADE,\n from_note_id TEXT NOT NULL REFERENCES note(id),\n to_note_id TEXT NOT NULL REFERENCES note(id),\n weight DOUBLE PRECISION NOT NULL,\n kind TEXT NOT NULL,\n rank INTEGER,\n metadata_json JSONB,\n PRIMARY KEY (graph_source_id, from_note_id, to_note_id, kind)\n );\n\n CREATE TABLE IF NOT EXISTS community_set (\n id TEXT PRIMARY KEY,\n graph_source_id TEXT NOT NULL REFERENCES graph_source(id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n source_type TEXT NOT NULL,\n algorithm TEXT,\n parameters_json JSONB,\n input_hash TEXT NOT NULL,\n freshness_json JSONB NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n CREATE TABLE IF NOT EXISTS community (\n id TEXT NOT NULL,\n community_set_id TEXT NOT NULL REFERENCES community_set(id) ON DELETE CASCADE,\n label TEXT,\n rank INTEGER,\n size INTEGER,\n confidence DOUBLE PRECISION,\n representative_note_ids TEXT[],\n metadata_json JSONB,\n PRIMARY KEY (community_set_id, id)\n );\n\n CREATE TABLE IF NOT EXISTS community_assignment (\n community_set_id TEXT NOT NULL REFERENCES community_set(id) ON DELETE CASCADE,\n community_id TEXT NOT NULL,\n note_id TEXT NOT NULL REFERENCES note(id),\n confidence DOUBLE PRECISION,\n source_type TEXT NOT NULL,\n metadata_json JSONB,\n PRIMARY KEY (community_set_id, note_id),\n FOREIGN KEY (community_set_id, community_id) REFERENCES community(community_set_id, id) ON DELETE CASCADE\n );\n `,\n}\n","/**\n * Migration 0009: Indexes for property-scoped vector selectors.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0009: Migration = {\n version: 9,\n name: '0009_vector_selector_performance',\n sql: `\n CREATE INDEX IF NOT EXISTS idx_embedding_set_kind ON embedding_set(kind);\n CREATE INDEX IF NOT EXISTS idx_embedding_set_member_set ON embedding_set_member(embedding_set_id);\n CREATE INDEX IF NOT EXISTS idx_embedding_set_member_note ON embedding_set_member(note_id);\n CREATE INDEX IF NOT EXISTS idx_embedding_set_member_embedding ON embedding_set_member(embedding_id);\n\n CREATE INDEX IF NOT EXISTS idx_note_source ON note(source);\n CREATE INDEX IF NOT EXISTS idx_note_format ON note(format);\n CREATE INDEX IF NOT EXISTS idx_note_visibility ON note(visibility);\n CREATE INDEX IF NOT EXISTS idx_note_starred ON note(is_starred);\n CREATE INDEX IF NOT EXISTS idx_note_archived ON note(is_archived);\n CREATE INDEX IF NOT EXISTS idx_note_updated_at ON note(updated_at);\n\n CREATE INDEX IF NOT EXISTS idx_note_revised_current_user_edited ON note_revised_current(is_user_edited);\n CREATE INDEX IF NOT EXISTS idx_note_revised_current_generation_count ON note_revised_current(generation_count);\n `,\n}\n","import type { Migration } from '../migration-runner.js'\nimport { migration0001 } from './0001_initial_schema.js'\nimport { migration0002 } from './0002_skos_tagging.js'\nimport { migration0003 } from './0003_attachments.js'\nimport { migration0004 } from './0004_embeddings.js'\nimport { migration0005 } from './0005_link_confidence.js'\nimport { migration0006 } from './0006_embedding_set_metadata.js'\nimport { migration0007 } from './0007_virtual_embedding_sets.js'\nimport { migration0008 } from './0008_graph_community_artifacts.js'\nimport { migration0009 } from './0009_vector_selector_performance.js'\n\nexport const allMigrations: Migration[] = [\n migration0001,\n migration0002,\n migration0003,\n migration0004,\n migration0005,\n migration0006,\n migration0007,\n migration0008,\n migration0009,\n]\n","/**\n * Physical data-dir snapshot (issue #187).\n *\n * A *snapshot* is a binary dump of a populated PGlite data directory — schema +\n * rows + INDEXES (including the HNSW vector index from migration 0004) — that\n * restores in a single binary load with NO migration, NO shard import, and NO\n * client-side HNSW build. It is the fast, pre-indexed, single-version restore\n * option, complementary to logical Knowledge Shards (which are portable + mergeable\n * but pay the import + reindex cost on every load).\n *\n * Named \"snapshot\" to stay distinct from:\n * - `ArchiveManager` / `archiveName` — a *named persistence store* (idb/opfs namespace).\n * - Knowledge Shards — logical, portable, mergeable interchange (`importShard`).\n *\n * Safety (the one real risk of the physical format): a Postgres data dir is coupled\n * to the PGlite/pgvector version and the schema-migration head it was built with.\n * Every snapshot carries a version stamp (a JSON sidecar); `restoreDbSnapshot`\n * verifies compatibility BEFORE loading and fails fast (`DbSnapshotVersionError`) on\n * mismatch, so a host can fall back to a shard import.\n */\n\nimport type { PGlite } from '@electric-sql/pglite'\nimport { createPGliteInstance, type CreatePGliteOptions, type PersistenceMode } from './db.js'\nimport { allMigrations } from './migrations/index.js'\n\n/** Snapshot meta envelope schema. */\nexport const DB_SNAPSHOT_SCHEMA_VERSION = 'fortemi.db-snapshot.v1' as const\n\n/**\n * PGlite version this build of @fortemi/core bundles and can safely restore a\n * snapshot from. Kept in sync with the `@electric-sql/pglite` dependency; a unit\n * test asserts it matches package.json so it can't silently drift.\n */\nexport const SUPPORTED_PGLITE_VERSION = '0.4.1'\n\n/** Schema-migration head this build expects a restored snapshot to carry. */\nexport const CURRENT_MIGRATION_HEAD: number = allMigrations.reduce(\n (head, migration) => Math.max(head, migration.version),\n 0,\n)\n\nexport type DbSnapshotCompression = 'none' | 'gzip' | 'auto'\n\nexport interface DbSnapshotMeta {\n schema_version: typeof DB_SNAPSHOT_SCHEMA_VERSION\n /** PGlite version the data dir was dumped from (data-dir format coupling). */\n pglite_version: string\n /** pgvector extension version at dump time (advisory). */\n pgvector_version: string | null\n /** Max applied migration version at dump time (schema coupling). */\n migration_head: number\n /** ISO-8601 dump time. */\n created_at: string\n /** @fortemi/core version that produced the snapshot (diagnostic only). */\n fortemi_version?: string\n}\n\nexport interface DbSnapshot {\n /** The PGlite data-dir dump (gzip by default). Serve as a static asset. */\n data: Blob | File\n /** Version stamp — serve alongside `data` as a `<name>.meta.json` sidecar. */\n meta: DbSnapshotMeta\n}\n\n/** Minimal shape `dumpDbSnapshot` needs — PGlite satisfies it structurally. */\nexport interface DumpableDb {\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{ rows: T[] }>\n dumpDataDir(compression?: DbSnapshotCompression): Promise<Blob | File>\n}\n\nexport interface DumpDbSnapshotOptions {\n /** Defaults to 'gzip'. */\n compression?: DbSnapshotCompression\n /** Recorded in meta for diagnostics. */\n fortemiVersion?: string\n /** Override the timestamp (tests / reproducible builds). */\n createdAt?: string\n}\n\nasync function readMigrationHead(db: DumpableDb): Promise<number> {\n try {\n const result = await db.query<{ head: number }>(\n 'SELECT COALESCE(MAX(version), 0) AS head FROM schema_version',\n )\n return Number(result.rows[0]?.head ?? 0)\n } catch {\n // No schema_version table → an unmigrated dir; head 0.\n return 0\n }\n}\n\nasync function readPgvectorVersion(db: DumpableDb): Promise<string | null> {\n try {\n const result = await db.query<{ extversion: string }>(\n \"SELECT extversion FROM pg_extension WHERE extname = 'vector'\",\n )\n return result.rows[0]?.extversion ?? null\n } catch {\n return null\n }\n}\n\n/**\n * Dump a populated PGlite into a versioned snapshot. Build-time (Node), after the\n * corpus is loaded and the HNSW index has been built once.\n *\n * Returns `{ data, meta }`: write `data` to e.g. `corpus.pgdata` and `meta` to\n * `corpus.pgdata.meta.json` (the sidecar `restoreDbSnapshot(url)` looks for).\n */\nexport async function dumpDbSnapshot(\n db: DumpableDb,\n options: DumpDbSnapshotOptions = {},\n): Promise<DbSnapshot> {\n const migration_head = await readMigrationHead(db)\n const pgvector_version = await readPgvectorVersion(db)\n const data = await db.dumpDataDir(options.compression ?? 'gzip')\n const meta: DbSnapshotMeta = {\n schema_version: DB_SNAPSHOT_SCHEMA_VERSION,\n pglite_version: SUPPORTED_PGLITE_VERSION,\n pgvector_version,\n migration_head,\n created_at: options.createdAt ?? new Date().toISOString(),\n ...(options.fortemiVersion ? { fortemi_version: options.fortemiVersion } : {}),\n }\n return { data, meta }\n}\n\nexport interface DbSnapshotExpectations {\n migrationHead?: number\n pgliteVersion?: string\n /** When provided, a differing snapshot pgvector version is a warning, not a failure. */\n pgvectorVersion?: string | null\n}\n\nexport interface DbSnapshotCompat {\n compatible: boolean\n /** Hard incompatibilities — restore must refuse. */\n reasons: string[]\n /** Advisory differences — restore proceeds. */\n warnings: string[]\n}\n\nfunction majorMinor(version: string): string {\n const parts = version.split('.')\n return `${parts[0] ?? '0'}.${parts[1] ?? '0'}`\n}\n\n/**\n * Verify a snapshot's version stamp against what this build supports. Pure —\n * unit-testable with no PGlite. Hard gates: snapshot schema, migration head\n * (exact), PGlite major.minor (data-dir format). pgvector is advisory.\n */\nexport function verifyDbSnapshotMeta(\n meta: DbSnapshotMeta,\n expected: DbSnapshotExpectations = {},\n): DbSnapshotCompat {\n const reasons: string[] = []\n const warnings: string[] = []\n const expectedHead = expected.migrationHead ?? CURRENT_MIGRATION_HEAD\n const expectedPglite = expected.pgliteVersion ?? SUPPORTED_PGLITE_VERSION\n\n if (meta.schema_version !== DB_SNAPSHOT_SCHEMA_VERSION) {\n reasons.push(`unsupported snapshot schema_version: ${String(meta.schema_version)}`)\n }\n if (meta.migration_head !== expectedHead) {\n reasons.push(`migration head mismatch: snapshot=${meta.migration_head}, supported=${expectedHead}`)\n }\n if (majorMinor(meta.pglite_version) !== majorMinor(expectedPglite)) {\n reasons.push(`PGlite version mismatch: snapshot=${meta.pglite_version}, supported=${expectedPglite}`)\n }\n if (expected.pgvectorVersion !== undefined && meta.pgvector_version !== expected.pgvectorVersion) {\n warnings.push(`pgvector version differs: snapshot=${String(meta.pgvector_version)}, expected=${String(expected.pgvectorVersion)}`)\n }\n\n return { compatible: reasons.length === 0, reasons, warnings }\n}\n\n/** Thrown by `restoreDbSnapshot` when the snapshot is incompatible with this build. */\nexport class DbSnapshotVersionError extends Error {\n readonly reasons: string[]\n readonly meta: DbSnapshotMeta\n constructor(reasons: string[], meta: DbSnapshotMeta) {\n super(`Incompatible DB snapshot: ${reasons.join('; ')}`)\n this.name = 'DbSnapshotVersionError'\n this.reasons = reasons\n this.meta = meta\n }\n}\n\nexport type DbSnapshotSource =\n | DbSnapshot\n | string\n | { dataUrl: string; metaUrl?: string }\n\nexport interface RestoreDbSnapshotOptions {\n /** Persistence for the restored instance. Defaults to 'memory' (read-only demos). */\n persistence?: PersistenceMode\n archiveName?: string\n /** Verification expectations (defaults to this build's supported values). */\n expectations?: DbSnapshotExpectations\n /** Injectable fetch (tests / non-browser). Defaults to global `fetch`. */\n fetchImpl?: typeof fetch\n}\n\nfunction isInlineSnapshot(source: DbSnapshotSource): source is DbSnapshot {\n return typeof source === 'object' && 'data' in source && 'meta' in source\n}\n\nasync function resolveSnapshotSource(\n source: DbSnapshotSource,\n fetchImpl: typeof fetch,\n): Promise<DbSnapshot> {\n if (isInlineSnapshot(source)) return source\n\n const dataUrl = typeof source === 'string' ? source : source.dataUrl\n const metaUrl = typeof source === 'string'\n ? `${source}.meta.json`\n : (source.metaUrl ?? `${source.dataUrl}.meta.json`)\n\n const metaResponse = await fetchImpl(metaUrl)\n if (!metaResponse.ok) {\n throw new Error(`Failed to fetch snapshot meta (${metaResponse.status}): ${metaUrl}`)\n }\n const meta = (await metaResponse.json()) as DbSnapshotMeta\n\n const dataResponse = await fetchImpl(dataUrl)\n if (!dataResponse.ok) {\n throw new Error(`Failed to fetch snapshot data (${dataResponse.status}): ${dataUrl}`)\n }\n const data = await dataResponse.blob()\n\n return { data, meta }\n}\n\n/**\n * Restore a PGlite from a physical snapshot — verify the version stamp first,\n * then load the data dir with **no migration / import / HNSW build**. Throws\n * `DbSnapshotVersionError` on incompatibility (catch it to fall back to a shard\n * import). The returned instance is ready to query; do NOT run migrations on it.\n */\nexport async function restoreDbSnapshot(\n source: DbSnapshotSource,\n options: RestoreDbSnapshotOptions = {},\n): Promise<PGlite> {\n const fetchImpl = options.fetchImpl ?? (globalThis.fetch as typeof fetch)\n const { data, meta } = await resolveSnapshotSource(source, fetchImpl)\n\n const compat = verifyDbSnapshotMeta(meta, options.expectations)\n if (!compat.compatible) {\n throw new DbSnapshotVersionError(compat.reasons, meta)\n }\n\n const createOptions: CreatePGliteOptions = { loadDataDir: data }\n return createPGliteInstance(options.persistence ?? 'memory', options.archiveName ?? 'default', createOptions)\n}\n","import { sha256 } from '@noble/hashes/sha256'\nimport { bytesToHex } from '@noble/hashes/utils'\n\n/**\n * Compute a SHA-256 content hash for the given byte array.\n *\n * Returns a string in `algorithm:hex` format to match the server-side\n * convention, e.g. `sha256:a3b4c5...` (64 hex characters after the prefix).\n *\n * @param data - Raw bytes to hash\n * @returns `'sha256:<64-char lowercase hex>'`\n */\nexport function computeHash(data: Uint8Array): string {\n const digest = sha256(data)\n return `sha256:${bytesToHex(digest)}`\n}\n","/**\n * NotesRepository — CRUD and lifecycle operations for the note entity.\n *\n * Responsibilities:\n * - Create notes with immutable original content and mutable current revision\n * - Manage note lifecycle: soft-delete, restore, star, pin, archive\n * - List notes with filtering, pagination, and sorting\n * - Emit domain events via TypedEventBus on every mutation\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\nimport { computeHash } from '../hash.js'\nimport type { TypedEventBus } from '../event-bus.js'\nimport type {\n NoteFull,\n NoteSummary,\n NoteCreateInput,\n NoteUpdateInput,\n NoteListOptions,\n NoteRevision,\n PaginatedResult,\n} from './types.js'\n\nexport class NotesRepository {\n constructor(\n private db: DatabaseClient,\n private events?: TypedEventBus,\n ) {}\n\n /**\n * Create a new note with its original content record, current revision,\n * optional tags, and an auto-queued title_generation job when no title\n * is provided.\n *\n * All writes happen in a single transaction.\n */\n async create(input: NoteCreateInput): Promise<NoteFull> {\n const noteId = generateId()\n const originalId = generateId()\n const contentHash = computeHash(new TextEncoder().encode(input.content))\n\n await this.db.transaction(async (tx) => {\n // Insert note\n await tx.query(\n `INSERT INTO note (id, archive_id, title, format, source, visibility)\n VALUES ($1, $2, $3, $4, $5, $6)`,\n [\n noteId,\n input.archive_id ?? null,\n input.title ?? null,\n input.format ?? 'markdown',\n input.source ?? 'user',\n input.visibility ?? 'private',\n ],\n )\n\n // Insert note_original (immutable — never updated)\n await tx.query(\n `INSERT INTO note_original (id, note_id, content, content_hash)\n VALUES ($1, $2, $3, $4)`,\n [originalId, noteId, input.content, contentHash],\n )\n\n // Insert note_revised_current (mutable — tracks latest revision)\n await tx.query(\n `INSERT INTO note_revised_current (note_id, content)\n VALUES ($1, $2)`,\n [noteId, input.content],\n )\n\n // Insert free-form tags\n if (input.tags?.length) {\n for (const tag of input.tags) {\n await tx.query(\n `INSERT INTO note_tag (id, note_id, tag) VALUES ($1, $2, $3)`,\n [generateId(), noteId, tag],\n )\n }\n }\n\n // Queue the note creation pipeline:\n // ai_revision (1, requires llm), title_generation (2), embedding (3, requires semantic)\n await tx.query(\n `INSERT INTO job_queue (id, note_id, job_type, status, priority, required_capability)\n VALUES ($1, $2, 'ai_revision', 'pending', 1, 'llm')`,\n [generateId(), noteId],\n )\n if (!input.title) {\n await tx.query(\n `INSERT INTO job_queue (id, note_id, job_type, status, priority)\n VALUES ($1, $2, 'title_generation', 'pending', 2)`,\n [generateId(), noteId],\n )\n }\n await tx.query(\n `INSERT INTO job_queue (id, note_id, job_type, status, priority, required_capability)\n VALUES ($1, $2, 'embedding', 'pending', 3, 'semantic')`,\n [generateId(), noteId],\n )\n })\n\n this.events?.emit('note.created', { id: noteId })\n return this.get(noteId)\n }\n\n /**\n * Fetch a single note by its ID.\n * Returns NoteFull which includes original content, current revision, and tags.\n * Throws when the note does not exist.\n */\n async get(id: string): Promise<NoteFull> {\n const noteResult = await this.db.query<{\n id: string\n archive_id: string | null\n title: string | null\n format: string\n source: string\n visibility: string\n revision_mode: string\n is_starred: boolean\n is_pinned: boolean\n is_archived: boolean\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n original_id: string\n original_content: string\n content_hash: string\n original_created_at: Date\n current_content: string\n ai_metadata: unknown | null\n generation_count: number\n model: string | null\n is_user_edited: boolean\n current_updated_at: Date\n }>(\n `SELECT n.id, n.archive_id, n.title, n.format, n.source, n.visibility,\n n.revision_mode, n.is_starred, n.is_pinned, n.is_archived,\n n.created_at, n.updated_at, n.deleted_at,\n o.id AS original_id,\n o.content AS original_content,\n o.content_hash,\n o.created_at AS original_created_at,\n c.content AS current_content,\n c.ai_metadata,\n c.generation_count,\n c.model,\n c.is_user_edited,\n c.updated_at AS current_updated_at\n FROM note n\n LEFT JOIN note_original o ON o.note_id = n.id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE n.id = $1`,\n [id],\n )\n\n if (noteResult.rows.length === 0) {\n throw new Error(`Note not found: ${id}`)\n }\n\n const row = noteResult.rows[0]\n\n const tagsResult = await this.db.query<{ tag: string }>(\n `SELECT tag FROM note_tag WHERE note_id = $1 ORDER BY tag`,\n [id],\n )\n\n return {\n id: row.id,\n archive_id: row.archive_id,\n title: row.title,\n format: row.format,\n source: row.source,\n visibility: row.visibility,\n revision_mode: row.revision_mode,\n is_starred: row.is_starred,\n is_pinned: row.is_pinned,\n is_archived: row.is_archived,\n created_at: row.created_at,\n updated_at: row.updated_at,\n deleted_at: row.deleted_at,\n tags: tagsResult.rows.map((r) => r.tag),\n original: {\n id: row.original_id,\n content: row.original_content,\n content_hash: row.content_hash,\n created_at: row.original_created_at,\n },\n current: {\n content: row.current_content,\n ai_metadata: row.ai_metadata,\n generation_count: row.generation_count,\n model: row.model,\n is_user_edited: row.is_user_edited,\n updated_at: row.current_updated_at,\n },\n }\n }\n\n /**\n * List notes with optional filtering, sorting, and pagination.\n * Excludes soft-deleted notes by default (pass include_deleted: true to override).\n */\n async list(options: NoteListOptions = {}): Promise<PaginatedResult<NoteSummary>> {\n const {\n limit = 50,\n offset = 0,\n sort = 'created_at',\n order = 'desc',\n is_starred,\n is_pinned,\n is_archived,\n include_deleted = false,\n collection_id,\n tags,\n } = options\n\n const conditions: string[] = []\n const params: unknown[] = []\n let paramIndex = 1\n\n if (!include_deleted) {\n conditions.push('n.deleted_at IS NULL')\n }\n if (is_starred !== undefined) {\n conditions.push(`n.is_starred = $${paramIndex++}`)\n params.push(is_starred)\n }\n if (is_pinned !== undefined) {\n conditions.push(`n.is_pinned = $${paramIndex++}`)\n params.push(is_pinned)\n }\n if (is_archived !== undefined) {\n conditions.push(`n.is_archived = $${paramIndex++}`)\n params.push(is_archived)\n }\n if (collection_id) {\n conditions.push(\n `EXISTS (SELECT 1 FROM collection_note cn WHERE cn.note_id = n.id AND cn.collection_id = $${paramIndex++})`,\n )\n params.push(collection_id)\n }\n if (tags?.length) {\n conditions.push(\n `EXISTS (SELECT 1 FROM note_tag nt WHERE nt.note_id = n.id AND nt.tag = ANY($${paramIndex++}))`,\n )\n params.push(tags)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Validate sort column against allowlist to prevent SQL injection\n const validSorts = ['created_at', 'updated_at', 'title'] as const\n const sortCol = (validSorts as readonly string[]).includes(sort) ? sort : 'created_at'\n const sortDir = order === 'asc' ? 'ASC' : 'DESC'\n\n // Count total matching rows\n const countResult = await this.db.query<{ count: string }>(\n `SELECT COUNT(*) AS count FROM note n ${where}`,\n params,\n )\n const total = parseInt(countResult.rows[0].count, 10)\n\n // Fetch paginated rows\n const listParams = [...params, limit, offset]\n const rowsResult = await this.db.query<{\n id: string\n title: string | null\n format: string\n source: string\n visibility: string\n is_starred: boolean\n is_pinned: boolean\n is_archived: boolean\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n }>(\n `SELECT n.id, n.title, n.format, n.source, n.visibility,\n n.is_starred, n.is_pinned, n.is_archived,\n n.created_at, n.updated_at, n.deleted_at\n FROM note n ${where}\n ORDER BY n.${sortCol} ${sortDir}\n LIMIT $${paramIndex++} OFFSET $${paramIndex++}`,\n listParams,\n )\n\n // Batch-load tags for all returned notes\n const noteIds = rowsResult.rows.map((r) => r.id)\n const tagMap = new Map<string, string[]>()\n\n if (noteIds.length > 0) {\n const tagsResult = await this.db.query<{ note_id: string; tag: string }>(\n `SELECT note_id, tag FROM note_tag WHERE note_id = ANY($1) ORDER BY tag`,\n [noteIds],\n )\n for (const row of tagsResult.rows) {\n const existing = tagMap.get(row.note_id) ?? []\n existing.push(row.tag)\n tagMap.set(row.note_id, existing)\n }\n }\n\n const items: NoteSummary[] = rowsResult.rows.map((r) => ({\n id: r.id,\n title: r.title,\n format: r.format,\n source: r.source,\n visibility: r.visibility,\n is_starred: r.is_starred,\n is_pinned: r.is_pinned,\n is_archived: r.is_archived,\n created_at: r.created_at,\n updated_at: r.updated_at,\n deleted_at: r.deleted_at,\n tags: tagMap.get(r.id) ?? [],\n }))\n\n return { items, total, limit, offset }\n }\n\n /**\n * Update mutable note fields.\n * When content changes, the previous current content is saved as a numbered\n * revision before the new content is applied.\n */\n async update(id: string, input: NoteUpdateInput): Promise<NoteFull> {\n // Determine the next revision number before entering the transaction\n const countResult = await this.db.query<{ count: string }>(\n `SELECT COUNT(*) AS count FROM note_revision WHERE note_id = $1`,\n [id],\n )\n const nextRevision = parseInt(countResult.rows[0].count, 10) + 1\n\n await this.db.transaction(async (tx) => {\n // Build dynamic SET clause for note table fields\n const setClauses: string[] = ['updated_at = now()']\n const noteParams: unknown[] = []\n let paramIdx = 1\n\n if (input.title !== undefined) {\n setClauses.push(`title = $${paramIdx++}`)\n noteParams.push(input.title)\n }\n if (input.format !== undefined) {\n setClauses.push(`format = $${paramIdx++}`)\n noteParams.push(input.format)\n }\n if (input.visibility !== undefined) {\n setClauses.push(`visibility = $${paramIdx++}`)\n noteParams.push(input.visibility)\n }\n\n noteParams.push(id)\n await tx.query(\n `UPDATE note SET ${setClauses.join(', ')} WHERE id = $${paramIdx}`,\n noteParams,\n )\n\n // When content changes, archive the current content as a revision\n if (input.content !== undefined) {\n const currentResult = await tx.query<{ content: string }>(\n `SELECT content FROM note_revised_current WHERE note_id = $1`,\n [id],\n )\n if (currentResult.rows.length > 0) {\n await tx.query(\n `INSERT INTO note_revision (id, note_id, revision_number, type, content)\n VALUES ($1, $2, $3, 'user', $4)`,\n [generateId(), id, nextRevision, currentResult.rows[0].content],\n )\n }\n\n await tx.query(\n `UPDATE note_revised_current\n SET content = $1, is_user_edited = true, updated_at = now()\n WHERE note_id = $2`,\n [input.content, id],\n )\n }\n })\n\n this.events?.emit('note.updated', { id })\n return this.get(id)\n }\n\n /**\n * Soft-delete a note by setting deleted_at to the current timestamp.\n */\n async delete(id: string): Promise<void> {\n await this.db.query(\n `UPDATE note SET deleted_at = now(), updated_at = now() WHERE id = $1`,\n [id],\n )\n this.events?.emit('note.deleted', { id })\n }\n\n /**\n * Restore a soft-deleted note by clearing deleted_at.\n */\n async restore(id: string): Promise<NoteFull> {\n await this.db.query(\n `UPDATE note SET deleted_at = NULL, updated_at = now() WHERE id = $1`,\n [id],\n )\n this.events?.emit('note.restored', { id })\n return this.get(id)\n }\n\n /**\n * Toggle the is_starred field on a note.\n */\n async star(id: string, starred: boolean): Promise<void> {\n await this.db.query(\n `UPDATE note SET is_starred = $1, updated_at = now() WHERE id = $2`,\n [starred, id],\n )\n this.events?.emit('note.updated', { id })\n }\n\n /**\n * Toggle the is_pinned field on a note.\n */\n async pin(id: string, pinned: boolean): Promise<void> {\n await this.db.query(\n `UPDATE note SET is_pinned = $1, updated_at = now() WHERE id = $2`,\n [pinned, id],\n )\n this.events?.emit('note.updated', { id })\n }\n\n /**\n * Toggle the is_archived field on a note.\n */\n async archive(id: string, archived: boolean): Promise<void> {\n await this.db.query(\n `UPDATE note SET is_archived = $1, updated_at = now() WHERE id = $2`,\n [archived, id],\n )\n this.events?.emit('note.updated', { id })\n }\n\n /**\n * Get revision history for a note, ordered by revision_number descending.\n */\n async getRevisions(noteId: string): Promise<NoteRevision[]> {\n const result = await this.db.query<NoteRevision>(\n `SELECT id, note_id, revision_number, type, content, ai_metadata, model, created_at\n FROM note_revision\n WHERE note_id = $1\n ORDER BY revision_number DESC`,\n [noteId],\n )\n return result.rows\n }\n}\n","/**\n * Shared SQL condition builder for note filtering.\n * Used by both SearchRepository and NotesRepository to prevent drift\n * when adding new filter fields.\n *\n * @implements #87 shared condition builder\n */\n\nimport type { SearchOptions } from './types.js'\n\nexport interface ConditionResult {\n conditions: string[]\n params: unknown[]\n nextIdx: number\n}\n\n/**\n * Build WHERE clause conditions for note filtering.\n * Generates parameterized SQL conditions for all shared filter fields.\n *\n * @param options - Filter options (any subset of SearchOptions fields)\n * @param startIdx - Starting parameter index ($N)\n * @param includeDeleted - Whether to include soft-deleted notes (default: false)\n */\nexport function buildNoteConditions(\n options: Pick<SearchOptions, 'tags' | 'collection_id' | 'date_from' | 'date_to' | 'is_starred' | 'is_archived' | 'format' | 'source' | 'visibility'>,\n startIdx: number,\n includeDeleted = false,\n): ConditionResult {\n const conditions: string[] = []\n const params: unknown[] = []\n let idx = startIdx\n\n if (!includeDeleted) {\n conditions.push('n.deleted_at IS NULL')\n }\n\n if (options.tags?.length) {\n conditions.push(\n `EXISTS (SELECT 1 FROM note_tag nt WHERE nt.note_id = n.id AND nt.tag = ANY($${idx++}))`,\n )\n params.push(options.tags)\n }\n\n if (options.collection_id) {\n conditions.push(\n `EXISTS (SELECT 1 FROM collection_note cn WHERE cn.note_id = n.id AND cn.collection_id = $${idx++})`,\n )\n params.push(options.collection_id)\n }\n\n if (options.date_from) {\n conditions.push(`n.created_at >= $${idx++}`)\n params.push(options.date_from)\n }\n\n if (options.date_to) {\n conditions.push(`n.created_at <= $${idx++}`)\n params.push(options.date_to)\n }\n\n if (options.is_starred !== undefined) {\n conditions.push(`n.is_starred = $${idx++}`)\n params.push(options.is_starred)\n }\n\n if (options.is_archived !== undefined) {\n conditions.push(`n.is_archived = $${idx++}`)\n params.push(options.is_archived)\n }\n\n if (options.format) {\n conditions.push(`n.format = $${idx++}`)\n params.push(options.format)\n }\n\n if (options.source) {\n conditions.push(`n.source = $${idx++}`)\n params.push(options.source)\n }\n\n if (options.visibility) {\n conditions.push(`n.visibility = $${idx++}`)\n params.push(options.visibility)\n }\n\n return { conditions, params, nextIdx: idx }\n}\n","/**\n * EmbeddingSetsRepository - named, filter, and virtual embedding set API.\n */\n\nimport type { QueryExecutor } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\nimport { computeHash } from '../hash.js'\n\nexport type EmbeddingSetKind = 'physical' | 'filter' | 'virtual'\nexport type EmbeddingSetMode = 'auto' | 'manual' | 'mixed'\n\nexport interface EmbeddingSetCriteria {\n query?: string\n tags?: string[]\n collectionIds?: string[]\n conceptIds?: string[]\n noteIds?: string[]\n sources?: string[]\n formats?: string[]\n visibilities?: string[]\n isStarred?: boolean\n isArchived?: boolean\n hasTitle?: boolean\n hasEmbedding?: boolean\n isUserEdited?: boolean\n hasAiMetadata?: boolean\n hasRevisions?: boolean\n minGenerationCount?: number\n maxGenerationCount?: number\n updatedAfter?: string\n updatedBefore?: string\n}\n\nexport interface EmbeddingSetFreshness {\n status: 'fresh' | 'stale' | 'unknown'\n sourceHash?: string\n checkedAt?: string\n reason?: string\n}\n\nexport interface EmbeddingCompatibilityPolicy {\n model: 'require-same' | 'allow-compatible-family'\n dimension: 'require-same' | 'allow-truncation'\n duplicateVectors: 'prefer-latest' | 'prefer-set-order' | 'error'\n missingVectors: 'omit' | 'include-unembedded-note' | 'error'\n}\n\nexport interface VirtualMaterializationPolicy {\n allowed: boolean\n includeResolvedMembers?: boolean\n includeResolvedEdges?: boolean\n freshness: 'fresh' | 'stale' | 'unknown'\n inputHash?: string\n generatedAt?: string\n resolvedMemberCount?: number\n}\n\nexport interface CriteriaVirtualSource {\n type: 'criteria'\n baseSetId: string\n criteria: EmbeddingSetCriteria\n}\n\nexport interface SetOperationVirtualSource {\n type: 'set-operation'\n operation: 'union' | 'intersection' | 'difference'\n setIds: string[]\n}\n\nexport interface FallbackVirtualSource {\n type: 'fallback'\n preferredSetIds: string[]\n}\n\nexport interface LatestCompatibleVirtualSource {\n type: 'latest-compatible'\n candidateSetIds: string[]\n model?: string\n dimension?: number\n}\n\nexport interface SnapshotVirtualSource {\n type: 'snapshot'\n snapshotId: string\n sourceDefinitionId: string\n generatedAt: string\n inputHash: string\n}\n\nexport type VirtualEmbeddingSetSource =\n | CriteriaVirtualSource\n | SetOperationVirtualSource\n | FallbackVirtualSource\n | LatestCompatibleVirtualSource\n | SnapshotVirtualSource\n\nexport interface VirtualEmbeddingSetDefinition {\n id: string\n name: string\n purpose?: string | null\n source: VirtualEmbeddingSetSource\n compatibility: EmbeddingCompatibilityPolicy\n materialization?: VirtualMaterializationPolicy\n createdAt?: string\n updatedAt?: string\n}\n\nexport interface EmbeddingSetSelector {\n kind: 'default' | 'embedding-set' | 'virtual-definition'\n embeddingSetId?: string\n definition?: VirtualEmbeddingSetDefinition\n}\n\nexport interface EmbeddingSetDescriptor {\n id: string\n name: string\n purpose?: string | null\n kind: EmbeddingSetKind\n mode?: EmbeddingSetMode\n model?: string\n dimension?: number\n truncateDimension?: number | null\n criteria?: EmbeddingSetCriteria | null\n createdAt?: string\n updatedAt?: string\n freshness?: EmbeddingSetFreshness\n}\n\nexport type VirtualEmbeddingSetValidationError =\n | { code: 'mixed-models'; setIds: string[] }\n | { code: 'mixed-dimensions'; setIds: string[] }\n | { code: 'missing-vector'; noteId: string; setId: string }\n | { code: 'duplicate-vector'; noteId: string; setIds: string[] }\n | { code: 'stale-snapshot'; snapshotId: string }\n | { code: 'unsupported-criteria'; field: string }\n\nexport interface ResolvedEmbeddingRow {\n note_id: string\n embedding_set_id: string\n embedding_id: string\n vector: string\n created_at: Date\n}\n\nexport interface ResolvedEmbeddingSet {\n selector: EmbeddingSetSelector\n rows: ResolvedEmbeddingRow[]\n noteIds: string[]\n embeddingIds: string[]\n errors: VirtualEmbeddingSetValidationError[]\n freshness: EmbeddingSetFreshness\n resolutionSource: 'live' | 'materialized'\n}\n\nexport interface EmbeddingSetRow {\n id: string\n name: string\n purpose: string | null\n model_name: string\n dimensions: number\n kind: EmbeddingSetKind\n mode: EmbeddingSetMode | null\n truncate_dimension: number | null\n criteria_json: unknown | null\n source_json: unknown | null\n compatibility_json: unknown | null\n materialization_json: unknown | null\n freshness_json: unknown | null\n created_at: Date\n updated_at: Date\n}\n\nexport interface EmbeddingSetCreateInput {\n id?: string\n name: string\n purpose?: string | null\n model_name?: string\n dimensions?: number\n kind?: EmbeddingSetKind\n mode?: EmbeddingSetMode | null\n truncate_dimension?: number | null\n criteria?: EmbeddingSetCriteria | null\n}\n\nexport interface EmbeddingSetEmbeddingInput {\n id?: string\n note_id: string\n embedding_set_id: string\n vector: number[]\n}\n\nconst DEFAULT_COMPATIBILITY: EmbeddingCompatibilityPolicy = {\n model: 'require-same',\n dimension: 'require-same',\n duplicateVectors: 'prefer-set-order',\n missingVectors: 'omit',\n}\n\nfunction jsonParam(value: unknown): string | null {\n return value == null ? null : JSON.stringify(value)\n}\n\nfunction asObject<T>(value: unknown): T | null {\n if (value == null) return null\n if (typeof value === 'string') return JSON.parse(value) as T\n return value as T\n}\n\nfunction dateString(value: Date | string | undefined): string | undefined {\n if (!value) return undefined\n return value instanceof Date ? value.toISOString() : value\n}\n\nfunction dateMillis(value: Date | string): number {\n return value instanceof Date ? value.getTime() : new Date(value).getTime()\n}\n\nfunction hashJson(value: unknown): string {\n return computeHash(new TextEncoder().encode(JSON.stringify(value)))\n}\n\nexport class EmbeddingSetsRepository {\n constructor(private db: QueryExecutor) {}\n\n async create(input: EmbeddingSetCreateInput): Promise<EmbeddingSetRow> {\n const id = input.id ?? generateId()\n await this.db.query(\n `INSERT INTO embedding_set (\n id, name, purpose, model_name, dimensions, kind, mode,\n truncate_dimension, criteria_json\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::jsonb)`,\n [\n id,\n input.name,\n input.purpose ?? null,\n input.model_name ?? 'all-MiniLM-L6-v2',\n input.dimensions ?? 384,\n input.kind ?? 'physical',\n input.mode ?? null,\n input.truncate_dimension ?? null,\n jsonParam(input.criteria ?? null),\n ],\n )\n return this.get(id)\n }\n\n async createVirtualDefinition(input: VirtualEmbeddingSetDefinition): Promise<EmbeddingSetRow> {\n const id = input.id ?? generateId()\n await this.db.query(\n `INSERT INTO embedding_set (\n id, name, purpose, model_name, dimensions, kind, mode,\n source_json, compatibility_json, materialization_json, freshness_json, created_at, updated_at\n ) VALUES ($1, $2, $3, $4, $5, 'virtual', 'auto', $6::jsonb, $7::jsonb, $8::jsonb, $9::jsonb,\n COALESCE($10::timestamptz, now()), COALESCE($11::timestamptz, now()))`,\n [\n id,\n input.name,\n input.purpose ?? null,\n this.inferDefinitionModel(input) ?? 'virtual',\n this.inferDefinitionDimension(input) ?? 0,\n jsonParam(input.source),\n jsonParam(input.compatibility),\n jsonParam(input.materialization ?? null),\n jsonParam({ status: input.materialization?.freshness ?? 'unknown' }),\n input.createdAt ?? null,\n input.updatedAt ?? null,\n ],\n )\n const row = await this.get(id)\n if (input.materialization?.allowed) {\n await this.refreshMaterializedVirtualSet(id)\n return this.get(id)\n }\n return row\n }\n\n async ensureDefault(): Promise<EmbeddingSetRow> {\n const existing = await this.db.query<EmbeddingSetRow>(\n `SELECT * FROM embedding_set WHERE name = $1 AND model_name = $2 AND kind = 'physical' ORDER BY created_at LIMIT 1`,\n ['Full content', 'all-MiniLM-L6-v2'],\n )\n if (existing.rows.length > 0) return existing.rows[0]\n\n return this.create({\n name: 'Full content',\n purpose: 'Semantic search over full revised note content',\n model_name: 'all-MiniLM-L6-v2',\n dimensions: 384,\n kind: 'physical',\n })\n }\n\n async get(id: string): Promise<EmbeddingSetRow> {\n const result = await this.db.query<EmbeddingSetRow>(\n `SELECT * FROM embedding_set WHERE id = $1`,\n [id],\n )\n if (result.rows.length === 0) throw new Error(`Embedding set not found: ${id}`)\n return result.rows[0]\n }\n\n async list(): Promise<EmbeddingSetRow[]> {\n const result = await this.db.query<EmbeddingSetRow>(\n `SELECT * FROM embedding_set ORDER BY created_at, name`,\n )\n return result.rows\n }\n\n async listDescriptors(): Promise<EmbeddingSetDescriptor[]> {\n const rows = await this.list()\n return rows.map((row) => this.toDescriptor(row))\n }\n\n toDescriptor(row: EmbeddingSetRow): EmbeddingSetDescriptor {\n return {\n id: row.id,\n name: row.name,\n purpose: row.purpose,\n kind: row.kind,\n mode: row.mode ?? undefined,\n model: row.model_name,\n dimension: row.dimensions,\n truncateDimension: row.truncate_dimension,\n criteria: asObject<EmbeddingSetCriteria>(row.criteria_json),\n createdAt: dateString(row.created_at),\n updatedAt: dateString(row.updated_at),\n freshness: asObject<EmbeddingSetFreshness>(row.freshness_json) ?? { status: 'fresh' },\n }\n }\n\n async putEmbedding(input: EmbeddingSetEmbeddingInput): Promise<{ id: string }> {\n const set = await this.get(input.embedding_set_id)\n if (set.kind === 'virtual') {\n throw new Error(`Cannot store vectors directly in virtual embedding set: ${set.id}`)\n }\n if (input.vector.length !== set.dimensions) {\n throw new Error(\n `Embedding vector has ${input.vector.length} dimensions; set ${set.id} expects ${set.dimensions}`,\n )\n }\n\n await this.db.query(\n `DELETE FROM embedding_set_member WHERE note_id = $1 AND embedding_set_id = $2`,\n [input.note_id, input.embedding_set_id],\n )\n await this.db.query(\n `DELETE FROM embedding WHERE note_id = $1 AND embedding_set_id = $2`,\n [input.note_id, input.embedding_set_id],\n )\n\n const embeddingId = input.id ?? generateId()\n const vector = `[${input.vector.join(',')}]`\n await this.db.query(\n `INSERT INTO embedding (id, note_id, embedding_set_id, vector)\n VALUES ($1, $2, $3, $4::vector)`,\n [embeddingId, input.note_id, input.embedding_set_id, vector],\n )\n\n await this.db.query(\n `INSERT INTO embedding_set_member (embedding_set_id, note_id, embedding_id)\n VALUES ($1, $2, $3)`,\n [input.embedding_set_id, input.note_id, embeddingId],\n )\n\n return { id: embeddingId }\n }\n\n async resolveSelector(selector: EmbeddingSetSelector): Promise<ResolvedEmbeddingSet> {\n if (selector.kind === 'default') {\n const set = await this.ensureDefault()\n return this.resolvePhysicalSet({ kind: 'embedding-set', embeddingSetId: set.id }, set.id)\n }\n if (selector.kind === 'embedding-set') {\n if (!selector.embeddingSetId) throw new Error('embedding-set selector requires embeddingSetId')\n const set = await this.get(selector.embeddingSetId)\n if (set.kind === 'virtual') {\n const definition = this.definitionFromRow(set)\n return this.resolveDefinition({ kind: 'embedding-set', embeddingSetId: set.id }, definition, set)\n }\n return this.resolvePhysicalSet(selector, set.id)\n }\n if (!selector.definition) throw new Error('virtual-definition selector requires definition')\n return this.resolveDefinition(selector, selector.definition)\n }\n\n async refreshMaterializedVirtualSet(setId: string): Promise<ResolvedEmbeddingSet> {\n const set = await this.get(setId)\n if (set.kind !== 'virtual') throw new Error(`Embedding set is not virtual: ${setId}`)\n const definition = this.definitionFromRow(set)\n if (!definition.materialization?.allowed) {\n throw new Error(`Virtual embedding set does not allow materialization: ${setId}`)\n }\n\n const live = await this.resolveDefinition(\n { kind: 'embedding-set', embeddingSetId: setId },\n definition,\n set,\n { forceLive: true },\n )\n await this.db.query(`DELETE FROM embedding_set_member WHERE embedding_set_id = $1`, [setId])\n for (const row of live.rows) {\n await this.db.query(\n `INSERT INTO embedding_set_member (embedding_set_id, note_id, embedding_id)\n VALUES ($1, $2, $3)\n ON CONFLICT DO NOTHING`,\n [setId, row.note_id, row.embedding_id],\n )\n }\n\n const inputHash = this.resolutionInputHash(definition, live.rows)\n const generatedAt = new Date().toISOString()\n const materialization: VirtualMaterializationPolicy = {\n ...definition.materialization,\n allowed: true,\n includeResolvedMembers: true,\n freshness: 'fresh',\n inputHash,\n generatedAt,\n resolvedMemberCount: live.rows.length,\n }\n const freshness: EmbeddingSetFreshness = {\n status: 'fresh',\n sourceHash: inputHash,\n checkedAt: generatedAt,\n }\n await this.db.query(\n `UPDATE embedding_set\n SET materialization_json = $2::jsonb, freshness_json = $3::jsonb, updated_at = now()\n WHERE id = $1`,\n [setId, jsonParam(materialization), jsonParam(freshness)],\n )\n\n return this.finalizeResolution(\n { kind: 'embedding-set', embeddingSetId: setId },\n live.rows,\n live.errors,\n definition.compatibility,\n 'fresh',\n 'materialized',\n )\n }\n\n async markVirtualSetStale(setId: string, reason: string): Promise<void> {\n const set = await this.get(setId)\n if (set.kind !== 'virtual') throw new Error(`Embedding set is not virtual: ${setId}`)\n const definition = this.definitionFromRow(set)\n const now = new Date().toISOString()\n const materialization = definition.materialization\n ? { ...definition.materialization, freshness: 'stale' as const }\n : null\n await this.db.query(\n `UPDATE embedding_set\n SET materialization_json = $2::jsonb, freshness_json = $3::jsonb, updated_at = now()\n WHERE id = $1`,\n [\n setId,\n jsonParam(materialization),\n jsonParam({ status: 'stale', sourceHash: definition.materialization?.inputHash, checkedAt: now, reason }),\n ],\n )\n }\n\n private async resolveDefinition(\n selector: EmbeddingSetSelector,\n definition: VirtualEmbeddingSetDefinition,\n set?: EmbeddingSetRow,\n options: { forceLive?: boolean } = {},\n ): Promise<ResolvedEmbeddingSet> {\n if (!options.forceLive && set && definition.materialization?.allowed && definition.materialization.freshness === 'fresh') {\n const materialized = await this.resolveMaterializedRows(set.id)\n if (materialized.length > 0 || definition.materialization.resolvedMemberCount === 0) {\n return this.finalizeResolution(\n selector,\n materialized,\n [],\n definition.compatibility,\n 'fresh',\n 'materialized',\n )\n }\n }\n\n let rows: ResolvedEmbeddingRow[]\n const errors: VirtualEmbeddingSetValidationError[] = []\n switch (definition.source.type) {\n case 'criteria':\n rows = await this.resolveCriteriaSource(definition.source)\n break\n case 'set-operation':\n rows = await this.resolveSetOperationSource(definition.source, definition.compatibility, errors)\n break\n case 'fallback':\n rows = await this.resolveFallbackSource(definition.source.preferredSetIds, definition.compatibility, errors)\n break\n case 'latest-compatible':\n rows = await this.resolveLatestCompatibleSource(definition.source, definition.compatibility, errors)\n break\n case 'snapshot':\n rows = await this.resolvePhysicalRows(definition.source.snapshotId)\n break\n default:\n rows = []\n }\n return this.finalizeResolution(selector, rows, errors, definition.compatibility, definition.materialization?.freshness ?? 'unknown', 'live')\n }\n\n private async resolvePhysicalSet(selector: EmbeddingSetSelector, setId: string): Promise<ResolvedEmbeddingSet> {\n return this.finalizeResolution(selector, await this.resolvePhysicalRows(setId), [], DEFAULT_COMPATIBILITY, 'fresh', 'live')\n }\n\n private async resolvePhysicalRows(setId: string): Promise<ResolvedEmbeddingRow[]> {\n const result = await this.db.query<ResolvedEmbeddingRow>(\n `SELECT note_id, embedding_set_id, id as embedding_id, vector::text as vector, created_at\n FROM embedding\n WHERE embedding_set_id = $1\n ORDER BY note_id, created_at DESC`,\n [setId],\n )\n return result.rows\n }\n\n private async resolveMaterializedRows(setId: string): Promise<ResolvedEmbeddingRow[]> {\n const result = await this.db.query<ResolvedEmbeddingRow>(\n `SELECT e.note_id, e.embedding_set_id, e.id as embedding_id, e.vector::text as vector, e.created_at\n FROM embedding_set_member m\n JOIN embedding e ON e.id = m.embedding_id\n WHERE m.embedding_set_id = $1\n ORDER BY e.note_id, e.created_at DESC`,\n [setId],\n )\n return result.rows\n }\n\n private async resolveCriteriaSource(source: CriteriaVirtualSource): Promise<ResolvedEmbeddingRow[]> {\n const criteria = source.criteria\n if (criteria.conceptIds && criteria.conceptIds.length > 0) {\n throw new Error('Unsupported virtual embedding-set criteria field: conceptIds')\n }\n const conditions = ['e.embedding_set_id = $1']\n const params: unknown[] = [source.baseSetId]\n let idx = 2\n if (criteria.noteIds?.length) {\n conditions.push(`n.id = ANY($${idx++})`)\n params.push(criteria.noteIds)\n }\n if (criteria.tags?.length) {\n conditions.push(`EXISTS (SELECT 1 FROM note_tag nt WHERE nt.note_id = n.id AND nt.tag = ANY($${idx++}))`)\n params.push(criteria.tags)\n }\n if (criteria.collectionIds?.length) {\n conditions.push(`EXISTS (SELECT 1 FROM collection_note cn WHERE cn.note_id = n.id AND cn.collection_id = ANY($${idx++}))`)\n params.push(criteria.collectionIds)\n }\n if (criteria.sources?.length) {\n conditions.push(`n.source = ANY($${idx++})`)\n params.push(criteria.sources)\n }\n if (criteria.formats?.length) {\n conditions.push(`n.format = ANY($${idx++})`)\n params.push(criteria.formats)\n }\n if (criteria.visibilities?.length) {\n conditions.push(`n.visibility = ANY($${idx++})`)\n params.push(criteria.visibilities)\n }\n if (criteria.isStarred !== undefined) {\n conditions.push(`n.is_starred = $${idx++}`)\n params.push(criteria.isStarred)\n }\n if (criteria.isArchived !== undefined) {\n conditions.push(`n.is_archived = $${idx++}`)\n params.push(criteria.isArchived)\n }\n if (criteria.hasTitle !== undefined) {\n conditions.push(criteria.hasTitle ? `n.title IS NOT NULL AND n.title <> ''` : `(n.title IS NULL OR n.title = '')`)\n }\n if (criteria.hasEmbedding === false) {\n conditions.push('FALSE')\n }\n if (criteria.isUserEdited !== undefined) {\n conditions.push(`COALESCE(c.is_user_edited, false) = $${idx++}`)\n params.push(criteria.isUserEdited)\n }\n if (criteria.hasAiMetadata !== undefined) {\n conditions.push(criteria.hasAiMetadata ? `c.ai_metadata IS NOT NULL` : `c.ai_metadata IS NULL`)\n }\n if (criteria.hasRevisions !== undefined) {\n conditions.push(criteria.hasRevisions\n ? `EXISTS (SELECT 1 FROM note_revision nr WHERE nr.note_id = n.id)`\n : `NOT EXISTS (SELECT 1 FROM note_revision nr WHERE nr.note_id = n.id)`)\n }\n if (criteria.minGenerationCount !== undefined) {\n conditions.push(`COALESCE(c.generation_count, 0) >= $${idx++}`)\n params.push(criteria.minGenerationCount)\n }\n if (criteria.maxGenerationCount !== undefined) {\n conditions.push(`COALESCE(c.generation_count, 0) <= $${idx++}`)\n params.push(criteria.maxGenerationCount)\n }\n if (criteria.updatedAfter) {\n conditions.push(`n.updated_at >= $${idx++}`)\n params.push(criteria.updatedAfter)\n }\n if (criteria.updatedBefore) {\n conditions.push(`n.updated_at <= $${idx++}`)\n params.push(criteria.updatedBefore)\n }\n if (criteria.query?.trim()) {\n conditions.push(`(n.tsv @@ plainto_tsquery('english', $${idx}) OR to_tsvector('english', coalesce(c.content, '')) @@ plainto_tsquery('english', $${idx}))`)\n params.push(criteria.query)\n }\n\n const result = await this.db.query<ResolvedEmbeddingRow>(\n `SELECT e.note_id, e.embedding_set_id, e.id as embedding_id, e.vector::text as vector, e.created_at\n FROM embedding e\n JOIN note n ON n.id = e.note_id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${conditions.join(' AND ')}\n ORDER BY e.note_id, e.created_at DESC`,\n params,\n )\n return result.rows\n }\n\n private async resolveSetOperationSource(\n source: SetOperationVirtualSource,\n compatibility: EmbeddingCompatibilityPolicy,\n errors: VirtualEmbeddingSetValidationError[],\n ): Promise<ResolvedEmbeddingRow[]> {\n const bySet = new Map<string, ResolvedEmbeddingRow[]>()\n for (const setId of source.setIds) bySet.set(setId, await this.resolvePhysicalRows(setId))\n await this.validateCompatibility(source.setIds, compatibility, errors)\n\n const noteSets = source.setIds.map((setId) => new Set((bySet.get(setId) ?? []).map((row) => row.note_id)))\n const firstRows = bySet.get(source.setIds[0]) ?? []\n if (source.operation === 'difference') {\n const excluded = new Set(noteSets.slice(1).flatMap((set) => Array.from(set)))\n return firstRows.filter((row) => !excluded.has(row.note_id))\n }\n if (source.operation === 'intersection') {\n return firstRows.filter((row) => noteSets.every((set) => set.has(row.note_id)))\n }\n return this.resolveDuplicateRows(source.setIds.flatMap((setId) => bySet.get(setId) ?? []), compatibility, errors)\n }\n\n private async resolveFallbackSource(\n setIds: string[],\n compatibility: EmbeddingCompatibilityPolicy,\n errors: VirtualEmbeddingSetValidationError[],\n ): Promise<ResolvedEmbeddingRow[]> {\n await this.validateCompatibility(setIds, compatibility, errors)\n const selected = new Map<string, ResolvedEmbeddingRow>()\n for (const setId of setIds) {\n for (const row of await this.resolvePhysicalRows(setId)) {\n if (!selected.has(row.note_id)) selected.set(row.note_id, row)\n }\n }\n return Array.from(selected.values()).sort((a, b) => a.note_id.localeCompare(b.note_id))\n }\n\n private async resolveLatestCompatibleSource(\n source: LatestCompatibleVirtualSource,\n compatibility: EmbeddingCompatibilityPolicy,\n errors: VirtualEmbeddingSetValidationError[],\n ): Promise<ResolvedEmbeddingRow[]> {\n const sets = []\n for (const setId of source.candidateSetIds) {\n const set = await this.get(setId)\n if (source.model && set.model_name !== source.model) continue\n if (source.dimension && set.dimensions !== source.dimension) continue\n sets.push(set)\n }\n sets.sort((a, b) => dateMillis(b.updated_at) - dateMillis(a.updated_at) || dateMillis(b.created_at) - dateMillis(a.created_at))\n return this.resolveFallbackSource(sets.map((set) => set.id), compatibility, errors)\n }\n\n private async validateCompatibility(\n setIds: string[],\n compatibility: EmbeddingCompatibilityPolicy,\n errors: VirtualEmbeddingSetValidationError[],\n ): Promise<void> {\n const sets = []\n for (const setId of setIds) sets.push(await this.get(setId))\n if (compatibility.model === 'require-same' && new Set(sets.map((set) => set.model_name)).size > 1) {\n errors.push({ code: 'mixed-models', setIds })\n }\n if (compatibility.dimension === 'require-same' && new Set(sets.map((set) => set.dimensions)).size > 1) {\n errors.push({ code: 'mixed-dimensions', setIds })\n }\n }\n\n private resolveDuplicateRows(\n rows: ResolvedEmbeddingRow[],\n compatibility: EmbeddingCompatibilityPolicy,\n errors: VirtualEmbeddingSetValidationError[],\n ): ResolvedEmbeddingRow[] {\n const byNote = new Map<string, ResolvedEmbeddingRow[]>()\n for (const row of rows) {\n const existing = byNote.get(row.note_id) ?? []\n existing.push(row)\n byNote.set(row.note_id, existing)\n }\n const resolved: ResolvedEmbeddingRow[] = []\n for (const [noteId, noteRows] of byNote) {\n if (noteRows.length > 1 && compatibility.duplicateVectors === 'error') {\n errors.push({ code: 'duplicate-vector', noteId, setIds: noteRows.map((row) => row.embedding_set_id) })\n continue\n }\n const ordered = [...noteRows]\n if (compatibility.duplicateVectors === 'prefer-latest') {\n ordered.sort((a, b) => dateMillis(b.created_at) - dateMillis(a.created_at))\n }\n resolved.push(ordered[0])\n }\n return resolved.sort((a, b) => a.note_id.localeCompare(b.note_id))\n }\n\n private finalizeResolution(\n selector: EmbeddingSetSelector,\n rows: ResolvedEmbeddingRow[],\n errors: VirtualEmbeddingSetValidationError[],\n compatibility: EmbeddingCompatibilityPolicy,\n freshness: EmbeddingSetFreshness['status'],\n resolutionSource: ResolvedEmbeddingSet['resolutionSource'],\n ): ResolvedEmbeddingSet {\n const deduped = this.resolveDuplicateRows(rows, compatibility, errors)\n return {\n selector,\n rows: deduped,\n noteIds: deduped.map((row) => row.note_id),\n embeddingIds: deduped.map((row) => row.embedding_id),\n errors,\n freshness: { status: freshness },\n resolutionSource,\n }\n }\n\n private resolutionInputHash(\n definition: VirtualEmbeddingSetDefinition,\n rows: ResolvedEmbeddingRow[],\n ): string {\n return hashJson({\n source: definition.source,\n compatibility: definition.compatibility,\n members: rows.map((row) => [row.note_id, row.embedding_set_id, row.embedding_id]),\n })\n }\n\n private definitionFromRow(row: EmbeddingSetRow): VirtualEmbeddingSetDefinition {\n const source = asObject<VirtualEmbeddingSetSource>(row.source_json)\n if (!source) throw new Error(`Virtual embedding set has no source definition: ${row.id}`)\n return {\n id: row.id,\n name: row.name,\n purpose: row.purpose,\n source,\n compatibility: asObject<EmbeddingCompatibilityPolicy>(row.compatibility_json) ?? DEFAULT_COMPATIBILITY,\n materialization: asObject<VirtualMaterializationPolicy>(row.materialization_json) ?? undefined,\n createdAt: dateString(row.created_at),\n updatedAt: dateString(row.updated_at),\n }\n }\n\n private inferDefinitionModel(input: VirtualEmbeddingSetDefinition): string | null {\n if (input.source.type === 'latest-compatible') return input.source.model ?? null\n return null\n }\n\n private inferDefinitionDimension(input: VirtualEmbeddingSetDefinition): number | null {\n if (input.source.type === 'latest-compatible') return input.source.dimension ?? null\n return null\n }\n}\n","/**\n * SearchRepository - full-text search using DatabaseClient tsvector/tsquery,\n * with optional semantic search (pgvector) and hybrid (BM25 + vector RRF).\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport type { SearchResponse, SearchOptions, SearchFacets, SearchResult } from './types.js'\nimport { buildNoteConditions } from './condition-builder.js'\nimport { EmbeddingSetsRepository, type EmbeddingSetSelector, type ResolvedEmbeddingSet } from './embedding-sets-repository.js'\n\nexport class SearchRepository {\n constructor(\n private db: DatabaseClient,\n private semanticAvailable = false,\n ) {}\n\n private tsqueryFn(query: string): string {\n return query.includes('\"') ? 'phraseto_tsquery' : 'plainto_tsquery'\n }\n\n private async fetchEmbeddingSet(noteIds: string[], embeddingSetId?: string): Promise<Set<string>> {\n if (noteIds.length === 0) return new Set()\n const params: unknown[] = [noteIds]\n const setFilter = embeddingSetId ? ' AND embedding_set_id = $2' : ''\n if (embeddingSetId) params.push(embeddingSetId)\n const result = await this.db.query<{ note_id: string }>(\n 'SELECT note_id FROM embedding WHERE note_id = ANY($1)' + setFilter,\n params,\n )\n return new Set(result.rows.map((r) => r.note_id))\n }\n\n private selectorFromOptions(options: SearchOptions): EmbeddingSetSelector | null {\n if (options.embeddingSetSelector) return options.embeddingSetSelector\n if (options.embeddingSetId) return { kind: 'embedding-set', embeddingSetId: options.embeddingSetId }\n return null\n }\n\n private async resolveEmbeddingSet(options: SearchOptions): Promise<ResolvedEmbeddingSet | null> {\n const selector = this.selectorFromOptions(options)\n if (!selector) return null\n return new EmbeddingSetsRepository(this.db).resolveSelector(selector)\n }\n\n private scopeToResolvedEmbeddingSet(\n conditions: string[],\n params: unknown[],\n paramIdx: number,\n resolved: ResolvedEmbeddingSet | null,\n ): number {\n if (!resolved) return paramIdx\n if (resolved.noteIds.length === 0) {\n conditions.push('FALSE')\n return paramIdx\n }\n conditions.push('n.id = ANY($' + paramIdx + ')')\n params.push(resolved.noteIds)\n return paramIdx + 1\n }\n\n private scopeToResolvedEmbeddingRows(\n conditions: string[],\n params: unknown[],\n paramIdx: number,\n resolved: ResolvedEmbeddingSet | null,\n ): number {\n if (!resolved) return paramIdx\n if (resolved.embeddingIds.length === 0) {\n conditions.push('FALSE')\n return paramIdx\n }\n conditions.push('e.id = ANY($' + paramIdx + ')')\n params.push(resolved.embeddingIds)\n return paramIdx + 1\n }\n\n private async fetchEmbeddingStatus(\n noteIds: string[],\n resolved: ResolvedEmbeddingSet | null,\n embeddingSetId?: string,\n ): Promise<Set<string>> {\n if (resolved) return new Set(noteIds.filter((id) => resolved.noteIds.includes(id)))\n return this.fetchEmbeddingSet(noteIds, embeddingSetId)\n }\n\n private attachEmbeddingStatus(\n results: Omit<SearchResult, 'has_embedding'>[],\n embeddingSet: Set<string>,\n ): SearchResult[] {\n return results.map((r) => ({ ...r, has_embedding: embeddingSet.has(r.id) }))\n }\n\n async search(\n query: string,\n options: SearchOptions = {},\n queryEmbedding?: number[],\n ): Promise<SearchResponse> {\n const { limit = 20, offset = 0 } = options\n const mode = options.mode ?? 'auto'\n\n if (mode === 'text') {\n if (!query.trim()) return this.recentNotes(options)\n } else if (mode === 'semantic') {\n if (!queryEmbedding || queryEmbedding.length === 0) {\n throw new Error('mode=semantic requires a query embedding')\n }\n return this.semanticSearch(queryEmbedding, options)\n } else if (mode === 'hybrid') {\n if (!queryEmbedding || queryEmbedding.length === 0) {\n throw new Error('mode=hybrid requires a query embedding')\n }\n return this.hybridSearch(query, queryEmbedding, options)\n } else {\n if (queryEmbedding && queryEmbedding.length > 0) {\n if (query.trim()) return this.hybridSearch(query, queryEmbedding, options)\n return this.semanticSearch(queryEmbedding, options)\n }\n if (!query.trim()) return this.recentNotes(options)\n }\n\n if (!query.trim()) return this.recentNotes(options)\n\n const resolvedEmbeddingSet = await this.resolveEmbeddingSet(options)\n const tsqFn = this.tsqueryFn(query)\n const { conditions, params, nextIdx } = buildNoteConditions(options, 2)\n conditions.unshift(\n `(n.tsv @@ ${tsqFn}('english', $1) OR\n to_tsvector('english', coalesce(c.content, '')) @@ ${tsqFn}('english', $1))`,\n )\n let paramIdx = this.scopeToResolvedEmbeddingSet(conditions, params, nextIdx, resolvedEmbeddingSet)\n const allParams = [query, ...params]\n const where = conditions.join(' AND ')\n\n const countResult = await this.db.query<{ count: string }>(\n `SELECT COUNT(*) as count\n FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${where}`,\n allParams,\n )\n const total = parseInt(countResult.rows[0].count, 10)\n\n const searchParams = [...allParams, limit, offset]\n const result = await this.db.query<{\n id: string\n title: string | null\n created_at: Date\n updated_at: Date\n rank: number\n snippet: string\n }>(\n `SELECT n.id, n.title, n.created_at, n.updated_at,\n ts_rank(\n setweight(n.tsv, 'A') || setweight(to_tsvector('english', coalesce(c.content, '')), 'B'),\n ${tsqFn}('english', $1)\n ) as rank,\n ts_headline(\n 'english',\n coalesce(c.content, ''),\n ${tsqFn}('english', $1),\n 'StartSel=<mark>, StopSel=</mark>, MaxWords=35, MinWords=15'\n ) as snippet\n FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${where}\n ORDER BY rank DESC, n.created_at DESC\n LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n searchParams,\n )\n\n const resultIds = result.rows.map((r) => r.id)\n const [tagMap, embeddingSet] = await Promise.all([\n this.fetchTagMap(resultIds),\n this.fetchEmbeddingStatus(resultIds, resolvedEmbeddingSet, options.embeddingSetId),\n ])\n\n let facets: SearchFacets | undefined\n if (options.include_facets) {\n const idsResult = await this.db.query<{ id: string }>(\n `SELECT n.id FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${where}`,\n allParams,\n )\n facets = await this.fetchFacets(idsResult.rows.map((r) => r.id))\n }\n\n const baseResults = result.rows.map((r) => ({\n id: r.id,\n title: r.title,\n snippet: r.snippet ?? '',\n rank: r.rank,\n created_at: r.created_at,\n updated_at: r.updated_at,\n tags: tagMap.get(r.id) ?? [],\n }))\n\n return {\n results: this.attachEmbeddingStatus(baseResults, embeddingSet),\n total,\n query,\n mode: 'text',\n semantic_available: this.semanticAvailable,\n limit,\n offset,\n facets,\n }\n }\n\n async semanticSearch(queryEmbedding: number[], options: SearchOptions = {}): Promise<SearchResponse> {\n const { limit = 20, offset = 0 } = options\n const vectorStr = `[${queryEmbedding.join(',')}]`\n const resolvedEmbeddingSet = await this.resolveEmbeddingSet(options)\n const { conditions, params, nextIdx } = buildNoteConditions(options, 1)\n let paramIdx = this.scopeToResolvedEmbeddingRows(conditions, params, nextIdx, resolvedEmbeddingSet)\n const where = conditions.join(' AND ')\n\n const countResult = await this.db.query<{ count: string }>(\n `SELECT COUNT(*) as count\n FROM embedding e\n JOIN note n ON n.id = e.note_id\n WHERE ${where}`,\n params,\n )\n const total = parseInt(countResult.rows[0].count, 10)\n\n const vecIdx = paramIdx++\n const limIdx = paramIdx++\n const offIdx = paramIdx++\n const result = await this.db.query<{\n id: string\n title: string | null\n created_at: Date\n updated_at: Date\n distance: number\n snippet: string\n }>(\n `SELECT n.id, n.title, n.created_at, n.updated_at,\n (e.vector <=> $${vecIdx}::vector) as distance,\n LEFT(coalesce(c.content, ''), 200) as snippet\n FROM embedding e\n JOIN note n ON n.id = e.note_id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${where}\n ORDER BY e.vector <=> $${vecIdx}::vector ASC\n LIMIT $${limIdx} OFFSET $${offIdx}`,\n [...params, vectorStr, limit, offset],\n )\n\n const tagMap = await this.fetchTagMap(result.rows.map((r) => r.id))\n const facets = options.include_facets\n ? await this.fetchFacets((await this.db.query<{ id: string }>(\n `SELECT n.id FROM embedding e JOIN note n ON n.id = e.note_id WHERE ${where}`,\n params,\n )).rows.map((r) => r.id))\n : undefined\n\n return {\n results: result.rows.map((r) => ({\n id: r.id,\n title: r.title,\n snippet: r.snippet ?? '',\n rank: 1 - r.distance,\n created_at: r.created_at,\n updated_at: r.updated_at,\n tags: tagMap.get(r.id) ?? [],\n has_embedding: true,\n })),\n total,\n query: '',\n mode: 'semantic',\n semantic_available: this.semanticAvailable,\n limit,\n offset,\n facets,\n }\n }\n\n async hybridSearch(\n query: string,\n queryEmbedding: number[],\n options: SearchOptions = {},\n ): Promise<SearchResponse> {\n const { limit = 20, offset = 0 } = options\n const vectorStr = `[${queryEmbedding.join(',')}]`\n const k = 60\n const tsqFn = this.tsqueryFn(query)\n const resolvedEmbeddingSet = await this.resolveEmbeddingSet(options)\n\n const textCond = buildNoteConditions(options, 2)\n const textConditions = [\n ...textCond.conditions,\n `(n.tsv @@ ${tsqFn}('english', $1) OR\n to_tsvector('english', coalesce(c.content, '')) @@ ${tsqFn}('english', $1))`,\n ]\n this.scopeToResolvedEmbeddingSet(textConditions, textCond.params, textCond.nextIdx, resolvedEmbeddingSet)\n const textWhere = textConditions.join(' AND ')\n const textParams = [query, ...textCond.params]\n\n const textResult = await this.db.query<{ id: string; rank: number }>(\n `SELECT n.id,\n ts_rank(\n setweight(n.tsv, 'A') || setweight(to_tsvector('english', coalesce(c.content, '')), 'B'),\n ${tsqFn}('english', $1)\n ) as rank\n FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${textWhere}\n ORDER BY rank DESC\n LIMIT 100`,\n textParams,\n )\n\n const vecCond = buildNoteConditions(options, 1)\n vecCond.nextIdx = this.scopeToResolvedEmbeddingRows(vecCond.conditions, vecCond.params, vecCond.nextIdx, resolvedEmbeddingSet)\n const vecWhere = vecCond.conditions.join(' AND ')\n const vecVecIdx = vecCond.nextIdx\n\n const vectorResult = await this.db.query<{ id: string; distance: number }>(\n `SELECT n.id, (e.vector <=> $${vecVecIdx}::vector) as distance\n FROM embedding e\n JOIN note n ON n.id = e.note_id\n WHERE ${vecWhere}\n ORDER BY e.vector <=> $${vecVecIdx}::vector ASC\n LIMIT 100`,\n [...vecCond.params, vectorStr],\n )\n\n const rrfScores = new Map<string, number>()\n textResult.rows.forEach((row, idx) => {\n rrfScores.set(row.id, (rrfScores.get(row.id) ?? 0) + 1 / (k + idx + 1))\n })\n vectorResult.rows.forEach((row, idx) => {\n rrfScores.set(row.id, (rrfScores.get(row.id) ?? 0) + 1 / (k + idx + 1))\n })\n\n const sortedIds = Array.from(rrfScores.entries()).sort((a, b) => b[1] - a[1]).map(([id]) => id)\n const total = sortedIds.length\n const pageIds = sortedIds.slice(offset, offset + limit)\n\n if (pageIds.length === 0) {\n return { results: [], total, query, mode: 'hybrid', semantic_available: this.semanticAvailable, limit, offset }\n }\n\n const noteResult = await this.db.query<{\n id: string\n title: string | null\n created_at: Date\n updated_at: Date\n snippet: string\n }>(\n `SELECT n.id, n.title, n.created_at, n.updated_at,\n LEFT(coalesce(c.content, ''), 200) as snippet\n FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE n.id = ANY($1)`,\n [pageIds],\n )\n\n const noteMap = new Map(noteResult.rows.map((r) => [r.id, r]))\n const [tagMap, embeddingSet] = await Promise.all([\n this.fetchTagMap(pageIds),\n this.fetchEmbeddingStatus(pageIds, resolvedEmbeddingSet, options.embeddingSetId),\n ])\n const facets = options.include_facets ? await this.fetchFacets(sortedIds) : undefined\n\n return {\n results: pageIds\n .map((id) => {\n const r = noteMap.get(id)\n if (!r) return null\n return {\n id: r.id,\n title: r.title,\n snippet: r.snippet ?? '',\n rank: rrfScores.get(id) ?? 0,\n created_at: r.created_at,\n updated_at: r.updated_at,\n tags: tagMap.get(id) ?? [],\n has_embedding: embeddingSet.has(id),\n }\n })\n .filter((r): r is NonNullable<typeof r> => r !== null),\n total,\n query,\n mode: 'hybrid',\n semantic_available: this.semanticAvailable,\n limit,\n offset,\n facets,\n }\n }\n\n private async recentNotes(options: SearchOptions = {}): Promise<SearchResponse> {\n const { limit = 20, offset = 0 } = options\n const resolvedEmbeddingSet = await this.resolveEmbeddingSet(options)\n const { conditions, params, nextIdx } = buildNoteConditions(options, 1)\n let paramIdx = this.scopeToResolvedEmbeddingSet(conditions, params, nextIdx, resolvedEmbeddingSet)\n const where = conditions.join(' AND ')\n\n const countResult = await this.db.query<{ count: string }>(\n `SELECT COUNT(*) as count FROM note n WHERE ${where}`,\n params,\n )\n const total = parseInt(countResult.rows[0].count, 10)\n\n const listParams = [...params, limit, offset]\n const result = await this.db.query<{\n id: string\n title: string | null\n created_at: Date\n updated_at: Date\n snippet: string\n }>(\n `SELECT n.id, n.title, n.created_at, n.updated_at,\n LEFT(coalesce(c.content, ''), 200) as snippet\n FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${where}\n ORDER BY n.created_at DESC\n LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n listParams,\n )\n\n const resultIds = result.rows.map((r) => r.id)\n const embeddingSet = await this.fetchEmbeddingStatus(resultIds, resolvedEmbeddingSet, options.embeddingSetId)\n\n return {\n results: result.rows.map((r) => ({\n id: r.id,\n title: r.title,\n snippet: r.snippet ?? '',\n rank: 0,\n created_at: r.created_at,\n updated_at: r.updated_at,\n tags: [],\n has_embedding: embeddingSet.has(r.id),\n })),\n total,\n query: '',\n mode: 'text',\n semantic_available: this.semanticAvailable,\n limit,\n offset,\n }\n }\n\n private async fetchFacets(noteIds: string[]): Promise<SearchFacets> {\n if (noteIds.length === 0) return { tags: [], collections: [] }\n\n const [tagResult, collResult] = await Promise.all([\n this.db.query<{ tag: string; count: string }>(\n `SELECT nt.tag, COUNT(*) as count FROM note_tag nt\n WHERE nt.note_id = ANY($1) GROUP BY nt.tag ORDER BY count DESC LIMIT 20`,\n [noteIds],\n ),\n this.db.query<{ id: string; name: string; count: string }>(\n `SELECT col.id, col.name, COUNT(*) as count FROM collection_note cn\n JOIN collection col ON col.id = cn.collection_id\n WHERE cn.note_id = ANY($1) GROUP BY col.id, col.name ORDER BY count DESC LIMIT 20`,\n [noteIds],\n ),\n ])\n\n return {\n tags: tagResult.rows.map((r) => ({ tag: r.tag, count: parseInt(r.count, 10) })),\n collections: collResult.rows.map((r) => ({ id: r.id, name: r.name, count: parseInt(r.count, 10) })),\n }\n }\n\n private async fetchTagMap(noteIds: string[]): Promise<Map<string, string[]>> {\n const tagMap = new Map<string, string[]>()\n if (noteIds.length === 0) return tagMap\n\n const tagsResult = await this.db.query<{ note_id: string; tag: string }>(\n `SELECT note_id, tag FROM note_tag WHERE note_id = ANY($1) ORDER BY tag`,\n [noteIds],\n )\n for (const row of tagsResult.rows) {\n const existing = tagMap.get(row.note_id) ?? []\n existing.push(row.tag)\n tagMap.set(row.note_id, existing)\n }\n return tagMap\n }\n}\n","/**\n * LinksRepository — bidirectional note link management.\n *\n * Responsibilities:\n * - Create typed links between notes with duplicate prevention\n * - Soft-delete links\n * - Query outbound, inbound, and backlinks for a note\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\n\nexport interface LinkRow {\n id: string\n source_note_id: string\n target_note_id: string\n link_type: string\n confidence: number | null\n created_at: Date\n updated_at: Date | null\n deleted_at: Date | null\n}\n\nexport class LinksRepository {\n constructor(private db: DatabaseClient) {}\n\n async create(\n sourceNoteId: string,\n targetNoteId: string,\n linkType: string = 'related',\n ): Promise<LinkRow> {\n // Duplicate prevention — return existing active link if it already exists\n const existing = await this.db.query<LinkRow>(\n `SELECT * FROM link WHERE source_note_id = $1 AND target_note_id = $2 AND link_type = $3 AND deleted_at IS NULL`,\n [sourceNoteId, targetNoteId, linkType],\n )\n if (existing.rows.length > 0) return existing.rows[0]\n\n const id = generateId()\n await this.db.query(\n `INSERT INTO link (id, source_note_id, target_note_id, link_type) VALUES ($1, $2, $3, $4)`,\n [id, sourceNoteId, targetNoteId, linkType],\n )\n return this.get(id)\n }\n\n async get(id: string): Promise<LinkRow> {\n const result = await this.db.query<LinkRow>(\n `SELECT * FROM link WHERE id = $1`,\n [id],\n )\n if (result.rows.length === 0) throw new Error(`Link not found: ${id}`)\n return result.rows[0]\n }\n\n async listForNote(noteId: string): Promise<{ outbound: LinkRow[]; inbound: LinkRow[] }> {\n const outbound = await this.db.query<LinkRow>(\n `SELECT * FROM link WHERE source_note_id = $1 AND deleted_at IS NULL`,\n [noteId],\n )\n const inbound = await this.db.query<LinkRow>(\n `SELECT * FROM link WHERE target_note_id = $1 AND deleted_at IS NULL`,\n [noteId],\n )\n return { outbound: outbound.rows, inbound: inbound.rows }\n }\n\n async getBacklinks(noteId: string): Promise<string[]> {\n const result = await this.db.query<{ source_note_id: string }>(\n `SELECT source_note_id FROM link WHERE target_note_id = $1 AND deleted_at IS NULL`,\n [noteId],\n )\n return result.rows.map((r) => r.source_note_id)\n }\n\n async delete(id: string): Promise<void> {\n await this.db.query(`UPDATE link SET deleted_at = now() WHERE id = $1`, [id])\n }\n}\n","/**\n * Zod schemas for tool function inputs.\n *\n * These schemas are the contract between callers (e.g. host platform bridge) and\n * the tool functions. All inputs are validated at the tool boundary so that\n * repository methods only receive well-typed data.\n */\n\nimport { z } from 'zod'\n\n// ---------------------------------------------------------------------------\n// capture_knowledge\n// ---------------------------------------------------------------------------\n\nexport const CaptureKnowledgeInputSchema = z.object({\n action: z.enum(['create', 'bulk_create', 'from_template']),\n // For create\n content: z.string().optional(),\n title: z.string().optional(),\n format: z.enum(['markdown', 'plain', 'html']).default('markdown'),\n source: z.string().default('user'),\n visibility: z.enum(['private', 'shared', 'public']).default('private'),\n tags: z.array(z.string()).optional(),\n archive_id: z.string().optional(),\n // For bulk_create\n notes: z\n .array(\n z.object({\n content: z.string(),\n title: z.string().optional(),\n format: z.enum(['markdown', 'plain', 'html']).default('markdown'),\n tags: z.array(z.string()).optional(),\n }),\n )\n .optional(),\n // For from_template\n template: z.string().optional(),\n variables: z.record(z.string()).optional(),\n})\n\nexport type CaptureKnowledgeInput = z.infer<typeof CaptureKnowledgeInputSchema>\n\n// ---------------------------------------------------------------------------\n// manage_note\n// ---------------------------------------------------------------------------\n\nexport const ManageNoteInputSchema = z.object({\n action: z.enum(['update', 'delete', 'restore', 'archive', 'unarchive', 'star', 'unstar']),\n note_id: z.string(),\n // For update\n title: z.string().optional(),\n content: z.string().optional(),\n format: z.string().optional(),\n visibility: z.string().optional(),\n})\n\nexport type ManageNoteInput = z.infer<typeof ManageNoteInputSchema>\n\n// ---------------------------------------------------------------------------\n// search\n// ---------------------------------------------------------------------------\n\nexport const SearchInputSchema = z.object({\n query: z.string(),\n mode: z.enum(['text', 'semantic', 'hybrid']).default('text'),\n limit: z.number().int().min(1).max(100).default(20),\n offset: z.number().int().min(0).default(0),\n tags: z.array(z.string()).optional(),\n collection_id: z.string().optional(),\n date_from: z.coerce.date().optional(),\n date_to: z.coerce.date().optional(),\n is_starred: z.boolean().optional(),\n is_archived: z.boolean().optional(),\n format: z.enum(['markdown', 'plain', 'html']).optional(),\n source: z.string().optional(),\n visibility: z.enum(['private', 'shared', 'public']).optional(),\n include_facets: z.boolean().default(false),\n})\n\nexport type SearchInput = z.infer<typeof SearchInputSchema>\n","/**\n * manageNote — tool function for note lifecycle operations.\n *\n * Supports: update, delete, restore, archive, unarchive, star, unstar.\n *\n * Input is Zod-validated at entry. All mutations delegate to NotesRepository.\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport type { TypedEventBus } from '../event-bus.js'\nimport { NotesRepository } from '../repositories/notes-repository.js'\nimport { ManageNoteInputSchema } from './schemas.js'\nimport type { NoteFull } from '../repositories/types.js'\n\nexport interface ManageNoteResult {\n action: string\n note_id: string\n note?: NoteFull\n}\n\nexport async function manageNote(\n db: DatabaseClient,\n rawInput: unknown,\n events?: TypedEventBus,\n): Promise<ManageNoteResult> {\n const input = ManageNoteInputSchema.parse(rawInput)\n const repo = new NotesRepository(db, events)\n\n switch (input.action) {\n case 'update': {\n const note = await repo.update(input.note_id, {\n title: input.title,\n content: input.content,\n format: input.format,\n visibility: input.visibility,\n })\n return { action: 'update', note_id: input.note_id, note }\n }\n\n case 'delete': {\n await repo.delete(input.note_id)\n return { action: 'delete', note_id: input.note_id }\n }\n\n case 'restore': {\n const note = await repo.restore(input.note_id)\n return { action: 'restore', note_id: input.note_id, note }\n }\n\n case 'archive': {\n await repo.archive(input.note_id, true)\n const note = await repo.get(input.note_id)\n return { action: 'archive', note_id: input.note_id, note }\n }\n\n case 'unarchive': {\n await repo.archive(input.note_id, false)\n const note = await repo.get(input.note_id)\n return { action: 'unarchive', note_id: input.note_id, note }\n }\n\n case 'star': {\n await repo.star(input.note_id, true)\n const note = await repo.get(input.note_id)\n return { action: 'star', note_id: input.note_id, note }\n }\n\n case 'unstar': {\n await repo.star(input.note_id, false)\n const note = await repo.get(input.note_id)\n return { action: 'unstar', note_id: input.note_id, note }\n }\n }\n}\n","/**\n * Backend seam (#191) — a uniform tool-intent operation interface that lets the\n * PGlite database backend (#187) and the static-file shard backend (#189) be\n * selected and dispatched against the same way, plus a capability-negotiation\n * API so a caller asks for the operations it needs and gets the lightest backend\n * that provides them.\n *\n * The seam sits one level above SQL: every adapter exposes the same read\n * operations (and optional relationship, write, semantic, and full-content ops)\n * regardless of whether the data lives in a queryable PGlite instance, a set of\n * static shard files fetched over HTTP, or the Fortemi server tier.\n */\n\nimport type { DatabaseClient } from './storage-backend.js'\nimport { NotesRepository } from './repositories/notes-repository.js'\nimport { SearchRepository } from './repositories/search-repository.js'\nimport { LinksRepository } from './repositories/links-repository.js'\nimport type { LinkRow } from './repositories/links-repository.js'\nimport type { NoteSummary, NoteFull, SearchResult } from './repositories/types.js'\nimport { manageNote } from './tools/manage-note.js'\nimport type { ShardReader, ShardReaderNote } from './shard/shard-reader.js'\nimport type { ShardLink, ShardProvenanceEdge, ShardSkosConcept } from './shard/types.js'\n\n// ── Capabilities ──────────────────────────────────────────────────────────\n\n/**\n * Semantic-search tier a backend offers, in increasing capability:\n * - `none` — no vector search (text / facets only)\n * - `cosine-small` — brute-force cosine over a small static vector set (#189)\n * - `ann-full` — prebuilt/queryable approximate-nearest-neighbour over the full\n * corpus (PGlite + pgvector, or a prebuilt ANN snapshot)\n * - `server` — delegated to the remote Fortemi server backend\n */\nexport type BackendSemanticTier = 'none' | 'cosine-small' | 'ann-full' | 'server'\n\n/** Relative startup cost of bringing a backend online. */\nexport type BackendStartupCost = 'instant' | 'index-build' | 'network'\n\n/** What a backend can do — the unit of capability negotiation. */\nexport interface BackendCapabilities {\n /** Can answer list / get / search read operations. */\n read: boolean\n /** Can mutate notes (manageNote). */\n write: boolean\n /** Can merge external shards into its store. */\n merge: boolean\n /** Coordinates concurrent multi-user writes. */\n multiUser: boolean\n /** Highest semantic-search tier available. */\n semantic: BackendSemanticTier\n /** Relative cost to bring the backend online. */\n startupCost: BackendStartupCost\n}\n\n// ── Neutral record shapes ─────────────────────────────────────────────────\n\n/**\n * Backend-neutral note record. `source`/`starred`/`archived` are optional\n * because lean read paths (PGlite full-text search) do not return them; list,\n * get, and every shard path populate all fields.\n */\nexport interface BackendNote {\n id: string\n title: string | null\n tags: string[]\n createdAt: string\n updatedAt: string\n source?: string\n starred?: boolean\n archived?: boolean\n}\n\n/** A note plus its current rendered content. */\nexport interface BackendNoteFull extends BackendNote {\n content: string\n links?: BackendLink[]\n concepts?: BackendConcept[]\n provenance?: BackendProvenanceEdge[]\n}\n\nexport interface BackendLink {\n id: string\n fromNoteId: string\n toNoteId: string\n kind: string\n score: number | null\n createdAt: string\n metadata?: Record<string, unknown>\n}\n\nexport interface BackendConcept {\n id: string\n schemeId: string\n prefLabel: string\n altLabels: string[]\n definition: string | null\n createdAt: string\n updatedAt: string\n}\n\nexport interface BackendProvenanceEdge {\n id: string\n entityType: string\n entityId: string\n activity: string\n agent: string\n startedAt: string\n endedAt: string | null\n attributes: Record<string, unknown> | null\n}\n\n/** One search hit — note plus optional rank/snippet when the backend ranks. */\nexport interface BackendSearchHit {\n note: BackendNote\n rank?: number\n snippet?: string\n}\n\n/** Search response with optional facet counts. */\nexport interface BackendSearchResult {\n hits: BackendSearchHit[]\n total: number\n facets?: {\n tags: Record<string, number>\n source?: Record<string, number>\n }\n}\n\nexport interface BackendListOptions {\n offset?: number\n limit?: number\n}\n\nexport interface BackendSearchQueryOptions extends BackendListOptions {\n /** AND-filter: note must carry every listed tag. */\n tags?: string[]\n /** OR-filter on note source. */\n source?: string[]\n}\n\ninterface RemoteNoteRecord {\n id: string\n title: string | null\n tags?: string[]\n createdAt?: string\n created_at?: string\n updatedAt?: string\n updated_at?: string\n source?: string\n starred?: boolean\n is_starred?: boolean\n archived?: boolean\n is_archived?: boolean\n content?: string\n current?: { content?: string }\n}\n\n// ── The uniform operation interface ───────────────────────────────────────\n\n/**\n * Uniform tool-intent operation interface. Every backend implements the read\n * core; `getNoteFull`, `semantic`, and `manageNote` are optional and present\n * only on backends whose capabilities advertise them.\n */\nexport interface DataBackend {\n readonly id: string\n readonly capabilities: BackendCapabilities\n\n listNotes(options?: BackendListOptions): Promise<{ items: BackendNote[]; total: number }>\n getNote(id: string): Promise<BackendNote | null>\n search(query: string, options?: BackendSearchQueryOptions): Promise<BackendSearchResult>\n\n /** Lazy full content (present when capabilities.read). */\n getNoteFull?(id: string): Promise<BackendNoteFull | null>\n /** Note links (present when capabilities.read). */\n linksOf?(id: string): Promise<BackendLink[]>\n /** SKOS concepts assigned to a note (present when capabilities.read). */\n conceptsOf?(id: string): Promise<BackendConcept[]>\n /** W3C PROV edges for a note (present when capabilities.read). */\n provenanceOf?(id: string): Promise<BackendProvenanceEdge[]>\n /** Vector search (present when capabilities.semantic !== 'none'). */\n semantic?(query: string, k?: number): Promise<BackendSearchHit[]>\n /** Write op (present when capabilities.write). */\n manageNote?(input: unknown): Promise<unknown>\n}\n\n// ── Capability negotiation ────────────────────────────────────────────────\n\n/** What a caller needs. Booleans require `true`; `semantic` is a minimum tier. */\nexport interface BackendRequest {\n read?: boolean\n write?: boolean\n merge?: boolean\n multiUser?: boolean\n /** Minimum acceptable semantic tier (a higher tier satisfies a lower request). */\n semantic?: BackendSemanticTier\n}\n\nexport interface BackendCandidate {\n backend: DataBackend\n /** Requested capabilities this backend cannot satisfy ([] = fully satisfies). */\n missing: string[]\n}\n\nexport interface BackendSelection {\n /** Chosen backend — fully-satisfying-and-lightest, else fewest-missing. Null only when no backends are available. */\n backend: DataBackend | null\n capabilities: BackendCapabilities | null\n /** Requested capabilities the chosen backend cannot satisfy. */\n missing: string[]\n /** Every candidate with its own missing set, ordered as evaluated. */\n candidates: BackendCandidate[]\n}\n\nconst SEMANTIC_RANK: Record<BackendSemanticTier, number> = {\n none: 0,\n 'cosine-small': 1,\n 'ann-full': 2,\n server: 3,\n}\n\nconst STARTUP_RANK: Record<BackendStartupCost, number> = {\n instant: 0,\n 'index-build': 1,\n network: 2,\n}\n\nfunction missingFor(request: BackendRequest, caps: BackendCapabilities): string[] {\n const missing: string[] = []\n if (request.read && !caps.read) missing.push('read')\n if (request.write && !caps.write) missing.push('write')\n if (request.merge && !caps.merge) missing.push('merge')\n if (request.multiUser && !caps.multiUser) missing.push('multiUser')\n if (request.semantic && SEMANTIC_RANK[caps.semantic] < SEMANTIC_RANK[request.semantic]) {\n missing.push(`semantic:${request.semantic}`)\n }\n return missing\n}\n\n/**\n * Pick the backend that best satisfies `request` from `available`. Prefers a\n * fully-satisfying backend with the lightest startup cost; if none fully\n * satisfy, returns the one missing the fewest capabilities (lightest on ties) so\n * the caller can degrade with eyes open via `selection.missing`.\n */\nexport function selectBackend(request: BackendRequest, available: DataBackend[]): BackendSelection {\n const candidates: BackendCandidate[] = available.map((backend) => ({\n backend,\n missing: missingFor(request, backend.capabilities),\n }))\n\n if (candidates.length === 0) {\n return { backend: null, capabilities: null, missing: [], candidates }\n }\n\n const lighter = (a: DataBackend, b: DataBackend): number =>\n STARTUP_RANK[a.capabilities.startupCost] - STARTUP_RANK[b.capabilities.startupCost]\n\n const fullySatisfying = candidates.filter((c) => c.missing.length === 0)\n const pool = fullySatisfying.length > 0 ? fullySatisfying : candidates\n\n const chosen = [...pool].sort((a, b) => {\n // Fewest missing first, then lightest startup, preserving input order on ties.\n if (a.missing.length !== b.missing.length) return a.missing.length - b.missing.length\n return lighter(a.backend, b.backend)\n })[0]\n\n return {\n backend: chosen.backend,\n capabilities: chosen.backend.capabilities,\n missing: chosen.missing,\n candidates,\n }\n}\n\n// ── PGlite adapter (#187 — wraps the repositories/tools) ──────────────────\n\nfunction toIso(d: Date | string): string {\n return d instanceof Date ? d.toISOString() : String(d)\n}\n\nfunction summaryToBackend(s: NoteSummary): BackendNote {\n return {\n id: s.id,\n title: s.title,\n tags: s.tags,\n createdAt: toIso(s.created_at),\n updatedAt: toIso(s.updated_at),\n source: s.source,\n starred: s.is_starred,\n archived: s.is_archived,\n }\n}\n\nfunction searchResultToBackend(r: SearchResult): BackendNote {\n // PGlite full-text rows are lean — no source/starred/archived.\n return {\n id: r.id,\n title: r.title,\n tags: r.tags,\n createdAt: toIso(r.created_at),\n updatedAt: toIso(r.updated_at),\n }\n}\n\nfunction remoteNoteToBackend(n: RemoteNoteRecord): BackendNote {\n return {\n id: n.id,\n title: n.title,\n tags: n.tags ?? [],\n createdAt: n.createdAt ?? n.created_at ?? '',\n updatedAt: n.updatedAt ?? n.updated_at ?? '',\n source: n.source,\n starred: n.starred ?? n.is_starred,\n archived: n.archived ?? n.is_archived,\n }\n}\n\nfunction remoteFullToBackend(n: RemoteNoteRecord): BackendNoteFull {\n return {\n ...remoteNoteToBackend(n),\n content: n.content ?? n.current?.content ?? '',\n }\n}\n\nfunction linkToBackend(link: LinkRow): BackendLink {\n return {\n id: link.id,\n fromNoteId: link.source_note_id,\n toNoteId: link.target_note_id,\n kind: link.link_type,\n score: link.confidence,\n createdAt: toIso(link.created_at),\n }\n}\n\nfunction shardLinkToBackend(link: ShardLink): BackendLink {\n return {\n id: link.id,\n fromNoteId: link.from_note_id,\n toNoteId: link.to_note_id,\n kind: link.kind,\n score: link.score,\n createdAt: link.created_at,\n ...(link.metadata ? { metadata: link.metadata } : {}),\n }\n}\n\nfunction conceptToBackend(concept: {\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[] | string\n definition: string | null\n created_at: Date | string\n updated_at: Date | string\n}): BackendConcept {\n const altLabels = typeof concept.alt_labels === 'string'\n ? JSON.parse(concept.alt_labels) as string[]\n : concept.alt_labels\n return {\n id: concept.id,\n schemeId: concept.scheme_id,\n prefLabel: concept.pref_label,\n altLabels,\n definition: concept.definition,\n createdAt: toIso(concept.created_at),\n updatedAt: toIso(concept.updated_at),\n }\n}\n\nfunction shardConceptToBackend(concept: ShardSkosConcept): BackendConcept {\n return conceptToBackend(concept)\n}\n\nfunction parseAttributes(attributes: Record<string, unknown> | string | null): Record<string, unknown> | null {\n if (attributes === null) return null\n if (typeof attributes === 'string') return JSON.parse(attributes) as Record<string, unknown>\n return attributes\n}\n\nfunction provenanceToBackend(edge: {\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: Date | string\n ended_at: Date | string | null\n attributes: Record<string, unknown> | string | null\n}): BackendProvenanceEdge {\n return {\n id: edge.id,\n entityType: edge.entity_type,\n entityId: edge.entity_id,\n activity: edge.activity,\n agent: edge.agent,\n startedAt: toIso(edge.started_at),\n endedAt: edge.ended_at ? toIso(edge.ended_at) : null,\n attributes: parseAttributes(edge.attributes),\n }\n}\n\nfunction shardProvenanceToBackend(edge: ShardProvenanceEdge): BackendProvenanceEdge {\n return provenanceToBackend(edge)\n}\n\nfunction remoteLinkToBackend(link: Partial<BackendLink> & {\n id: string\n from_note_id?: string\n source_note_id?: string\n to_note_id?: string\n target_note_id?: string\n kind?: string\n link_type?: string\n score?: number | null\n confidence?: number | null\n created_at?: string\n}): BackendLink {\n return {\n id: link.id,\n fromNoteId: link.fromNoteId ?? link.from_note_id ?? link.source_note_id ?? '',\n toNoteId: link.toNoteId ?? link.to_note_id ?? link.target_note_id ?? '',\n kind: link.kind ?? link.link_type ?? '',\n score: link.score ?? link.confidence ?? null,\n createdAt: link.createdAt ?? link.created_at ?? '',\n ...(link.metadata ? { metadata: link.metadata } : {}),\n }\n}\n\nfunction remoteConceptToBackend(concept: BackendConcept | Parameters<typeof conceptToBackend>[0]): BackendConcept {\n if ('schemeId' in concept) return concept\n return conceptToBackend(concept)\n}\n\nfunction remoteProvenanceToBackend(\n edge: BackendProvenanceEdge | Parameters<typeof provenanceToBackend>[0],\n): BackendProvenanceEdge {\n if ('entityType' in edge) return edge\n return provenanceToBackend(edge)\n}\n\nexport interface PGliteBackendOptions {\n id?: string\n /** Whether embeddings exist so search can use the semantic path. */\n semanticAvailable?: boolean\n}\n\n/**\n * Wrap a PGlite-backed `DatabaseClient` as a `DataBackend`. Read ops delegate to\n * the repositories; writes go through the `manageNote` tool. Advertises full\n * read+write+merge with `ann-full` semantic when embeddings are present.\n */\nexport function createPGliteBackend(db: DatabaseClient, options: PGliteBackendOptions = {}): DataBackend {\n const semanticAvailable = options.semanticAvailable ?? false\n const notes = new NotesRepository(db)\n const search = new SearchRepository(db, semanticAvailable)\n const links = new LinksRepository(db)\n\n async function linksOf(id: string): Promise<BackendLink[]> {\n const result = await links.listForNote(id)\n return [...result.outbound, ...result.inbound].map(linkToBackend)\n }\n\n async function conceptsOf(id: string): Promise<BackendConcept[]> {\n const result = await db.query<{\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[] | string\n definition: string | null\n created_at: Date | string\n updated_at: Date | string\n }>(\n `SELECT c.*\n FROM skos_concept c\n INNER JOIN note_skos_tag nst ON nst.concept_id = c.id\n WHERE nst.note_id = $1 AND c.deleted_at IS NULL\n ORDER BY c.pref_label`,\n [id],\n )\n return result.rows.map(conceptToBackend)\n }\n\n async function provenanceOf(id: string): Promise<BackendProvenanceEdge[]> {\n const result = await db.query<{\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: Date | string\n ended_at: Date | string | null\n attributes: Record<string, unknown> | string | null\n }>(\n `SELECT *\n FROM provenance_edge\n WHERE entity_type = 'note' AND entity_id = $1\n ORDER BY started_at`,\n [id],\n )\n return result.rows.map(provenanceToBackend)\n }\n\n return {\n id: options.id ?? 'pglite',\n capabilities: {\n read: true,\n write: true,\n merge: true,\n multiUser: false,\n semantic: semanticAvailable ? 'ann-full' : 'none',\n startupCost: 'index-build',\n },\n\n async listNotes(o) {\n const r = await notes.list({ offset: o?.offset, limit: o?.limit })\n return { items: r.items.map(summaryToBackend), total: r.total }\n },\n\n async getNote(id) {\n try {\n const f: NoteFull = await notes.get(id)\n return summaryToBackend(f)\n } catch {\n return null\n }\n },\n\n async search(query, o) {\n const r = await search.search(query, {\n limit: o?.limit,\n offset: o?.offset,\n tags: o?.tags,\n source: o?.source?.[0],\n include_facets: true,\n })\n const hits: BackendSearchHit[] = r.results.map((res) => ({\n note: searchResultToBackend(res),\n rank: res.rank,\n snippet: res.snippet,\n }))\n const facets = r.facets\n ? {\n tags: Object.fromEntries(r.facets.tags.map((t) => [t.tag, t.count])),\n }\n : undefined\n return { hits, total: r.total, facets }\n },\n\n async getNoteFull(id) {\n try {\n const f: NoteFull = await notes.get(id)\n const [noteLinks, concepts, provenance] = await Promise.all([\n linksOf(id),\n conceptsOf(id),\n provenanceOf(id),\n ])\n return { ...summaryToBackend(f), content: f.current.content, links: noteLinks, concepts, provenance }\n } catch {\n return null\n }\n },\n\n linksOf,\n conceptsOf,\n provenanceOf,\n\n async manageNote(input) {\n return manageNote(db, input)\n },\n }\n}\n\n// ── Remote server adapter (#197 — HTTP proxy to the full Fortemi server) ─────\n\nexport interface RemoteBackendPaths {\n notes: string\n note: string\n search: string\n links: string\n concepts: string\n provenance: string\n manageNote: string\n semantic: string\n}\n\nexport interface RemoteBackendConfig {\n baseUrl: string\n id?: string\n fetchImpl?: typeof fetch\n headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>)\n authToken?: string\n paths?: Partial<RemoteBackendPaths>\n}\n\nconst DEFAULT_REMOTE_PATHS: RemoteBackendPaths = {\n notes: '/api/v1/notes',\n note: '/api/v1/notes/:id',\n search: '/api/v1/search',\n links: '/api/v1/notes/:id/links',\n concepts: '/api/v1/notes/:id/concepts',\n provenance: '/api/v1/notes/:id/provenance',\n manageNote: '/api/v1/tools/manage-note',\n semantic: '/api/v1/semantic/search',\n}\n\nfunction remotePath(template: string, id?: string): string {\n return id ? template.replace(':id', encodeURIComponent(id)) : template\n}\n\nfunction remoteUrl(baseUrl: string, path: string, params?: Record<string, unknown>): string {\n const url = new URL(path, baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`)\n for (const [key, value] of Object.entries(params ?? {})) {\n if (value === undefined) continue\n if (Array.isArray(value)) {\n for (const item of value) url.searchParams.append(key, String(item))\n } else {\n url.searchParams.set(key, String(value))\n }\n }\n return url.toString()\n}\n\nasync function remoteHeaders(config: RemoteBackendConfig, json = false): Promise<HeadersInit> {\n const configured = typeof config.headers === 'function' ? await config.headers() : config.headers\n const headers = new Headers(configured)\n if (config.authToken) headers.set('Authorization', `Bearer ${config.authToken}`)\n if (json) headers.set('Content-Type', 'application/json')\n return headers\n}\n\nasync function remoteJson<T>(config: RemoteBackendConfig, path: string, init: RequestInit = {}): Promise<T> {\n const fetchImpl = config.fetchImpl ?? globalThis.fetch\n const response = await fetchImpl(remoteUrl(config.baseUrl, path), init)\n if (!response.ok) {\n throw new Error(`Remote backend request failed (${response.status}): ${path}`)\n }\n return response.json() as Promise<T>\n}\n\nexport function createRemoteBackend(config: RemoteBackendConfig): DataBackend {\n const paths = { ...DEFAULT_REMOTE_PATHS, ...config.paths }\n\n async function getJson<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n return remoteJson<T>(config, remoteUrl(config.baseUrl, path, params), {\n method: 'GET',\n headers: await remoteHeaders(config),\n })\n }\n\n async function postJson<T>(path: string, body: unknown): Promise<T> {\n return remoteJson<T>(config, path, {\n method: 'POST',\n headers: await remoteHeaders(config, true),\n body: JSON.stringify(body),\n })\n }\n\n async function getNoteFull(id: string): Promise<BackendNoteFull | null> {\n try {\n const note = await getJson<RemoteNoteRecord>(remotePath(paths.note, id), { full: true })\n const [links, concepts, provenance] = await Promise.all([\n linksOf(id),\n conceptsOf(id),\n provenanceOf(id),\n ])\n return { ...remoteFullToBackend(note), links, concepts, provenance }\n } catch {\n return null\n }\n }\n\n async function linksOf(id: string): Promise<BackendLink[]> {\n const links = await getJson<Array<Parameters<typeof remoteLinkToBackend>[0]>>(remotePath(paths.links, id))\n return links.map(remoteLinkToBackend)\n }\n\n async function conceptsOf(id: string): Promise<BackendConcept[]> {\n const concepts = await getJson<Array<BackendConcept | Parameters<typeof conceptToBackend>[0]>>(\n remotePath(paths.concepts, id),\n )\n return concepts.map(remoteConceptToBackend)\n }\n\n async function provenanceOf(id: string): Promise<BackendProvenanceEdge[]> {\n const edges = await getJson<Array<BackendProvenanceEdge | Parameters<typeof provenanceToBackend>[0]>>(\n remotePath(paths.provenance, id),\n )\n return edges.map(remoteProvenanceToBackend)\n }\n\n return {\n id: config.id ?? 'remote-server',\n capabilities: {\n read: true,\n write: true,\n merge: true,\n multiUser: true,\n semantic: 'server',\n startupCost: 'network',\n },\n\n async listNotes(o) {\n const result = await getJson<{ items: RemoteNoteRecord[]; total: number }>(paths.notes, o ? { ...o } : undefined)\n return { items: result.items.map(remoteNoteToBackend), total: result.total }\n },\n\n async getNote(id) {\n try {\n return remoteNoteToBackend(await getJson<RemoteNoteRecord>(remotePath(paths.note, id)))\n } catch {\n return null\n }\n },\n\n async search(query, o) {\n const result = await getJson<{\n results?: Array<{ note?: RemoteNoteRecord; rank?: number; snippet?: string } & RemoteNoteRecord>\n hits?: BackendSearchHit[]\n total: number\n facets?: BackendSearchResult['facets']\n }>(paths.search, { query, ...o })\n if (result.hits) return { hits: result.hits, total: result.total, facets: result.facets }\n return {\n hits: (result.results ?? []).map((hit) => ({\n note: remoteNoteToBackend(hit.note ?? hit),\n rank: hit.rank,\n snippet: hit.snippet,\n })),\n total: result.total,\n facets: result.facets,\n }\n },\n\n getNoteFull,\n linksOf,\n conceptsOf,\n provenanceOf,\n\n async semantic(query, k) {\n const result = await getJson<{ hits: BackendSearchHit[] }>(paths.semantic, { query, k })\n return result.hits\n },\n\n async manageNote(input) {\n return postJson<unknown>(paths.manageNote, input)\n },\n }\n}\n\n// ── Static-file adapter (#189 — wraps the shard reader) ───────────────────\n\nfunction shardNoteToBackend(n: ShardReaderNote): BackendNote {\n return {\n id: n.id,\n title: n.title,\n tags: n.tags,\n createdAt: toIso(n.created_at),\n updatedAt: toIso(n.updated_at),\n source: n.source,\n starred: n.is_starred,\n archived: n.is_archived,\n }\n}\n\nexport interface ShardBackendOptions {\n id?: string\n /** Declared semantic tier this shard provides (default `none`). Set to `cosine-small` when the reader has a vector provider. */\n semantic?: BackendSemanticTier\n}\n\n/**\n * Wrap a `ShardReader` (#189) as a read-only `DataBackend`. Startup is instant\n * (no index build) and the semantic tier is whatever the reader's provider\n * offers — `none` for text/facets-only shards, `cosine-small` when a vector\n * provider is attached.\n */\nexport function createShardBackend(reader: ShardReader, options: ShardBackendOptions = {}): DataBackend {\n const semantic = options.semantic ?? 'none'\n\n return {\n id: options.id ?? 'static-file',\n capabilities: {\n read: true,\n write: false,\n merge: false,\n multiUser: false,\n semantic,\n startupCost: 'instant',\n },\n\n async listNotes(o) {\n const r = await reader.listNotes(o)\n return { items: r.items.map(shardNoteToBackend), total: r.total }\n },\n\n async getNote(id) {\n const n = await reader.getNote(id)\n return n ? shardNoteToBackend(n) : null\n },\n\n async search(query, o) {\n // Request ranking + snippets so hits carry rank/snippet uniformly with the\n // PGlite backend (whose ts_rank always ranks).\n const r = await reader.search(query, { ...o, rank: true, snippets: true })\n const hits: BackendSearchHit[] = r.rankedItems\n ? r.rankedItems.map((it) => ({\n note: shardNoteToBackend(it.note),\n rank: it.rank,\n snippet: it.snippet,\n }))\n : r.items.map((note) => ({ note: shardNoteToBackend(note) }))\n return { hits, total: r.total, facets: r.facets }\n },\n\n async getNoteFull(id) {\n const f = await reader.getNoteFull(id)\n if (!f) return null\n return {\n ...shardNoteToBackend(f.note),\n content: f.note.revised_content ?? f.note.original_content,\n links: f.links.map(shardLinkToBackend),\n concepts: f.concepts.map(shardConceptToBackend),\n provenance: f.provenance.map(shardProvenanceToBackend),\n }\n },\n\n async linksOf(id) {\n return (await reader.linksOf(id)).map(shardLinkToBackend)\n },\n\n async conceptsOf(id) {\n return (await reader.conceptsOf(id)).map(shardConceptToBackend)\n },\n\n async provenanceOf(id) {\n return (await reader.provenanceOf(id)).map(shardProvenanceToBackend)\n },\n\n async semantic(query, k) {\n const r = await reader.semantic(query, k)\n return r.map(({ note, score }) => ({ note: shardNoteToBackend(note), rank: score }))\n },\n }\n}\n","/**\n * Type-safe client for the PGlite Worker.\n *\n * PGliteWorkerClient wraps a Worker instance and exposes the same surface as\n * PGlite (query / exec / transaction) but serialises every call to a typed\n * postMessage exchange. Each outgoing request is tagged with a UUIDv7 `id`;\n * the worker echoes that id in its reply so the client can resolve or reject\n * the matching Promise.\n *\n * TransactionProxy is a lightweight wrapper handed to the callback in\n * transaction(), forwarding TX_QUERY / TX_EXEC messages with the active txId.\n */\n\nimport { generateId } from '../uuid.js'\nimport type { WorkerResponse } from './protocol.js'\n\nexport class PGliteWorkerClient {\n private pending = new Map<string, { resolve: (v: WorkerResponse) => void; reject: (e: Error) => void }>()\n private readyPromise: Promise<void>\n private resolveReady!: () => void\n\n constructor(private worker: Worker) {\n this.readyPromise = new Promise<void>((resolve) => {\n this.resolveReady = resolve\n })\n\n this.worker.addEventListener('message', (e: MessageEvent<WorkerResponse>) => {\n const msg = e.data\n\n if (msg.type === 'READY') {\n this.resolveReady()\n return\n }\n\n if (!('id' in msg)) return\n\n const pending = this.pending.get(msg.id)\n if (!pending) return\n this.pending.delete(msg.id)\n\n if (msg.type === 'ERROR') {\n pending.reject(new Error(msg.error))\n } else {\n pending.resolve(msg)\n }\n })\n }\n\n /** Resolves when the worker broadcasts READY after database initialisation. */\n async waitReady(): Promise<void> {\n return this.readyPromise\n }\n\n private send<T extends WorkerResponse>(request: { type: string } & Record<string, unknown>): Promise<T> {\n const id = generateId()\n return new Promise<T>((resolve, reject) => {\n this.pending.set(id, {\n resolve: resolve as (v: WorkerResponse) => void,\n reject,\n })\n this.worker.postMessage({ ...request, id })\n })\n }\n\n async query<T = Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n ): Promise<{ rows: T[]; fields?: Array<{ name: string; dataTypeID: number }> }> {\n const resp = await this.send<Extract<WorkerResponse, { type: 'RESULT' }>>({ type: 'QUERY', sql, params })\n return { rows: resp.rows as T[], fields: resp.fields }\n }\n\n async exec(sql: string): Promise<void> {\n await this.send({ type: 'EXEC', sql })\n }\n\n async transaction<T>(fn: (tx: TransactionProxy) => Promise<T>): Promise<T> {\n const resp = await this.send<Extract<WorkerResponse, { type: 'TX_STARTED' }>>({ type: 'BEGIN' })\n const txId = resp.txId\n const proxy = new TransactionProxy(this, txId)\n try {\n const result = await fn(proxy)\n await this.send({ type: 'COMMIT', txId })\n return result\n } catch (err) {\n // Best-effort rollback — ignore secondary errors so the original throws.\n await this.send({ type: 'ROLLBACK', txId }).catch(() => {})\n throw err\n }\n }\n\n /** Forward TX_QUERY for TransactionProxy — not part of the public surface. */\n async _txQuery<T>(txId: string, sql: string, params?: unknown[]): Promise<{ rows: T[] }> {\n const resp = await this.send<Extract<WorkerResponse, { type: 'RESULT' }>>({\n type: 'TX_QUERY',\n txId,\n sql,\n params,\n })\n return { rows: resp.rows as T[] }\n }\n\n /** Forward TX_EXEC for TransactionProxy — not part of the public surface. */\n async _txExec(txId: string, sql: string): Promise<void> {\n await this.send({ type: 'TX_EXEC', txId, sql })\n }\n\n async ping(): Promise<void> {\n await this.send({ type: 'PING' })\n }\n\n async close(): Promise<void> {\n await this.send({ type: 'CLOSE' })\n this.worker.terminate()\n }\n}\n\n/** Proxy passed to the transaction callback — scopes queries to the active txId. */\nexport class TransactionProxy {\n constructor(\n private client: PGliteWorkerClient,\n private txId: string,\n ) {}\n\n async query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{ rows: T[] }> {\n return this.client._txQuery<T>(this.txId, sql, params)\n }\n\n async exec(sql: string): Promise<void> {\n return this.client._txExec(this.txId, sql)\n }\n}\n","import type { PGlite } from '@electric-sql/pglite'\nimport { createPGliteInstance, type PersistenceMode } from './db.js'\nimport { PGliteWorkerClient } from './worker/worker-client.js'\n\nexport interface QueryResult<T = Record<string, unknown>> {\n rows: T[]\n fields?: Array<{ name: string; dataTypeID: number }>\n}\n\nexport interface QueryExecutor {\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>\n exec(sql: string): Promise<unknown>\n}\n\nexport interface DatabaseClient extends QueryExecutor {\n transaction<T>(fn: (tx: QueryExecutor) => Promise<T>): Promise<T>\n}\n\nexport interface StorageBackend extends DatabaseClient {\n readonly id: string\n readonly mode: 'readwrite' | 'readonly'\n close(): Promise<void>\n}\n\nexport interface StorageOpenRequest {\n archiveName: string\n persistence: PersistenceMode\n}\n\nexport interface StorageBackendFactory {\n open(input: StorageOpenRequest): Promise<StorageBackend>\n}\n\nexport interface StorageTopology {\n primary: StorageBackend\n secondary?: StorageBackend\n policy: 'primary-only' | 'read-through-secondary' | 'explicit-replication'\n}\n\nexport class PGliteStorageBackend implements StorageBackend {\n readonly mode = 'readwrite'\n\n constructor(\n readonly id: string,\n private db: PGlite,\n ) {}\n\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>> {\n return this.db.query<T>(sql, params)\n }\n\n exec(sql: string): Promise<unknown> {\n return this.db.exec(sql)\n }\n\n async transaction<T>(fn: (tx: QueryExecutor) => Promise<T>): Promise<T> {\n return this.db.transaction((tx) => fn(tx))\n }\n\n close(): Promise<void> {\n return this.db.close()\n }\n}\n\nexport class PGliteStorageBackendFactory implements StorageBackendFactory {\n async open(input: StorageOpenRequest): Promise<StorageBackend> {\n const db = await createPGliteInstance(input.persistence, input.archiveName)\n return new PGliteStorageBackend(`pglite:${input.persistence}:${input.archiveName}`, db)\n }\n}\n\nexport const defaultStorageBackendFactory = new PGliteStorageBackendFactory()\n\nexport class PGliteWorkerStorageBackend implements StorageBackend {\n readonly mode = 'readwrite'\n\n constructor(\n readonly id: string,\n private client: PGliteWorkerClient,\n ) {}\n\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>> {\n return this.client.query<T>(sql, params)\n }\n\n exec(sql: string): Promise<unknown> {\n return this.client.exec(sql)\n }\n\n transaction<T>(fn: (tx: QueryExecutor) => Promise<T>): Promise<T> {\n return this.client.transaction(fn)\n }\n\n close(): Promise<void> {\n return this.client.close()\n }\n}\n\nexport interface PGliteWorkerStorageBackendFactoryOptions {\n createWorker: () => Worker\n}\n\nexport class PGliteWorkerStorageBackendFactory implements StorageBackendFactory {\n constructor(private options: PGliteWorkerStorageBackendFactoryOptions) {}\n\n async open(input: StorageOpenRequest): Promise<StorageBackend> {\n const worker = this.options.createWorker()\n const client = new PGliteWorkerClient(worker)\n worker.postMessage({\n type: 'INIT',\n persistence: input.persistence,\n archiveName: input.archiveName,\n })\n await client.waitReady()\n return new PGliteWorkerStorageBackend(`pglite-worker:${input.persistence}:${input.archiveName}`, client)\n }\n}\n","/**\n * Capability module system (ADR-002).\n * Tracks opt-in WASM module states. No WASM loaded by default (CAP-001).\n *\n * State machine (valid transitions):\n * unloaded -> loading (via enable)\n * loading -> ready (via markReady or successful loader)\n * loading -> error (via markError or failed loader)\n * ready -> disabled (via disable)\n * disabled -> loading (via enable, re-enable)\n * error -> loading (via enable, retry)\n */\n\nimport type { TypedEventBus } from './event-bus.js'\n\nexport type CapabilityState = 'unloaded' | 'loading' | 'ready' | 'error' | 'disabled'\n\nexport type CapabilityName = 'semantic' | 'llm' | 'audio' | 'vision' | 'pdf'\n\ninterface CapabilityEntry {\n name: CapabilityName\n state: CapabilityState\n error?: string\n}\n\n/** Valid source states that allow the given transition. */\nconst VALID_TRANSITIONS: Record<string, CapabilityState[]> = {\n enable: ['unloaded', 'disabled', 'error'],\n disable: ['ready'],\n markReady: ['loading'],\n markError: ['loading'],\n}\n\nfunction assertTransition(\n method: string,\n name: CapabilityName,\n current: CapabilityState,\n): void {\n const allowed = VALID_TRANSITIONS[method]\n if (!allowed.includes(current)) {\n throw new Error(\n `CapabilityManager.${method}('${name}'): invalid transition from state '${current}'. ` +\n `Allowed source states: ${allowed.join(', ')}.`,\n )\n }\n}\n\nexport class CapabilityManager {\n private capabilities = new Map<CapabilityName, CapabilityEntry>()\n private loaders = new Map<CapabilityName, () => Promise<void>>()\n private progressMessages = new Map<CapabilityName, string>()\n\n constructor(private events: TypedEventBus) {\n const names: CapabilityName[] = ['semantic', 'llm', 'audio', 'vision', 'pdf']\n for (const name of names) {\n this.capabilities.set(name, { name, state: 'unloaded' })\n }\n }\n\n /**\n * Register an async loader for a capability.\n * Called by enable(); if no loader is registered the capability transitions\n * directly to ready (useful for capabilities that require no async init).\n */\n registerLoader(name: CapabilityName, loader: () => Promise<void>): void {\n this.loaders.set(name, loader)\n }\n\n getState(name: CapabilityName): CapabilityState {\n return this.capabilities.get(name)?.state ?? 'unloaded'\n }\n\n isReady(name: CapabilityName): boolean {\n return this.getState(name) === 'ready'\n }\n\n /**\n * Enable a capability.\n * Valid from: unloaded, disabled, error (retry).\n * Runs the registered loader if present; transitions to ready on success,\n * error on failure.\n */\n async enable(name: CapabilityName): Promise<void> {\n const entry = this.capabilities.get(name)\n if (!entry) return\n\n // Idempotent: already loading or ready -- do nothing.\n if (entry.state === 'ready' || entry.state === 'loading') return\n\n assertTransition('enable', name, entry.state)\n\n entry.state = 'loading'\n entry.error = undefined\n this.events.emit('capability.loading', { name })\n\n const loader = this.loaders.get(name)\n if (!loader) {\n // No loader registered -- transition directly to ready.\n entry.state = 'ready'\n this.events.emit('capability.ready', { name })\n return\n }\n\n try {\n await loader()\n // Only transition if still in loading -- external markReady/markError\n // (e.g. bridge protocol) may have already advanced state.\n if (entry.state === 'loading') {\n entry.state = 'ready'\n this.events.emit('capability.ready', { name })\n }\n } catch (err) {\n if (entry.state === 'loading') {\n const message = err instanceof Error ? err.message : String(err)\n entry.state = 'error'\n entry.error = message\n }\n }\n }\n\n /**\n * Disable a ready capability.\n * Valid from: ready only.\n */\n disable(name: CapabilityName): void {\n const entry = this.capabilities.get(name)\n if (!entry) return\n\n assertTransition('disable', name, entry.state)\n\n entry.state = 'disabled'\n this.events.emit('capability.disabled', { name })\n }\n\n /**\n * Mark a loading capability as ready (external use, e.g. bridge protocol).\n * Valid from: loading only.\n */\n markReady(name: CapabilityName): void {\n const entry = this.capabilities.get(name)\n if (!entry) return\n\n assertTransition('markReady', name, entry.state)\n\n entry.state = 'ready'\n entry.error = undefined\n this.events.emit('capability.ready', { name })\n }\n\n /**\n * Mark a loading capability as errored (external use, e.g. bridge protocol).\n * Valid from: loading only.\n */\n markError(name: CapabilityName, error: string): void {\n const entry = this.capabilities.get(name)\n if (!entry) return\n\n assertTransition('markError', name, entry.state)\n\n entry.state = 'error'\n entry.error = error\n }\n\n /**\n * Report loading progress (0-100).\n * Emits capability.loading with progress if the capability is currently loading.\n * No-op if the capability is not in loading state.\n */\n reportProgress(name: CapabilityName, progress: number): void {\n const entry = this.capabilities.get(name)\n if (!entry || entry.state !== 'loading') return\n\n this.events.emit('capability.loading', { name, progress })\n }\n\n /** Set a human-readable progress message for a loading capability */\n setProgress(name: CapabilityName, message: string): void {\n this.progressMessages.set(name, message)\n this.events.emit('capability.loading', { name, progress: -1 })\n }\n\n /** Get the current progress message for a capability */\n getProgress(name: CapabilityName): string | undefined {\n return this.progressMessages.get(name)\n }\n\n getError(name: CapabilityName): string | undefined {\n return this.capabilities.get(name)?.error\n }\n\n listAll(): Array<{ name: CapabilityName; state: CapabilityState }> {\n return Array.from(this.capabilities.values()).map(({ name, state }) => ({\n name,\n state,\n }))\n }\n}\n","/**\n * Sequential SQL migration runner for DatabaseClient.\n * Tracks applied migrations in a schema_version table.\n * Each migration runs in a transaction; version updated atomically.\n */\n\nimport type { DatabaseClient } from './storage-backend.js'\nimport type { TypedEventBus } from './event-bus.js'\n\nexport interface Migration {\n version: number\n name: string\n sql: string\n}\n\nexport class MigrationRunner {\n constructor(\n private db: DatabaseClient,\n private events?: TypedEventBus,\n ) {}\n\n async ensureSchemaTable(): Promise<void> {\n await this.db.exec(`\n CREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER NOT NULL,\n name TEXT NOT NULL,\n applied_at TIMESTAMPTZ DEFAULT now(),\n PRIMARY KEY (version)\n )\n `)\n }\n\n async getCurrentVersion(): Promise<number> {\n const result = await this.db.query<{ version: number }>(\n 'SELECT COALESCE(MAX(version), 0) AS version FROM schema_version',\n )\n return result.rows[0].version\n }\n\n async apply(migrations: Migration[]): Promise<number> {\n await this.ensureSchemaTable()\n const currentVersion = await this.getCurrentVersion()\n\n const pending = migrations\n .filter((m) => m.version > currentVersion)\n .sort((a, b) => a.version - b.version)\n\n let applied = 0\n\n for (const migration of pending) {\n await this.db.transaction(async (tx) => {\n await tx.exec(migration.sql)\n await tx.query(\n 'INSERT INTO schema_version (version, name) VALUES ($1, $2)',\n [migration.version, migration.name],\n )\n })\n\n applied++\n this.events?.emit('migration.applied', { version: migration.version })\n }\n\n return applied\n }\n\n async getAppliedMigrations(): Promise<Array<{ version: number; name: string }>> {\n const result = await this.db.query<{ version: number; name: string }>(\n 'SELECT version, name FROM schema_version ORDER BY version',\n )\n return result.rows\n }\n}\n","/**\n * Multi-archive manager for Fortemi.\n * Each archive is a separate PGlite instance with its own persistence path.\n * Migrations are applied automatically on open.\n */\n\nimport type { PersistenceMode } from './db.js'\nimport { MigrationRunner } from './migration-runner.js'\nimport { allMigrations } from './migrations/index.js'\nimport type { TypedEventBus } from './event-bus.js'\nimport { defaultStorageBackendFactory, type StorageBackend, type StorageBackendFactory } from './storage-backend.js'\n\nexport interface ArchiveInfo {\n name: string\n createdAt: string // ISO 8601\n}\n\nexport class ArchiveManager {\n private currentArchive: string = 'default'\n private db: StorageBackend | null = null\n private archives = new Map<string, ArchiveInfo>()\n private persistence: PersistenceMode\n private backendFactory: StorageBackendFactory\n\n constructor(\n persistenceOrFactory: PersistenceMode | StorageBackendFactory,\n private events?: TypedEventBus,\n persistenceOverride?: PersistenceMode,\n ) {\n if (typeof persistenceOrFactory === 'string') {\n this.persistence = persistenceOrFactory\n this.backendFactory = defaultStorageBackendFactory\n } else {\n this.persistence = persistenceOverride ?? 'memory'\n this.backendFactory = persistenceOrFactory\n }\n\n // Default archive always exists\n this.archives.set('default', {\n name: 'default',\n createdAt: new Date().toISOString(),\n })\n }\n\n getCurrentArchiveName(): string {\n return this.currentArchive\n }\n\n getDb(): StorageBackend | null {\n return this.db\n }\n\n async open(archiveName: string = 'default'): Promise<StorageBackend> {\n if (this.db) {\n await this.db.close()\n }\n\n this.db = await this.backendFactory.open({\n archiveName,\n persistence: this.persistence,\n })\n\n // Run migrations\n const runner = new MigrationRunner(this.db, this.events)\n await runner.apply(allMigrations)\n\n this.currentArchive = archiveName\n\n if (!this.archives.has(archiveName)) {\n this.archives.set(archiveName, {\n name: archiveName,\n createdAt: new Date().toISOString(),\n })\n }\n\n this.events?.emit('archive.switched', { name: archiveName })\n\n return this.db\n }\n\n /**\n * Adopt an already-created backend WITHOUT running migrations — for a backend\n * whose schema is already present, e.g. a PGlite restored from a physical\n * data-dir snapshot (issue #187, `restoreDbSnapshot`). Running migrations here\n * would be wrong: the restored dir already carries them (and the HNSW index).\n */\n async adopt(backend: StorageBackend, archiveName: string = 'default'): Promise<StorageBackend> {\n if (this.db) {\n await this.db.close()\n }\n this.db = backend\n this.currentArchive = archiveName\n if (!this.archives.has(archiveName)) {\n this.archives.set(archiveName, {\n name: archiveName,\n createdAt: new Date().toISOString(),\n })\n }\n this.events?.emit('archive.switched', { name: archiveName })\n return this.db\n }\n\n async create(archiveName: string): Promise<StorageBackend> {\n if (this.archives.has(archiveName)) {\n throw new Error(`Archive '${archiveName}' already exists`)\n }\n return this.open(archiveName)\n }\n\n async switchTo(archiveName: string): Promise<StorageBackend> {\n return this.open(archiveName)\n }\n\n async delete(archiveName: string): Promise<void> {\n if (archiveName === 'default') {\n throw new Error('Cannot delete the default archive')\n }\n if (this.currentArchive === archiveName && this.db) {\n await this.db.close()\n this.db = null\n }\n this.archives.delete(archiveName)\n // Note: actual OPFS/IDB data cleanup would require browser APIs\n // For now, we just remove from our registry\n }\n\n listArchives(): ArchiveInfo[] {\n return Array.from(this.archives.values())\n }\n\n async close(): Promise<void> {\n if (this.db) {\n await this.db.close()\n this.db = null\n }\n }\n}\n","/**\n * Factory function for creating a FortemiCore instance.\n * All deployment modes use this entry point.\n */\n\nimport { TypedEventBus } from './event-bus.js'\n\nexport interface FortemiConfig {\n persistence: 'opfs' | 'idb' | 'memory'\n archiveName?: string\n}\n\nexport interface FortemiCore {\n events: TypedEventBus\n config: FortemiConfig\n destroy(): void\n}\n\nexport function createFortemi(config: FortemiConfig): FortemiCore {\n const events = new TypedEventBus()\n\n return {\n events,\n config,\n destroy() {\n events.removeAllListeners()\n },\n }\n}\n","export interface SWRegistrationResult {\n registered: boolean\n registration?: ServiceWorkerRegistration\n error?: string\n}\n\nexport async function registerServiceWorker(\n swUrl: string = '/sw.js',\n): Promise<SWRegistrationResult> {\n if (!('serviceWorker' in navigator)) {\n return { registered: false, error: 'Service Workers not supported' }\n }\n\n try {\n const registration = await navigator.serviceWorker.register(swUrl, {\n type: 'module',\n scope: '/',\n })\n\n // Wait for the SW to become active\n if (registration.installing) {\n await new Promise<void>((resolve) => {\n registration.installing!.addEventListener('statechange', function handler() {\n if (this.state === 'activated') {\n this.removeEventListener('statechange', handler)\n resolve()\n }\n })\n })\n }\n\n return { registered: true, registration }\n } catch (err) {\n return {\n registered: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n}\n","/**\n * REST route definitions for Service Worker.\n * These are pure functions that transform HTTP Request → tool input and tool output → Response.\n * The actual DB connection is injected at registration time.\n *\n * All routes currently return 503 Not Implemented — the DB wiring happens in a later issue.\n * The URL structure and request/response shapes are the valuable contract defined here.\n */\n\nexport interface RouteHandler {\n method: string\n pattern: RegExp\n handler: (request: Request, match: RegExpMatchArray, params: URLSearchParams) => Promise<Response>\n}\n\n/** Parse JSON body safely — returns null when the body is absent or malformed */\nasync function parseJsonBody(request: Request): Promise<unknown> {\n try {\n return await request.json()\n } catch {\n return null\n }\n}\n\n/** Create a JSON response */\nfunction jsonResponse(data: unknown, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json' },\n })\n}\n\n/** Create an error response */\nfunction errorResponse(message: string, status: number): Response {\n return jsonResponse({ error: message }, status)\n}\n\nconst DB_NOT_CONNECTED = 'Database not connected. REST API available in standalone mode only.'\n\n/**\n * Create route handlers.\n * db parameter will be injected when the SW gets access to PGlite.\n * For now, returns 503 Not Implemented for all routes.\n */\nexport function createRoutes(): RouteHandler[] {\n return [\n // GET /api/v1/notes — list notes\n {\n method: 'GET',\n pattern: /^\\/api\\/v1\\/notes\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // POST /api/v1/notes — create note\n {\n method: 'POST',\n pattern: /^\\/api\\/v1\\/notes\\/?$/,\n handler: async (request) => {\n const body = await parseJsonBody(request)\n if (body === null) return errorResponse('Invalid JSON body', 400)\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // POST /api/v1/notes/:id/restore — restore soft-deleted note (must come before /:id)\n {\n method: 'POST',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/restore\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // POST /api/v1/notes/:id/star — star or unstar a note\n {\n method: 'POST',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/star\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // POST /api/v1/notes/:id/archive — archive or unarchive a note\n {\n method: 'POST',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/archive\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // GET /api/v1/notes/:id — get a single note\n {\n method: 'GET',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // PUT /api/v1/notes/:id — update a note\n {\n method: 'PUT',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // DELETE /api/v1/notes/:id — soft-delete a note\n {\n method: 'DELETE',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // GET /api/v1/search — full-text search\n {\n method: 'GET',\n pattern: /^\\/api\\/v1\\/search\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n ]\n}\n\n/**\n * Match a request against the registered routes and return the first matching\n * handler, or null if no route matches.\n */\nexport function matchRoute(routes: RouteHandler[], request: Request, url: URL): RouteHandler | null {\n for (const route of routes) {\n if (request.method !== route.method) continue\n const match = url.pathname.match(route.pattern)\n if (match) return route\n }\n return null\n}\n","/**\n * Content-addressable blob storage.\n *\n * Path format: blobs/{dir1}/{dir2}/{hash}\n * dir1 = first 2 hex chars of hash\n * dir2 = next 2 hex chars of hash\n * filename = full hash\n *\n * Two implementations are provided:\n * - OpfsBlobStore — Origin Private File System (Chrome/Edge 86+)\n * - IdbBlobStore — IndexedDB fallback (Firefox, Safari)\n *\n * Use createBlobStore() to get the best available implementation.\n * Export MemoryBlobStore for use in tests.\n */\n\n// ---------------------------------------------------------------------------\n// Interface\n// ---------------------------------------------------------------------------\n\nexport interface BlobStore {\n write(hash: string, data: Uint8Array): Promise<void>\n read(hash: string): Promise<Uint8Array | null>\n remove(hash: string): Promise<void>\n exists(hash: string): Promise<boolean>\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction hashPath(hash: string): { dir1: string; dir2: string; filename: string } {\n return {\n dir1: hash.slice(0, 2),\n dir2: hash.slice(2, 4),\n filename: hash,\n }\n}\n\n// ---------------------------------------------------------------------------\n// OPFS implementation\n// ---------------------------------------------------------------------------\n\nclass OpfsBlobStore implements BlobStore {\n constructor(private archiveName: string) {}\n\n private async getRoot(): Promise<FileSystemDirectoryHandle> {\n const root = await navigator.storage.getDirectory()\n return root.getDirectoryHandle(`fortemi-${this.archiveName}-blobs`, { create: true })\n }\n\n private async getFileHandle(\n hash: string,\n create: boolean,\n ): Promise<FileSystemFileHandle | null> {\n const { dir1, dir2, filename } = hashPath(hash)\n try {\n const root = await this.getRoot()\n const d1 = await root.getDirectoryHandle(dir1, { create })\n const d2 = await d1.getDirectoryHandle(dir2, { create })\n return d2.getFileHandle(filename, { create })\n } catch (err) {\n if (err instanceof DOMException && err.name === 'NotFoundError') {\n return null\n }\n throw err\n }\n }\n\n async write(hash: string, data: Uint8Array): Promise<void> {\n const fh = await this.getFileHandle(hash, true)\n if (!fh) throw new Error(`OpfsBlobStore: could not create file for hash ${hash}`)\n // createSyncAccessHandle is worker-only; use a writable stream instead.\n const writable = await fh.createWritable()\n // Slice to a plain ArrayBuffer so TS is happy with the stricter\n // FileSystemWritableFileStream.write() overload signature.\n await writable.write(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer)\n await writable.close()\n }\n\n async read(hash: string): Promise<Uint8Array | null> {\n const fh = await this.getFileHandle(hash, false)\n if (!fh) return null\n const file = await fh.getFile()\n const buffer = await file.arrayBuffer()\n return new Uint8Array(buffer)\n }\n\n async remove(hash: string): Promise<void> {\n const { dir1, dir2, filename } = hashPath(hash)\n try {\n const root = await this.getRoot()\n const d1 = await root.getDirectoryHandle(dir1, { create: false })\n const d2 = await d1.getDirectoryHandle(dir2, { create: false })\n await d2.removeEntry(filename)\n } catch (err) {\n if (err instanceof DOMException && err.name === 'NotFoundError') {\n return // already gone — idempotent\n }\n throw err\n }\n }\n\n async exists(hash: string): Promise<boolean> {\n const fh = await this.getFileHandle(hash, false)\n return fh !== null\n }\n}\n\n// ---------------------------------------------------------------------------\n// IDB implementation\n// ---------------------------------------------------------------------------\n\nconst IDB_STORE = 'blobs'\nconst IDB_VERSION = 1\n\nfunction openDb(dbName: string): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, IDB_VERSION)\n req.onupgradeneeded = () => {\n req.result.createObjectStore(IDB_STORE)\n }\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n })\n}\n\nclass IdbBlobStore implements BlobStore {\n private dbName: string\n private _db: IDBDatabase | null = null\n\n constructor(archiveName: string) {\n this.dbName = `fortemi-${archiveName}-blobs`\n }\n\n private async db(): Promise<IDBDatabase> {\n if (!this._db) {\n this._db = await openDb(this.dbName)\n }\n return this._db\n }\n\n async write(hash: string, data: Uint8Array): Promise<void> {\n const db = await this.db()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite')\n tx.objectStore(IDB_STORE).put(data, hash)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n }\n\n async read(hash: string): Promise<Uint8Array | null> {\n const db = await this.db()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readonly')\n const req = tx.objectStore(IDB_STORE).get(hash)\n req.onsuccess = () => resolve((req.result as Uint8Array | undefined) ?? null)\n req.onerror = () => reject(req.error)\n })\n }\n\n async remove(hash: string): Promise<void> {\n const db = await this.db()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite')\n tx.objectStore(IDB_STORE).delete(hash)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n }\n\n async exists(hash: string): Promise<boolean> {\n const db = await this.db()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readonly')\n const req = tx.objectStore(IDB_STORE).count(hash)\n req.onsuccess = () => resolve(req.result > 0)\n req.onerror = () => reject(req.error)\n })\n }\n}\n\n// ---------------------------------------------------------------------------\n// In-memory implementation (testing)\n// ---------------------------------------------------------------------------\n\nexport class MemoryBlobStore implements BlobStore {\n private store = new Map<string, Uint8Array>()\n\n async write(hash: string, data: Uint8Array): Promise<void> {\n this.store.set(hash, data)\n }\n\n async read(hash: string): Promise<Uint8Array | null> {\n return this.store.get(hash) ?? null\n }\n\n async remove(hash: string): Promise<void> {\n this.store.delete(hash)\n }\n\n async exists(hash: string): Promise<boolean> {\n return this.store.has(hash)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createBlobStore(archiveName: string): BlobStore {\n if (\n typeof navigator !== 'undefined' &&\n 'storage' in navigator &&\n 'getDirectory' in navigator.storage\n ) {\n return new OpfsBlobStore(archiveName)\n }\n return new IdbBlobStore(archiveName)\n}\n","import type { QueryExecutor } from '../storage-backend.js'\nimport { computeHash } from '../hash.js'\nimport { EmbeddingSetsRepository, type EmbeddingSetSelector, type ResolvedEmbeddingSet } from './embedding-sets-repository.js'\n\nexport interface GraphNode {\n id: string\n}\n\nexport interface GraphEdge {\n source: string\n target: string\n weight: number\n kind?: string\n}\n\nexport interface GraphCommunity {\n id: string\n nodes: string[]\n}\n\nexport interface CommunityGraph {\n nodes: GraphNode[]\n edges: GraphEdge[]\n communities: GraphCommunity[]\n}\n\nexport interface SimilarityGraphOptions {\n k?: number\n minSimilarity?: number\n threshold?: number\n metric?: 'cosine' | 'inner_product' | 'l2'\n batchSize?: number\n yieldEvery?: number\n onProgress?: (progress: SimilarityGraphProgress) => void\n}\n\nexport interface SimilarityGraphRequest extends SimilarityGraphOptions {\n selector: EmbeddingSetSelector\n source?: 'cache-preferred' | 'live-only' | 'cache-only'\n}\n\nexport interface SimilarityGraphProgress {\n phase: 'prepare' | 'neighbors'\n done: number\n total: number\n}\n\nexport interface SimilarityGraphCacheKey {\n selectorHash: string\n resolvedEmbeddingSetId?: string\n virtualSetId?: string\n k: number\n minSimilarity: number\n metric: 'cosine' | 'inner_product' | 'l2'\n model: string\n dimension: number\n truncateDimension?: number | null\n memberHash: string\n vectorHash: string\n parameterHash: string\n}\n\nexport interface SimilarityGraphResult {\n graph: CommunityGraph\n graphSource: {\n id: string\n name: string\n input_hash: string\n freshness: 'fresh' | 'stale' | 'unknown'\n }\n cache: 'hit' | 'miss-live-built' | 'stale-live-built' | 'live-only'\n freshness: 'fresh' | 'stale' | 'unknown'\n}\n\nexport interface CommunityOptions {\n maxIterations?: number\n}\n\nconst SIMILARITY_GRAPH_ALGORITHM = 'knn-batched-v1'\nconst DEFAULT_GRAPH_BATCH_SIZE = 64\n\nfunction hashJson(value: unknown): string {\n return computeHash(new TextEncoder().encode(JSON.stringify(value)))\n}\n\nfunction sourceIdFor(inputHash: string): string {\n return `similarity-${inputHash.replace(/^sha256:/, '').slice(0, 24)}`\n}\n\nfunction jsonObject(value: unknown): Record<string, unknown> | null {\n if (value == null) return null\n if (typeof value === 'string') return JSON.parse(value) as Record<string, unknown>\n return value as Record<string, unknown>\n}\n\nasync function yieldToEventLoop(): Promise<void> {\n const scheduler = (globalThis as unknown as { scheduler?: { yield?: () => Promise<void> } }).scheduler\n if (scheduler?.yield) {\n await scheduler.yield()\n return\n }\n await new Promise<void>((resolve) => setTimeout(resolve, 0))\n}\n\nasync function maybeYield(done: number, every: number): Promise<void> {\n if (every > 0 && done > 0 && done % every === 0) {\n await yieldToEventLoop()\n }\n}\n\nfunction parseVector(value: string): number[] {\n return value\n .replace(/^\\[/, '')\n .replace(/\\]$/, '')\n .split(',')\n .filter((part) => part.length > 0)\n .map(Number)\n}\n\nfunction vectorScore(\n left: number[],\n right: number[],\n metric: 'cosine' | 'inner_product' | 'l2',\n): { distance: number; similarity: number } {\n let dot = 0\n let leftNorm = 0\n let rightNorm = 0\n let squaredDistance = 0\n for (let i = 0; i < Math.min(left.length, right.length); i++) {\n dot += left[i] * right[i]\n leftNorm += left[i] * left[i]\n rightNorm += right[i] * right[i]\n const diff = left[i] - right[i]\n squaredDistance += diff * diff\n }\n if (metric === 'inner_product') {\n return { distance: -dot, similarity: dot }\n }\n if (metric === 'l2') {\n const distance = Math.sqrt(squaredDistance)\n return { distance, similarity: -distance }\n }\n const denominator = Math.sqrt(leftNorm) * Math.sqrt(rightNorm)\n const similarity = denominator === 0 ? 0 : dot / denominator\n return { distance: 1 - similarity, similarity }\n}\n\nexport function detectCommunities(\n edges: GraphEdge[],\n nodes: GraphNode[] = [],\n options: CommunityOptions = {},\n): GraphCommunity[] {\n const nodeIds = new Set(nodes.map((n) => n.id))\n for (const edge of edges) {\n nodeIds.add(edge.source)\n nodeIds.add(edge.target)\n }\n\n const labels = new Map<string, string>()\n const adjacency = new Map<string, Array<{ node: string; weight: number }>>()\n for (const id of nodeIds) {\n labels.set(id, id)\n adjacency.set(id, [])\n }\n for (const edge of edges) {\n adjacency.get(edge.source)?.push({ node: edge.target, weight: edge.weight })\n adjacency.get(edge.target)?.push({ node: edge.source, weight: edge.weight })\n }\n\n const orderedNodes = Array.from(nodeIds).sort()\n const maxIterations = options.maxIterations ?? 20\n for (let i = 0; i < maxIterations; i++) {\n let changed = false\n for (const node of orderedNodes) {\n const scores = new Map<string, number>()\n for (const neighbor of adjacency.get(node) ?? []) {\n const label = labels.get(neighbor.node) ?? neighbor.node\n scores.set(label, (scores.get(label) ?? 0) + neighbor.weight)\n }\n if (scores.size === 0) continue\n const nextLabel = Array.from(scores.entries())\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))[0][0]\n if (nextLabel !== labels.get(node)) {\n labels.set(node, nextLabel)\n changed = true\n }\n }\n if (!changed) break\n }\n\n const byLabel = new Map<string, string[]>()\n for (const node of orderedNodes) {\n const label = labels.get(node) ?? node\n const members = byLabel.get(label) ?? []\n members.push(node)\n byLabel.set(label, members)\n }\n\n return Array.from(byLabel.values())\n .sort((a, b) => b.length - a.length || a[0].localeCompare(b[0]))\n .map((members, index) => ({ id: `community-${index + 1}`, nodes: members }))\n}\n\nexport class GraphRepository {\n constructor(private db: QueryExecutor) {}\n\n normalizeSimilarityRequest(request: SimilarityGraphRequest): Required<Pick<SimilarityGraphRequest, 'selector' | 'k' | 'minSimilarity' | 'metric' | 'source'>> {\n if (request.minSimilarity !== undefined && request.threshold !== undefined && request.minSimilarity !== request.threshold) {\n throw new Error('conflicting-threshold')\n }\n return {\n selector: request.selector,\n k: request.k ?? 5,\n minSimilarity: request.minSimilarity ?? request.threshold ?? -1,\n metric: request.metric ?? 'cosine',\n source: request.source ?? 'cache-preferred',\n }\n }\n\n async buildSimilarityGraph(\n embeddingSet: string | EmbeddingSetSelector,\n options: SimilarityGraphOptions = {},\n ): Promise<CommunityGraph> {\n const selector = typeof embeddingSet === 'string'\n ? { kind: 'embedding-set' as const, embeddingSetId: embeddingSet }\n : embeddingSet\n return this.buildSimilarityGraphFromResolved(\n await new EmbeddingSetsRepository(this.db).resolveSelector(selector),\n options,\n )\n }\n\n async buildSimilarityGraphLive(request: SimilarityGraphRequest): Promise<CommunityGraph> {\n const normalized = this.normalizeSimilarityRequest({ ...request, source: 'live-only' })\n const resolved = await new EmbeddingSetsRepository(this.db).resolveSelector(normalized.selector)\n return this.buildSimilarityGraphFromResolved(resolved, normalized)\n }\n\n async getCachedSimilarityGraph(request: SimilarityGraphRequest): Promise<SimilarityGraphResult | null> {\n const normalized = this.normalizeSimilarityRequest(request)\n const resolved = await new EmbeddingSetsRepository(this.db).resolveSelector(normalized.selector)\n const cacheKey = await this.computeSimilarityGraphCacheKey(normalized, resolved)\n const inputHash = hashJson(cacheKey)\n const source = await this.findGraphSource(inputHash)\n if (!source) return null\n const graph = await this.graphFromArtifact(source.id, resolved.noteIds)\n return {\n graph,\n graphSource: { id: source.id, name: source.name, input_hash: source.input_hash, freshness: source.freshness },\n cache: 'hit',\n freshness: source.freshness,\n }\n }\n\n async buildOrLoadSimilarityGraph(request: SimilarityGraphRequest): Promise<SimilarityGraphResult> {\n const normalized = this.normalizeSimilarityRequest(request)\n const resolved = await new EmbeddingSetsRepository(this.db).resolveSelector(normalized.selector)\n const cacheKey = await this.computeSimilarityGraphCacheKey(normalized, resolved)\n const inputHash = hashJson(cacheKey)\n\n if (normalized.source !== 'live-only') {\n const cached = await this.findGraphSource(inputHash)\n if (cached?.freshness === 'fresh') {\n const graph = await this.graphFromArtifact(cached.id, resolved.noteIds)\n return {\n graph,\n graphSource: { id: cached.id, name: cached.name, input_hash: cached.input_hash, freshness: cached.freshness },\n cache: 'hit',\n freshness: 'fresh',\n }\n }\n if (normalized.source === 'cache-only') {\n throw new Error(cached ? 'similarity graph cache stale' : 'similarity graph cache miss')\n }\n const graph = await this.buildSimilarityGraphFromResolved(resolved, normalized)\n const graphSource = await this.saveSimilarityGraphArtifact({ graph, request: normalized, resolved, cacheKey, freshness: 'fresh' })\n return {\n graph,\n graphSource,\n cache: cached ? 'stale-live-built' : 'miss-live-built',\n freshness: cached ? cached.freshness : 'fresh',\n }\n }\n\n const graph = await this.buildSimilarityGraphFromResolved(resolved, normalized)\n return {\n graph,\n graphSource: { id: sourceIdFor(inputHash), name: 'Live similarity graph', input_hash: inputHash, freshness: 'unknown' },\n cache: 'live-only',\n freshness: 'unknown',\n }\n }\n\n async saveSimilarityGraphArtifact(input: {\n graph: CommunityGraph\n request: Required<Pick<SimilarityGraphRequest, 'selector' | 'k' | 'minSimilarity' | 'metric' | 'source'>>\n resolved: ResolvedEmbeddingSet\n cacheKey: SimilarityGraphCacheKey\n freshness?: 'fresh' | 'stale' | 'unknown'\n }): Promise<SimilarityGraphResult['graphSource']> {\n const inputHash = hashJson(input.cacheKey)\n const id = sourceIdFor(inputHash)\n const parameters = {\n k: input.request.k,\n minSimilarity: input.request.minSimilarity,\n metric: input.request.metric,\n algorithm: SIMILARITY_GRAPH_ALGORITHM,\n selectorHash: input.cacheKey.selectorHash,\n parameterHash: input.cacheKey.parameterHash,\n }\n await this.db.query(\n `INSERT INTO graph_source (id, name, kind, source_table, embedding_set_id, virtual_set_id, model, dimension, metric, algorithm, parameters_json, input_hash, freshness_json)\n VALUES ($1, $2, 'similarity', 'embedding', $3, $4, $5, $6, $7, $8, $9::jsonb, $10, $11::jsonb)\n ON CONFLICT (id) DO UPDATE SET parameters_json = $9::jsonb, input_hash = $10, freshness_json = $11::jsonb`,\n [\n id,\n 'Cached similarity graph',\n input.request.selector.kind === 'embedding-set' ? input.request.selector.embeddingSetId ?? null : null,\n input.request.selector.kind !== 'embedding-set' ? input.request.selector.definition?.id ?? null : null,\n input.cacheKey.model,\n input.cacheKey.dimension,\n input.request.metric,\n SIMILARITY_GRAPH_ALGORITHM,\n JSON.stringify(parameters),\n inputHash,\n JSON.stringify({ status: input.freshness ?? 'fresh' }),\n ],\n )\n await this.db.query(`DELETE FROM graph_edge_artifact WHERE graph_source_id = $1`, [id])\n let rank = 1\n for (const edge of input.graph.edges) {\n await this.db.query(\n `INSERT INTO graph_edge_artifact (graph_source_id, from_note_id, to_note_id, weight, kind, rank)\n VALUES ($1, $2, $3, $4, 'similarity', $5)`,\n [id, edge.source, edge.target, edge.weight, rank++],\n )\n }\n return { id, name: 'Cached similarity graph', input_hash: inputHash, freshness: input.freshness ?? 'fresh' }\n }\n\n async markSimilarityGraphStale(graphSourceId: string, reason: string): Promise<void> {\n await this.db.query(\n `UPDATE graph_source SET freshness_json = $2::jsonb WHERE id = $1`,\n [graphSourceId, JSON.stringify({ status: 'stale', stale_reason: reason, checked_at: new Date().toISOString() })],\n )\n }\n\n async loadGraphArtifact(graphSourceId: string, noteIds: string[] = []): Promise<CommunityGraph> {\n return this.graphFromArtifact(graphSourceId, noteIds)\n }\n\n private async buildSimilarityGraphFromResolved(\n resolved: ResolvedEmbeddingSet,\n options: SimilarityGraphOptions,\n ): Promise<CommunityGraph> {\n const k = options.k ?? 5\n const minSimilarity = options.minSimilarity ?? options.threshold ?? -1\n const metric = options.metric ?? 'cosine'\n const yieldEvery = options.yieldEvery ?? options.batchSize ?? DEFAULT_GRAPH_BATCH_SIZE\n const embeddings = resolved.rows\n\n const nodes = embeddings.map((row) => ({ id: row.note_id }))\n const edgeMap = new Map<string, GraphEdge>()\n const vectors = embeddings.map((row) => ({\n row,\n vector: parseVector(row.vector),\n }))\n options.onProgress?.({ phase: 'prepare', done: vectors.length, total: vectors.length })\n\n for (const [index, item] of vectors.entries()) {\n const neighbors = vectors\n .filter((candidate) => candidate.row.note_id !== item.row.note_id)\n .map((candidate) => {\n const score = vectorScore(item.vector, candidate.vector, metric)\n return { noteId: candidate.row.note_id, ...score }\n })\n .sort((a, b) => a.distance - b.distance || a.noteId.localeCompare(b.noteId))\n .slice(0, k)\n for (const neighbor of neighbors) {\n if (neighbor.similarity < minSimilarity) continue\n const [source, target] = [item.row.note_id, neighbor.noteId].sort()\n const id = `${source}\\u0000${target}`\n const existing = edgeMap.get(id)\n if (!existing || neighbor.similarity > existing.weight) {\n edgeMap.set(id, { source, target, weight: neighbor.similarity, kind: 'similarity' })\n }\n }\n options.onProgress?.({ phase: 'neighbors', done: index + 1, total: vectors.length })\n await maybeYield(index + 1, yieldEvery)\n }\n\n const edges = Array.from(edgeMap.values()).sort((a, b) =>\n a.source.localeCompare(b.source) || a.target.localeCompare(b.target),\n )\n return { nodes, edges, communities: detectCommunities(edges, nodes) }\n }\n\n private async computeSimilarityGraphCacheKey(\n request: Required<Pick<SimilarityGraphRequest, 'selector' | 'k' | 'minSimilarity' | 'metric' | 'source'>>,\n resolved: ResolvedEmbeddingSet,\n ): Promise<SimilarityGraphCacheKey> {\n const firstSetId = resolved.rows[0]?.embedding_set_id\n const set = firstSetId ? await new EmbeddingSetsRepository(this.db).get(firstSetId) : null\n return {\n selectorHash: hashJson(request.selector),\n resolvedEmbeddingSetId: request.selector.kind === 'embedding-set' ? request.selector.embeddingSetId : undefined,\n virtualSetId: request.selector.kind === 'virtual-definition' ? request.selector.definition?.id : undefined,\n k: request.k,\n minSimilarity: request.minSimilarity,\n metric: request.metric,\n model: set?.model_name ?? 'unknown',\n dimension: set?.dimensions ?? 0,\n truncateDimension: set?.truncate_dimension ?? null,\n memberHash: hashJson(resolved.rows.map((row) => [row.note_id, row.embedding_set_id, row.embedding_id])),\n vectorHash: hashJson(resolved.rows.map((row) => [row.embedding_id, row.vector])),\n parameterHash: hashJson({ k: request.k, minSimilarity: request.minSimilarity, metric: request.metric, algorithm: SIMILARITY_GRAPH_ALGORITHM }),\n }\n }\n\n private async findGraphSource(inputHash: string): Promise<{ id: string; name: string; input_hash: string; freshness: 'fresh' | 'stale' | 'unknown' } | null> {\n const result = await this.db.query<{ id: string; name: string; input_hash: string; freshness_json: unknown }>(\n `SELECT id, name, input_hash, freshness_json FROM graph_source WHERE kind = 'similarity' AND input_hash = $1 LIMIT 1`,\n [inputHash],\n )\n if (result.rows.length === 0) return null\n const row = result.rows[0]\n const freshness = jsonObject(row.freshness_json) as { status?: 'fresh' | 'stale' | 'unknown' } | null\n return { id: row.id, name: row.name, input_hash: row.input_hash, freshness: freshness?.status ?? 'unknown' }\n }\n\n private async graphFromArtifact(graphSourceId: string, noteIds: string[]): Promise<CommunityGraph> {\n const result = await this.db.query<GraphEdge>(\n `SELECT from_note_id as source, to_note_id as target, weight, kind\n FROM graph_edge_artifact\n WHERE graph_source_id = $1\n ORDER BY from_note_id, to_note_id`,\n [graphSourceId],\n )\n const nodes = Array.from(new Set([...noteIds, ...result.rows.flatMap((edge) => [edge.source, edge.target])]))\n .sort()\n .map((id) => ({ id }))\n return { nodes, edges: result.rows, communities: detectCommunities(result.rows, nodes) }\n }\n\n async buildLinkGraph(linkType?: string): Promise<CommunityGraph> {\n const params: unknown[] = []\n const typeFilter = linkType ? ' AND link_type = $1' : ''\n if (linkType) params.push(linkType)\n const result = await this.db.query<GraphEdge>(\n `SELECT source_note_id as source, target_note_id as target,\n COALESCE(confidence, 1.0) as weight, link_type as kind\n FROM link\n WHERE deleted_at IS NULL${typeFilter}\n ORDER BY source_note_id, target_note_id`,\n params,\n )\n const nodes = Array.from(new Set(result.rows.flatMap((edge) => [edge.source, edge.target])))\n .sort()\n .map((id) => ({ id }))\n return { nodes, edges: result.rows, communities: detectCommunities(result.rows, nodes) }\n }\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\nimport type { EmbeddingSetSelector } from './embedding-sets-repository.js'\nimport { SearchRepository } from './search-repository.js'\n\nexport type CommunitySourceType =\n | 'computed'\n | 'precomputed'\n | 'dynamic'\n | 'dynamic-snapshot'\n | 'user-authored'\n | 'imported'\n\nexport interface CommunityFilterDefinition {\n query?: string\n tags?: string[]\n collectionIds?: string[]\n conceptIds?: string[]\n noteIds?: string[]\n embeddingSetSelector?: EmbeddingSetSelector\n}\n\nexport interface CommunitySourceDescriptor {\n id: string\n name: string\n sourceType: CommunitySourceType\n graphSourceId?: string\n selector?: EmbeddingSetSelector\n searchQuery?: string\n filters?: CommunityFilterDefinition\n createdAt?: string\n updatedAt?: string\n freshness?: 'fresh' | 'stale' | 'unknown'\n}\n\nexport interface CommunityAssignmentView {\n communitySourceId: string\n communityId: string\n noteId: string\n label?: string | null\n confidence?: number | null\n sourceType: CommunitySourceType\n}\n\nexport interface CommunitySummary {\n id: string\n label: string\n sourceType: CommunitySourceType\n size: number\n confidence?: number | null\n representativeNoteIds: string[]\n freshness?: 'fresh' | 'stale' | 'unknown'\n}\n\nexport interface CommunityCreateInput {\n name: string\n label?: string\n sourceType: 'dynamic-snapshot' | 'user-authored'\n filters?: CommunityFilterDefinition\n noteIds?: string[]\n representativeNoteIds?: string[]\n}\n\nfunction json(value: unknown): string | null {\n return value == null ? null : JSON.stringify(value)\n}\n\nfunction parseObject<T>(value: unknown): T | undefined {\n if (value == null) return undefined\n if (typeof value === 'string') return JSON.parse(value) as T\n return value as T\n}\n\nfunction iso(value: Date | string | undefined): string | undefined {\n if (!value) return undefined\n return value instanceof Date ? value.toISOString() : value\n}\n\nexport class CommunitiesRepository {\n constructor(private db: DatabaseClient) {}\n\n async previewDynamicCommunity(filters: CommunityFilterDefinition): Promise<CommunityAssignmentView[]> {\n const noteIds = await this.resolveFilterNoteIds(filters)\n return noteIds.map((noteId) => ({\n communitySourceId: 'dynamic-preview',\n communityId: 'dynamic-preview',\n noteId,\n label: 'Dynamic preview',\n confidence: null,\n sourceType: 'dynamic',\n }))\n }\n\n async saveCommunity(input: CommunityCreateInput): Promise<CommunitySourceDescriptor> {\n const sourceId = generateId()\n const communitySetId = generateId()\n const communityId = generateId()\n const noteIds = input.noteIds ?? (input.filters ? await this.resolveFilterNoteIds(input.filters) : [])\n const sourceKind = input.sourceType === 'dynamic-snapshot' ? 'search' : 'manual'\n const freshness = input.sourceType === 'dynamic-snapshot' ? 'fresh' : 'unknown'\n\n await this.db.query(\n `INSERT INTO graph_source (id, name, kind, source_table, parameters_json, input_hash, freshness_json)\n VALUES ($1, $2, $3, 'manual', $4::jsonb, $5, $6::jsonb)`,\n [sourceId, input.name, sourceKind, json({ filters: input.filters ?? null }), `community:${sourceId}`, json({ status: freshness })],\n )\n await this.db.query(\n `INSERT INTO community_set (id, graph_source_id, name, source_type, parameters_json, input_hash, freshness_json)\n VALUES ($1, $2, $3, $4, $5::jsonb, $6, $7::jsonb)`,\n [communitySetId, sourceId, input.name, input.sourceType, json({ filters: input.filters ?? null }), `community:${communitySetId}`, json({ status: freshness })],\n )\n await this.db.query(\n `INSERT INTO community (community_set_id, id, label, rank, size, representative_note_ids)\n VALUES ($1, $2, $3, 1, $4, $5)`,\n [communitySetId, communityId, input.label ?? input.name, noteIds.length, input.representativeNoteIds ?? []],\n )\n for (const noteId of noteIds) {\n await this.db.query(\n `INSERT INTO community_assignment (community_set_id, community_id, note_id, confidence, source_type)\n VALUES ($1, $2, $3, NULL, $4)`,\n [communitySetId, communityId, noteId, input.sourceType],\n )\n }\n\n return {\n id: communitySetId,\n name: input.name,\n sourceType: input.sourceType,\n graphSourceId: sourceId,\n searchQuery: input.filters?.query,\n filters: input.filters,\n freshness,\n }\n }\n\n async rerunDynamicCommunity(sourceId: string): Promise<CommunityAssignmentView[]> {\n const result = await this.db.query<{ parameters_json: unknown; source_type: CommunitySourceType }>(\n `SELECT parameters_json, source_type FROM community_set WHERE id = $1`,\n [sourceId],\n )\n if (result.rows.length === 0) throw new Error(`Community source not found: ${sourceId}`)\n const parameters = parseObject<{ filters?: CommunityFilterDefinition | null }>(result.rows[0].parameters_json)\n if (!parameters?.filters) return this.getCommunityAssignments(sourceId)\n const preview = await this.previewDynamicCommunity(parameters.filters)\n return preview.map((assignment) => ({ ...assignment, communitySourceId: sourceId, sourceType: 'dynamic' }))\n }\n\n async listCommunitySources(): Promise<CommunitySourceDescriptor[]> {\n const result = await this.db.query<{\n id: string\n graph_source_id: string\n name: string\n source_type: CommunitySourceType\n parameters_json: unknown | null\n freshness_json: unknown | null\n created_at: Date\n }>(`SELECT * FROM community_set ORDER BY created_at, name`)\n return result.rows.map((row) => {\n const parameters = parseObject<{ filters?: CommunityFilterDefinition | null }>(row.parameters_json)\n const freshness = parseObject<{ status?: 'fresh' | 'stale' | 'unknown' }>(row.freshness_json)\n return {\n id: row.id,\n name: row.name,\n sourceType: row.source_type,\n graphSourceId: row.graph_source_id,\n searchQuery: parameters?.filters?.query,\n filters: parameters?.filters ?? undefined,\n createdAt: iso(row.created_at),\n freshness: freshness?.status ?? 'unknown',\n }\n })\n }\n\n async getCommunityAssignments(sourceId: string): Promise<CommunityAssignmentView[]> {\n const result = await this.db.query<{\n community_set_id: string\n community_id: string\n note_id: string\n label: string | null\n confidence: number | null\n source_type: CommunitySourceType\n }>(\n `SELECT ca.community_set_id, ca.community_id, ca.note_id, c.label, ca.confidence, ca.source_type\n FROM community_assignment ca\n LEFT JOIN community c ON c.community_set_id = ca.community_set_id AND c.id = ca.community_id\n WHERE ca.community_set_id = $1\n ORDER BY ca.community_id, ca.note_id`,\n [sourceId],\n )\n return result.rows.map((row) => ({\n communitySourceId: row.community_set_id,\n communityId: row.community_id,\n noteId: row.note_id,\n label: row.label,\n confidence: row.confidence,\n sourceType: row.source_type,\n }))\n }\n\n async listCommunitySummaries(sourceId: string): Promise<CommunitySummary[]> {\n const result = await this.db.query<{\n id: string\n label: string | null\n source_type: CommunitySourceType\n size: number | null\n confidence: number | null\n representative_note_ids: string[] | null\n freshness_json: unknown | null\n }>(\n `SELECT c.id, c.label, cs.source_type, c.size, c.confidence, c.representative_note_ids, cs.freshness_json\n FROM community c\n JOIN community_set cs ON cs.id = c.community_set_id\n WHERE c.community_set_id = $1\n ORDER BY c.rank NULLS LAST, c.id`,\n [sourceId],\n )\n return result.rows.map((row) => {\n const freshness = parseObject<{ status?: 'fresh' | 'stale' | 'unknown' }>(row.freshness_json)\n return {\n id: row.id,\n label: row.label ?? row.id,\n sourceType: row.source_type,\n size: row.size ?? 0,\n confidence: row.confidence,\n representativeNoteIds: row.representative_note_ids ?? [],\n freshness: freshness?.status ?? 'unknown',\n }\n })\n }\n\n private async resolveFilterNoteIds(filters: CommunityFilterDefinition): Promise<string[]> {\n if (filters.conceptIds?.length) {\n throw new Error('Community concept filters are not supported locally yet')\n }\n if (filters.noteIds?.length && !filters.query && !filters.tags?.length && !filters.collectionIds?.length && !filters.embeddingSetSelector) {\n return [...filters.noteIds].sort()\n }\n const result = await new SearchRepository(this.db, true).search(filters.query ?? '', {\n limit: 1000,\n tags: filters.tags,\n collection_id: filters.collectionIds?.[0],\n embeddingSetSelector: filters.embeddingSetSelector,\n })\n const ids = result.results.map((row) => row.id)\n return filters.noteIds?.length ? ids.filter((id) => filters.noteIds?.includes(id)) : ids\n }\n}\n","/**\n * LLM completion function injection.\n * Provides the slot for an LLM function — injected by the llm capability module.\n * No model loading by default (CAP-001).\n *\n * @implements #66 AI title generation\n */\n\n/** Type for the LLM completion function — injected by the llm capability module */\nexport type LlmCompleteFn = (\n prompt: string,\n options?: { maxTokens?: number; temperature?: number }\n) => Promise<string>\n\nlet llmFn: LlmCompleteFn | null = null\n\nexport function setLlmFunction(fn: LlmCompleteFn | null): void {\n llmFn = fn\n}\n\nexport function getLlmFunction(): LlmCompleteFn | null {\n return llmFn\n}\n","/**\n * Job queue worker — polls job_queue for pending jobs, dispatches to registered\n * handlers, manages status transitions and exponential backoff retries.\n *\n * Job types and priorities (lower = runs first):\n * ai_revision: 1 (LLM enriches content first, requires llm)\n * title_generation: 2 (generate title from enriched content)\n * embedding: 3 (vectorize final content, requires semantic)\n * concept_tagging: 4 (extract concepts from enriched content, requires llm)\n * linking: 5 (find related notes, requires embeddings to exist)\n */\n\nimport type { DatabaseClient } from './storage-backend.js'\nimport type { TypedEventBus } from './event-bus.js'\nimport type { CapabilityManager, CapabilityName } from './capability-manager.js'\nimport { getLlmFunction } from './capabilities/llm-handler.js'\nimport { generateId } from './uuid.js'\n\nexport interface JobQueueOptions {\n /** How often to poll for new jobs (ms). Default: 5000 */\n pollIntervalMs?: number\n /** Global max retries used when job.max_retries is 0. Default: 3 */\n maxRetries?: number\n /** Base delay for exponential backoff (ms). Default: 1000 */\n backoffBaseMs?: number\n /** Maximum backoff delay cap (ms). Default: 300000 (5 min) */\n backoffMaxMs?: number\n}\n\ninterface Job {\n id: string\n note_id: string\n job_type: string\n status: string\n priority: number\n required_capability: string | null\n retry_count: number\n max_retries: number\n error: string | null\n result: unknown | null\n created_at: Date\n updated_at: Date\n}\n\ntype JobHandler = (job: Job, db: DatabaseClient) => Promise<unknown>\n\n/** Job types listed in execution priority order (lower number = runs first) */\nexport type JobType =\n | 'ai_revision' // priority 1, requires llm — enriches content first\n | 'title_generation' // priority 2, generates title from enriched content\n | 'embedding' // priority 3, requires semantic\n | 'concept_tagging' // priority 4, requires llm\n | 'linking' // priority 5, requires embeddings to exist\n\n/**\n * Job priorities — lower number = runs first.\n * Correct dependency order:\n * 1. ai_revision — LLM enriches content first\n * 2. title_generation — generate title from enriched content\n * 3. embedding — vectorize final content\n * 4. concept_tagging — extract concepts from enriched content\n * 5. linking — find related notes (requires embeddings to exist)\n */\nexport const JOB_PRIORITIES: Record<JobType, number> = {\n ai_revision: 1,\n title_generation: 2,\n embedding: 3,\n concept_tagging: 4,\n linking: 5,\n}\n\nexport const JOB_CAPABILITIES: Partial<Record<JobType, string>> = {\n ai_revision: 'llm',\n embedding: 'semantic',\n concept_tagging: 'llm',\n}\n\nexport interface EnqueueJobInput {\n noteId: string\n jobType: JobType\n priority?: number\n requiredCapability?: string | null\n}\n\n/** Enqueue a job into the job_queue table. Returns the new job ID. */\nexport async function enqueueJob(db: DatabaseClient, input: EnqueueJobInput): Promise<string> {\n const id = generateId()\n const priority = input.priority ?? JOB_PRIORITIES[input.jobType] ?? 5\n const capability = input.requiredCapability !== undefined\n ? input.requiredCapability\n : JOB_CAPABILITIES[input.jobType] ?? null\n await db.query(\n `INSERT INTO job_queue (id, note_id, job_type, status, priority, required_capability, max_retries, retry_count)\n VALUES ($1, $2, $3, 'pending', $4, $5, 3, 0)`,\n [id, input.noteId, input.jobType, priority, capability],\n )\n return id\n}\n\n/** Enqueue the note creation pipeline: revision → title → embedding. */\nexport async function enqueueNoteCreationJobs(db: DatabaseClient, noteId: string, hasTitle: boolean): Promise<void> {\n await enqueueJob(db, { noteId, jobType: 'ai_revision' })\n if (!hasTitle) {\n await enqueueJob(db, { noteId, jobType: 'title_generation' })\n }\n await enqueueJob(db, { noteId, jobType: 'embedding' })\n}\n\n/**\n * Enqueue the complete workflow for a note.\n * Order: revision → title → embedding → concepts → linking.\n * Jobs run in priority order so each step has the richest content available.\n */\nexport async function enqueueFullWorkflow(db: DatabaseClient, noteId: string): Promise<void> {\n await enqueueJob(db, { noteId, jobType: 'ai_revision' })\n await enqueueJob(db, { noteId, jobType: 'title_generation' })\n await enqueueJob(db, { noteId, jobType: 'embedding' })\n await enqueueJob(db, { noteId, jobType: 'concept_tagging' })\n await enqueueJob(db, { noteId, jobType: 'linking' })\n}\n\nexport interface JobStatus {\n id: string\n note_id: string\n job_type: string\n status: string\n priority: number\n required_capability: string | null\n retry_count: number\n max_retries: number\n error: string | null\n result: unknown | null\n created_at: Date\n updated_at: Date\n}\n\n/** Query job queue status. Optionally filter by note_id. */\nexport async function getJobQueueStatus(db: DatabaseClient, noteId?: string): Promise<JobStatus[]> {\n const query = noteId\n ? `SELECT * FROM job_queue WHERE note_id = $1 ORDER BY created_at DESC LIMIT 50`\n : `SELECT * FROM job_queue ORDER BY created_at DESC LIMIT 50`\n const params = noteId ? [noteId] : []\n const result = await db.query<JobStatus>(query, params)\n return result.rows\n}\n\nexport class JobQueueWorker {\n private handlers = new Map<string, JobHandler>()\n private running = false\n private timer: ReturnType<typeof setTimeout> | null = null\n private options: Required<JobQueueOptions>\n\n constructor(\n private db: DatabaseClient,\n private events?: TypedEventBus,\n options: JobQueueOptions = {},\n private capabilityManager?: CapabilityManager,\n ) {\n this.options = {\n pollIntervalMs: options.pollIntervalMs ?? 5000,\n maxRetries: options.maxRetries ?? 3,\n backoffBaseMs: options.backoffBaseMs ?? 1000,\n backoffMaxMs: options.backoffMaxMs ?? 300000,\n }\n }\n\n registerHandler(jobType: string, handler: JobHandler): void {\n this.handlers.set(jobType, handler)\n }\n\n async start(): Promise<void> {\n if (this.running) return\n this.running = true\n // Recover jobs stuck in 'processing' from a previous session (app restart / crash)\n await this.recoverStaleJobs()\n this.poll()\n }\n\n /** Reset any 'processing' jobs back to 'pending' — they were interrupted by a restart */\n private async recoverStaleJobs(): Promise<void> {\n const result = await this.db.query<{ id: string; job_type: string }>(\n `UPDATE job_queue SET status = 'pending', updated_at = now()\n WHERE status = 'processing'\n RETURNING id, job_type`,\n )\n if (result.rows.length > 0) {\n console.log(`[JobQueue] Recovered ${result.rows.length} stale jobs:`, result.rows.map(r => r.job_type))\n }\n // Also clean up any legacy 'embedding_generation' jobs renamed to 'embedding'\n await this.db.query(\n `UPDATE job_queue SET job_type = 'embedding' WHERE job_type = 'embedding_generation'`,\n )\n }\n\n stop(): void {\n this.running = false\n if (this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n }\n }\n\n /** Process one batch of pending jobs. Useful for testing without polling. */\n async processOnce(): Promise<number> {\n return this.processPendingJobs()\n }\n\n private poll(): void {\n if (!this.running) return\n this.processPendingJobs()\n .catch(() => {})\n .finally(() => {\n if (this.running) {\n this.timer = setTimeout(() => this.poll(), this.options.pollIntervalMs)\n }\n })\n }\n\n private async processPendingJobs(): Promise<number> {\n const result = await this.db.query<Job>(\n `SELECT * FROM job_queue\n WHERE status = 'pending'\n ORDER BY priority ASC, created_at ASC\n LIMIT 10`,\n )\n\n let processed = 0\n\n if (result.rows.length > 0) {\n console.log(`[JobQueue] Found ${result.rows.length} pending jobs:`, result.rows.map(j => `${j.job_type}(${j.status})`))\n }\n\n for (const job of result.rows) {\n const handler = this.handlers.get(job.job_type)\n if (!handler) {\n console.warn(`[JobQueue] No handler for job type '${job.job_type}' — skipping job ${job.id.slice(0, 8)}`)\n continue\n }\n\n // Capability gating: skip jobs whose required capability is not ready\n if (job.required_capability) {\n const capName = job.required_capability as CapabilityName\n if (!this.capabilityManager?.isReady(capName)) {\n await this.blockForCapability(job, capName)\n continue\n }\n }\n\n // Mark as processing\n await this.db.query(\n `UPDATE job_queue SET status = 'processing', error = NULL, updated_at = now() WHERE id = $1`,\n [job.id],\n )\n\n try {\n console.log(`[JobQueue] Running ${job.job_type} for note ${job.note_id.slice(0, 8)}...`)\n const jobResult = await handler(job, this.db)\n console.log(`[JobQueue] Completed ${job.job_type}:`, jobResult)\n\n await this.db.query(\n `UPDATE job_queue SET status = 'completed', error = NULL, result = $1, updated_at = now() WHERE id = $2`,\n [JSON.stringify(jobResult ?? null), job.id],\n )\n\n this.events?.emit('job.completed', {\n id: job.id,\n noteId: job.note_id,\n type: job.job_type,\n })\n\n processed++\n } catch (err) {\n console.error(`[JobQueue] Failed ${job.job_type}:`, err)\n const errorMessage = err instanceof Error ? err.message : String(err)\n const newRetryCount = job.retry_count + 1\n\n if (newRetryCount >= (job.max_retries || this.options.maxRetries)) {\n await this.db.query(\n `UPDATE job_queue SET status = 'failed', error = $1, retry_count = $2, updated_at = now() WHERE id = $3`,\n [errorMessage, newRetryCount, job.id],\n )\n\n this.events?.emit('job.failed', {\n id: job.id,\n noteId: job.note_id,\n type: job.job_type,\n error: errorMessage,\n })\n } else {\n await this.db.query(\n `UPDATE job_queue SET status = 'pending', error = $1, retry_count = $2, updated_at = now() WHERE id = $3`,\n [errorMessage, newRetryCount, job.id],\n )\n }\n }\n }\n\n return processed\n }\n\n private async blockForCapability(job: Job, capability: string): Promise<void> {\n const message = `requires capability '${capability}' — not ready`\n console.log(`[JobQueue] Deferring ${job.job_type} — ${message}`)\n\n await this.db.query(\n `UPDATE job_queue\n SET status = 'pending', error = $1, updated_at = now()\n WHERE id = $2 AND error IS DISTINCT FROM $1`,\n [message, job.id],\n )\n\n this.events?.emit('job.blocked', {\n id: job.id,\n noteId: job.note_id,\n type: job.job_type,\n capability,\n message,\n })\n\n this.events?.emit('capability.required', {\n name: capability,\n jobId: job.id,\n noteId: job.note_id,\n type: job.job_type,\n message,\n })\n }\n\n getBackoffDelay(retryCount: number): number {\n const delay = this.options.backoffBaseMs * Math.pow(2, retryCount)\n return Math.min(delay, this.options.backoffMaxMs)\n }\n}\n\n// ---- Built-in job handlers ----\n\n/** Title generation: LLM first, fallback to first-line extraction */\nexport function titleGenerationHandler(job: Job, db: DatabaseClient): Promise<unknown> {\n return (async () => {\n const result = await db.query<{ content: string }>(\n `SELECT content FROM note_revised_current WHERE note_id = $1`,\n [job.note_id],\n )\n if (result.rows.length === 0) throw new Error(`No content found for note ${job.note_id}`)\n\n const content = result.rows[0].content\n const llmFn = getLlmFunction()\n\n // Try LLM title generation first\n if (llmFn) {\n const prompt =\n `Generate a concise title (under 100 characters) for this note. ` +\n `Respond with ONLY the title text, no quotes, no explanation.\\n\\nNote content:\\n${content.slice(0, 1000)}`\n\n const llmTitle = (await llmFn(prompt, { maxTokens: 60, temperature: 0.3 })).trim()\n if (llmTitle) {\n const title = llmTitle.length > 200 ? llmTitle.slice(0, 197) + '...' : llmTitle\n await db.query(\n `UPDATE note_revised_current\n SET model = $1, ai_metadata = $2, generation_count = generation_count + 1, updated_at = now()\n WHERE note_id = $3`,\n ['llm', JSON.stringify({ source: 'title_generation' }), job.note_id],\n )\n await db.query(`UPDATE note SET title = $1, updated_at = now() WHERE id = $2`, [title, job.note_id])\n return { title, model: 'llm' }\n }\n }\n\n // Fallback: extract title from first line with markdown stripping\n let title = content.split('\\n')[0] ?? ''\n title = title\n .replace(/^#{1,6}\\s+/, '')\n .replace(/\\*\\*(.*?)\\*\\*/g, '$1')\n .replace(/\\*(.*?)\\*/g, '$1')\n .replace(/`(.*?)`/g, '$1')\n .replace(/\\[(.*?)\\]\\(.*?\\)/g, '$1')\n .trim()\n\n if (title.length > 200) title = title.slice(0, 197) + '...'\n if (!title) title = 'Untitled Note'\n\n await db.query(`UPDATE note SET title = $1, updated_at = now() WHERE id = $2`, [title, job.note_id])\n return { title }\n })()\n}\n\n/** AI revision: LLM enhances note content, creates a revision record */\nexport function aiRevisionHandler(job: Job, db: DatabaseClient): Promise<unknown> {\n return (async () => {\n const llmFn = getLlmFunction()\n if (!llmFn) return { skipped: true, reason: 'no LLM function registered' }\n\n const result = await db.query<{ content: string }>(\n `SELECT content FROM note_revised_current WHERE note_id = $1`,\n [job.note_id],\n )\n if (result.rows.length === 0) throw new Error(`No content found for note ${job.note_id}`)\n\n const content = result.rows[0].content\n\n const prompt =\n `You are a knowledge management assistant. Enhance the following note by:\\n` +\n `- Improving clarity and structure\\n` +\n `- Adding markdown formatting where appropriate\\n` +\n `- Preserving all original information\\n` +\n `- Keeping the same general length\\n\\n` +\n `Respond with ONLY the enhanced note content, no explanation.\\n\\n` +\n `Original note:\\n${content}`\n\n const revised = (await llmFn(prompt, { maxTokens: 2000, temperature: 0.4 })).trim()\n if (!revised || revised === content) return { skipped: true, reason: 'no changes from LLM' }\n\n // Get next revision number\n const revResult = await db.query<{ max_rev: number }>(\n `SELECT COALESCE(MAX(revision_number), 0) as max_rev FROM note_revision WHERE note_id = $1`,\n [job.note_id],\n )\n const nextRev = (revResult.rows[0]?.max_rev ?? 0) + 1\n\n // Insert revision record (type='ai_enhancement' per server convention)\n const revId = generateId()\n await db.query(\n `INSERT INTO note_revision (id, note_id, revision_number, type, content, ai_metadata, model, created_at)\n VALUES ($1, $2, $3, 'ai_enhancement', $4, $5, 'llm', now())`,\n [revId, job.note_id, nextRev, revised, JSON.stringify({ source: 'ai_revision', original_length: content.length, revised_length: revised.length })],\n )\n\n // Update note_revised_current\n await db.query(\n `UPDATE note_revised_current\n SET content = $1, model = 'llm', ai_metadata = $2, generation_count = generation_count + 1, is_user_edited = false, updated_at = now()\n WHERE note_id = $3`,\n [revised, JSON.stringify({ source: 'ai_revision', revision_id: revId }), job.note_id],\n )\n\n // Chain: enqueue concept_tagging after ai_revision completes\n await enqueueJob(db, { noteId: job.note_id, jobType: 'concept_tagging' })\n\n return { revision_number: nextRev, revision_id: revId, model: 'llm' }\n })()\n}\n\n/** Concept tagging: LLM extracts SKOS concepts from revised content */\nexport function conceptTaggingHandler(job: Job, db: DatabaseClient): Promise<unknown> {\n return (async () => {\n const llmFn = getLlmFunction()\n if (!llmFn) return { skipped: true, reason: 'no LLM function registered' }\n\n const result = await db.query<{ content: string }>(\n `SELECT content FROM note_revised_current WHERE note_id = $1`,\n [job.note_id],\n )\n if (result.rows.length === 0) throw new Error(`No content found for note ${job.note_id}`)\n\n const content = result.rows[0].content\n\n const prompt =\n `Task: Extract 3-5 topic tags from the text below.\\n` +\n `Rules:\\n` +\n `- Each tag is 1-3 words, lowercase\\n` +\n `- Tags should be broad topics, not individual words from the text\\n` +\n `- Return ONLY a comma-separated list, nothing else\\n` +\n `- Example output: machine learning, web development, database design\\n\\n` +\n `Text:\\n${content.slice(0, 1500)}\\n\\nTags:`\n\n const response = (await llmFn(prompt, { maxTokens: 60, temperature: 0.1 })).trim()\n\n // Parse and validate tags aggressively\n const tags = response\n .split(/[,\\n]/)\n .map((t) => t.trim().toLowerCase().replace(/^[-*\\d.]+\\s*/, '').replace(/['\"]/g, ''))\n .filter((t) => {\n if (t.length < 2 || t.length > 40) return false\n // Must be multi-character words, not single letters or numbers\n if (/^\\d+$/.test(t)) return false\n // Reject if it's just a common stop word\n const stops = new Set(['the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could', 'should', 'may', 'might', 'shall', 'can', 'and', 'or', 'but', 'if', 'then', 'else', 'when', 'at', 'by', 'for', 'with', 'about', 'between', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'once', 'here', 'there', 'all', 'each', 'every', 'both', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 'just', 'because', 'as', 'until', 'while', 'of', 'this', 'that', 'these', 'those', 'it', 'its'])\n if (stops.has(t)) return false\n // Reject single-word tags shorter than 3 chars\n if (!t.includes(' ') && t.length < 3) return false\n return true\n })\n .slice(0, 5)\n\n if (tags.length === 0) {\n return { skipped: true, reason: 'LLM returned no valid tags', raw: response.slice(0, 200) }\n }\n\n for (const tag of tags) {\n await db.query(\n `INSERT INTO note_tag (id, note_id, tag) VALUES ($1, $2, $3)\n ON CONFLICT (note_id, tag) DO NOTHING`,\n [generateId(), job.note_id, tag],\n )\n }\n\n return { tags, count: tags.length }\n })()\n}\n\n/** Linking: find semantically related notes using FTS + vector RRF */\nexport function linkingHandler(job: Job, db: DatabaseClient): Promise<unknown> {\n return (async () => {\n // Check if this note has embeddings\n const embResult = await db.query<{ id: string }>(\n `SELECT id FROM embedding WHERE note_id = $1 LIMIT 1`,\n [job.note_id],\n )\n if (embResult.rows.length === 0) {\n return { skipped: true, reason: 'no embeddings for this note yet' }\n }\n\n // Get this note's embedding vector\n const vecResult = await db.query<{ vector: string }>(\n `SELECT vector::text FROM embedding WHERE note_id = $1 LIMIT 1`,\n [job.note_id],\n )\n if (vecResult.rows.length === 0) return { skipped: true, reason: 'no vector found' }\n\n // Find similar notes by vector cosine distance (top 5, excluding self)\n const similar = await db.query<{ note_id: string; distance: number }>(\n `SELECT e.note_id, e.vector <=> (SELECT vector FROM embedding WHERE note_id = $1 LIMIT 1) as distance\n FROM embedding e\n WHERE e.note_id != $1\n ORDER BY distance ASC\n LIMIT 5`,\n [job.note_id],\n )\n\n let created = 0\n for (const row of similar.rows) {\n if (row.distance > 0.8) continue // too dissimilar\n\n // Insert link if not already exists\n const existing = await db.query(\n `SELECT id FROM link WHERE source_note_id = $1 AND target_note_id = $2 AND link_type = 'semantic'`,\n [job.note_id, row.note_id],\n )\n if (existing.rows.length === 0) {\n await db.query(\n `INSERT INTO link (id, source_note_id, target_note_id, link_type, confidence, created_at, updated_at)\n VALUES ($1, $2, $3, 'semantic', $4, now(), now())`,\n [generateId(), job.note_id, row.note_id, 1.0 - row.distance],\n )\n created++\n }\n }\n\n return { links_created: created, candidates: similar.rows.length }\n })()\n}\n","/**\n * TagsRepository — free-form tag management for notes.\n *\n * Responsibilities:\n * - Add and remove tags from notes\n * - Look up tags by note or notes by tag\n * - List all tags with usage counts\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\nexport class TagsRepository {\n constructor(\n private db: DatabaseClient,\n ) {}\n\n async addTag(noteId: string, tag: string): Promise<void> {\n await this.db.query(\n `INSERT INTO note_tag (id, note_id, tag) VALUES ($1, $2, $3) ON CONFLICT (note_id, tag) DO NOTHING`,\n [generateId(), noteId, tag],\n )\n }\n\n async removeTag(noteId: string, tag: string): Promise<void> {\n await this.db.query(\n `DELETE FROM note_tag WHERE note_id = $1 AND tag = $2`,\n [noteId, tag],\n )\n }\n\n async getTagsForNote(noteId: string): Promise<string[]> {\n const result = await this.db.query<{ tag: string }>(\n `SELECT tag FROM note_tag WHERE note_id = $1 ORDER BY tag`,\n [noteId],\n )\n return result.rows.map((r) => r.tag)\n }\n\n async getNotesForTag(tag: string): Promise<string[]> {\n const result = await this.db.query<{ note_id: string }>(\n `SELECT note_id FROM note_tag WHERE tag = $1`,\n [tag],\n )\n return result.rows.map((r) => r.note_id)\n }\n\n async listAllTags(): Promise<Array<{ tag: string; count: number }>> {\n const result = await this.db.query<{ tag: string; count: string }>(\n `SELECT tag, COUNT(*) as count FROM note_tag GROUP BY tag ORDER BY count DESC, tag ASC`,\n )\n return result.rows.map((r) => ({ tag: r.tag, count: parseInt(r.count, 10) }))\n }\n}\n","/**\n * CollectionsRepository — folder/category management for notes.\n *\n * Responsibilities:\n * - Create, read, update, and soft-delete collections\n * - Prevent circular parent references\n * - Assign and unassign notes from collections\n * - Return flat list and shallow tree views\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\n\nexport interface CollectionRow {\n id: string\n name: string\n description: string | null\n parent_id: string | null\n position: number\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n}\n\nexport interface CollectionCreateInput {\n name: string\n description?: string\n parent_id?: string\n}\n\nexport class CollectionsRepository {\n constructor(private db: DatabaseClient) {}\n\n async create(input: CollectionCreateInput): Promise<CollectionRow> {\n const id = generateId()\n await this.db.query(\n `INSERT INTO collection (id, name, description, parent_id)\n VALUES ($1, $2, $3, $4)`,\n [id, input.name, input.description ?? null, input.parent_id ?? null],\n )\n return this.get(id)\n }\n\n async get(id: string): Promise<CollectionRow> {\n const result = await this.db.query<CollectionRow>(\n `SELECT * FROM collection WHERE id = $1 AND deleted_at IS NULL`,\n [id],\n )\n if (result.rows.length === 0) throw new Error(`Collection not found: ${id}`)\n return result.rows[0]\n }\n\n async list(): Promise<CollectionRow[]> {\n const result = await this.db.query<CollectionRow>(\n `SELECT * FROM collection WHERE deleted_at IS NULL ORDER BY position, name`,\n )\n return result.rows\n }\n\n async listTree(): Promise<Array<CollectionRow & { children: CollectionRow[] }>> {\n const all = await this.list()\n const roots = all.filter((c) => c.parent_id === null)\n return roots.map((root) => ({\n ...root,\n children: all.filter((c) => c.parent_id === root.id),\n }))\n }\n\n async update(\n id: string,\n fields: Partial<Pick<CollectionRow, 'name' | 'description' | 'parent_id' | 'position'>>,\n ): Promise<CollectionRow> {\n // Circular reference check\n if (fields.parent_id !== undefined) {\n if (fields.parent_id === id) throw new Error('Collection cannot be its own parent')\n // Check for deeper cycles by walking parent chain\n if (fields.parent_id) {\n let current = fields.parent_id\n const visited = new Set<string>([id])\n while (current) {\n if (visited.has(current)) throw new Error('Circular reference detected')\n visited.add(current)\n const parent = await this.db.query<{ parent_id: string | null }>(\n `SELECT parent_id FROM collection WHERE id = $1`,\n [current],\n )\n current = parent.rows[0]?.parent_id ?? ''\n if (!current) break\n }\n }\n }\n\n const setClauses: string[] = ['updated_at = now()']\n const params: unknown[] = []\n let idx = 1\n if (fields.name !== undefined) {\n setClauses.push(`name = $${idx++}`)\n params.push(fields.name)\n }\n if (fields.description !== undefined) {\n setClauses.push(`description = $${idx++}`)\n params.push(fields.description)\n }\n if (fields.parent_id !== undefined) {\n setClauses.push(`parent_id = $${idx++}`)\n params.push(fields.parent_id)\n }\n if (fields.position !== undefined) {\n setClauses.push(`position = $${idx++}`)\n params.push(fields.position)\n }\n\n params.push(id)\n await this.db.query(\n `UPDATE collection SET ${setClauses.join(', ')} WHERE id = $${idx}`,\n params,\n )\n return this.get(id)\n }\n\n async delete(id: string): Promise<void> {\n await this.db.query(`UPDATE collection SET deleted_at = now() WHERE id = $1`, [id])\n // Unassign notes from the deleted collection\n await this.db.query(`DELETE FROM collection_note WHERE collection_id = $1`, [id])\n }\n\n async assignNote(collectionId: string, noteId: string): Promise<void> {\n await this.db.query(\n `INSERT INTO collection_note (collection_id, note_id) VALUES ($1, $2) ON CONFLICT DO NOTHING`,\n [collectionId, noteId],\n )\n }\n\n async unassignNote(collectionId: string, noteId: string): Promise<void> {\n await this.db.query(\n `DELETE FROM collection_note WHERE collection_id = $1 AND note_id = $2`,\n [collectionId, noteId],\n )\n }\n\n async getNotesInCollection(collectionId: string): Promise<string[]> {\n const result = await this.db.query<{ note_id: string }>(\n `SELECT note_id FROM collection_note WHERE collection_id = $1 ORDER BY position`,\n [collectionId],\n )\n return result.rows.map((r) => r.note_id)\n }\n}\n","/**\n * SkosRepository — SKOS taxonomy management (schemes, concepts, relations).\n *\n * Responsibilities:\n * - Create and soft-delete SKOS schemes (taxonomy containers)\n * - Create, list, and soft-delete SKOS concepts within schemes\n * - Create and query broader/narrower/related concept relations\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\n\nexport interface SkosScheme {\n id: string\n title: string\n description: string | null\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n}\n\nexport interface SkosConcept {\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[]\n definition: string | null\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n}\n\nexport interface SkosRelation {\n id: string\n source_concept_id: string\n target_concept_id: string\n relation_type: string\n created_at: Date\n}\n\nexport interface NoteSkosTag {\n id: string\n note_id: string\n concept_id: string\n created_at: Date\n}\n\nexport class SkosRepository {\n constructor(private db: DatabaseClient) {}\n\n // ── Schemes ──────────────────────────────────────────────────────────────\n\n async createScheme(title: string, description?: string): Promise<SkosScheme> {\n const id = generateId()\n await this.db.query(\n `INSERT INTO skos_scheme (id, title, description) VALUES ($1, $2, $3)`,\n [id, title, description ?? null],\n )\n const result = await this.db.query<SkosScheme>(`SELECT * FROM skos_scheme WHERE id = $1`, [id])\n return result.rows[0]\n }\n\n async listSchemes(): Promise<SkosScheme[]> {\n const result = await this.db.query<SkosScheme>(\n `SELECT * FROM skos_scheme WHERE deleted_at IS NULL ORDER BY title`,\n )\n return result.rows\n }\n\n async deleteScheme(id: string): Promise<void> {\n await this.db.query(`UPDATE skos_scheme SET deleted_at = now() WHERE id = $1`, [id])\n }\n\n // ── Concepts ─────────────────────────────────────────────────────────────\n\n async createConcept(\n schemeId: string,\n prefLabel: string,\n options?: { altLabels?: string[]; definition?: string },\n ): Promise<SkosConcept> {\n const id = generateId()\n await this.db.query(\n `INSERT INTO skos_concept (id, scheme_id, pref_label, alt_labels, definition) VALUES ($1, $2, $3, $4, $5)`,\n [\n id,\n schemeId,\n prefLabel,\n JSON.stringify(options?.altLabels ?? []),\n options?.definition ?? null,\n ],\n )\n const result = await this.db.query<SkosConcept>(\n `SELECT * FROM skos_concept WHERE id = $1`,\n [id],\n )\n return result.rows[0]\n }\n\n async listConcepts(schemeId: string): Promise<SkosConcept[]> {\n const result = await this.db.query<SkosConcept>(\n `SELECT * FROM skos_concept WHERE scheme_id = $1 AND deleted_at IS NULL ORDER BY pref_label`,\n [schemeId],\n )\n return result.rows\n }\n\n async deleteConcept(id: string): Promise<void> {\n await this.db.query(`UPDATE skos_concept SET deleted_at = now() WHERE id = $1`, [id])\n }\n\n // ── Relations ─────────────────────────────────────────────────────────────\n\n async createRelation(\n sourceConceptId: string,\n targetConceptId: string,\n relationType: 'broader' | 'narrower' | 'related',\n ): Promise<SkosRelation> {\n const id = generateId()\n await this.db.query(\n `INSERT INTO skos_concept_relation (id, source_concept_id, target_concept_id, relation_type) VALUES ($1, $2, $3, $4)`,\n [id, sourceConceptId, targetConceptId, relationType],\n )\n const result = await this.db.query<SkosRelation>(\n `SELECT * FROM skos_concept_relation WHERE id = $1`,\n [id],\n )\n return result.rows[0]\n }\n\n async getRelations(conceptId: string): Promise<SkosRelation[]> {\n const result = await this.db.query<SkosRelation>(\n `SELECT * FROM skos_concept_relation WHERE source_concept_id = $1 OR target_concept_id = $1`,\n [conceptId],\n )\n return result.rows\n }\n\n // ── Note tagging ───────────────────────────────────────────────────────────\n\n async tagNote(noteId: string, conceptId: string): Promise<NoteSkosTag> {\n const existing = await this.db.query<NoteSkosTag>(\n `SELECT * FROM note_skos_tag WHERE note_id = $1 AND concept_id = $2`,\n [noteId, conceptId],\n )\n if (existing.rows.length > 0) return existing.rows[0]\n\n const id = generateId()\n await this.db.query(\n `INSERT INTO note_skos_tag (id, note_id, concept_id) VALUES ($1, $2, $3)`,\n [id, noteId, conceptId],\n )\n const result = await this.db.query<NoteSkosTag>(`SELECT * FROM note_skos_tag WHERE id = $1`, [id])\n return result.rows[0]\n }\n\n async untagNote(noteId: string, conceptId: string): Promise<void> {\n await this.db.query(\n `DELETE FROM note_skos_tag WHERE note_id = $1 AND concept_id = $2`,\n [noteId, conceptId],\n )\n }\n\n async conceptsForNote(noteId: string): Promise<SkosConcept[]> {\n const result = await this.db.query<SkosConcept>(\n `SELECT c.*\n FROM skos_concept c\n INNER JOIN note_skos_tag nst ON nst.concept_id = c.id\n WHERE nst.note_id = $1 AND c.deleted_at IS NULL\n ORDER BY c.pref_label`,\n [noteId],\n )\n return result.rows\n }\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\n\nexport interface ProvenanceEdge {\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: Date\n ended_at: Date | null\n attributes: Record<string, unknown> | null\n}\n\nexport interface RecordProvenanceInput {\n activity: string\n agent: string\n startedAt?: Date | string\n endedAt?: Date | string | null\n attributes?: Record<string, unknown> | null\n}\n\nexport class ProvenanceRepository {\n constructor(private db: DatabaseClient) {}\n\n async recordProvenance(\n entityType: string,\n entityId: string,\n input: RecordProvenanceInput,\n ): Promise<ProvenanceEdge> {\n const id = generateId()\n await this.db.query(\n `INSERT INTO provenance_edge (id, entity_type, entity_id, activity, agent, started_at, ended_at, attributes)\n VALUES ($1, $2, $3, $4, $5, COALESCE($6, now()), $7, $8)`,\n [\n id,\n entityType,\n entityId,\n input.activity,\n input.agent,\n input.startedAt ?? null,\n input.endedAt ?? null,\n input.attributes === undefined ? null : JSON.stringify(input.attributes),\n ],\n )\n const result = await this.db.query<ProvenanceEdge>(`SELECT * FROM provenance_edge WHERE id = $1`, [id])\n return result.rows[0]\n }\n\n async forEntity(entityType: string, entityId: string): Promise<ProvenanceEdge[]> {\n const result = await this.db.query<ProvenanceEdge>(\n `SELECT *\n FROM provenance_edge\n WHERE entity_type = $1 AND entity_id = $2\n ORDER BY started_at`,\n [entityType, entityId],\n )\n return result.rows\n }\n}\n","/**\n * captureKnowledge — tool function for creating notes.\n *\n * Supports three sub-actions:\n * create — create a single note from content\n * bulk_create — create multiple notes in sequence\n * from_template — interpolate a template string and create a note\n *\n * Input is Zod-validated at entry. All writes delegate to NotesRepository.\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport type { TypedEventBus } from '../event-bus.js'\nimport { NotesRepository } from '../repositories/notes-repository.js'\nimport { CaptureKnowledgeInputSchema } from './schemas.js'\nimport type { NoteFull } from '../repositories/types.js'\n\nexport interface CaptureKnowledgeResult {\n action: string\n notes: NoteFull[]\n}\n\nexport async function captureKnowledge(\n db: DatabaseClient,\n rawInput: unknown,\n events?: TypedEventBus,\n): Promise<CaptureKnowledgeResult> {\n const input = CaptureKnowledgeInputSchema.parse(rawInput)\n const repo = new NotesRepository(db, events)\n\n switch (input.action) {\n case 'create': {\n if (!input.content) throw new Error('content is required for create action')\n const note = await repo.create({\n content: input.content,\n title: input.title,\n format: input.format,\n source: input.source,\n visibility: input.visibility,\n tags: input.tags,\n archive_id: input.archive_id,\n })\n return { action: 'create', notes: [note] }\n }\n\n case 'bulk_create': {\n if (!input.notes?.length) throw new Error('notes array is required for bulk_create action')\n const results: NoteFull[] = []\n for (const noteInput of input.notes) {\n const note = await repo.create({\n content: noteInput.content,\n title: noteInput.title,\n format: noteInput.format,\n tags: noteInput.tags,\n })\n results.push(note)\n }\n return { action: 'bulk_create', notes: results }\n }\n\n case 'from_template': {\n if (!input.template) throw new Error('template is required for from_template action')\n let content = input.template\n if (input.variables) {\n for (const [key, value] of Object.entries(input.variables)) {\n content = content.replaceAll(`{{${key}}}`, value)\n }\n }\n const note = await repo.create({\n content,\n title: input.title,\n format: input.format,\n tags: input.tags,\n })\n return { action: 'from_template', notes: [note] }\n }\n }\n}\n","/**\n * searchTool — tool function wrapping SearchRepository.\n *\n * Only 'text' mode is currently supported. Semantic and hybrid modes throw a\n * descriptive error so callers can surface appropriate feedback.\n *\n * Input is Zod-validated at entry.\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { SearchRepository } from '../repositories/search-repository.js'\nimport { SearchInputSchema } from './schemas.js'\nimport type { SearchResponse } from '../repositories/types.js'\n\nexport async function searchTool(db: DatabaseClient, rawInput: unknown): Promise<SearchResponse> {\n const input = SearchInputSchema.parse(rawInput)\n\n if (input.mode !== 'text') {\n throw new Error(\n `Search mode '${input.mode}' is not available. Only 'text' mode is currently supported. semantic_available: false`,\n )\n }\n\n const repo = new SearchRepository(db)\n return repo.search(input.query, {\n limit: input.limit,\n offset: input.offset,\n tags: input.tags,\n collection_id: input.collection_id,\n date_from: input.date_from,\n date_to: input.date_to,\n is_starred: input.is_starred,\n is_archived: input.is_archived,\n format: input.format,\n source: input.source,\n visibility: input.visibility,\n include_facets: input.include_facets,\n })\n}\n","/**\n * FortemiToolManifest — registry of all Fortemi tool definitions.\n *\n * Defines the full set of tool schemas and provides BridgeCapability\n * projection for bridge registration. Each tool definition follows the\n * WHEN/WHAT/HOW/OUT description pattern so consumers understand call sites.\n *\n * The 10 tools defined here are the initial subset covering core Fortemi\n * operations. Additional tools will be added incrementally as repositories\n * are implemented.\n */\n\nimport { z, type ZodType } from 'zod'\nimport {\n CaptureKnowledgeInputSchema,\n ManageNoteInputSchema,\n SearchInputSchema,\n} from './schemas.js'\n\n// ---------------------------------------------------------------------------\n// Public interfaces\n// ---------------------------------------------------------------------------\n\nexport interface FortemiToolDefinition {\n id: string\n name: string\n description: string\n category: 'capture' | 'search' | 'manage' | 'organize' | 'process' | 'analyze' | 'system'\n inputSchema: ZodType\n tags: string[]\n sideEffects: boolean\n requiredCapability?: string\n}\n\nexport interface BridgeCapability {\n id: string\n name: string\n description: string\n inputSchema: Record<string, unknown> // JSON Schema 7\n tags: string[]\n sideEffects: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Zod → JSON Schema conversion (simplified)\n//\n// A full implementation would delegate to `zod-to-json-schema`. This version\n// handles the concrete shapes used by Fortemi tools and is sufficient for\n// BridgeCapability projection until the dependency is added.\n// ---------------------------------------------------------------------------\n\nfunction zodToJsonSchema(schema: ZodType): Record<string, unknown> {\n if (schema instanceof z.ZodObject) {\n const shape = schema.shape as Record<string, ZodType>\n const properties: Record<string, unknown> = {}\n const required: string[] = []\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = resolvePropertySchema(value)\n\n // Required = not Optional and not Default\n if (!(value instanceof z.ZodOptional) && !(value instanceof z.ZodDefault)) {\n required.push(key)\n }\n }\n\n return {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n }\n }\n\n return { type: 'object' }\n}\n\nfunction resolvePropertySchema(value: ZodType): Record<string, unknown> {\n if (value instanceof z.ZodString) return { type: 'string' }\n if (value instanceof z.ZodNumber) return { type: 'number' }\n if (value instanceof z.ZodBoolean) return { type: 'boolean' }\n if (value instanceof z.ZodEnum) return { type: 'string', enum: value.options }\n if (value instanceof z.ZodArray) return { type: 'array' }\n if (value instanceof z.ZodRecord) return { type: 'object' }\n if (value instanceof z.ZodOptional) return resolvePropertySchema(value.unwrap())\n if (value instanceof z.ZodDefault) return resolvePropertySchema(value._def.innerType)\n if (value instanceof z.ZodObject) return zodToJsonSchema(value)\n return {}\n}\n\n// ---------------------------------------------------------------------------\n// Tool definitions\n// ---------------------------------------------------------------------------\n\nconst TOOL_DEFINITIONS: FortemiToolDefinition[] = [\n {\n id: 'fortemi.capture_knowledge',\n name: 'Capture Knowledge',\n description:\n 'WHEN you have text, ideas, or information to save. WHAT creates one or more notes in Fortemi. HOW accepts content, optional title/tags, supports create/bulk_create/from_template. OUT returns the created note(s) with full metadata.',\n category: 'capture',\n inputSchema: CaptureKnowledgeInputSchema,\n tags: ['create', 'notes', 'capture'],\n sideEffects: true,\n },\n {\n id: 'fortemi.manage_note',\n name: 'Manage Note',\n description:\n 'WHEN you need to modify an existing note. WHAT updates, deletes, restores, archives, or stars a note. HOW accepts note_id and action (update/delete/restore/archive/star). OUT returns the updated note.',\n category: 'manage',\n inputSchema: ManageNoteInputSchema,\n tags: ['update', 'delete', 'notes'],\n sideEffects: true,\n },\n {\n id: 'fortemi.search',\n name: 'Search Notes',\n description:\n 'WHEN you need to find notes by content or metadata. WHAT performs full-text search across all notes. HOW accepts query string with optional tag/collection filters. OUT returns ranked results with highlighted snippets.',\n category: 'search',\n inputSchema: SearchInputSchema,\n tags: ['search', 'find', 'query'],\n sideEffects: false,\n },\n {\n id: 'fortemi.get_note',\n name: 'Get Note',\n description:\n 'WHEN you need the full content of a specific note. WHAT retrieves a single note by ID. HOW accepts note_id. OUT returns complete note with content, metadata, tags, and revision info.',\n category: 'manage',\n inputSchema: z.object({ note_id: z.string() }),\n tags: ['read', 'notes'],\n sideEffects: false,\n },\n {\n id: 'fortemi.list_notes',\n name: 'List Notes',\n description:\n 'WHEN you need to browse or filter notes. WHAT lists notes with pagination and filtering. HOW accepts optional filters (starred, archived, tags, collection). OUT returns paginated note summaries.',\n category: 'manage',\n inputSchema: z.object({\n limit: z.number().int().min(1).max(100).default(50),\n offset: z.number().int().min(0).default(0),\n sort: z.enum(['created_at', 'updated_at', 'title']).default('created_at'),\n order: z.enum(['asc', 'desc']).default('desc'),\n is_starred: z.boolean().optional(),\n is_archived: z.boolean().optional(),\n tags: z.array(z.string()).optional(),\n collection_id: z.string().optional(),\n }),\n tags: ['list', 'browse', 'notes'],\n sideEffects: false,\n },\n {\n id: 'fortemi.manage_tags',\n name: 'Manage Tags',\n description:\n 'WHEN you need to organize notes with tags. WHAT adds or removes tags from notes. HOW accepts note_id, action (add/remove), and tag string. OUT confirms the tag operation.',\n category: 'organize',\n inputSchema: z.object({\n action: z.enum(['add', 'remove', 'list']),\n note_id: z.string().optional(),\n tag: z.string().optional(),\n }),\n tags: ['tags', 'organize'],\n sideEffects: true,\n },\n {\n id: 'fortemi.manage_collections',\n name: 'Manage Collections',\n description:\n 'WHEN you need to organize notes into folders. WHAT creates, updates, or manages collections. HOW accepts collection operations (create/list/assign/delete). OUT returns collection data.',\n category: 'organize',\n inputSchema: z.object({\n action: z.enum(['create', 'list', 'assign', 'unassign', 'delete']),\n name: z.string().optional(),\n collection_id: z.string().optional(),\n note_id: z.string().optional(),\n }),\n tags: ['collections', 'folders', 'organize'],\n sideEffects: true,\n },\n {\n id: 'fortemi.manage_links',\n name: 'Manage Links',\n description:\n 'WHEN you need to connect related notes. WHAT creates bidirectional links between notes. HOW accepts source/target note IDs and link type. OUT returns the link data.',\n category: 'organize',\n inputSchema: z.object({\n action: z.enum(['create', 'list', 'delete']),\n source_note_id: z.string().optional(),\n target_note_id: z.string().optional(),\n link_id: z.string().optional(),\n link_type: z.string().default('related'),\n }),\n tags: ['links', 'connections'],\n sideEffects: true,\n },\n {\n id: 'fortemi.manage_archive',\n name: 'Manage Archive',\n description:\n 'WHEN you need to switch between or manage knowledge archives. WHAT creates, lists, switches, or deletes archives. HOW accepts archive name and operation. OUT returns archive info.',\n category: 'system',\n inputSchema: z.object({\n action: z.enum(['list', 'create', 'switch', 'delete']),\n name: z.string().optional(),\n }),\n tags: ['archive', 'system'],\n sideEffects: true,\n },\n {\n id: 'fortemi.manage_capabilities',\n name: 'Manage Capabilities',\n description:\n 'WHEN you need to enable optional features like vector search or LLM. WHAT enables, disables, or queries WASM capability modules. HOW accepts capability name and action. OUT returns capability status.',\n category: 'system',\n inputSchema: z.object({\n action: z.enum(['list', 'enable', 'disable', 'status']),\n capability: z.string().optional(),\n }),\n tags: ['capabilities', 'system', 'wasm'],\n sideEffects: true,\n },\n]\n\n// ---------------------------------------------------------------------------\n// FortemiToolManifest\n// ---------------------------------------------------------------------------\n\nexport class FortemiToolManifest {\n private tools: Map<string, FortemiToolDefinition>\n\n constructor() {\n this.tools = new Map()\n for (const tool of TOOL_DEFINITIONS) {\n this.tools.set(tool.id, tool)\n }\n }\n\n /** Look up a single tool by its fully-qualified id. */\n get(id: string): FortemiToolDefinition | undefined {\n return this.tools.get(id)\n }\n\n /** Return all registered tools as a snapshot array. */\n list(): FortemiToolDefinition[] {\n return [...this.tools.values()]\n }\n\n /** Return tools matching a custom predicate. */\n filter(predicate: (tool: FortemiToolDefinition) => boolean): FortemiToolDefinition[] {\n return this.list().filter(predicate)\n }\n\n /** Return tools belonging to a specific category. */\n byCategory(category: string): FortemiToolDefinition[] {\n return this.filter(t => t.category === category)\n }\n\n /**\n * Full-text search across tool name, description, and tags.\n * Case-insensitive.\n */\n search(query: string): FortemiToolDefinition[] {\n const q = query.toLowerCase()\n return this.filter(\n t =>\n t.name.toLowerCase().includes(q) ||\n t.description.toLowerCase().includes(q) ||\n t.tags.some(tag => tag.includes(q)),\n )\n }\n\n /** Project all tools as BridgeCapability entries for bridge registration. */\n toBridgeCapabilities(): BridgeCapability[] {\n return this.list().map(tool => ({\n id: tool.id,\n name: tool.name,\n description: tool.description,\n inputSchema: zodToJsonSchema(tool.inputSchema),\n tags: tool.tags,\n sideEffects: tool.sideEffects,\n }))\n }\n\n /** Return the count of tools in each category. */\n getCategoryCounts(): Record<string, number> {\n const counts: Record<string, number> = {}\n for (const tool of this.tools.values()) {\n counts[tool.category] = (counts[tool.category] ?? 0) + 1\n }\n return counts\n }\n}\n\n// Convenience singleton — use this in application code.\nexport const fortemiManifest = new FortemiToolManifest()\n","import type { DatabaseClient } from '../storage-backend.js'\nimport type { TypedEventBus } from '../event-bus.js'\nimport { z } from 'zod'\nimport { NotesRepository } from '../repositories/notes-repository.js'\nimport type { NoteFull } from '../repositories/types.js'\n\nexport const GetNoteInputSchema = z.object({ note_id: z.string() })\nexport type GetNoteInput = z.infer<typeof GetNoteInputSchema>\n\nexport async function getNote(db: DatabaseClient, rawInput: unknown, events?: TypedEventBus): Promise<NoteFull> {\n const input = GetNoteInputSchema.parse(rawInput)\n const repo = new NotesRepository(db, events)\n return repo.get(input.note_id)\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport type { TypedEventBus } from '../event-bus.js'\nimport { z } from 'zod'\nimport { NotesRepository } from '../repositories/notes-repository.js'\nimport type { NoteSummary, PaginatedResult } from '../repositories/types.js'\n\nexport const ListNotesInputSchema = z.object({\n limit: z.number().int().min(1).max(100).default(50),\n offset: z.number().int().min(0).default(0),\n sort: z.enum(['created_at', 'updated_at', 'title']).default('created_at'),\n order: z.enum(['asc', 'desc']).default('desc'),\n is_starred: z.boolean().optional(),\n is_archived: z.boolean().optional(),\n tags: z.array(z.string()).optional(),\n collection_id: z.string().optional(),\n include_deleted: z.boolean().optional(),\n})\nexport type ListNotesInput = z.infer<typeof ListNotesInputSchema>\n\nexport async function listNotes(db: DatabaseClient, rawInput: unknown, events?: TypedEventBus): Promise<PaginatedResult<NoteSummary>> {\n const input = ListNotesInputSchema.parse(rawInput)\n const repo = new NotesRepository(db, events)\n return repo.list(input)\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { z } from 'zod'\nimport { TagsRepository } from '../repositories/tags-repository.js'\n\nexport const ManageTagsInputSchema = z.object({\n action: z.enum(['add', 'remove', 'list_for_note', 'list_all']),\n note_id: z.string().optional(),\n tag: z.string().optional(),\n})\nexport type ManageTagsInput = z.infer<typeof ManageTagsInputSchema>\n\nexport interface ManageTagsResult {\n action: string\n tags?: string[]\n all_tags?: Array<{ tag: string; count: number }>\n}\n\nexport async function manageTags(db: DatabaseClient, rawInput: unknown): Promise<ManageTagsResult> {\n const input = ManageTagsInputSchema.parse(rawInput)\n const repo = new TagsRepository(db)\n\n switch (input.action) {\n case 'add': {\n if (!input.note_id || !input.tag) throw new Error('note_id and tag required for add')\n await repo.addTag(input.note_id, input.tag)\n const tags = await repo.getTagsForNote(input.note_id)\n return { action: 'add', tags }\n }\n case 'remove': {\n if (!input.note_id || !input.tag) throw new Error('note_id and tag required for remove')\n await repo.removeTag(input.note_id, input.tag)\n const tags = await repo.getTagsForNote(input.note_id)\n return { action: 'remove', tags }\n }\n case 'list_for_note': {\n if (!input.note_id) throw new Error('note_id required for list_for_note')\n const tags = await repo.getTagsForNote(input.note_id)\n return { action: 'list_for_note', tags }\n }\n case 'list_all': {\n const all_tags = await repo.listAllTags()\n return { action: 'list_all', all_tags }\n }\n }\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { z } from 'zod'\nimport { CollectionsRepository } from '../repositories/collections-repository.js'\nimport type { CollectionRow } from '../repositories/collections-repository.js'\n\nexport const ManageCollectionsInputSchema = z.object({\n action: z.enum(['create', 'list', 'list_tree', 'assign', 'unassign', 'delete']),\n name: z.string().optional(),\n description: z.string().optional(),\n parent_id: z.string().optional(),\n collection_id: z.string().optional(),\n note_id: z.string().optional(),\n})\nexport type ManageCollectionsInput = z.infer<typeof ManageCollectionsInputSchema>\n\nexport interface ManageCollectionsResult {\n action: string\n collection?: CollectionRow\n collections?: CollectionRow[]\n tree?: Array<CollectionRow & { children: CollectionRow[] }>\n collection_id?: string\n note_id?: string\n}\n\nexport async function manageCollections(db: DatabaseClient, rawInput: unknown): Promise<ManageCollectionsResult> {\n const input = ManageCollectionsInputSchema.parse(rawInput)\n const repo = new CollectionsRepository(db)\n\n switch (input.action) {\n case 'create': {\n if (!input.name) throw new Error('name required for create')\n const collection = await repo.create({ name: input.name, description: input.description, parent_id: input.parent_id })\n return { action: 'create', collection }\n }\n case 'list': {\n const collections = await repo.list()\n return { action: 'list', collections }\n }\n case 'list_tree': {\n const tree = await repo.listTree()\n return { action: 'list_tree', tree }\n }\n case 'assign': {\n if (!input.collection_id || !input.note_id) throw new Error('collection_id and note_id required')\n await repo.assignNote(input.collection_id, input.note_id)\n return { action: 'assign', collection_id: input.collection_id, note_id: input.note_id }\n }\n case 'unassign': {\n if (!input.collection_id || !input.note_id) throw new Error('collection_id and note_id required')\n await repo.unassignNote(input.collection_id, input.note_id)\n return { action: 'unassign', collection_id: input.collection_id, note_id: input.note_id }\n }\n case 'delete': {\n if (!input.collection_id) throw new Error('collection_id required for delete')\n await repo.delete(input.collection_id)\n return { action: 'delete', collection_id: input.collection_id }\n }\n }\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { z } from 'zod'\nimport { LinksRepository } from '../repositories/links-repository.js'\nimport type { LinkRow } from '../repositories/links-repository.js'\n\nexport const ManageLinksInputSchema = z.object({\n action: z.enum(['create', 'list', 'backlinks', 'delete']),\n source_note_id: z.string().optional(),\n target_note_id: z.string().optional(),\n link_id: z.string().optional(),\n link_type: z.string().default('related'),\n note_id: z.string().optional(),\n})\nexport type ManageLinksInput = z.infer<typeof ManageLinksInputSchema>\n\nexport interface ManageLinksResult {\n action: string\n link?: LinkRow\n outbound?: LinkRow[]\n inbound?: LinkRow[]\n backlinks?: string[]\n link_id?: string\n}\n\nexport async function manageLinks(db: DatabaseClient, rawInput: unknown): Promise<ManageLinksResult> {\n const input = ManageLinksInputSchema.parse(rawInput)\n const repo = new LinksRepository(db)\n\n switch (input.action) {\n case 'create': {\n if (!input.source_note_id || !input.target_note_id) throw new Error('source_note_id and target_note_id required')\n const link = await repo.create(input.source_note_id, input.target_note_id, input.link_type)\n return { action: 'create', link }\n }\n case 'list': {\n if (!input.note_id) throw new Error('note_id required for list')\n const { outbound, inbound } = await repo.listForNote(input.note_id)\n return { action: 'list', outbound, inbound }\n }\n case 'backlinks': {\n if (!input.note_id) throw new Error('note_id required for backlinks')\n const backlinks = await repo.getBacklinks(input.note_id)\n return { action: 'backlinks', backlinks }\n }\n case 'delete': {\n if (!input.link_id) throw new Error('link_id required for delete')\n await repo.delete(input.link_id)\n return { action: 'delete', link_id: input.link_id }\n }\n }\n}\n","import { z } from 'zod'\nimport { ArchiveManager } from '../archive-manager.js'\nimport type { ArchiveInfo } from '../archive-manager.js'\n\nexport const ManageArchiveInputSchema = z.object({\n action: z.enum(['list', 'create', 'switch', 'delete']),\n name: z.string().optional(),\n})\nexport type ManageArchiveInput = z.infer<typeof ManageArchiveInputSchema>\n\nexport interface ManageArchiveResult {\n action: string\n archives?: ArchiveInfo[]\n current?: string\n name?: string\n}\n\nexport async function manageArchive(archiveManager: ArchiveManager, rawInput: unknown): Promise<ManageArchiveResult> {\n const input = ManageArchiveInputSchema.parse(rawInput)\n\n switch (input.action) {\n case 'list': {\n const archives = archiveManager.listArchives()\n return { action: 'list', archives, current: archiveManager.getCurrentArchiveName() }\n }\n case 'create': {\n if (!input.name) throw new Error('name required for create')\n await archiveManager.open(input.name)\n return { action: 'create', name: input.name, current: archiveManager.getCurrentArchiveName() }\n }\n case 'switch': {\n if (!input.name) throw new Error('name required for switch')\n await archiveManager.switchTo(input.name)\n return { action: 'switch', name: input.name, current: archiveManager.getCurrentArchiveName() }\n }\n case 'delete': {\n if (!input.name) throw new Error('name required for delete')\n await archiveManager.delete(input.name)\n return { action: 'delete', name: input.name }\n }\n }\n}\n","import { z } from 'zod'\nimport { CapabilityManager } from '../capability-manager.js'\nimport type { CapabilityName, CapabilityState } from '../capability-manager.js'\n\nexport const ManageCapabilitiesInputSchema = z.object({\n action: z.enum(['list', 'enable', 'disable', 'status']),\n capability: z.string().optional(),\n})\nexport type ManageCapabilitiesInput = z.infer<typeof ManageCapabilitiesInputSchema>\n\nexport interface CapabilityInfo {\n name: CapabilityName\n state: CapabilityState\n error?: string\n}\n\nexport interface ManageCapabilitiesResult {\n action: string\n capabilities?: Array<{ name: CapabilityName; state: CapabilityState }>\n capability?: CapabilityInfo\n}\n\nexport async function manageCapabilities(capabilityManager: CapabilityManager, rawInput: unknown): Promise<ManageCapabilitiesResult> {\n const input = ManageCapabilitiesInputSchema.parse(rawInput)\n\n switch (input.action) {\n case 'list': {\n return { action: 'list', capabilities: capabilityManager.listAll() }\n }\n case 'enable': {\n if (!input.capability) throw new Error('capability required for enable')\n const name = input.capability as CapabilityName\n await capabilityManager.enable(name)\n return {\n action: 'enable',\n capability: {\n name,\n state: capabilityManager.getState(name),\n error: capabilityManager.getError(name),\n },\n }\n }\n case 'disable': {\n if (!input.capability) throw new Error('capability required for disable')\n const name = input.capability as CapabilityName\n capabilityManager.disable(name)\n return {\n action: 'disable',\n capability: {\n name,\n state: capabilityManager.getState(name),\n error: capabilityManager.getError(name),\n },\n }\n }\n case 'status': {\n if (!input.capability) throw new Error('capability required for status')\n const name = input.capability as CapabilityName\n return {\n action: 'status',\n capability: {\n name,\n state: capabilityManager.getState(name),\n error: capabilityManager.getError(name),\n },\n }\n }\n }\n}\n","/**\n * AttachmentsRepository — attach and retrieve binary files linked to notes.\n *\n * Responsibilities:\n * - Content-addressed blob deduplication via SHA-256 hash\n * - Store blob metadata in DatabaseClient (attachment_blob table)\n * - Store binary data in a BlobStore implementation\n * - Create/soft-delete attachment records linked to notes\n * - List active attachments for a note\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport type { BlobStore } from '../blob-store.js'\nimport { generateId } from '../uuid.js'\nimport { computeHash } from '../hash.js'\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface AttachmentRow {\n id: string\n note_id: string\n blob_id: string\n document_type_id: string | null\n filename: string\n display_name: string | null\n position: number\n created_at: Date\n deleted_at: Date | null\n}\n\nexport interface AttachmentBlobRow {\n id: string\n content_hash: string\n size_bytes: number\n storage_path: string | null\n created_at: Date\n}\n\nexport interface AttachInput {\n noteId: string\n data: Uint8Array\n filename: string\n mimeType?: string\n displayName?: string\n}\n\n// ── Repository ────────────────────────────────────────────────────────────────\n\nexport class AttachmentsRepository {\n constructor(\n private db: DatabaseClient,\n private blobStore: BlobStore,\n ) {}\n\n /**\n * Attach a binary file to a note.\n *\n * If a blob with the same SHA-256 content hash already exists, the existing\n * blob row is reused (deduplication). Otherwise a new blob row is inserted\n * and the raw bytes are written to the BlobStore.\n *\n * Returns the newly created AttachmentRow.\n */\n async attach(input: AttachInput): Promise<AttachmentRow> {\n const contentHash = computeHash(input.data)\n const sizeBytes = input.data.length\n\n // ── blob deduplication ──────────────────────────────────────────────────\n let blobId: string\n const existing = await this.db.query<{ id: string }>(\n `SELECT id FROM attachment_blob WHERE content_hash = $1`,\n [contentHash],\n )\n\n if (existing.rows.length > 0) {\n blobId = existing.rows[0].id\n } else {\n blobId = generateId()\n await this.blobStore.write(contentHash, input.data)\n await this.db.query(\n `INSERT INTO attachment_blob (id, content_hash, size_bytes) VALUES ($1, $2, $3)`,\n [blobId, contentHash, sizeBytes],\n )\n }\n\n // ── attachment record ───────────────────────────────────────────────────\n const attachmentId = generateId()\n await this.db.query(\n `INSERT INTO attachment (id, note_id, blob_id, filename, display_name)\n VALUES ($1, $2, $3, $4, $5)`,\n [attachmentId, input.noteId, blobId, input.filename, input.displayName ?? null],\n )\n\n return this.get(attachmentId)\n }\n\n /**\n * Fetch an attachment row by its ID.\n * Throws when no row exists.\n */\n async get(id: string): Promise<AttachmentRow> {\n const result = await this.db.query<AttachmentRow>(\n `SELECT * FROM attachment WHERE id = $1`,\n [id],\n )\n if (result.rows.length === 0) throw new Error(`Attachment not found: ${id}`)\n return result.rows[0]\n }\n\n /**\n * Retrieve the raw binary data for an attachment.\n * Returns null if the blob cannot be found in the BlobStore.\n */\n async getBlob(attachmentId: string): Promise<Uint8Array | null> {\n const att = await this.get(attachmentId)\n const blob = await this.db.query<{ content_hash: string }>(\n `SELECT content_hash FROM attachment_blob WHERE id = $1`,\n [att.blob_id],\n )\n if (blob.rows.length === 0) return null\n return this.blobStore.read(blob.rows[0].content_hash)\n }\n\n /**\n * List active (non-deleted) attachments for a note.\n * Ordered by position ascending, then created_at ascending.\n */\n async list(noteId: string): Promise<AttachmentRow[]> {\n const result = await this.db.query<AttachmentRow>(\n `SELECT * FROM attachment\n WHERE note_id = $1 AND deleted_at IS NULL\n ORDER BY position ASC, created_at ASC`,\n [noteId],\n )\n return result.rows\n }\n\n /**\n * Soft-delete an attachment by setting deleted_at to the current timestamp.\n * The underlying blob row and BlobStore data are not removed.\n */\n async delete(id: string): Promise<void> {\n await this.db.query(\n `UPDATE attachment SET deleted_at = now() WHERE id = $1`,\n [id],\n )\n }\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { z } from 'zod'\nimport { AttachmentsRepository } from '../repositories/attachments-repository.js'\nimport type { AttachmentRow } from '../repositories/attachments-repository.js'\nimport type { BlobStore } from '../blob-store.js'\n\nexport const ManageAttachmentsInputSchema = z.object({\n action: z.enum(['attach', 'list', 'get', 'get_blob', 'delete']),\n note_id: z.string().optional(),\n attachment_id: z.string().optional(),\n /** Base64-encoded file data for the 'attach' action */\n data_base64: z.string().optional(),\n filename: z.string().optional(),\n mime_type: z.string().optional(),\n display_name: z.string().optional(),\n})\nexport type ManageAttachmentsInput = z.infer<typeof ManageAttachmentsInputSchema>\n\nexport interface ManageAttachmentsResult {\n action: string\n attachment?: AttachmentRow\n attachments?: AttachmentRow[]\n attachment_id?: string\n /** Base64-encoded blob data for 'get_blob' action */\n data_base64?: string\n size_bytes?: number\n}\n\nexport async function manageAttachments(\n db: DatabaseClient,\n blobStore: BlobStore,\n rawInput: unknown,\n): Promise<ManageAttachmentsResult> {\n const input = ManageAttachmentsInputSchema.parse(rawInput)\n const repo = new AttachmentsRepository(db, blobStore)\n\n switch (input.action) {\n case 'attach': {\n if (!input.note_id) throw new Error('note_id required for attach')\n if (!input.data_base64) throw new Error('data_base64 required for attach')\n if (!input.filename) throw new Error('filename required for attach')\n\n // Decode base64 to Uint8Array\n const binaryStr = atob(input.data_base64)\n const data = new Uint8Array(binaryStr.length)\n for (let i = 0; i < binaryStr.length; i++) data[i] = binaryStr.charCodeAt(i)\n\n const attachment = await repo.attach({\n noteId: input.note_id,\n data,\n filename: input.filename,\n mimeType: input.mime_type,\n displayName: input.display_name,\n })\n return { action: 'attach', attachment, size_bytes: data.length }\n }\n case 'list': {\n if (!input.note_id) throw new Error('note_id required for list')\n const attachments = await repo.list(input.note_id)\n return { action: 'list', attachments }\n }\n case 'get': {\n if (!input.attachment_id) throw new Error('attachment_id required for get')\n const attachment = await repo.get(input.attachment_id)\n return { action: 'get', attachment }\n }\n case 'get_blob': {\n if (!input.attachment_id) throw new Error('attachment_id required for get_blob')\n const blob = await repo.getBlob(input.attachment_id)\n if (!blob) throw new Error(`Blob not found for attachment ${input.attachment_id}`)\n\n // Encode Uint8Array to base64 for JSON transport\n let binary = ''\n for (let i = 0; i < blob.length; i++) binary += String.fromCharCode(blob[i])\n const data_base64 = btoa(binary)\n\n return { action: 'get_blob', attachment_id: input.attachment_id, data_base64, size_bytes: blob.length }\n }\n case 'delete': {\n if (!input.attachment_id) throw new Error('attachment_id required for delete')\n await repo.delete(input.attachment_id)\n return { action: 'delete', attachment_id: input.attachment_id }\n }\n }\n}\n","/**\n * GPU capability detection for WebGPU-based LLM inference.\n * Used to select appropriate model tier based on available GPU memory.\n *\n * @implements #61 GPU capability detection\n */\n\nexport interface GpuCapabilities {\n webgpuAvailable: boolean\n vendor: string\n architecture: string\n maxBufferSizeBytes: number\n supportsF16: boolean\n}\n\nexport type VramTier = 'low' | 'medium' | 'high' | 'unknown'\n\ntype AdapterLike = {\n info?: Record<string, string>\n limits?: Record<string, number>\n features?: { has(f: string): boolean }\n}\ntype GpuApi = { requestAdapter(options?: Record<string, string>): Promise<AdapterLike | null> }\n\nconst NO_GPU: GpuCapabilities = { webgpuAvailable: false, vendor: 'none', architecture: 'unknown', maxBufferSizeBytes: 0, supportsF16: false }\n\nfunction capsFromAdapter(adapter: AdapterLike, archSuffix = ''): GpuCapabilities {\n const info = adapter.info ?? {}\n const limits = adapter.limits ?? {}\n const f16 = adapter.features?.has('shader-f16') ?? false\n return {\n webgpuAvailable: true,\n vendor: info.vendor ?? 'unknown',\n architecture: (info.architecture ?? 'unknown') + archSuffix,\n maxBufferSizeBytes: limits.maxBufferSize ?? 0,\n supportsF16: f16,\n }\n}\n\nexport async function detectGpuCapabilities(): Promise<GpuCapabilities> {\n if (typeof navigator === 'undefined' || !('gpu' in navigator)) return NO_GPU\n\n try {\n const gpu = (navigator as unknown as { gpu: GpuApi }).gpu\n const preferences: Array<Record<string, string>> = [\n { powerPreference: 'high-performance' },\n { powerPreference: 'low-power' },\n {},\n ]\n\n let swiftshaderAdapter: AdapterLike | null = null\n\n for (const pref of preferences) {\n const adapter = await gpu.requestAdapter(pref)\n if (!adapter) continue\n\n const arch = (adapter.info?.architecture ?? '').toLowerCase()\n const vendor = (adapter.info?.vendor ?? '').toLowerCase()\n\n if (arch === 'swiftshader' || vendor === 'google') {\n if (!swiftshaderAdapter) swiftshaderAdapter = adapter\n continue\n }\n\n return capsFromAdapter(adapter)\n }\n\n if (swiftshaderAdapter) return capsFromAdapter(swiftshaderAdapter, ' (software)')\n return { ...NO_GPU, vendor: 'unavailable' }\n } catch {\n return { ...NO_GPU, vendor: 'error', architecture: 'error' }\n }\n}\n\nexport function estimateVramTier(caps: GpuCapabilities): VramTier {\n if (!caps.webgpuAvailable) return 'unknown'\n const mb = caps.maxBufferSizeBytes / (1024 * 1024)\n if (mb <= 256) return 'low'\n if (mb <= 2048) return 'medium'\n return 'high'\n}\n\n/**\n * Select an LLM model based on VRAM tier and f16 shader support.\n * Uses f32 quantization when f16 shaders aren't available (e.g., SwiftShader).\n */\nexport function selectLlmModel(tier: VramTier, supportsF16 = false): string {\n const q = supportsF16 ? 'q4f16_1' : 'q4f32_1'\n switch (tier) {\n case 'high':\n return `Hermes-3-Llama-3.2-3B-${q}-MLC`\n case 'medium':\n return `Qwen3-1.7B-${q}-MLC`\n case 'low':\n case 'unknown':\n return `Qwen3-0.6B-${q}-MLC`\n }\n}\n","/**\n * Enhanced inference capability detection.\n * Extends gpu-detect.ts with VRAM estimation, model fit, Chrome AI, and WebNN detection.\n *\n * @implements #115 hardware capability detection improvements\n */\n\nimport { detectGpuCapabilities, estimateVramTier, type GpuCapabilities, type VramTier } from './gpu-detect.js'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type RecommendedTier = 'high' | 'medium' | 'low' | 'cpu-only'\n\nexport interface InferenceCapabilities {\n webgpu: boolean\n wasm: boolean\n webnn: boolean\n sharedArrayBuffer: boolean\n chromeAI: boolean\n estimatedVramMB: number\n recommendedTier: RecommendedTier\n gpu: GpuCapabilities\n vramTier: VramTier\n}\n\nexport interface ModelFitResult {\n fits: boolean\n estimatedVramMB: number\n availableVramMB: number\n recommendation: string\n}\n\n// ---------------------------------------------------------------------------\n// Known GPU VRAM heuristics\n// ---------------------------------------------------------------------------\n\ninterface GpuVramHeuristic {\n pattern: RegExp\n vramMB: number\n}\n\nconst GPU_VRAM_HEURISTICS: GpuVramHeuristic[] = [\n // Apple M-series (unified memory, ~70% available for GPU)\n { pattern: /apple.*m4\\s*pro/i, vramMB: 16384 },\n { pattern: /apple.*m4\\s*max/i, vramMB: 25600 },\n { pattern: /apple.*m4/i, vramMB: 11264 },\n { pattern: /apple.*m3\\s*pro/i, vramMB: 12800 },\n { pattern: /apple.*m3\\s*max/i, vramMB: 25600 },\n { pattern: /apple.*m3/i, vramMB: 5632 },\n { pattern: /apple.*m2\\s*pro/i, vramMB: 12800 },\n { pattern: /apple.*m2\\s*max/i, vramMB: 21504 },\n { pattern: /apple.*m2/i, vramMB: 5632 },\n { pattern: /apple.*m1\\s*pro/i, vramMB: 11264 },\n { pattern: /apple.*m1\\s*max/i, vramMB: 21504 },\n { pattern: /apple.*m1/i, vramMB: 5632 },\n\n // NVIDIA (discrete VRAM)\n { pattern: /rtx\\s*40[89]0/i, vramMB: 16384 },\n { pattern: /rtx\\s*4070/i, vramMB: 12288 },\n { pattern: /rtx\\s*4060/i, vramMB: 8192 },\n { pattern: /rtx\\s*30[89]0/i, vramMB: 10240 },\n { pattern: /rtx\\s*3070/i, vramMB: 8192 },\n { pattern: /rtx\\s*3060/i, vramMB: 12288 },\n\n // AMD (discrete VRAM)\n { pattern: /rx\\s*7900/i, vramMB: 20480 },\n { pattern: /rx\\s*7800/i, vramMB: 16384 },\n { pattern: /rx\\s*7600/i, vramMB: 8192 },\n\n // Intel Arc\n { pattern: /arc\\s*a770/i, vramMB: 16384 },\n { pattern: /arc\\s*a750/i, vramMB: 8192 },\n { pattern: /arc\\s*a580/i, vramMB: 8192 },\n]\n\n/**\n * Estimate VRAM in MB using known GPU heuristics.\n * Falls back to maxBufferSize-based estimation if no match.\n */\nexport function estimateVramMB(gpu: GpuCapabilities): number {\n if (!gpu.webgpuAvailable) return 0\n\n // Try to match against known GPU architectures\n const combinedInfo = `${gpu.vendor} ${gpu.architecture}`.toLowerCase()\n for (const h of GPU_VRAM_HEURISTICS) {\n if (h.pattern.test(combinedInfo)) {\n return h.vramMB\n }\n }\n\n // Fallback: use maxBufferSize as a rough proxy\n // Most GPUs report maxBufferSize as ~25-50% of total VRAM\n const bufferMB = gpu.maxBufferSizeBytes / (1024 * 1024)\n if (bufferMB > 0) {\n return Math.round(bufferMB * 2.5)\n }\n\n return 0\n}\n\n/**\n * Estimate whether a model will fit in available VRAM.\n */\nexport function estimateModelFit(\n modelSizeMB: number,\n availableVramMB: number,\n): ModelFitResult {\n // Models need ~20% overhead for KV cache and runtime\n const requiredMB = Math.round(modelSizeMB * 1.2)\n const fits = availableVramMB >= requiredMB\n\n let recommendation: string\n if (fits) {\n const headroom = availableVramMB - requiredMB\n if (headroom > modelSizeMB * 0.5) {\n recommendation = `This model requires ~${requiredMB}MB VRAM. Your GPU has ~${availableVramMB}MB — plenty of headroom.`\n } else {\n recommendation = `This model requires ~${requiredMB}MB VRAM. Your GPU has ~${availableVramMB}MB — tight but should work.`\n }\n } else {\n recommendation = `This model requires ~${requiredMB}MB VRAM but your GPU only has ~${availableVramMB}MB. Consider a smaller model or use a remote provider.`\n }\n\n return {\n fits,\n estimatedVramMB: requiredMB,\n availableVramMB,\n recommendation,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Chrome Built-in AI detection\n// ---------------------------------------------------------------------------\n\n/**\n * Detect Chrome Built-in AI (Gemini Nano) availability.\n * This API is experimental and behind flags in Chrome 127+.\n */\nasync function detectChromeAI(): Promise<boolean> {\n try {\n if (typeof globalThis === 'undefined') return false\n // Chrome exposes ai.languageModel on the window object\n const ai = (globalThis as Record<string, unknown>).ai as\n | { languageModel?: { capabilities?: () => Promise<{ available: string }> } }\n | undefined\n if (!ai?.languageModel?.capabilities) return false\n const caps = await ai.languageModel.capabilities()\n return caps.available === 'readily' || caps.available === 'after-download'\n } catch {\n return false\n }\n}\n\n// ---------------------------------------------------------------------------\n// WebNN detection\n// ---------------------------------------------------------------------------\n\nfunction detectWebNN(): boolean {\n try {\n return typeof globalThis !== 'undefined' && 'ml' in (globalThis.navigator ?? {})\n } catch {\n return false\n }\n}\n\n// ---------------------------------------------------------------------------\n// SharedArrayBuffer detection\n// ---------------------------------------------------------------------------\n\nfunction detectSharedArrayBuffer(): boolean {\n try {\n return typeof SharedArrayBuffer !== 'undefined'\n } catch {\n return false\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main detection function\n// ---------------------------------------------------------------------------\n\nfunction deriveRecommendedTier(vramMB: number, gpu: GpuCapabilities): RecommendedTier {\n if (!gpu.webgpuAvailable) return 'cpu-only'\n if (vramMB >= 8192) return 'high'\n if (vramMB >= 2048) return 'medium'\n if (vramMB > 0) return 'low'\n return 'cpu-only'\n}\n\n/**\n * Comprehensive inference capability detection.\n * Superset of detectGpuCapabilities() — adds VRAM estimation, WebNN, Chrome AI, etc.\n */\nexport async function detectInferenceCapabilities(): Promise<InferenceCapabilities> {\n const [gpu, chromeAI] = await Promise.all([\n detectGpuCapabilities(),\n detectChromeAI(),\n ])\n\n const vramTier = estimateVramTier(gpu)\n const vramMB = estimateVramMB(gpu)\n const webnn = detectWebNN()\n const sharedArrayBuffer = detectSharedArrayBuffer()\n\n return {\n webgpu: gpu.webgpuAvailable,\n wasm: true, // Always available in modern browsers\n webnn,\n sharedArrayBuffer,\n chromeAI,\n estimatedVramMB: vramMB,\n recommendedTier: deriveRecommendedTier(vramMB, gpu),\n gpu,\n vramTier,\n }\n}\n","/**\n * Text chunking utility for embedding generation.\n * Splits long text into overlapping chunks suitable for embedding models.\n *\n * @implements #63 embedding pipeline prerequisite\n */\n\n/** Split text into overlapping chunks for embedding. */\nexport function chunkText(text: string, maxChars = 800, overlap = 100): string[] {\n if (text.length <= maxChars) return [text]\n const chunks: string[] = []\n let start = 0\n while (start < text.length) {\n chunks.push(text.slice(start, start + maxChars))\n start += maxChars - overlap\n }\n return chunks\n}\n","/**\n * Embedding generation job handler.\n * Generates and stores vector embeddings for note content.\n * Embed function is injected via setEmbedFunction — no WASM loaded by default.\n *\n * @implements #63 embedding generation\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { EmbeddingSetsRepository } from '../repositories/embedding-sets-repository.js'\nimport { chunkText } from './chunking.js'\n\n/** Type for the embed function — injected by the semantic capability module */\nexport type EmbedFunction = (texts: string[]) => Promise<number[][]>\n\nlet embedFn: EmbedFunction | null = null\n\nexport function setEmbedFunction(fn: EmbedFunction | null): void {\n embedFn = fn\n}\n\nexport function getEmbedFunction(): EmbedFunction | null {\n return embedFn\n}\n\n/**\n * Average multiple embeddings into a single vector.\n * Used to collapse chunk embeddings into one representative vector per note.\n */\nfunction averageEmbeddings(embeddings: number[][]): number[] {\n if (embeddings.length === 1) return embeddings[0]\n const dims = embeddings[0].length\n const avg = new Array<number>(dims).fill(0)\n for (const emb of embeddings) {\n for (let i = 0; i < dims; i++) {\n avg[i] += emb[i]\n }\n }\n for (let i = 0; i < dims; i++) {\n avg[i] /= embeddings.length\n }\n // Normalize\n const norm = Math.sqrt(avg.reduce((s, v) => s + v * v, 0))\n return norm > 0 ? avg.map(v => v / norm) : avg\n}\n\n/** Job handler for embedding generation. Registered in JobQueueWorker. */\nexport async function embeddingGenerationHandler(\n job: { note_id: string },\n db: DatabaseClient,\n): Promise<unknown> {\n const fn = embedFn\n if (!fn) return { skipped: true, reason: 'no embed function registered' }\n\n // Get note content\n const noteResult = await db.query<{ content: string }>(\n `SELECT content FROM note_revised_current WHERE note_id = $1`,\n [job.note_id],\n )\n if (noteResult.rows.length === 0) throw new Error(`No content for note ${job.note_id}`)\n\n const content = noteResult.rows[0].content\n const chunks = chunkText(content)\n\n // Generate embeddings for all chunks\n const embeddings = await fn(chunks)\n\n // Average all chunk embeddings into one vector for storage\n const vector = averageEmbeddings(embeddings)\n\n const embeddingSets = new EmbeddingSetsRepository(db)\n const set = await embeddingSets.ensureDefault()\n await embeddingSets.putEmbedding({\n note_id: job.note_id,\n embedding_set_id: set.id,\n vector,\n })\n\n return { chunks: chunks.length, embeddings: embeddings.length, setId: set.id }\n}\n","/**\n * Auto-tagging utility using embedding similarity.\n * Suggests tags based on cosine similarity between note and tag vocabulary embeddings.\n *\n * @implements #67 auto-tagging\n */\n\n/** Cosine similarity between two normalized vectors (dot product) */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n let sum = 0\n for (let i = 0; i < a.length; i++) sum += a[i] * b[i]\n return sum\n}\n\n/**\n * Suggest tags based on embedding similarity to tag vocabulary centroids.\n * Returns tags sorted by descending similarity score, filtered by threshold.\n */\nexport function suggestTags(\n noteEmbedding: number[],\n tagEmbeddings: Map<string, number[]>,\n threshold = 0.6,\n maxTags = 5,\n): string[] {\n return Array.from(tagEmbeddings.entries())\n .map(([tag, emb]) => ({ tag, score: cosineSimilarity(noteEmbedding, emb) }))\n .filter(({ score }) => score > threshold)\n .sort((a, b) => b.score - a.score)\n .slice(0, maxTags)\n .map(({ tag }) => tag)\n}\n","/**\n * Off-main-thread query-embedding transport for the semantic capability.\n *\n * The semantic capability consumes a single `EmbedFunction`\n * (`(texts: string[]) => Promise<number[][]>`). With `executionMode=\"worker\"`\n * (#146) the PGlite DB + HNSW query run off the main thread, but a\n * main-thread `EmbedFunction` closure still blocks the UI: model load janks\n * first paint of search, and every per-query embed blocks input.\n *\n * This module lets the host run the embed function inside a Worker (or behind\n * a MessagePort) so semantic search is off-thread end-to-end. Core posts\n * `{ texts }` to the port and awaits `number[][]`; the host owns the worker,\n * the model, and the model params (so build-time corpus embeddings stay an\n * exact match: `Xenova/all-MiniLM-L6-v2`, fp32, `{ pooling:'mean', normalize:true }`,\n * 384-d).\n *\n * Two halves:\n * - {@link createWorkerEmbedFunction} — main-thread side. Wraps a transport\n * into an `EmbedFunction` that round-trips each request to the worker.\n * - {@link handleEmbedRequests} — worker side. Wires a host-owned\n * `(texts) => Promise<number[][]>` to the message protocol.\n *\n * The existing main-thread `registerSemanticCapability(manager, embedFn)` path\n * is unchanged. This transport is additive and opt-in.\n *\n * @implements #180 off-main-thread / pluggable query-embedding transport\n */\n\nimport type { EmbedFunction } from './embedding-handler.js'\n\n/**\n * Minimal transport contract satisfied by both `Worker` and `MessagePort`.\n * Core only needs to post messages and listen for replies.\n */\nexport interface EmbedTransportPort {\n postMessage(message: unknown): void\n addEventListener(type: 'message', listener: (event: { data: unknown }) => void): void\n removeEventListener(type: 'message', listener: (event: { data: unknown }) => void): void\n /** MessagePort requires start() when using addEventListener; Worker does not. */\n start?(): void\n}\n\n/** Message discriminators for the embed protocol. */\nexport const EMBED_REQUEST_KIND = 'fortemi:embed:request' as const\nexport const EMBED_RESPONSE_KIND = 'fortemi:embed:response' as const\n\n/** Request posted by core (main thread) to the worker. */\nexport interface EmbedRequestMessage {\n kind: typeof EMBED_REQUEST_KIND\n id: number\n texts: string[]\n}\n\n/** Reply posted by the worker back to core. Exactly one of `vectors`/`error`. */\nexport interface EmbedResponseMessage {\n kind: typeof EMBED_RESPONSE_KIND\n id: number\n vectors?: number[][]\n error?: string\n}\n\n/** Options for the main-thread worker embed function. */\nexport interface EmbedWorkerOptions {\n /**\n * Per-request timeout in milliseconds. A request that receives no reply\n * within this window rejects with a timeout error. Set to `0` to disable.\n * Default: 30000 (30s).\n */\n timeoutMs?: number\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000\n\nfunction isEmbedResponse(data: unknown): data is EmbedResponseMessage {\n return (\n typeof data === 'object' &&\n data !== null &&\n (data as { kind?: unknown }).kind === EMBED_RESPONSE_KIND &&\n typeof (data as { id?: unknown }).id === 'number'\n )\n}\n\nfunction isEmbedRequest(data: unknown): data is EmbedRequestMessage {\n return (\n typeof data === 'object' &&\n data !== null &&\n (data as { kind?: unknown }).kind === EMBED_REQUEST_KIND &&\n typeof (data as { id?: unknown }).id === 'number' &&\n Array.isArray((data as { texts?: unknown }).texts)\n )\n}\n\ninterface PendingRequest {\n resolve: (vectors: number[][]) => void\n reject: (err: Error) => void\n timer: ReturnType<typeof setTimeout> | null\n}\n\n/**\n * Wrap a Worker/MessagePort transport into an `EmbedFunction` (main-thread side).\n *\n * Each `embed(texts)` call posts an {@link EmbedRequestMessage} with a unique id\n * and resolves when the matching {@link EmbedResponseMessage} arrives. The\n * message listener is attached immediately and removed by `dispose()`.\n *\n * @param port - A `Worker`, `MessagePort`, or any {@link EmbedTransportPort}.\n * @param options - Optional timeout configuration.\n * @returns The `embed` function and a `dispose` cleanup (removes the listener\n * and rejects any in-flight requests).\n *\n * @example\n * ```ts\n * const worker = new Worker(new URL('./queryEmbed.worker.ts', import.meta.url), { type: 'module' })\n * const { embed, dispose } = createWorkerEmbedFunction(worker)\n * setEmbedFunction(embed) // query + job embedding now run off-thread\n * // later: dispose(); worker.terminate()\n * ```\n */\nexport function createWorkerEmbedFunction(\n port: EmbedTransportPort,\n options?: EmbedWorkerOptions,\n): { embed: EmbedFunction; dispose: () => void } {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const pending = new Map<number, PendingRequest>()\n let nextId = 1\n let disposed = false\n\n const onMessage = (event: { data: unknown }): void => {\n const data = event.data\n if (!isEmbedResponse(data)) return\n const entry = pending.get(data.id)\n if (!entry) return\n pending.delete(data.id)\n if (entry.timer !== null) clearTimeout(entry.timer)\n if (data.error !== undefined) {\n entry.reject(new Error(data.error))\n } else if (Array.isArray(data.vectors)) {\n entry.resolve(data.vectors)\n } else {\n entry.reject(new Error('Embed worker returned a malformed response (no vectors, no error)'))\n }\n }\n\n port.addEventListener('message', onMessage)\n // MessagePort needs an explicit start() when using addEventListener.\n port.start?.()\n\n const embed: EmbedFunction = (texts: string[]): Promise<number[][]> => {\n if (disposed) {\n return Promise.reject(new Error('Embed worker transport has been disposed'))\n }\n return new Promise<number[][]>((resolve, reject) => {\n const id = nextId++\n let timer: ReturnType<typeof setTimeout> | null = null\n if (timeoutMs > 0) {\n timer = setTimeout(() => {\n if (pending.delete(id)) {\n reject(new Error(`Embed worker request timed out after ${timeoutMs}ms`))\n }\n }, timeoutMs)\n }\n pending.set(id, { resolve, reject, timer })\n try {\n const message: EmbedRequestMessage = { kind: EMBED_REQUEST_KIND, id, texts }\n port.postMessage(message)\n } catch (err) {\n pending.delete(id)\n if (timer !== null) clearTimeout(timer)\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n })\n }\n\n const dispose = (): void => {\n if (disposed) return\n disposed = true\n port.removeEventListener('message', onMessage)\n for (const [, entry] of pending) {\n if (entry.timer !== null) clearTimeout(entry.timer)\n entry.reject(new Error('Embed worker transport has been disposed'))\n }\n pending.clear()\n }\n\n return { embed, dispose }\n}\n\n/**\n * Wire a host-owned embed function to the message protocol (worker side).\n *\n * Call this inside the worker (or behind a MessagePort) with the function that\n * loads the model and runs inference. It answers each {@link EmbedRequestMessage}\n * with an {@link EmbedResponseMessage}.\n *\n * @param port - The worker scope (`self`) or a `MessagePort`.\n * @param embed - The host embed function `(texts) => Promise<number[][]>`.\n * @returns A disposer that removes the listener.\n *\n * @example\n * ```ts\n * // queryEmbed.worker.ts\n * import { handleEmbedRequests } from '@fortemi/core'\n * import { pipeline } from '@huggingface/transformers'\n *\n * const extractor = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2')\n * handleEmbedRequests(self as unknown as EmbedTransportPort, async (texts) => {\n * const out = await Promise.all(\n * texts.map(async (t) => {\n * const r = await extractor(t, { pooling: 'mean', normalize: true })\n * return Array.from(r.data as Float32Array)\n * }),\n * )\n * return out\n * })\n * ```\n */\nexport function handleEmbedRequests(\n port: EmbedTransportPort,\n embed: EmbedFunction,\n): () => void {\n const onMessage = (event: { data: unknown }): void => {\n const data = event.data\n if (!isEmbedRequest(data)) return\n const { id, texts } = data\n void Promise.resolve()\n .then(() => embed(texts))\n .then((vectors) => {\n const reply: EmbedResponseMessage = { kind: EMBED_RESPONSE_KIND, id, vectors }\n port.postMessage(reply)\n })\n .catch((err: unknown) => {\n const reply: EmbedResponseMessage = {\n kind: EMBED_RESPONSE_KIND,\n id,\n error: err instanceof Error ? err.message : String(err),\n }\n port.postMessage(reply)\n })\n }\n\n port.addEventListener('message', onMessage)\n port.start?.()\n\n return () => {\n port.removeEventListener('message', onMessage)\n }\n}\n","/**\n * Semantic capability loader — registers the embedding pipeline with CapabilityManager.\n *\n * In production (browser), this loads @huggingface/transformers in a Web Worker.\n * In tests, call registerSemanticCapability() with a mock embed function.\n *\n * Two registration paths, both additive:\n * - registerSemanticCapability(manager, embedFn) — main-thread embed closure.\n * - registerSemanticCapabilityWorker(manager, port) — off-main-thread embed\n * transport (#180), so semantic search runs off-thread end-to-end.\n *\n * @implements #62 semantic capability loader\n * @implements #180 off-main-thread / pluggable query-embedding transport\n */\n\nimport type { CapabilityManager } from '../capability-manager.js'\nimport { setEmbedFunction, type EmbedFunction } from './embedding-handler.js'\nimport {\n createWorkerEmbedFunction,\n type EmbedTransportPort,\n type EmbedWorkerOptions,\n} from './embed-worker-transport.js'\n\n/**\n * Cleanup for the currently-wired transport, if any. The worker path installs a\n * disposer (removes the message listener); the main-thread path leaves it null.\n * Tracked at module scope so unregisterSemanticCapability() can tear it down.\n */\nlet activeTransportDispose: (() => void) | null = null\n\nfunction clearActiveTransport(): void {\n if (activeTransportDispose) {\n activeTransportDispose()\n activeTransportDispose = null\n }\n}\n\n/**\n * Register the semantic capability with a CapabilityManager.\n * The loader will be called when capabilityManager.enable('semantic') is invoked.\n *\n * @param manager - The CapabilityManager instance\n * @param embedFn - The embedding function (from transformers.js worker or mock)\n * @param onProgress - Optional progress callback for model download\n */\nexport function registerSemanticCapability(\n manager: CapabilityManager,\n embedFn: EmbedFunction,\n onProgress?: (pct: number) => void,\n): void {\n manager.registerLoader('semantic', async () => {\n if (onProgress) onProgress(0)\n // Switching registration paths: drop any previously-wired transport.\n clearActiveTransport()\n // In real implementation: load transformers.js model here\n // For now, just wire the embed function\n setEmbedFunction(embedFn)\n if (onProgress) onProgress(100)\n })\n}\n\n/**\n * Register the semantic capability backed by an off-main-thread transport (#180).\n *\n * The embed function round-trips each request to a host-owned Worker/MessagePort,\n * so model load and per-query inference never touch the main thread. The host\n * owns the worker and the model params (build-time corpus match stays exact).\n *\n * The loader runs when `capabilityManager.enable('semantic')` is invoked; the\n * message listener is attached then and removed on\n * {@link unregisterSemanticCapability} (i.e. on `disable`).\n *\n * @param manager - The CapabilityManager instance.\n * @param port - A `Worker`, `MessagePort`, or any {@link EmbedTransportPort}.\n * @param options - Optional transport options (e.g. per-request timeout).\n *\n * @example\n * ```ts\n * const worker = new Worker(new URL('./queryEmbed.worker.ts', import.meta.url), { type: 'module' })\n * registerSemanticCapabilityWorker(capabilityManager, worker)\n * await capabilityManager.enable('semantic') // off-thread end-to-end\n * ```\n */\nexport function registerSemanticCapabilityWorker(\n manager: CapabilityManager,\n port: EmbedTransportPort,\n options?: EmbedWorkerOptions,\n): void {\n manager.registerLoader('semantic', async () => {\n // Re-enabling: tear down a prior transport before wiring a fresh one.\n clearActiveTransport()\n const { embed, dispose } = createWorkerEmbedFunction(port, options)\n activeTransportDispose = dispose\n setEmbedFunction(embed)\n })\n}\n\n/**\n * Unregister the semantic capability — clears the embed function and tears down\n * any active off-main-thread transport. Called when the capability is disabled.\n */\nexport function unregisterSemanticCapability(): void {\n setEmbedFunction(null)\n clearActiveTransport()\n}\n","/**\n * LLM capability loader — registers the local LLM with CapabilityManager.\n *\n * In production (browser), this loads @mlc-ai/web-llm in a Web Worker.\n * In tests, call registerLlmCapability() with a mock completion function.\n *\n * @implements #65 LLM capability loader\n */\n\nimport type { CapabilityManager } from '../capability-manager.js'\nimport { setLlmFunction, type LlmCompleteFn } from './llm-handler.js'\nimport { detectGpuCapabilities, estimateVramTier, selectLlmModel } from './gpu-detect.js'\n\nexport interface LlmCapabilityOptions {\n modelOverride?: string // Force specific model (bypass VRAM detection)\n onProgress?: (pct: number, text: string) => void\n}\n\n/**\n * Register the LLM capability with a CapabilityManager.\n * The loader checks WebGPU availability before loading.\n *\n * @param manager - The CapabilityManager instance\n * @param completeFn - The LLM completion function (from WebLLM worker or mock)\n * @param options - Optional model override and progress callback\n */\nexport function registerLlmCapability(\n manager: CapabilityManager,\n completeFn: LlmCompleteFn,\n options: LlmCapabilityOptions = {},\n): void {\n manager.registerLoader('llm', async () => {\n // Check GPU capabilities\n const gpuCaps = await detectGpuCapabilities()\n if (!gpuCaps.webgpuAvailable) {\n throw new Error(\n 'WebGPU is not available. Local LLM requires WebGPU support (Chrome 113+ or Firefox 141+).',\n )\n }\n\n const tier = estimateVramTier(gpuCaps)\n const model = options.modelOverride ?? selectLlmModel(tier)\n\n if (options.onProgress) {\n options.onProgress(0, `Loading ${model}...`)\n }\n\n // In real implementation: load WebLLM model here\n // For now, just wire the completion function\n setLlmFunction(completeFn)\n\n if (options.onProgress) {\n options.onProgress(100, `${model} ready`)\n }\n })\n}\n\n/**\n * Unregister the LLM capability — clears the completion function.\n */\nexport function unregisterLlmCapability(): void {\n setLlmFunction(null)\n}\n","/**\n * ProviderRegistry — manages InferenceProvider instances.\n * Supports add/remove/getActive/setActive and derives CapabilityManager state.\n *\n * @implements #112 provider registry\n */\n\nimport type { TypedEventBus } from '../event-bus.js'\nimport type {\n InferenceProvider,\n EmbedRequest,\n EmbedResponse,\n CompletionRequest,\n CompletionResponse,\n StreamChunk,\n} from './inference-provider.js'\nimport type { EmbedFunction } from './embedding-handler.js'\nimport type { LlmCompleteFn } from './llm-handler.js'\nimport { setEmbedFunction } from './embedding-handler.js'\nimport { setLlmFunction } from './llm-handler.js'\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nexport class ProviderRegistry {\n private providers = new Map<string, InferenceProvider>()\n private activeId: string | null = null\n\n constructor(private events?: TypedEventBus) {}\n\n /** Register a provider. First provider with embedding capability becomes active. */\n add(provider: InferenceProvider): void {\n if (this.providers.has(provider.id)) {\n throw new Error(`Provider '${provider.id}' already registered`)\n }\n this.providers.set(provider.id, provider)\n this.events?.emit('provider.added', { id: provider.id, name: provider.name })\n\n // Auto-activate first provider\n if (!this.activeId) {\n this.setActive(provider.id)\n }\n }\n\n /** Remove a provider by ID. If it was active, clears active. */\n remove(id: string): void {\n const provider = this.providers.get(id)\n if (!provider) return\n\n provider.dispose()\n this.providers.delete(id)\n\n if (this.activeId === id) {\n this.activeId = null\n this.syncLegacyFunctions()\n\n // Auto-activate next available provider\n const next = this.providers.values().next()\n if (!next.done) {\n this.setActive(next.value.id)\n }\n }\n\n this.events?.emit('provider.removed', { id })\n }\n\n /** Set the active provider by ID */\n setActive(id: string): void {\n const provider = this.providers.get(id)\n if (!provider) {\n throw new Error(`Provider '${id}' not found`)\n }\n this.activeId = id\n this.syncLegacyFunctions()\n this.events?.emit('provider.active', { id, name: provider.name })\n }\n\n /** Get the currently active provider */\n getActive(): InferenceProvider | null {\n if (!this.activeId) return null\n return this.providers.get(this.activeId) ?? null\n }\n\n /** Get a provider by ID */\n get(id: string): InferenceProvider | undefined {\n return this.providers.get(id)\n }\n\n /** List all registered providers */\n list(): InferenceProvider[] {\n return Array.from(this.providers.values())\n }\n\n /** Get provider count */\n get size(): number {\n return this.providers.size\n }\n\n /** Check if any provider supports embeddings */\n hasEmbeddings(): boolean {\n return this.list().some(p => p.capabilities.embeddings && p.embed)\n }\n\n /** Check if any provider supports chat */\n hasChat(): boolean {\n return this.list().some(p => p.capabilities.chat && p.complete)\n }\n\n /** Find first provider supporting a given capability */\n findByCapability(cap: keyof InferenceProvider['capabilities']): InferenceProvider | undefined {\n return this.list().find(p => p.capabilities[cap])\n }\n\n /** Convenience: embed using active provider */\n async embed(request: EmbedRequest): Promise<EmbedResponse> {\n const provider = this.getActive()\n if (!provider?.embed) {\n throw new Error('No active provider with embedding capability')\n }\n return provider.embed(request)\n }\n\n /** Convenience: complete using active provider */\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const provider = this.getActive()\n if (!provider?.complete) {\n throw new Error('No active provider with chat capability')\n }\n return provider.complete(request)\n }\n\n /** Convenience: stream using active provider */\n stream(request: CompletionRequest): AsyncIterable<StreamChunk> {\n const provider = this.getActive()\n if (!provider?.stream) {\n throw new Error('No active provider with streaming capability')\n }\n return provider.stream(request)\n }\n\n /** Dispose all providers */\n dispose(): void {\n for (const provider of this.providers.values()) {\n provider.dispose()\n }\n this.providers.clear()\n this.activeId = null\n this.syncLegacyFunctions()\n }\n\n // -------------------------------------------------------------------------\n // Legacy bridge — keeps setEmbedFunction/setLlmFunction in sync\n // -------------------------------------------------------------------------\n\n /**\n * Sync the legacy bare function slots with the active provider.\n * This maintains backward compatibility: job-queue-worker.ts and other\n * consumers that call getEmbedFunction() / getLlmFunction() still work.\n */\n private syncLegacyFunctions(): void {\n const active = this.getActive()\n\n if (active?.embed && active.capabilities.embeddings) {\n const embedBridge: EmbedFunction = (texts) =>\n active.embed!({ texts }).then(r => r.vectors)\n setEmbedFunction(embedBridge)\n } else {\n setEmbedFunction(null)\n }\n\n if (active?.complete && active.capabilities.chat) {\n const llmBridge: LlmCompleteFn = (prompt, options) =>\n active.complete!({\n prompt,\n maxTokens: options?.maxTokens,\n temperature: options?.temperature,\n }).then(r => r.text)\n setLlmFunction(llmBridge)\n } else {\n setLlmFunction(null)\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Legacy adapter — wraps bare functions as an InferenceProvider\n// ---------------------------------------------------------------------------\n\n/**\n * Create an InferenceProvider from legacy bare functions.\n * Used by setEmbedFunction/setLlmFunction backward compat layer.\n */\nexport function createLegacyProvider(options: {\n embedFn?: EmbedFunction | null\n llmFn?: LlmCompleteFn | null\n id?: string\n name?: string\n}): InferenceProvider {\n const { embedFn, llmFn, id = 'legacy', name = 'Legacy Provider' } = options\n\n return {\n id,\n name,\n tier: 'in-browser',\n capabilities: {\n embeddings: !!embedFn,\n chat: !!llmFn,\n streaming: false,\n vision: false,\n toolCalling: false,\n structuredOutput: false,\n },\n\n embed: embedFn\n ? async (request) => ({\n vectors: await embedFn(request.texts),\n model: 'legacy',\n })\n : undefined,\n\n complete: llmFn\n ? async (request) => ({\n text: await llmFn(request.prompt, {\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n }),\n model: 'legacy',\n })\n : undefined,\n\n async listModels() {\n const models = []\n if (embedFn) models.push({ id: 'legacy-embed', capabilities: { embeddings: true } })\n if (llmFn) models.push({ id: 'legacy-llm', capabilities: { chat: true } })\n return models\n },\n\n async probe() {\n return { status: 'ok' as const, latencyMs: 0, message: 'Legacy function injection' }\n },\n\n dispose() {\n // No-op for legacy functions\n },\n }\n}\n","/**\n * OpenAI-compatible inference provider.\n * Works with OpenAI, OpenRouter, Anthropic (via OpenRouter), Ollama, LM Studio,\n * llama.cpp, vLLM, Jan, and any OpenAI-compatible endpoint.\n *\n * No SDK dependencies — uses raw fetch() to keep @fortemi/core lightweight.\n *\n * @implements #113 remote provider support\n */\n\nimport type {\n InferenceProvider,\n ProviderCapabilities,\n ProviderTier,\n EmbedRequest,\n EmbedResponse,\n CompletionRequest,\n CompletionResponse,\n StreamChunk,\n ModelInfo,\n ProbeResult,\n} from './inference-provider.js'\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface OpenAIProviderConfig {\n id: string\n name: string\n baseURL: string\n apiKey?: string\n defaultModel?: string\n defaultEmbeddingModel?: string\n tier?: ProviderTier\n headers?: Record<string, string>\n timeoutMs?: number\n}\n\n// ---------------------------------------------------------------------------\n// OpenAI API response shapes (subset we need)\n// ---------------------------------------------------------------------------\n\ninterface OAIEmbeddingResponse {\n data: Array<{ embedding: number[]; index: number }>\n model: string\n usage?: { total_tokens: number }\n}\n\ninterface OAIChatResponse {\n choices: Array<{\n message: { content: string }\n finish_reason: string\n }>\n model: string\n usage?: { prompt_tokens: number; completion_tokens: number }\n}\n\ninterface OAIChatStreamChunk {\n choices: Array<{\n delta: { content?: string }\n finish_reason: string | null\n }>\n}\n\ninterface OAIModelsResponse {\n data: Array<{\n id: string\n owned_by?: string\n }>\n}\n\n// ---------------------------------------------------------------------------\n// Provider implementation\n// ---------------------------------------------------------------------------\n\nexport class OpenAICompatibleProvider implements InferenceProvider {\n readonly id: string\n readonly name: string\n readonly tier: ProviderTier\n readonly capabilities: ProviderCapabilities\n\n private baseURL: string\n private apiKey?: string\n private defaultModel: string\n private defaultEmbeddingModel: string\n private extraHeaders: Record<string, string>\n private timeoutMs: number\n private abortController: AbortController | null = null\n\n constructor(config: OpenAIProviderConfig) {\n this.id = config.id\n this.name = config.name\n this.baseURL = config.baseURL.replace(/\\/+$/, '') // strip trailing slashes\n this.apiKey = config.apiKey\n this.defaultModel = config.defaultModel ?? 'gpt-3.5-turbo'\n this.defaultEmbeddingModel = config.defaultEmbeddingModel ?? 'text-embedding-3-small'\n this.tier = config.tier ?? (this.isLocalURL() ? 'local-server' : 'remote')\n this.extraHeaders = config.headers ?? {}\n this.timeoutMs = config.timeoutMs ?? 30000\n\n this.capabilities = {\n embeddings: true,\n chat: true,\n streaming: true,\n vision: false,\n toolCalling: false,\n structuredOutput: false,\n }\n }\n\n // -------------------------------------------------------------------------\n // InferenceProvider interface\n // -------------------------------------------------------------------------\n\n async embed(request: EmbedRequest): Promise<EmbedResponse> {\n const model = request.model ?? this.defaultEmbeddingModel\n const body = {\n input: request.texts,\n model,\n }\n\n const response = await this.fetch('/embeddings', body)\n const data = response as OAIEmbeddingResponse\n\n // Sort by index to ensure correct order\n const sorted = [...data.data].sort((a, b) => a.index - b.index)\n\n return {\n vectors: sorted.map(d => d.embedding),\n model: data.model,\n usage: data.usage ? { totalTokens: data.usage.total_tokens } : undefined,\n }\n }\n\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const model = request.model ?? this.defaultModel\n const body: Record<string, unknown> = {\n model,\n messages: this.buildMessages(request),\n stream: false,\n }\n if (request.maxTokens) body.max_tokens = request.maxTokens\n if (request.temperature !== undefined) body.temperature = request.temperature\n if (request.stopSequences?.length) body.stop = request.stopSequences\n\n const response = await this.fetch('/chat/completions', body)\n const data = response as OAIChatResponse\n\n const choice = data.choices[0]\n return {\n text: choice?.message?.content ?? '',\n model: data.model,\n usage: data.usage\n ? { promptTokens: data.usage.prompt_tokens, completionTokens: data.usage.completion_tokens }\n : undefined,\n finishReason: this.mapFinishReason(choice?.finish_reason),\n }\n }\n\n async *stream(request: CompletionRequest): AsyncIterable<StreamChunk> {\n const model = request.model ?? this.defaultModel\n const body: Record<string, unknown> = {\n model,\n messages: this.buildMessages(request),\n stream: true,\n }\n if (request.maxTokens) body.max_tokens = request.maxTokens\n if (request.temperature !== undefined) body.temperature = request.temperature\n if (request.stopSequences?.length) body.stop = request.stopSequences\n\n const response = await this.rawFetch('/chat/completions', body)\n\n if (!response.body) {\n throw new Error('Streaming not supported: response body is null')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed || !trimmed.startsWith('data:')) continue\n const data = trimmed.slice(5).trim()\n if (data === '[DONE]') {\n yield { text: '', done: true }\n return\n }\n\n try {\n const parsed = JSON.parse(data) as OAIChatStreamChunk\n const delta = parsed.choices[0]?.delta\n const finishReason = parsed.choices[0]?.finish_reason\n if (delta?.content) {\n yield { text: delta.content, done: false }\n }\n if (finishReason) {\n yield { text: '', done: true }\n return\n }\n } catch {\n // Skip malformed SSE chunks\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const response = await this.fetch('/models', undefined, 'GET')\n const data = response as OAIModelsResponse\n return data.data.map(m => ({\n id: m.id,\n name: m.id,\n capabilities: {\n chat: !this.isEmbeddingModel(m.id),\n embeddings: this.isEmbeddingModel(m.id),\n },\n owned_by: m.owned_by,\n }))\n } catch {\n return []\n }\n }\n\n async probe(): Promise<ProbeResult> {\n const start = Date.now()\n try {\n await this.fetch('/models', undefined, 'GET')\n return {\n status: 'ok',\n latencyMs: Date.now() - start,\n }\n } catch (err) {\n return {\n status: 'down',\n latencyMs: Date.now() - start,\n message: err instanceof Error ? err.message : String(err),\n }\n }\n }\n\n dispose(): void {\n this.abortController?.abort()\n this.abortController = null\n }\n\n // -------------------------------------------------------------------------\n // Internal helpers\n // -------------------------------------------------------------------------\n\n private buildMessages(request: CompletionRequest): Array<{ role: string; content: string }> {\n const messages: Array<{ role: string; content: string }> = []\n if (request.systemPrompt) {\n messages.push({ role: 'system', content: request.systemPrompt })\n }\n messages.push({ role: 'user', content: request.prompt })\n return messages\n }\n\n private mapFinishReason(reason?: string): CompletionResponse['finishReason'] {\n switch (reason) {\n case 'stop': return 'stop'\n case 'length': return 'length'\n case 'content_filter': return 'content_filter'\n default: return undefined\n }\n }\n\n private isEmbeddingModel(id: string): boolean {\n const lower = id.toLowerCase()\n return lower.includes('embed') || lower.includes('e5-') || lower.includes('bge-') ||\n lower.includes('nomic-') || lower.includes('mxbai-') || lower.includes('all-minilm')\n }\n\n private isLocalURL(): boolean {\n try {\n const url = new URL(this.baseURL)\n return url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '0.0.0.0'\n } catch {\n return false\n }\n }\n\n private async fetch(\n path: string,\n body?: unknown,\n method: 'GET' | 'POST' = body ? 'POST' : 'GET',\n ): Promise<unknown> {\n const response = await this.rawFetch(path, body, method)\n if (!response.ok) {\n const text = await response.text().catch(() => '')\n throw new Error(`${this.name} API error ${response.status}: ${text}`)\n }\n return response.json()\n }\n\n private async rawFetch(\n path: string,\n body?: unknown,\n method: 'GET' | 'POST' = body ? 'POST' : 'GET',\n ): Promise<Response> {\n this.abortController = new AbortController()\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.extraHeaders,\n }\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n const url = `${this.baseURL}${path}`\n const response = await globalThis.fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (!response.ok && method !== 'GET') {\n const text = await response.text().catch(() => '')\n throw new Error(`${this.name} API error ${response.status}: ${text}`)\n }\n\n return response\n }\n}\n","/**\n * Local inference server auto-discovery.\n * Probes known local endpoints (Ollama, LM Studio, llama.cpp, vLLM, Jan, LocalAI)\n * and returns discovered providers ready for registration.\n *\n * @implements #116 local server auto-discovery\n */\n\nimport type { ModelInfo } from './inference-provider.js'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface LocalEndpoint {\n id: string\n name: string\n baseURL: string\n defaultPort: number\n}\n\nexport interface DiscoveredProvider {\n id: string\n name: string\n baseURL: string\n models: ModelInfo[]\n}\n\nexport interface DiscoveryOptions {\n /** Additional endpoints to probe beyond the defaults */\n extraEndpoints?: LocalEndpoint[]\n /** Probe timeout per endpoint in ms (default: 2000) */\n timeoutMs?: number\n /** Ports to skip (e.g., if you know a port is used for something else) */\n skipPorts?: number[]\n}\n\n// ---------------------------------------------------------------------------\n// Known local server endpoints\n// ---------------------------------------------------------------------------\n\nexport const LOCAL_ENDPOINTS: LocalEndpoint[] = [\n { id: 'ollama', name: 'Ollama', baseURL: 'http://localhost:11434/v1', defaultPort: 11434 },\n { id: 'lm-studio', name: 'LM Studio', baseURL: 'http://localhost:1234/v1', defaultPort: 1234 },\n { id: 'llama-cpp', name: 'llama.cpp', baseURL: 'http://localhost:8080/v1', defaultPort: 8080 },\n { id: 'vllm', name: 'vLLM', baseURL: 'http://localhost:8000/v1', defaultPort: 8000 },\n { id: 'jan', name: 'Jan', baseURL: 'http://localhost:1337/v1', defaultPort: 1337 },\n { id: 'localai', name: 'LocalAI', baseURL: 'http://localhost:8080/v1', defaultPort: 8080 },\n]\n\n// ---------------------------------------------------------------------------\n// Model capability heuristics\n// ---------------------------------------------------------------------------\n\nexport type ModelCategory = 'embedding' | 'vision' | 'chat'\n\n/**\n * Classify a model by its ID/name into embedding, vision, or chat.\n */\nexport function classifyModel(modelId: string): ModelCategory {\n const lower = modelId.toLowerCase()\n\n // Embedding models\n if (\n lower.includes('embed') || lower.includes('e5-') || lower.includes('bge-') ||\n lower.includes('nomic-') || lower.includes('mxbai-') || lower.includes('all-minilm') ||\n lower.includes('gte-')\n ) {\n return 'embedding'\n }\n\n // Vision models\n if (\n lower.includes('vision') || lower.includes('llava') || lower.includes('moondream') ||\n lower.includes('minicpm-v') || lower.includes('bakllava')\n ) {\n return 'vision'\n }\n\n // Default: chat\n return 'chat'\n}\n\n// ---------------------------------------------------------------------------\n// Discovery\n// ---------------------------------------------------------------------------\n\ninterface ModelsResponse {\n data?: Array<{ id: string; owned_by?: string }>\n models?: Array<{ name: string; model?: string }>\n}\n\n/**\n * Probe a single endpoint and return discovered provider info, or null if unreachable.\n */\nasync function probeEndpoint(\n endpoint: LocalEndpoint,\n timeoutMs: number,\n): Promise<DiscoveredProvider | null> {\n try {\n const response = await globalThis.fetch(`${endpoint.baseURL}/models`, {\n signal: AbortSignal.timeout(timeoutMs),\n })\n if (!response.ok) return null\n\n const data = (await response.json()) as ModelsResponse\n\n // OpenAI format: { data: [{ id: \"model-name\" }] }\n // Ollama format: { models: [{ name: \"model-name\" }] }\n let modelIds: string[]\n if (data.data && Array.isArray(data.data)) {\n modelIds = data.data.map(m => m.id)\n } else if (data.models && Array.isArray(data.models)) {\n modelIds = data.models.map(m => m.name ?? m.model ?? '')\n } else {\n modelIds = []\n }\n\n const models: ModelInfo[] = modelIds\n .filter(Boolean)\n .map(id => {\n const category = classifyModel(id)\n return {\n id,\n name: id,\n capabilities: {\n embeddings: category === 'embedding',\n chat: category === 'chat' || category === 'vision',\n vision: category === 'vision',\n },\n }\n })\n\n return {\n id: endpoint.id,\n name: endpoint.name,\n baseURL: endpoint.baseURL,\n models,\n }\n } catch {\n return null\n }\n}\n\n/**\n * Discover local inference servers by probing known endpoints.\n * Returns all reachable providers with their available models.\n */\nexport async function discoverLocalProviders(\n options: DiscoveryOptions = {},\n): Promise<DiscoveredProvider[]> {\n const { extraEndpoints = [], timeoutMs = 2000, skipPorts = [] } = options\n\n // Deduplicate endpoints by baseURL (llama.cpp and LocalAI share port 8080)\n const allEndpoints = [...LOCAL_ENDPOINTS, ...extraEndpoints]\n const seen = new Set<string>()\n const uniqueEndpoints = allEndpoints.filter(ep => {\n if (seen.has(ep.baseURL)) return false\n if (skipPorts.includes(ep.defaultPort)) return false\n seen.add(ep.baseURL)\n return true\n })\n\n const results = await Promise.allSettled(\n uniqueEndpoints.map(ep => probeEndpoint(ep, timeoutMs)),\n )\n\n return results\n .filter((r): r is PromiseFulfilledResult<DiscoveredProvider | null> =>\n r.status === 'fulfilled' && r.value !== null,\n )\n .map(r => r.value!)\n}\n","/**\n * FallbackRouter — wraps multiple InferenceProviders with automatic failover.\n * Routes requests to the highest-priority available provider, falling through\n * on errors. Failed providers enter cooldown before retry.\n *\n * @implements #114 provider fallback chains with cooldown\n */\n\nimport type { TypedEventBus } from '../event-bus.js'\nimport type {\n InferenceProvider,\n ProviderCapabilities,\n ProviderTier,\n EmbedRequest,\n EmbedResponse,\n CompletionRequest,\n CompletionResponse,\n StreamChunk,\n ModelInfo,\n ProbeResult,\n} from './inference-provider.js'\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface FallbackRouterConfig {\n /** Ordered list of providers (highest priority first) */\n providers: InferenceProvider[]\n /** Cooldown durations by error type in ms */\n cooldowns?: CooldownConfig\n /** Event bus for fallback notifications */\n events?: TypedEventBus\n}\n\nexport interface CooldownConfig {\n /** Cooldown for rate limit errors (HTTP 429) — default 30s */\n rateLimit?: number\n /** Cooldown for server errors (HTTP 5xx) — default 60s */\n serverError?: number\n /** Cooldown for connection failures — default 300s */\n connectionFailure?: number\n /** Cooldown for content policy errors — default 0 (immediate retry with next) */\n contentPolicy?: number\n}\n\nconst DEFAULT_COOLDOWNS: Required<CooldownConfig> = {\n rateLimit: 30_000,\n serverError: 60_000,\n connectionFailure: 300_000,\n contentPolicy: 0,\n}\n\n// ---------------------------------------------------------------------------\n// Error classification\n// ---------------------------------------------------------------------------\n\nexport type ErrorCategory = 'rate_limit' | 'server_error' | 'connection_failure' | 'content_policy' | 'context_window' | 'unknown'\n\nexport function classifyError(error: unknown): ErrorCategory {\n const msg = error instanceof Error ? error.message : String(error)\n const lower = msg.toLowerCase()\n\n if (lower.includes('429') || lower.includes('rate limit')) return 'rate_limit'\n if (lower.includes('500') || lower.includes('502') || lower.includes('503') || lower.includes('504')) return 'server_error'\n if (lower.includes('content') && (lower.includes('policy') || lower.includes('filter'))) return 'content_policy'\n if (lower.includes('context') && (lower.includes('window') || lower.includes('length') || lower.includes('too long'))) return 'context_window'\n if (lower.includes('fetch') || lower.includes('network') || lower.includes('connection') || lower.includes('econnrefused') || lower.includes('timeout')) return 'connection_failure'\n\n return 'unknown'\n}\n\n// ---------------------------------------------------------------------------\n// Fallback event types\n// ---------------------------------------------------------------------------\n\nexport interface FallbackEvent {\n fromProvider: string\n toProvider: string\n errorCategory: ErrorCategory\n error: string\n}\n\nexport interface CooldownEvent {\n providerId: string\n errorCategory: ErrorCategory\n cooldownMs: number\n expiresAt: number\n}\n\n// ---------------------------------------------------------------------------\n// Router implementation\n// ---------------------------------------------------------------------------\n\ninterface CooldownEntry {\n expiresAt: number\n category: ErrorCategory\n}\n\nexport class FallbackRouter implements InferenceProvider {\n readonly id = 'fallback-router'\n readonly name = 'Fallback Router'\n readonly tier: ProviderTier = 'remote'\n\n private providers: InferenceProvider[]\n private cooldowns: Required<CooldownConfig>\n private cooldownMap = new Map<string, CooldownEntry>()\n private events?: TypedEventBus\n\n get capabilities(): ProviderCapabilities {\n // Aggregate capabilities from all providers\n const available = this.getAvailableProviders()\n return {\n embeddings: available.some(p => p.capabilities.embeddings),\n chat: available.some(p => p.capabilities.chat),\n streaming: available.some(p => p.capabilities.streaming),\n vision: available.some(p => p.capabilities.vision),\n toolCalling: available.some(p => p.capabilities.toolCalling),\n structuredOutput: available.some(p => p.capabilities.structuredOutput),\n maxContextTokens: Math.max(\n ...available.map(p => p.capabilities.maxContextTokens ?? 0),\n 0,\n ),\n }\n }\n\n constructor(config: FallbackRouterConfig) {\n this.providers = [...config.providers]\n this.cooldowns = { ...DEFAULT_COOLDOWNS, ...config.cooldowns }\n this.events = config.events\n }\n\n // -------------------------------------------------------------------------\n // Provider management\n // -------------------------------------------------------------------------\n\n /** Get providers not currently in cooldown */\n getAvailableProviders(): InferenceProvider[] {\n const now = Date.now()\n return this.providers.filter(p => {\n const cd = this.cooldownMap.get(p.id)\n if (!cd) return true\n if (now >= cd.expiresAt) {\n this.cooldownMap.delete(p.id)\n return true\n }\n return false\n })\n }\n\n /** Get providers in cooldown with their expiry info */\n getCoolingDown(): Array<{ providerId: string; category: ErrorCategory; expiresAt: number }> {\n const now = Date.now()\n const result: Array<{ providerId: string; category: ErrorCategory; expiresAt: number }> = []\n for (const [id, entry] of this.cooldownMap) {\n if (now < entry.expiresAt) {\n result.push({ providerId: id, category: entry.category, expiresAt: entry.expiresAt })\n }\n }\n return result\n }\n\n /** Manually clear cooldown for a provider */\n clearCooldown(providerId: string): void {\n this.cooldownMap.delete(providerId)\n }\n\n /** Clear all cooldowns */\n clearAllCooldowns(): void {\n this.cooldownMap.clear()\n }\n\n /** Add a provider to the chain (appended at lowest priority) */\n addProvider(provider: InferenceProvider): void {\n this.providers.push(provider)\n }\n\n /** Remove a provider from the chain */\n removeProvider(id: string): void {\n this.providers = this.providers.filter(p => p.id !== id)\n this.cooldownMap.delete(id)\n }\n\n /** Reorder providers (new priority order) */\n setOrder(ids: string[]): void {\n const byId = new Map(this.providers.map(p => [p.id, p]))\n const reordered: InferenceProvider[] = []\n for (const id of ids) {\n const p = byId.get(id)\n if (p) reordered.push(p)\n }\n // Append any providers not in the new order list\n for (const p of this.providers) {\n if (!ids.includes(p.id)) reordered.push(p)\n }\n this.providers = reordered\n }\n\n // -------------------------------------------------------------------------\n // InferenceProvider interface — with fallback\n // -------------------------------------------------------------------------\n\n async embed(request: EmbedRequest): Promise<EmbedResponse> {\n return this.withFallback(\n p => p.capabilities.embeddings && !!p.embed,\n p => p.embed!(request),\n )\n }\n\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n return this.withFallback(\n p => p.capabilities.chat && !!p.complete,\n p => p.complete!(request),\n )\n }\n\n async *stream(request: CompletionRequest): AsyncIterable<StreamChunk> {\n const candidates = this.getAvailableProviders()\n .filter(p => p.capabilities.streaming && p.stream)\n\n if (candidates.length === 0) {\n throw new Error('No available providers with streaming capability')\n }\n\n // For streaming, we try the first candidate only (can't retry mid-stream)\n yield* candidates[0].stream!(request)\n }\n\n async listModels(): Promise<ModelInfo[]> {\n const available = this.getAvailableProviders()\n const results = await Promise.allSettled(\n available.map(p => p.listModels()),\n )\n const models: ModelInfo[] = []\n for (const r of results) {\n if (r.status === 'fulfilled') models.push(...r.value)\n }\n return models\n }\n\n async probe(): Promise<ProbeResult> {\n const available = this.getAvailableProviders()\n if (available.length === 0) {\n return { status: 'down', latencyMs: 0, message: 'All providers in cooldown' }\n }\n\n const start = Date.now()\n const results = await Promise.allSettled(\n available.map(p => p.probe()),\n )\n\n const okCount = results.filter(\n r => r.status === 'fulfilled' && r.value.status === 'ok',\n ).length\n\n return {\n status: okCount === available.length ? 'ok' : okCount > 0 ? 'degraded' : 'down',\n latencyMs: Date.now() - start,\n message: `${okCount}/${available.length} providers healthy`,\n }\n }\n\n dispose(): void {\n for (const p of this.providers) {\n p.dispose()\n }\n this.providers = []\n this.cooldownMap.clear()\n }\n\n // -------------------------------------------------------------------------\n // Core fallback logic\n // -------------------------------------------------------------------------\n\n private async withFallback<T>(\n filter: (p: InferenceProvider) => boolean,\n execute: (p: InferenceProvider) => Promise<T>,\n ): Promise<T> {\n const candidates = this.getAvailableProviders().filter(filter)\n\n if (candidates.length === 0) {\n throw new Error('No available providers for this request')\n }\n\n let lastError: Error | undefined\n\n for (const provider of candidates) {\n try {\n return await execute(provider)\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err))\n const category = classifyError(err)\n this.applyCooldown(provider.id, category)\n\n // Emit fallback event\n const nextCandidate = candidates[candidates.indexOf(provider) + 1]\n if (nextCandidate) {\n this.events?.emit('provider.fallback', {\n fromProvider: provider.id,\n toProvider: nextCandidate.id,\n errorCategory: category,\n error: lastError.message,\n })\n }\n }\n }\n\n throw lastError ?? new Error('All providers failed')\n }\n\n private applyCooldown(providerId: string, category: ErrorCategory): void {\n let cooldownMs: number\n switch (category) {\n case 'rate_limit':\n cooldownMs = this.cooldowns.rateLimit\n break\n case 'server_error':\n cooldownMs = this.cooldowns.serverError\n break\n case 'connection_failure':\n cooldownMs = this.cooldowns.connectionFailure\n break\n case 'content_policy':\n cooldownMs = this.cooldowns.contentPolicy\n break\n default:\n cooldownMs = this.cooldowns.serverError // default to server error cooldown\n }\n\n if (cooldownMs > 0) {\n const expiresAt = Date.now() + cooldownMs\n this.cooldownMap.set(providerId, { expiresAt, category })\n\n this.events?.emit('provider.cooldown', {\n providerId,\n errorCategory: category,\n cooldownMs,\n expiresAt,\n })\n }\n }\n}\n","import type {\n CompletionRequest,\n CompletionResponse,\n EmbedRequest,\n EmbedResponse,\n ProbeResult,\n StreamChunk,\n} from './capabilities/inference-provider.js'\n\nexport interface FortemiBridgeCapabilities {\n secureSecrets: boolean\n providerRouting: boolean\n localNetworkAccess: boolean\n auditLog: boolean\n}\n\nexport interface FortemiSecretStore {\n isAvailable(): boolean | Promise<boolean>\n getSecret(key: string): Promise<string | null>\n setSecret(key: string, value: string): Promise<void>\n deleteSecret(key: string): Promise<void>\n}\n\nexport interface BridgeProviderInfo {\n id: string\n name: string\n tier: 'remote' | 'local-server' | 'in-browser' | 'chrome-ai'\n requiresApiKey: boolean\n capabilities: {\n chat?: boolean\n embeddings?: boolean\n streaming?: boolean\n }\n}\n\nexport interface FortemiInferenceRouter {\n listProviders(): Promise<BridgeProviderInfo[]>\n probeProvider(providerId: string): Promise<ProbeResult>\n complete(providerId: string, request: CompletionRequest): Promise<CompletionResponse>\n embed(providerId: string, request: EmbedRequest): Promise<EmbedResponse>\n stream?(providerId: string, request: CompletionRequest): AsyncIterable<StreamChunk>\n}\n\nexport interface FortemiBridge {\n version: string\n capabilities(): Promise<FortemiBridgeCapabilities>\n secrets: FortemiSecretStore\n inference?: FortemiInferenceRouter\n}\n\nexport interface FortemiBridgeHost {\n fortemiBridge?: FortemiBridge\n fortemiSecureStorage?: FortemiSecretStore\n}\n\nexport function getFortemiBridge(host: FortemiBridgeHost | undefined = globalThis as FortemiBridgeHost): FortemiBridge | null {\n return host?.fortemiBridge ?? null\n}\n\nexport function getFortemiSecretStore(host: FortemiBridgeHost | undefined = globalThis as FortemiBridgeHost): FortemiSecretStore | null {\n return host?.fortemiBridge?.secrets ?? host?.fortemiSecureStorage ?? null\n}\n\nexport async function hasFortemiSecureSecrets(host: FortemiBridgeHost | undefined = globalThis as FortemiBridgeHost): Promise<boolean> {\n const bridge = getFortemiBridge(host)\n if (bridge) {\n try {\n const capabilities = await bridge.capabilities()\n if (!capabilities.secureSecrets) return false\n return Boolean(await bridge.secrets.isAvailable())\n } catch {\n return false\n }\n }\n\n const legacySecrets = host?.fortemiSecureStorage\n if (!legacySecrets) return false\n try {\n return Boolean(await legacySecrets.isAvailable())\n } catch {\n return false\n }\n}\n","\nexport type CspDirectiveName =\n | 'default-src'\n | 'base-uri'\n | 'object-src'\n | 'frame-ancestors'\n | 'img-src'\n | 'font-src'\n | 'style-src'\n | 'script-src'\n | 'connect-src'\n | 'worker-src'\n | 'manifest-src'\n | 'report-uri'\n\nexport type CspDirectives = Partial<Record<CspDirectiveName, string[]>>\n\nexport interface PluginCspOptions {\n scriptSrc?: string[]\n connectSrc?: string[]\n imgSrc?: string[]\n styleSrc?: string[]\n reportUri?: string\n extraDirectives?: CspDirectives\n}\n\nexport interface PluginScriptPolicy {\n allowedOrigins: string[]\n allowedUrls?: string[]\n requireSri?: boolean\n}\n\nexport interface PluginScriptDescriptor {\n url: string\n integrity?: string\n crossOrigin?: 'anonymous' | 'use-credentials'\n}\n\nexport interface LoadedPluginScript {\n url: string\n integrity: string\n bytes: Uint8Array\n text: string\n}\n\nexport interface CspViolationReport {\n documentUri?: string\n violatedDirective?: string\n effectiveDirective?: string\n blockedUri?: string\n originalPolicy?: string\n disposition?: string\n sourceFile?: string\n lineNumber?: number\n columnNumber?: number\n raw: unknown\n}\n\nconst DEFAULT_DIRECTIVES: CspDirectives = {\n 'default-src': [\"'self'\"],\n 'base-uri': [\"'self'\"],\n 'object-src': [\"'none'\"],\n 'frame-ancestors': [\"'self'\"],\n 'img-src': [\"'self'\", 'data:', 'blob:'],\n 'font-src': [\"'self'\", 'data:'],\n 'style-src': [\"'self'\", \"'unsafe-inline'\"],\n 'script-src': [\"'self'\", \"'strict-dynamic'\"],\n 'connect-src': [\"'self'\"],\n 'worker-src': [\"'self'\", 'blob:'],\n 'manifest-src': [\"'self'\"],\n}\n\nconst SUPPORTED_SRI_ALGORITHMS = new Set(['sha256', 'sha384', 'sha512'])\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values.filter(Boolean)))\n}\n\nfunction mergeDirective(base: string[] | undefined, additions: string[] | undefined): string[] | undefined {\n if (!base && !additions) return undefined\n return unique([...(base ?? []), ...(additions ?? [])])\n}\n\nexport function buildPluginCsp(options: PluginCspOptions = {}): string {\n const directives: CspDirectives = { ...DEFAULT_DIRECTIVES }\n directives['script-src'] = mergeDirective(directives['script-src'], options.scriptSrc)\n directives['connect-src'] = mergeDirective(directives['connect-src'], options.connectSrc)\n directives['img-src'] = mergeDirective(directives['img-src'], options.imgSrc)\n directives['style-src'] = mergeDirective(directives['style-src'], options.styleSrc)\n\n if (options.reportUri) {\n directives['report-uri'] = [options.reportUri]\n }\n\n for (const [name, values] of Object.entries(options.extraDirectives ?? {}) as Array<[CspDirectiveName, string[]]>) {\n directives[name] = mergeDirective(directives[name], values)\n }\n\n return Object.entries(directives)\n .filter((entry): entry is [string, string[]] => Array.isArray(entry[1]) && entry[1].length > 0)\n .map(([name, values]) => name + ' ' + values.join(' '))\n .join('; ')\n}\n\nfunction parseSriToken(integrity: string): { algorithm: string; digest: string } {\n const token = integrity.trim().split(/\\s+/)[0]\n const separator = token.indexOf('-')\n if (separator <= 0) throw new Error('Invalid SRI token')\n\n const algorithm = token.slice(0, separator).toLowerCase()\n const digest = token.slice(separator + 1)\n if (!SUPPORTED_SRI_ALGORITHMS.has(algorithm)) {\n throw new Error('Unsupported SRI algorithm: ' + algorithm)\n }\n if (!digest) throw new Error('Invalid SRI digest')\n return { algorithm, digest }\n}\n\nfunction toBase64(bytes: ArrayBuffer): string {\n const data = new Uint8Array(bytes)\n let binary = ''\n for (const byte of data) binary += String.fromCharCode(byte)\n return btoa(binary)\n}\n\nfunction toArrayBuffer(data: Uint8Array | ArrayBuffer): ArrayBuffer {\n if (data instanceof ArrayBuffer) return data\n return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer\n}\n\nexport async function computeSri(data: Uint8Array | ArrayBuffer, algorithm = 'sha384'): Promise<string> {\n const normalized = algorithm.toLowerCase()\n if (!SUPPORTED_SRI_ALGORITHMS.has(normalized)) {\n throw new Error('Unsupported SRI algorithm: ' + algorithm)\n }\n const digest = await crypto.subtle.digest(normalized.toUpperCase().replace('SHA', 'SHA-'), toArrayBuffer(data))\n return normalized + '-' + toBase64(digest)\n}\n\nexport async function verifySri(data: Uint8Array | ArrayBuffer, integrity: string): Promise<boolean> {\n const expected = parseSriToken(integrity)\n return (await computeSri(data, expected.algorithm)) === expected.algorithm + '-' + expected.digest\n}\n\nexport function isPluginScriptAllowed(url: string, policy: PluginScriptPolicy): boolean {\n let parsed: URL\n try {\n parsed = new URL(url, globalThis.location?.href)\n } catch {\n return false\n }\n\n const exactAllowed = policy.allowedUrls?.some(allowed => new URL(allowed, parsed.href).href === parsed.href) ?? false\n if (exactAllowed) return true\n\n return policy.allowedOrigins.some(origin => {\n if (origin === '*') return true\n return new URL(origin, parsed.href).origin === parsed.origin\n })\n}\n\nexport async function fetchPluginScript(\n descriptor: PluginScriptDescriptor,\n policy: PluginScriptPolicy,\n fetchFn: typeof fetch = fetch,\n): Promise<LoadedPluginScript> {\n if (!isPluginScriptAllowed(descriptor.url, policy)) {\n throw new Error('Plugin script origin is not allowlisted: ' + descriptor.url)\n }\n if (policy.requireSri !== false && !descriptor.integrity) {\n throw new Error('Plugin script requires an SRI integrity value: ' + descriptor.url)\n }\n\n const response = await fetchFn(descriptor.url, {\n credentials: descriptor.crossOrigin === 'use-credentials' ? 'include' : 'omit',\n })\n if (!response.ok) {\n throw new Error('Plugin script fetch failed with HTTP ' + response.status + ': ' + descriptor.url)\n }\n\n const bytes = new Uint8Array(await response.arrayBuffer())\n if (descriptor.integrity && !(await verifySri(bytes, descriptor.integrity))) {\n throw new Error('Plugin script failed SRI verification: ' + descriptor.url)\n }\n\n return {\n url: descriptor.url,\n integrity: descriptor.integrity ?? await computeSri(bytes),\n bytes,\n text: new TextDecoder().decode(bytes),\n }\n}\n\nexport async function appendPluginScript(\n descriptor: PluginScriptDescriptor,\n policy: PluginScriptPolicy,\n doc: Document = document,\n): Promise<HTMLScriptElement> {\n if (!isPluginScriptAllowed(descriptor.url, policy)) {\n throw new Error('Plugin script origin is not allowlisted: ' + descriptor.url)\n }\n if (policy.requireSri !== false && !descriptor.integrity) {\n throw new Error('Plugin script requires an SRI integrity value: ' + descriptor.url)\n }\n\n const script = doc.createElement('script')\n script.type = 'module'\n script.src = descriptor.url\n if (descriptor.integrity) script.integrity = descriptor.integrity\n script.crossOrigin = descriptor.crossOrigin ?? 'anonymous'\n\n await new Promise<void>((resolve, reject) => {\n script.addEventListener('load', () => resolve(), { once: true })\n script.addEventListener('error', () => reject(new Error('Plugin script failed to load: ' + descriptor.url)), { once: true })\n doc.head.appendChild(script)\n })\n\n return script\n}\n\nexport function parseCspReport(body: unknown): CspViolationReport {\n const report = typeof body === 'object' && body !== null && 'csp-report' in body\n ? (body as { 'csp-report': Record<string, unknown> })['csp-report']\n : typeof body === 'object' && body !== null && 'body' in body\n ? (body as { body: Record<string, unknown> }).body\n : body\n\n const r = report as Record<string, unknown>\n return {\n documentUri: typeof r['document-uri'] === 'string' ? r['document-uri'] : undefined,\n violatedDirective: typeof r['violated-directive'] === 'string' ? r['violated-directive'] : undefined,\n effectiveDirective: typeof r['effective-directive'] === 'string' ? r['effective-directive'] : undefined,\n blockedUri: typeof r['blocked-uri'] === 'string' ? r['blocked-uri'] : undefined,\n originalPolicy: typeof r['original-policy'] === 'string' ? r['original-policy'] : undefined,\n disposition: typeof r.disposition === 'string' ? r.disposition : undefined,\n sourceFile: typeof r['source-file'] === 'string' ? r['source-file'] : undefined,\n lineNumber: typeof r['line-number'] === 'number' ? r['line-number'] : undefined,\n columnNumber: typeof r['column-number'] === 'number' ? r['column-number'] : undefined,\n raw: body,\n }\n}\n\nexport function createCspReportHandler(\n onReport: (report: CspViolationReport) => void | Promise<void>,\n): (request: Request) => Promise<Response> {\n return async (request: Request) => {\n if (request.method !== 'POST') {\n return new Response(null, { status: 405, headers: { Allow: 'POST' } })\n }\n\n let json: unknown\n try {\n json = await request.json()\n } catch {\n return new Response(JSON.stringify({ error: 'Invalid CSP report JSON' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n await onReport(parseCspReport(json))\n return new Response(null, { status: 204 })\n }\n}\n","/**\n * Shard format types — matches the fortemi server matric-shard specification.\n *\n * A shard is a gzip-compressed tar archive (.shard) containing serialized\n * knowledge data with a manifest for integrity verification.\n */\n\nexport const CURRENT_SHARD_VERSION = '1.0.0'\nexport const SHARD_FORMAT = 'matric-shard'\n\n/** Components that can appear in a shard archive. */\nexport type ShardComponent =\n | 'notes'\n | 'collections'\n | 'tags'\n | 'links'\n | 'embedding_sets'\n | 'embedding_set_members'\n | 'embedding_configs'\n | 'embeddings'\n | 'skos_schemes'\n | 'skos_concepts'\n | 'skos_relations'\n | 'note_skos_tags'\n | 'provenance_edges'\n | 'community_assignments'\n | 'communities'\n | 'graph_edges'\n | 'graph_sources'\n\n/**\n * Reference to one cluster file of a component split across addressable files\n * (`notes/000.jsonl`, `notes/001.jsonl`, …). `offset`/`count` are the record\n * range within the component, so an in-place reader fetches only the clusters a\n * query needs — the shard analog of the AIWG chunk-manifest scan parts.\n */\nexport interface ShardClusterRef {\n href: string // path within the shard, relative to manifest base\n offset: number // index of the first record in this cluster\n count: number // records in this cluster\n}\n\n/**\n * Optional clustered layout (additive — absent on monolithic shards). When a\n * component is present here, its records live in the listed cluster files instead\n * of (or in addition to) the single `<component>.jsonl`. Both `importShard` and\n * the in-place reader consume it; a monolithic shard omits `layout` entirely.\n */\nexport interface ShardLayout {\n clusters?: Partial<Record<ShardComponent, ShardClusterRef[]>>\n}\n\n/** Manifest included in every shard as manifest.json. */\nexport interface ShardManifest {\n version: string\n matric_version: string\n format: typeof SHARD_FORMAT\n created_at: string // ISO 8601\n components: ShardComponent[]\n counts: Partial<Record<ShardComponent | 'community_sets', number>>\n checksums: Record<string, string> // filename → sha256 hex\n min_reader_version: string\n /** Clustered component layout for partial fetch (issue #189). Absent → monolithic. */\n layout?: ShardLayout\n}\n\n/** Options for shard export. */\nexport interface ExportOptions {\n includeEmbeddings?: boolean\n /** Filter to specific collection (export only notes in this collection). */\n collectionId?: string\n /** Filter to notes with this tag (e.g. 'app:research' for app-scoped export). */\n tag?: string\n /** Export only these embedding sets and their member/vector rows. */\n embeddingSetIds?: string[]\n /** Preserve virtual selector materialization metadata and virtual member rows. */\n includeMaterializedSelectors?: boolean\n /**\n * When set to a positive integer, emit notes as clustered files\n * (`notes/000.jsonl`, …) of this many records each, and record the layout in\n * the manifest, so an in-place reader can fetch only the clusters it needs\n * (issue #189). Absent → a single monolithic `notes.jsonl` (unchanged).\n */\n clusterNotesSize?: number\n}\n\n/** Conflict resolution strategy for shard import. */\nexport type ConflictStrategy = 'skip' | 'replace' | 'error'\n\n/** Options for shard import. */\nexport interface ImportOptions {\n conflictStrategy?: ConflictStrategy\n /** Rows processed between cooperative yields. Defaults to 250. */\n batchSize?: number\n /** Progress callback for long-running import phases. */\n onProgress?: (progress: ImportProgress) => void\n}\n\nexport type ImportProgressPhase =\n | 'unpack'\n | 'validate'\n | 'collections'\n | 'notes'\n | 'skos'\n | 'links'\n | 'provenance'\n | 'embedding_sets'\n | 'embeddings'\n | 'embedding_set_members'\n | 'graph'\n | 'communities'\n | 'index'\n\nexport interface ImportProgress {\n phase: ImportProgressPhase\n done: number\n total: number\n}\n\n/** Per-entity import counts. */\nexport interface ImportCounts {\n notes: number\n collections: number\n tags: number\n links: number\n embedding_sets: number\n embedding_set_members: number\n embeddings: number\n skos_schemes: number\n skos_concepts: number\n skos_relations: number\n note_skos_tags: number\n provenance_edges: number\n graph_sources: number\n graph_edges: number\n community_sets: number\n communities: number\n community_assignments: number\n}\n\n/** Result of a shard import operation. */\nexport interface ImportResult {\n success: boolean\n counts: ImportCounts\n skipped: Partial<ImportCounts>\n warnings: string[]\n errors: string[]\n duration_ms: number\n}\n\n// ── Shard-format entity shapes (server-compatible) ──────────────────────\n\n/** Note as serialized in the shard JSONL. */\nexport interface ShardNote {\n id: string\n title: string | null\n original_content: string\n revised_content: string | null\n format: string\n source: string\n starred: boolean\n archived: boolean\n tags: string[]\n created_at: string\n updated_at: string\n deleted_at: string | null\n}\n\n/** Collection as serialized in the shard JSON array. */\nexport interface ShardCollection {\n id: string\n name: string\n description: string | null\n parent_id: string | null\n created_at: string\n note_count?: number\n}\n\n/** Tag as serialized in the shard JSON array. */\nexport interface ShardTag {\n name: string\n created_at: string\n}\n\n/** Link as serialized in the shard JSONL. */\nexport interface ShardLink {\n id: string\n from_note_id: string\n to_note_id: string\n kind: string\n score: number | null\n created_at: string\n metadata?: Record<string, unknown>\n}\n\n/** Embedding set as serialized in the shard JSON array. */\nexport interface ShardEmbeddingSet {\n id: string\n name?: string\n purpose?: string | null\n model: string\n dimension: number\n kind?: 'physical' | 'filter' | 'virtual'\n mode?: 'auto' | 'manual' | 'mixed' | null\n truncate_dimension?: number | null\n criteria?: Record<string, unknown> | null\n source?: Record<string, unknown> | null\n compatibility?: Record<string, unknown> | null\n materialization?: Record<string, unknown> | null\n freshness?: ShardArtifactFreshness | null\n created_at: string\n updated_at?: string\n}\n\n/** Embedding set member as serialized in the shard JSONL. */\nexport interface ShardEmbeddingSetMember {\n embedding_set_id: string\n note_id: string\n embedding_id: string\n}\n\n/** Embedding as serialized in the shard JSONL. */\nexport interface ShardEmbedding {\n id: string\n note_id: string\n embedding_set_id: string\n vector: number[]\n created_at: string\n}\n\n\n/** SKOS scheme as serialized in the shard JSON array. */\nexport interface ShardSkosScheme {\n id: string\n title: string\n description: string | null\n created_at: string\n updated_at: string\n}\n\n/** SKOS concept as serialized in the shard JSON array. */\nexport interface ShardSkosConcept {\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[]\n definition: string | null\n created_at: string\n updated_at: string\n}\n\n/** SKOS concept relation as serialized in the shard JSONL. */\nexport interface ShardSkosRelation {\n id: string\n source_concept_id: string\n target_concept_id: string\n relation_type: 'broader' | 'narrower' | 'related'\n created_at: string\n}\n\n/** Note-to-SKOS-concept assignment as serialized in the shard JSONL. */\nexport interface ShardNoteSkosTag {\n id: string\n note_id: string\n concept_id: string\n created_at: string\n}\n\n/** Provenance edge as serialized in the shard JSONL. */\nexport interface ShardProvenanceEdge {\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: string\n ended_at: string | null\n attributes: Record<string, unknown> | null\n}\n\n\n// - Graph/community derived artifacts ---------------------------------------\n\nexport interface ShardArtifactFreshness {\n status: 'fresh' | 'stale' | 'unknown'\n checked_at?: string\n stale_reason?: string\n source_hashes?: {\n notes?: string\n links?: string\n embeddings?: string\n embedding_set_members?: string\n virtual_set_definition?: string\n parameters?: string\n }\n}\n\nexport interface ShardGraphSource {\n id: string\n name: string\n kind: 'link' | 'similarity' | 'search' | 'manual' | 'imported'\n source_table?: 'link' | 'embedding' | 'manual' | null\n embedding_set_id?: string | null\n virtual_set_id?: string | null\n model?: string | null\n dimension?: number | null\n truncate_dimension?: number | null\n metric?: 'cosine' | 'inner_product' | 'l2' | null\n algorithm?: string | null\n parameters?: Record<string, unknown>\n input_hash: string\n freshness: ShardArtifactFreshness\n created_at: string\n}\n\nexport interface ShardGraphEdge {\n graph_source_id: string\n from_note_id: string\n to_note_id: string\n weight: number\n kind: 'link' | 'similarity' | 'manual'\n rank?: number | null\n metadata?: Record<string, unknown>\n}\n\nexport interface ShardCommunitySet {\n id: string\n graph_source_id: string\n name: string\n source_type: 'precomputed' | 'dynamic-snapshot' | 'user-authored' | 'imported'\n algorithm?: string | null\n parameters?: Record<string, unknown>\n input_hash: string\n freshness: ShardArtifactFreshness\n communities: ShardCommunity[]\n created_at: string\n}\n\nexport interface ShardCommunity {\n id: string\n label?: string | null\n rank?: number | null\n size?: number | null\n confidence?: number | null\n representative_note_ids?: string[]\n metadata?: Record<string, unknown>\n}\n\nexport interface ShardCommunityAssignment {\n community_set_id: string\n community_id: string\n note_id: string\n confidence?: number | null\n source_type: 'precomputed' | 'dynamic-snapshot' | 'user-authored' | 'imported'\n metadata?: Record<string, unknown>\n}\n","/**\n * Minimal tar + gzip packing/unpacking for shard archives.\n *\n * Uses fflate for gzip compression and implements a lightweight POSIX tar\n * encoder/decoder (512-byte block headers, ustar format).\n */\n\nimport { gzipSync, gunzipSync } from 'fflate'\n\n// ── Tar constants ────────────────────────────────────────────────────────\n\nconst BLOCK_SIZE = 512\nconst USTAR_MAGIC = 'ustar\\x0000'\n\n// ── Tar encoder ──────────────────────────────────────────────────────────\n\nfunction writeString(buf: Uint8Array, offset: number, str: string, len: number) {\n for (let i = 0; i < Math.min(str.length, len); i++) {\n buf[offset + i] = str.charCodeAt(i)\n }\n}\n\nfunction writeOctal(buf: Uint8Array, offset: number, value: number, len: number) {\n const str = value.toString(8).padStart(len - 1, '0')\n writeString(buf, offset, str, len - 1)\n}\n\nfunction computeHeaderChecksum(header: Uint8Array): number {\n // For checksum computation, treat the checksum field (offset 148, 8 bytes) as spaces\n let sum = 0\n for (let i = 0; i < BLOCK_SIZE; i++) {\n sum += i >= 148 && i < 156 ? 32 : header[i]\n }\n return sum\n}\n\nfunction createTarHeader(filename: string, size: number): Uint8Array {\n const header = new Uint8Array(BLOCK_SIZE)\n\n // name (0, 100)\n writeString(header, 0, filename, 100)\n // mode (100, 8) — 0644\n writeOctal(header, 100, 0o644, 8)\n // uid (108, 8)\n writeOctal(header, 108, 0, 8)\n // gid (116, 8)\n writeOctal(header, 116, 0, 8)\n // size (124, 12)\n writeOctal(header, 124, size, 12)\n // mtime (136, 12)\n writeOctal(header, 136, Math.floor(Date.now() / 1000), 12)\n // typeflag (156) — '0' for regular file\n header[156] = 48 // ASCII '0'\n // magic (257, 8) — ustar\\000\n writeString(header, 257, USTAR_MAGIC, 8)\n\n // compute and write checksum (148, 8)\n const checksum = computeHeaderChecksum(header)\n const csStr = checksum.toString(8).padStart(6, '0')\n writeString(header, 148, csStr, 6)\n header[154] = 0 // null terminator\n header[155] = 32 // space\n\n return header\n}\n\nfunction encodeTar(files: Map<string, Uint8Array>): Uint8Array {\n const blocks: Uint8Array[] = []\n\n for (const [filename, data] of files) {\n blocks.push(createTarHeader(filename, data.byteLength))\n blocks.push(data)\n\n // Pad to 512-byte boundary\n const remainder = data.byteLength % BLOCK_SIZE\n if (remainder > 0) {\n blocks.push(new Uint8Array(BLOCK_SIZE - remainder))\n }\n }\n\n // Two zero blocks mark end of archive\n blocks.push(new Uint8Array(BLOCK_SIZE * 2))\n\n // Concatenate\n let totalLen = 0\n for (const b of blocks) totalLen += b.byteLength\n const result = new Uint8Array(totalLen)\n let offset = 0\n for (const b of blocks) {\n result.set(b, offset)\n offset += b.byteLength\n }\n return result\n}\n\n// ── Tar decoder ──────────────────────────────────────────────────────────\n\nfunction readString(buf: Uint8Array, offset: number, len: number): string {\n let end = offset\n const limit = offset + len\n while (end < limit && buf[end] !== 0) end++\n return String.fromCharCode(...buf.slice(offset, end))\n}\n\nfunction readOctal(buf: Uint8Array, offset: number, len: number): number {\n const str = readString(buf, offset, len).trim()\n return str.length > 0 ? parseInt(str, 8) : 0\n}\n\nfunction isZeroBlock(buf: Uint8Array, offset: number): boolean {\n for (let i = 0; i < BLOCK_SIZE; i++) {\n if (buf[offset + i] !== 0) return false\n }\n return true\n}\n\nfunction decodeTar(tarData: Uint8Array): Map<string, Uint8Array> {\n const files = new Map<string, Uint8Array>()\n let offset = 0\n\n while (offset + BLOCK_SIZE <= tarData.byteLength) {\n // Check for end-of-archive (two zero blocks)\n if (isZeroBlock(tarData, offset)) break\n\n const name = readString(tarData, offset, 100)\n const size = readOctal(tarData, offset + 124, 12)\n const typeflag = tarData[offset + 156]\n\n offset += BLOCK_SIZE // skip header\n\n // Only extract regular files (typeflag '0' or NUL)\n if (typeflag === 48 || typeflag === 0) {\n files.set(name, tarData.slice(offset, offset + size))\n }\n\n // Advance past data blocks (padded to 512-byte boundary)\n const dataBlocks = Math.ceil(size / BLOCK_SIZE)\n offset += dataBlocks * BLOCK_SIZE\n }\n\n return files\n}\n\n// ── Public API ───────────────────────────────────────────────────────────\n\n/**\n * Pack files into a gzip-compressed tar archive.\n *\n * @param files Map of filename → file contents\n * @returns Compressed archive bytes (suitable for .shard file)\n */\nexport function packTarGz(files: Map<string, Uint8Array>): Uint8Array {\n const tarData = encodeTar(files)\n return gzipSync(tarData)\n}\n\n/**\n * Unpack a gzip-compressed tar archive.\n *\n * @param data Compressed archive bytes\n * @returns Map of filename → file contents\n */\nexport function unpackTarGz(data: Uint8Array): Map<string, Uint8Array> {\n const tarData = gunzipSync(data)\n return decodeTar(tarData)\n}\n","/**\n * SHA-256 checksum utilities for shard integrity verification.\n * Uses the Web Crypto API (browser-native, no extra dependencies).\n */\n\n/**\n * Compute SHA-256 hex digest of a Uint8Array.\n * Returns lowercase hex string (64 characters).\n */\nexport async function sha256Hex(data: Uint8Array): Promise<string> {\n const buf = new ArrayBuffer(data.byteLength)\n new Uint8Array(buf).set(data)\n const hashBuffer = await crypto.subtle.digest('SHA-256', buf)\n const hashArray = new Uint8Array(hashBuffer)\n return Array.from(hashArray)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\n/**\n * Validate checksums listed in a shard manifest against actual file contents.\n *\n * @returns Object with `valid` flag and list of failed filenames.\n */\nexport async function validateChecksums(\n checksums: Record<string, string>,\n files: Map<string, Uint8Array>,\n): Promise<{ valid: boolean; failures: string[] }> {\n const failures: string[] = []\n\n for (const [filename, expectedHash] of Object.entries(checksums)) {\n const fileData = files.get(filename)\n if (!fileData) {\n failures.push(filename)\n continue\n }\n const actualHash = await sha256Hex(fileData)\n if (actualHash !== expectedHash) {\n failures.push(filename)\n }\n }\n\n return { valid: failures.length === 0, failures }\n}\n","/**\n * Field mapper — converts between browser schema and shard (server) schema.\n *\n * The browser uses different field names than the server shard format.\n * This module handles all rename transforms bidirectionally.\n */\n\nimport type {\n ShardNote,\n ShardLink,\n ShardTag,\n ShardCollection,\n ShardEmbeddingSet,\n ShardEmbeddingSetMember,\n ShardEmbedding,\n ShardSkosScheme,\n ShardSkosConcept,\n ShardSkosRelation,\n ShardNoteSkosTag,\n ShardProvenanceEdge,\n} from './types.js'\nimport type { LinkRow } from '../repositories/links-repository.js'\nimport type { CollectionRow } from '../repositories/collections-repository.js'\n\n// ── Notes ────────────────────────────────────────────────────────────────\n\n/** Browser-format note row from the export query (denormalized). */\nexport interface BrowserNoteExport {\n id: string\n title: string | null\n format: string\n source: string\n is_starred: boolean\n is_archived: boolean\n created_at: Date | string\n updated_at: Date | string\n deleted_at: Date | string | null\n original_content: string\n revised_content: string | null\n tags: string[]\n}\n\n/** Convert a browser note to shard format. */\nexport function noteToShard(note: BrowserNoteExport): ShardNote {\n return {\n id: note.id,\n title: note.title,\n original_content: note.original_content,\n revised_content: note.revised_content,\n format: note.format,\n source: note.source,\n starred: note.is_starred,\n archived: note.is_archived,\n tags: note.tags,\n created_at: toISOString(note.created_at),\n updated_at: toISOString(note.updated_at),\n deleted_at: note.deleted_at ? toISOString(note.deleted_at) : null,\n }\n}\n\n/** Convert a shard note back to browser-insertable format. */\nexport function noteFromShard(shard: ShardNote): BrowserNoteExport {\n return {\n id: shard.id,\n title: shard.title,\n format: shard.format,\n source: shard.source,\n is_starred: shard.starred,\n is_archived: shard.archived,\n original_content: shard.original_content,\n revised_content: shard.revised_content,\n tags: shard.tags,\n created_at: shard.created_at,\n updated_at: shard.updated_at,\n deleted_at: shard.deleted_at,\n }\n}\n\n// ── Links ────────────────────────────────────────────────────────────────\n\n/** Convert a browser link to shard format. */\nexport function linkToShard(link: LinkRow): ShardLink {\n return {\n id: link.id,\n from_note_id: link.source_note_id,\n to_note_id: link.target_note_id,\n kind: link.link_type,\n score: link.confidence,\n created_at: toISOString(link.created_at),\n }\n}\n\n/** Convert a shard link back to browser-insertable format. */\nexport function linkFromShard(shard: ShardLink): {\n id: string\n source_note_id: string\n target_note_id: string\n link_type: string\n confidence: number | null\n created_at: string\n} {\n return {\n id: shard.id,\n source_note_id: shard.from_note_id,\n target_note_id: shard.to_note_id,\n link_type: shard.kind,\n confidence: shard.score,\n created_at: shard.created_at,\n }\n}\n\n// ── Collections ──────────────────────────────────────────────────────────\n\n/** Convert a browser collection to shard format. */\nexport function collectionToShard(\n collection: CollectionRow,\n noteCount?: number,\n): ShardCollection {\n return {\n id: collection.id,\n name: collection.name,\n description: collection.description,\n parent_id: collection.parent_id,\n created_at: toISOString(collection.created_at),\n note_count: noteCount,\n }\n}\n\n/** Convert a shard collection back to browser-insertable format. */\nexport function collectionFromShard(shard: ShardCollection): {\n id: string\n name: string\n description: string | null\n parent_id: string | null\n created_at: string\n} {\n return {\n id: shard.id,\n name: shard.name,\n description: shard.description,\n parent_id: shard.parent_id,\n created_at: shard.created_at,\n }\n}\n\n// ── Tags ─────────────────────────────────────────────────────────────────\n\n/**\n * Convert SKOS concepts + note_tag associations into shard flat tag format.\n * Shard tags are simple string arrays — deduplicated across all notes.\n */\nexport function tagsToShard(\n allTags: Array<{ name: string; created_at: Date | string }>,\n): ShardTag[] {\n return allTags.map((t) => ({\n name: t.name,\n created_at: toISOString(t.created_at),\n }))\n}\n\n/**\n * Convert shard flat tags to browser format for insertion.\n * Returns unique tag names ready for note_tag association.\n */\nexport function tagsFromShard(shardTags: ShardTag[]): string[] {\n return [...new Set(shardTags.map((t) => t.name))]\n}\n\n// ── Embeddings ───────────────────────────────────────────────────────────\n\n/** Convert a browser embedding_set to shard format. */\nexport function embeddingSetToShard(set: {\n id: string\n name?: string\n purpose?: string | null\n model_name: string\n dimensions: number\n kind?: 'physical' | 'filter' | 'virtual'\n mode?: 'auto' | 'manual' | 'mixed' | null\n truncate_dimension?: number | null\n criteria_json?: unknown | null\n source_json?: unknown | null\n compatibility_json?: unknown | null\n materialization_json?: unknown | null\n freshness_json?: unknown | null\n created_at: Date | string\n updated_at?: Date | string\n}): ShardEmbeddingSet {\n return {\n id: set.id,\n name: set.name ?? set.model_name,\n purpose: set.purpose ?? null,\n model: set.model_name,\n dimension: set.dimensions,\n kind: set.kind ?? 'physical',\n mode: set.mode ?? null,\n truncate_dimension: set.truncate_dimension ?? null,\n criteria: jsonObject(set.criteria_json),\n source: jsonObject(set.source_json),\n compatibility: jsonObject(set.compatibility_json),\n materialization: jsonObject(set.materialization_json),\n freshness: jsonObject(set.freshness_json) as ShardEmbeddingSet['freshness'],\n created_at: toISOString(set.created_at),\n updated_at: set.updated_at ? toISOString(set.updated_at) : undefined,\n }\n}\n\n/** Convert a shard embedding set back to browser format. */\nexport function embeddingSetFromShard(shard: ShardEmbeddingSet): {\n id: string\n name: string\n purpose: string | null\n model_name: string\n dimensions: number\n kind: 'physical' | 'filter' | 'virtual'\n mode: 'auto' | 'manual' | 'mixed' | null\n truncate_dimension: number | null\n criteria_json: string | null\n source_json: string | null\n compatibility_json: string | null\n materialization_json: string | null\n freshness_json: string | null\n created_at: string\n updated_at: string | null\n} {\n return {\n id: shard.id,\n name: shard.name ?? shard.model,\n purpose: shard.purpose ?? null,\n model_name: shard.model,\n dimensions: shard.dimension,\n kind: shard.kind ?? 'physical',\n mode: shard.mode ?? null,\n truncate_dimension: shard.truncate_dimension ?? null,\n criteria_json: jsonString(shard.criteria),\n source_json: jsonString(shard.source),\n compatibility_json: jsonString(shard.compatibility),\n materialization_json: jsonString(shard.materialization),\n freshness_json: jsonString(shard.freshness),\n created_at: shard.created_at,\n updated_at: shard.updated_at ?? null,\n }\n}\n\n/** Convert a browser embedding_set_member to shard format. */\nexport function embeddingSetMemberToShard(member: {\n embedding_set_id: string\n note_id: string\n embedding_id: string\n}): ShardEmbeddingSetMember {\n return {\n embedding_set_id: member.embedding_set_id,\n note_id: member.note_id,\n embedding_id: member.embedding_id,\n }\n}\n\n/** Convert a browser embedding to shard format. */\nexport function embeddingToShard(emb: {\n id: string\n note_id: string\n embedding_set_id: string\n vector: string | number[]\n created_at: Date | string\n}): ShardEmbedding {\n return {\n id: emb.id,\n note_id: emb.note_id,\n embedding_set_id: emb.embedding_set_id,\n vector: typeof emb.vector === 'string' ? parseVector(emb.vector) : emb.vector,\n created_at: toISOString(emb.created_at),\n }\n}\n\n/** Convert a shard embedding back to browser format. */\nexport function embeddingFromShard(shard: ShardEmbedding): {\n id: string\n note_id: string\n embedding_set_id: string\n vector: string\n created_at: string\n} {\n return {\n id: shard.id,\n note_id: shard.note_id,\n embedding_set_id: shard.embedding_set_id,\n vector: `[${shard.vector.join(',')}]`,\n created_at: shard.created_at,\n }\n}\n\n\n// ── SKOS ─────────────────────────────────────────────────────────────────\n\nexport function skosSchemeToShard(scheme: {\n id: string\n title: string\n description: string | null\n created_at: Date | string\n updated_at: Date | string\n}): ShardSkosScheme {\n return {\n id: scheme.id,\n title: scheme.title,\n description: scheme.description,\n created_at: toISOString(scheme.created_at),\n updated_at: toISOString(scheme.updated_at),\n }\n}\n\nexport function skosConceptToShard(concept: {\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[] | string | null\n definition: string | null\n created_at: Date | string\n updated_at: Date | string\n}): ShardSkosConcept {\n return {\n id: concept.id,\n scheme_id: concept.scheme_id,\n pref_label: concept.pref_label,\n alt_labels: parseJsonArrayField(concept.alt_labels),\n definition: concept.definition,\n created_at: toISOString(concept.created_at),\n updated_at: toISOString(concept.updated_at),\n }\n}\n\nexport function skosRelationToShard(relation: {\n id: string\n source_concept_id: string\n target_concept_id: string\n relation_type: 'broader' | 'narrower' | 'related'\n created_at: Date | string\n}): ShardSkosRelation {\n return {\n id: relation.id,\n source_concept_id: relation.source_concept_id,\n target_concept_id: relation.target_concept_id,\n relation_type: relation.relation_type,\n created_at: toISOString(relation.created_at),\n }\n}\n\nexport function noteSkosTagToShard(tag: {\n id: string\n note_id: string\n concept_id: string\n created_at: Date | string\n}): ShardNoteSkosTag {\n return {\n id: tag.id,\n note_id: tag.note_id,\n concept_id: tag.concept_id,\n created_at: toISOString(tag.created_at),\n }\n}\n\n// ── Provenance ───────────────────────────────────────────────────────────\n\nexport function provenanceEdgeToShard(edge: {\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: Date | string\n ended_at: Date | string | null\n attributes: Record<string, unknown> | string | null\n}): ShardProvenanceEdge {\n return {\n id: edge.id,\n entity_type: edge.entity_type,\n entity_id: edge.entity_id,\n activity: edge.activity,\n agent: edge.agent,\n started_at: toISOString(edge.started_at),\n ended_at: edge.ended_at ? toISOString(edge.ended_at) : null,\n attributes: parseJsonObjectField(edge.attributes),\n }\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────\n\nfunction toISOString(date: Date | string): string {\n if (date instanceof Date) return date.toISOString()\n return date\n}\n\n/** Parse a PGlite vector string \"[0.1,0.2,...]\" into a number array. */\nfunction parseVector(vectorStr: string): number[] {\n const inner = vectorStr.replace(/^\\[/, '').replace(/\\]$/, '')\n return inner.split(',').map(Number)\n}\n\nfunction parseJsonArrayField(value: string[] | string | null): string[] {\n if (Array.isArray(value)) return value\n if (!value) return []\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? parsed.map(String) : []\n}\n\nfunction parseJsonObjectField(value: Record<string, unknown> | string | null): Record<string, unknown> | null {\n if (!value) return null\n if (typeof value !== 'string') return value\n const parsed = JSON.parse(value)\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as Record<string, unknown> : null\n}\n\nfunction jsonObject(value: unknown): Record<string, unknown> | null {\n if (value == null) return null\n if (typeof value === 'string') return JSON.parse(value) as Record<string, unknown>\n return value as Record<string, unknown>\n}\n\nfunction jsonString(value: unknown): string | null {\n return value == null ? null : JSON.stringify(value)\n}\n","/**\n * Shard export pipeline — query all entities, serialize, pack into .shard archive.\n *\n * Pipeline: query DB → field-map → serialize (JSONL/JSON) → compute checksums → build manifest → tar.gz\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { VERSION } from '../index.js'\nimport { packTarGz } from './shard-tar.js'\nimport { sha256Hex } from './checksum.js'\nimport {\n noteToShard,\n linkToShard,\n collectionToShard,\n tagsToShard,\n embeddingSetToShard,\n embeddingSetMemberToShard,\n embeddingToShard,\n skosSchemeToShard,\n skosConceptToShard,\n skosRelationToShard,\n noteSkosTagToShard,\n provenanceEdgeToShard,\n} from './field-mapper.js'\nimport type { BrowserNoteExport } from './field-mapper.js'\nimport type { LinkRow } from '../repositories/links-repository.js'\nimport type { CollectionRow } from '../repositories/collections-repository.js'\nimport {\n CURRENT_SHARD_VERSION,\n SHARD_FORMAT,\n} from './types.js'\nimport type {\n ExportOptions,\n ShardManifest,\n ShardComponent,\n ShardClusterRef,\n ShardLayout,\n} from './types.js'\n\nconst encoder = new TextEncoder()\n\nfunction jsonObject(value: unknown): Record<string, unknown> | undefined {\n if (value == null) return undefined\n if (typeof value === 'string') return JSON.parse(value) as Record<string, unknown>\n return value as Record<string, unknown>\n}\n\nfunction iso(value: Date | string): string {\n return value instanceof Date ? value.toISOString() : value\n}\n\n/**\n * Export knowledge data from the database as a .shard archive (Uint8Array).\n *\n * @param db DatabaseClient database instance\n * @param options Export options (includeEmbeddings, collectionId filter)\n * @returns Compressed shard archive bytes\n */\nexport async function exportShard(\n db: DatabaseClient,\n options?: ExportOptions,\n): Promise<Uint8Array> {\n const files = new Map<string, Uint8Array>()\n const components: ShardComponent[] = []\n const counts: ShardManifest['counts'] = {}\n\n // ── Query notes ─────────────────────────────────────────────────────\n let noteQuery: string\n let noteParams: unknown[]\n\n if (options?.collectionId) {\n noteQuery = `SELECT n.id, n.title, n.format, n.source, n.is_starred, n.is_archived,\n n.created_at, n.updated_at, n.deleted_at,\n o.content as original_content,\n c.content as revised_content\n FROM note n\n LEFT JOIN note_original o ON o.note_id = n.id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n JOIN collection_note cn ON cn.note_id = n.id\n WHERE n.deleted_at IS NULL AND cn.collection_id = $1\n ORDER BY n.created_at`\n noteParams = [options.collectionId]\n } else if (options?.tag) {\n noteQuery = `SELECT n.id, n.title, n.format, n.source, n.is_starred, n.is_archived,\n n.created_at, n.updated_at, n.deleted_at,\n o.content as original_content,\n c.content as revised_content\n FROM note n\n LEFT JOIN note_original o ON o.note_id = n.id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n JOIN note_tag nt ON nt.note_id = n.id AND nt.tag = $1\n WHERE n.deleted_at IS NULL\n ORDER BY n.created_at`\n noteParams = [options.tag]\n } else {\n noteQuery = `SELECT n.id, n.title, n.format, n.source, n.is_starred, n.is_archived,\n n.created_at, n.updated_at, n.deleted_at,\n o.content as original_content,\n c.content as revised_content\n FROM note n\n LEFT JOIN note_original o ON o.note_id = n.id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE n.deleted_at IS NULL\n ORDER BY n.created_at`\n noteParams = []\n }\n\n const noteRows = await db.query<{\n id: string\n title: string | null\n format: string\n source: string\n is_starred: boolean\n is_archived: boolean\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n original_content: string\n revised_content: string | null\n }>(noteQuery, noteParams)\n\n // Fetch tags per note\n const tagRows = await db.query<{ note_id: string; tag: string }>(\n `SELECT note_id, tag FROM note_tag ORDER BY note_id, tag`,\n )\n const tagsByNote = new Map<string, string[]>()\n for (const row of tagRows.rows) {\n const tags = tagsByNote.get(row.note_id) ?? []\n tags.push(row.tag)\n tagsByNote.set(row.note_id, tags)\n }\n\n const notes: BrowserNoteExport[] = noteRows.rows.map((row) => ({\n ...row,\n tags: tagsByNote.get(row.id) ?? [],\n }))\n\n // Collect exported note IDs for scoping related data\n const exportedNoteIds = new Set(notes.map((n) => n.id))\n\n const shardNotes = notes.map((n) => noteToShard(n))\n let layout: ShardLayout | undefined\n const clusterSize = options?.clusterNotesSize\n if (clusterSize && Number.isInteger(clusterSize) && clusterSize > 0 && shardNotes.length > 0) {\n // Clustered layout: one addressable file per `clusterSize` records (issue #189).\n const clusters: ShardClusterRef[] = []\n for (let offset = 0; offset < shardNotes.length; offset += clusterSize) {\n const slice = shardNotes.slice(offset, offset + clusterSize)\n const href = `notes/${String(offset).padStart(6, '0')}.jsonl`\n clusters.push({ href, offset, count: slice.length })\n files.set(href, encoder.encode(slice.map((n) => JSON.stringify(n)).join('\\n')))\n }\n layout = { clusters: { notes: clusters } }\n } else {\n files.set('notes.jsonl', encoder.encode(shardNotes.map((n) => JSON.stringify(n)).join('\\n')))\n }\n components.push('notes')\n counts.notes = notes.length\n\n // ── Query collections ───────────────────────────────────────────────\n const collectionRows = await db.query<CollectionRow>(\n `SELECT * FROM collection WHERE deleted_at IS NULL ORDER BY position, name`,\n )\n // Get note counts per collection\n const collNoteCountRows = await db.query<{ collection_id: string; cnt: string }>(\n `SELECT collection_id, COUNT(*) as cnt FROM collection_note GROUP BY collection_id`,\n )\n const noteCountMap = new Map<string, number>()\n for (const row of collNoteCountRows.rows) {\n noteCountMap.set(row.collection_id, parseInt(row.cnt, 10))\n }\n\n const shardCollections = collectionRows.rows.map((c) =>\n collectionToShard(c, noteCountMap.get(c.id) ?? 0),\n )\n files.set('collections.json', encoder.encode(JSON.stringify(shardCollections)))\n components.push('collections')\n counts.collections = shardCollections.length\n\n // ── Query tags (unique list, scoped to exported notes) ──────────────\n const allTagRows = await db.query<{ tag: string }>(\n `SELECT DISTINCT tag FROM note_tag ORDER BY tag`,\n )\n // When filtering, only include tags that appear on exported notes\n const isFiltered = !!(options?.tag || options?.collectionId)\n const relevantTags = isFiltered\n ? allTagRows.rows.filter((r) => {\n for (const note of notes) {\n if (note.tags.includes(r.tag)) return true\n }\n return false\n })\n : allTagRows.rows\n const shardTags = tagsToShard(\n relevantTags.map((r) => ({ name: r.tag, created_at: new Date() })),\n )\n files.set('tags.json', encoder.encode(JSON.stringify(shardTags)))\n components.push('tags')\n counts.tags = shardTags.length\n\n // ── Query links (scoped to exported notes) ──────────────────────────\n const linkRows = await db.query<LinkRow>(\n `SELECT * FROM link WHERE deleted_at IS NULL ORDER BY created_at`,\n )\n // When filtering, only include links where both endpoints are in the export\n const filteredLinks = (options?.tag || options?.collectionId)\n ? linkRows.rows.filter((l) => exportedNoteIds.has(l.source_note_id) && exportedNoteIds.has(l.target_note_id))\n : linkRows.rows\n const linksJsonl = filteredLinks.map((l) => JSON.stringify(linkToShard(l))).join('\\n')\n files.set('links.jsonl', encoder.encode(linksJsonl))\n components.push('links')\n counts.links = filteredLinks.length\n\n\n // ── Query SKOS (scoped to exported notes when filtered) ─────────────\n const allNoteSkosRows = await db.query<{\n id: string\n note_id: string\n concept_id: string\n created_at: Date\n }>(`SELECT * FROM note_skos_tag ORDER BY created_at`)\n const filteredNoteSkosRows = isFiltered\n ? allNoteSkosRows.rows.filter((row) => exportedNoteIds.has(row.note_id))\n : allNoteSkosRows.rows\n const referencedConceptIds = new Set(filteredNoteSkosRows.map((row) => row.concept_id))\n\n const allConceptRows = await db.query<{\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[] | string | null\n definition: string | null\n created_at: Date\n updated_at: Date\n }>(`SELECT * FROM skos_concept WHERE deleted_at IS NULL ORDER BY pref_label`)\n const filteredConceptRows = isFiltered\n ? allConceptRows.rows.filter((row) => referencedConceptIds.has(row.id))\n : allConceptRows.rows\n const exportedConceptIds = new Set(filteredConceptRows.map((row) => row.id))\n const exportedSchemeIds = new Set(filteredConceptRows.map((row) => row.scheme_id))\n\n const allSchemeRows = await db.query<{\n id: string\n title: string\n description: string | null\n created_at: Date\n updated_at: Date\n }>(`SELECT * FROM skos_scheme WHERE deleted_at IS NULL ORDER BY title`)\n const filteredSchemeRows = isFiltered\n ? allSchemeRows.rows.filter((row) => exportedSchemeIds.has(row.id))\n : allSchemeRows.rows\n\n const allRelationRows = await db.query<{\n id: string\n source_concept_id: string\n target_concept_id: string\n relation_type: 'broader' | 'narrower' | 'related'\n created_at: Date\n }>(`SELECT * FROM skos_concept_relation ORDER BY created_at`)\n const filteredRelationRows = isFiltered\n ? allRelationRows.rows.filter((row) =>\n exportedConceptIds.has(row.source_concept_id) && exportedConceptIds.has(row.target_concept_id),\n )\n : allRelationRows.rows\n\n const shardSkosSchemes = filteredSchemeRows.map(skosSchemeToShard)\n files.set('skos_schemes.json', encoder.encode(JSON.stringify(shardSkosSchemes)))\n components.push('skos_schemes')\n counts.skos_schemes = shardSkosSchemes.length\n\n const shardSkosConcepts = filteredConceptRows.map(skosConceptToShard)\n files.set('skos_concepts.json', encoder.encode(JSON.stringify(shardSkosConcepts)))\n components.push('skos_concepts')\n counts.skos_concepts = shardSkosConcepts.length\n\n const skosRelationsJsonl = filteredRelationRows.map((row) => JSON.stringify(skosRelationToShard(row))).join('\\n')\n files.set('skos_relations.jsonl', encoder.encode(skosRelationsJsonl))\n components.push('skos_relations')\n counts.skos_relations = filteredRelationRows.length\n\n const noteSkosJsonl = filteredNoteSkosRows.map((row) => JSON.stringify(noteSkosTagToShard(row))).join('\\n')\n files.set('note_skos_tags.jsonl', encoder.encode(noteSkosJsonl))\n components.push('note_skos_tags')\n counts.note_skos_tags = filteredNoteSkosRows.length\n\n // ── Query provenance (scoped to exported notes when filtered) ───────\n const provenanceRows = await db.query<{\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: Date\n ended_at: Date | null\n attributes: Record<string, unknown> | string | null\n }>(`SELECT * FROM provenance_edge ORDER BY started_at`)\n const filteredProvenanceRows = isFiltered\n ? provenanceRows.rows.filter((row) => row.entity_type !== 'note' || exportedNoteIds.has(row.entity_id))\n : provenanceRows.rows\n const provenanceJsonl = filteredProvenanceRows.map((row) => JSON.stringify(provenanceEdgeToShard(row))).join('\\n')\n files.set('provenance_edges.jsonl', encoder.encode(provenanceJsonl))\n components.push('provenance_edges')\n counts.provenance_edges = filteredProvenanceRows.length\n\n // ── Query embeddings (optional) ─────────────────────────────────────\n if (options?.includeEmbeddings) {\n const embeddingSetIds = options.embeddingSetIds?.filter(Boolean) ?? []\n const setScoped = embeddingSetIds.length > 0\n const includeMaterializedSelectors = options.includeMaterializedSelectors === true\n const embSetRows = await db.query<{\n id: string\n name: string\n purpose: string | null\n model_name: string\n dimensions: number\n kind?: 'physical' | 'filter' | 'virtual'\n mode?: 'auto' | 'manual' | 'mixed' | null\n truncate_dimension?: number | null\n criteria_json?: unknown | null\n source_json?: unknown | null\n compatibility_json?: unknown | null\n materialization_json?: unknown | null\n freshness_json?: unknown | null\n created_at: Date\n updated_at?: Date\n }>(\n `SELECT * FROM embedding_set\n ${setScoped ? 'WHERE id = ANY($1)' : ''}\n ORDER BY created_at`,\n setScoped ? [embeddingSetIds] : [],\n )\n const exportedSetIds = new Set(embSetRows.rows.map((row) => row.id))\n const virtualSetIds = new Set(embSetRows.rows.filter((row) => row.kind === 'virtual').map((row) => row.id))\n\n const shardEmbSets = embSetRows.rows.map((row) => embeddingSetToShard(\n row.kind === 'virtual' && !includeMaterializedSelectors\n ? {\n ...row,\n materialization_json: undefined,\n freshness_json: { status: 'unknown' },\n }\n : row,\n ))\n files.set('embedding_sets.json', encoder.encode(JSON.stringify(shardEmbSets)))\n components.push('embedding_sets')\n counts.embedding_sets = shardEmbSets.length\n\n const embMemberRows = await db.query<{\n embedding_set_id: string\n note_id: string\n embedding_id: string\n }>(\n `SELECT * FROM embedding_set_member\n ${setScoped ? 'WHERE embedding_set_id = ANY($1)' : ''}`,\n setScoped ? [embeddingSetIds] : [],\n )\n const scopedEmbMemberRows = embMemberRows.rows.filter((member) =>\n exportedSetIds.has(member.embedding_set_id) &&\n exportedNoteIds.has(member.note_id) &&\n (includeMaterializedSelectors || !virtualSetIds.has(member.embedding_set_id)),\n )\n\n const membersJsonl = scopedEmbMemberRows\n .map((m) => JSON.stringify(embeddingSetMemberToShard(m)))\n .join('\\n')\n files.set('embedding_set_members.jsonl', encoder.encode(membersJsonl))\n components.push('embedding_set_members')\n counts.embedding_set_members = scopedEmbMemberRows.length\n\n const embRows = await db.query<{\n id: string\n note_id: string\n embedding_set_id: string\n vector: string\n created_at: Date\n }>(\n `SELECT * FROM embedding\n ${setScoped ? 'WHERE embedding_set_id = ANY($1)' : ''}\n ORDER BY created_at`,\n setScoped ? [embeddingSetIds] : [],\n )\n const memberEmbeddingIds = new Set(scopedEmbMemberRows.map((member) => member.embedding_id))\n const scopedEmbRows = embRows.rows.filter((embedding) =>\n exportedSetIds.has(embedding.embedding_set_id) &&\n exportedNoteIds.has(embedding.note_id) &&\n (memberEmbeddingIds.size === 0 || memberEmbeddingIds.has(embedding.id)),\n )\n\n const embJsonl = scopedEmbRows.map((e) => JSON.stringify(embeddingToShard(e))).join('\\n')\n files.set('embeddings.jsonl', encoder.encode(embJsonl))\n components.push('embeddings')\n counts.embeddings = scopedEmbRows.length\n }\n\n\n\n // -- Query graph/community artifacts (optional) ----------------------\n const graphSourceRows = await db.query<{\n id: string\n name: string\n kind: 'link' | 'similarity' | 'search' | 'manual' | 'imported'\n source_table: 'link' | 'embedding' | 'manual' | null\n embedding_set_id: string | null\n virtual_set_id: string | null\n model: string | null\n dimension: number | null\n truncate_dimension: number | null\n metric: 'cosine' | 'inner_product' | 'l2' | null\n algorithm: string | null\n parameters_json: unknown | null\n input_hash: string\n freshness_json: unknown\n created_at: Date\n }>(`SELECT * FROM graph_source ORDER BY created_at, id`)\n const graphScoped = !!options?.embeddingSetIds?.length\n const scopedGraphSourceRows = graphScoped\n ? graphSourceRows.rows.filter((row) => !row.embedding_set_id || options.embeddingSetIds?.includes(row.embedding_set_id))\n : graphSourceRows.rows\n const exportedGraphSourceIds = new Set(scopedGraphSourceRows.map((row) => row.id))\n if (scopedGraphSourceRows.length > 0) {\n const shardGraphSources = scopedGraphSourceRows.map((row) => ({\n id: row.id,\n name: row.name,\n kind: row.kind,\n source_table: row.source_table,\n embedding_set_id: row.embedding_set_id,\n virtual_set_id: row.virtual_set_id,\n model: row.model,\n dimension: row.dimension,\n truncate_dimension: row.truncate_dimension,\n metric: row.metric,\n algorithm: row.algorithm,\n parameters: jsonObject(row.parameters_json),\n input_hash: row.input_hash,\n freshness: jsonObject(row.freshness_json) ?? { status: 'unknown' },\n created_at: iso(row.created_at),\n }))\n files.set('graph_sources.json', encoder.encode(JSON.stringify(shardGraphSources)))\n components.push('graph_sources')\n counts.graph_sources = shardGraphSources.length\n }\n\n const graphEdgeRows = await db.query<{\n graph_source_id: string\n from_note_id: string\n to_note_id: string\n weight: number\n kind: 'link' | 'similarity' | 'manual'\n rank: number | null\n metadata_json: unknown | null\n }>(`SELECT * FROM graph_edge_artifact ORDER BY graph_source_id, from_note_id, to_note_id, kind`)\n const scopedGraphEdgeRows = graphScoped\n ? graphEdgeRows.rows.filter((row) => exportedGraphSourceIds.has(row.graph_source_id))\n : graphEdgeRows.rows\n if (scopedGraphEdgeRows.length > 0) {\n const graphEdgesJsonl = scopedGraphEdgeRows.map((row) => JSON.stringify({\n graph_source_id: row.graph_source_id,\n from_note_id: row.from_note_id,\n to_note_id: row.to_note_id,\n weight: row.weight,\n kind: row.kind,\n rank: row.rank,\n metadata: jsonObject(row.metadata_json),\n })).join('\\n')\n files.set('graph_edges.jsonl', encoder.encode(graphEdgesJsonl))\n components.push('graph_edges')\n counts.graph_edges = scopedGraphEdgeRows.length\n }\n\n const communitySetRows = await db.query<{\n id: string\n graph_source_id: string\n name: string\n source_type: 'precomputed' | 'dynamic-snapshot' | 'user-authored' | 'imported'\n algorithm: string | null\n parameters_json: unknown | null\n input_hash: string\n freshness_json: unknown\n created_at: Date\n }>(`SELECT * FROM community_set ORDER BY created_at, id`)\n const communityRows = await db.query<{\n id: string\n community_set_id: string\n label: string | null\n rank: number | null\n size: number | null\n confidence: number | null\n representative_note_ids: string[] | null\n metadata_json: unknown | null\n }>(`SELECT * FROM community ORDER BY community_set_id, rank NULLS LAST, id`)\n const scopedCommunitySetRows = graphScoped\n ? communitySetRows.rows.filter((row) => exportedGraphSourceIds.has(row.graph_source_id))\n : communitySetRows.rows\n const exportedCommunitySetIds = new Set(scopedCommunitySetRows.map((row) => row.id))\n const scopedCommunityRows = graphScoped\n ? communityRows.rows.filter((row) => exportedCommunitySetIds.has(row.community_set_id))\n : communityRows.rows\n if (scopedCommunitySetRows.length > 0) {\n const communitiesBySet = new Map<string, typeof communityRows.rows>()\n for (const row of scopedCommunityRows) {\n const rows = communitiesBySet.get(row.community_set_id) ?? []\n rows.push(row)\n communitiesBySet.set(row.community_set_id, rows)\n }\n const shardCommunitySets = scopedCommunitySetRows.map((row) => ({\n id: row.id,\n graph_source_id: row.graph_source_id,\n name: row.name,\n source_type: row.source_type,\n algorithm: row.algorithm,\n parameters: jsonObject(row.parameters_json),\n input_hash: row.input_hash,\n freshness: jsonObject(row.freshness_json) ?? { status: 'unknown' },\n communities: (communitiesBySet.get(row.id) ?? []).map((community) => ({\n id: community.id,\n label: community.label,\n rank: community.rank,\n size: community.size,\n confidence: community.confidence,\n representative_note_ids: community.representative_note_ids ?? [],\n metadata: jsonObject(community.metadata_json),\n })),\n created_at: iso(row.created_at),\n }))\n files.set('communities.json', encoder.encode(JSON.stringify(shardCommunitySets)))\n components.push('communities')\n counts.community_sets = shardCommunitySets.length\n counts.communities = scopedCommunityRows.length\n }\n\n const assignmentRows = await db.query<{\n community_set_id: string\n community_id: string\n note_id: string\n confidence: number | null\n source_type: 'precomputed' | 'dynamic-snapshot' | 'user-authored' | 'imported'\n metadata_json: unknown | null\n }>(`SELECT * FROM community_assignment ORDER BY community_set_id, community_id, note_id`)\n const scopedAssignmentRows = graphScoped\n ? assignmentRows.rows.filter((row) => exportedCommunitySetIds.has(row.community_set_id))\n : assignmentRows.rows\n if (scopedAssignmentRows.length > 0) {\n const assignmentsJsonl = scopedAssignmentRows.map((row) => JSON.stringify({\n community_set_id: row.community_set_id,\n community_id: row.community_id,\n note_id: row.note_id,\n confidence: row.confidence,\n source_type: row.source_type,\n metadata: jsonObject(row.metadata_json),\n })).join('\\n')\n files.set('community_assignments.jsonl', encoder.encode(assignmentsJsonl))\n components.push('community_assignments')\n counts.community_assignments = scopedAssignmentRows.length\n }\n\n // ── Compute checksums ───────────────────────────────────────────────\n const checksums: Record<string, string> = {}\n for (const [filename, data] of files) {\n checksums[filename] = await sha256Hex(data)\n }\n\n // ── Build manifest ──────────────────────────────────────────────────\n const manifest: ShardManifest = {\n version: CURRENT_SHARD_VERSION,\n matric_version: VERSION,\n format: SHARD_FORMAT,\n created_at: new Date().toISOString(),\n components,\n counts,\n checksums,\n min_reader_version: '1.0.0',\n ...(layout ? { layout } : {}),\n }\n files.set('manifest.json', encoder.encode(JSON.stringify(manifest, null, 2)))\n\n // ── Pack tar.gz ─────────────────────────────────────────────────────\n return packTarGz(files)\n}\n","/**\n * Shard import pipeline — unpack, validate, field-map, transactional insert.\n *\n * Pipeline: ArrayBuffer → gunzip → untar → parse manifest → validate checksums →\n * parse components → field-map → BEGIN transaction → INSERT all → COMMIT\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { unpackTarGz } from './shard-tar.js'\nimport { validateChecksums } from './checksum.js'\nimport {\n noteFromShard,\n linkFromShard,\n collectionFromShard,\n embeddingSetFromShard,\n embeddingFromShard,\n} from './field-mapper.js'\nimport { generateId } from '../uuid.js'\nimport { computeHash } from '../hash.js'\nimport { CURRENT_SHARD_VERSION } from './types.js'\nimport type {\n ShardManifest,\n ImportOptions,\n ImportResult,\n ImportCounts,\n ShardNote,\n ShardLink,\n ShardCollection,\n ShardTag,\n ShardEmbeddingSet,\n ShardEmbeddingSetMember,\n ShardEmbedding,\n ShardSkosScheme,\n ShardSkosConcept,\n ShardSkosRelation,\n ShardNoteSkosTag,\n ShardProvenanceEdge,\n ShardGraphSource,\n ShardGraphEdge,\n ShardCommunitySet,\n ShardCommunityAssignment,\n} from './types.js'\n\nconst decoder = new TextDecoder()\nconst DEFAULT_BATCH_SIZE = 250\n\nasync function yieldToEventLoop(): Promise<void> {\n const scheduler = (globalThis as unknown as { scheduler?: { yield?: () => Promise<void> } }).scheduler\n if (scheduler?.yield) {\n await scheduler.yield()\n return\n }\n await new Promise<void>((resolve) => setTimeout(resolve, 0))\n}\n\nasync function maybeYield(done: number, batchSize: number): Promise<void> {\n if (batchSize > 0 && done > 0 && done % batchSize === 0) {\n await yieldToEventLoop()\n }\n}\n\n/**\n * Import a .shard archive into the database.\n *\n * The entire import is wrapped in a single transaction — if anything fails,\n * all changes are rolled back.\n *\n * @param db DatabaseClient database instance\n * @param data Raw archive bytes (from File API or fetch)\n * @param options Import options (conflict strategy)\n * @returns Import result with counts, warnings, and errors\n */\nexport async function importShard(\n db: DatabaseClient,\n data: Uint8Array | ArrayBuffer,\n options?: ImportOptions,\n): Promise<ImportResult> {\n const start = performance.now()\n const strategy = options?.conflictStrategy ?? 'skip'\n const batchSize = options?.batchSize ?? DEFAULT_BATCH_SIZE\n const report = options?.onProgress\n const warnings: string[] = []\n const errors: string[] = []\n const counts: ImportCounts = {\n notes: 0,\n collections: 0,\n tags: 0,\n links: 0,\n embedding_sets: 0,\n embedding_set_members: 0,\n embeddings: 0,\n skos_schemes: 0,\n skos_concepts: 0,\n skos_relations: 0,\n note_skos_tags: 0,\n provenance_edges: 0,\n graph_sources: 0,\n graph_edges: 0,\n community_sets: 0,\n communities: 0,\n community_assignments: 0,\n }\n const skipped: Partial<ImportCounts> = {}\n\n const inputData = data instanceof ArrayBuffer ? new Uint8Array(data) : data\n\n // ── Step 1: Unpack tar.gz ─────────────────────────────────────────────\n report?.({ phase: 'unpack', done: 0, total: 1 })\n let files: Map<string, Uint8Array>\n try {\n files = unpackTarGz(inputData)\n report?.({ phase: 'unpack', done: 1, total: 1 })\n } catch (err) {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: [`Failed to decompress archive: ${err instanceof Error ? err.message : String(err)}`],\n duration_ms: performance.now() - start,\n }\n }\n\n // ── Step 2: Parse and validate manifest ───────────────────────────────\n const manifestData = files.get('manifest.json')\n if (!manifestData) {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: ['Missing manifest.json in shard archive'],\n duration_ms: performance.now() - start,\n }\n }\n\n let manifest: ShardManifest\n try {\n manifest = JSON.parse(decoder.decode(manifestData))\n } catch {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: ['Invalid manifest.json: failed to parse JSON'],\n duration_ms: performance.now() - start,\n }\n }\n\n // Version compatibility check\n if (manifest.min_reader_version && manifest.min_reader_version > CURRENT_SHARD_VERSION) {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: [\n `Shard requires reader version ${manifest.min_reader_version}, ` +\n `but this version supports up to ${CURRENT_SHARD_VERSION}`,\n ],\n duration_ms: performance.now() - start,\n }\n }\n\n // ── Step 3: Validate checksums ────────────────────────────────────────\n report?.({ phase: 'validate', done: 0, total: 1 })\n const checksumResult = await validateChecksums(manifest.checksums, files)\n if (!checksumResult.valid) {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: [`Checksum validation failed for: ${checksumResult.failures.join(', ')}`],\n duration_ms: performance.now() - start,\n }\n }\n report?.({ phase: 'validate', done: 1, total: 1 })\n\n // ── Step 4: Parse all components ──────────────────────────────────────\n // Notes may be clustered (notes/000.jsonl, …) per the manifest layout (#189);\n // a monolithic notes.jsonl is the default. Concatenate clusters in offset order.\n const noteClusters = manifest.layout?.clusters?.notes\n const parsedNotes = noteClusters && noteClusters.length > 0\n ? [...noteClusters]\n .sort((a, b) => a.offset - b.offset)\n .flatMap((ref) => parseJsonl<ShardNote>(files.get(ref.href)))\n : parseJsonl<ShardNote>(files.get('notes.jsonl'))\n const parsedCollections = parseJsonArray<ShardCollection>(files.get('collections.json'))\n // Tags are embedded in notes as arrays — the global tags.json is informational only\n parseJsonArray<ShardTag>(files.get('tags.json')) // parsed for validation, not used directly\n const parsedLinks = parseJsonl<ShardLink>(files.get('links.jsonl'))\n const parsedEmbSets = parseJsonArray<ShardEmbeddingSet>(files.get('embedding_sets.json'))\n const parsedEmbMembers = parseJsonl<ShardEmbeddingSetMember>(\n files.get('embedding_set_members.jsonl'),\n )\n const parsedEmbeddings = parseJsonl<ShardEmbedding>(files.get('embeddings.jsonl'))\n const parsedSkosSchemes = parseJsonArray<ShardSkosScheme>(files.get('skos_schemes.json'))\n const parsedSkosConcepts = parseJsonArray<ShardSkosConcept>(files.get('skos_concepts.json'))\n const parsedSkosRelations = parseJsonl<ShardSkosRelation>(files.get('skos_relations.jsonl'))\n const parsedNoteSkosTags = parseJsonl<ShardNoteSkosTag>(files.get('note_skos_tags.jsonl'))\n const parsedProvenanceEdges = parseJsonl<ShardProvenanceEdge>(files.get('provenance_edges.jsonl'))\n const parsedGraphSources = parseJsonArray<ShardGraphSource>(files.get('graph_sources.json'))\n const parsedGraphEdges = parseJsonl<ShardGraphEdge>(files.get('graph_edges.jsonl'))\n const parsedCommunitySets = parseJsonArray<ShardCommunitySet>(files.get('communities.json'))\n const parsedCommunityAssignments = parseJsonl<ShardCommunityAssignment>(files.get('community_assignments.jsonl'))\n\n // Warn about unknown components\n const knownFiles = new Set([\n 'manifest.json',\n 'notes.jsonl',\n 'collections.json',\n 'tags.json',\n 'links.jsonl',\n 'embedding_sets.json',\n 'embedding_set_members.jsonl',\n 'embedding_configs.json',\n 'embeddings.jsonl',\n 'templates.json',\n 'skos_schemes.json',\n 'skos_concepts.json',\n 'skos_relations.jsonl',\n 'note_skos_tags.jsonl',\n 'provenance_edges.jsonl',\n 'graph_sources.json',\n 'graph_edges.jsonl',\n 'communities.json',\n 'community_assignments.jsonl',\n ])\n for (const filename of files.keys()) {\n if (!knownFiles.has(filename)) {\n warnings.push(`Unknown component skipped: ${filename}`)\n }\n }\n if (files.has('templates.json')) {\n warnings.push('templates.json skipped (not supported in browser)')\n }\n\n // ── Step 5: Transactional insert ──────────────────────────────────────\n const conflictClause = strategy === 'skip' ? 'ON CONFLICT DO NOTHING' : ''\n\n try {\n await db.transaction(async (tx) => {\n // Import collections first (notes may reference them)\n report?.({ phase: 'collections', done: 0, total: parsedCollections.length })\n for (const [index, shardCol] of parsedCollections.entries()) {\n const col = collectionFromShard(shardCol)\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO collection (id, name, description, parent_id, created_at)\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (id) DO UPDATE SET name = $2, description = $3, parent_id = $4`,\n [col.id, col.name, col.description, col.parent_id, col.created_at],\n )\n } else {\n await tx.query(\n `INSERT INTO collection (id, name, description, parent_id, created_at)\n VALUES ($1, $2, $3, $4, $5) ${conflictClause}`,\n [col.id, col.name, col.description, col.parent_id, col.created_at],\n )\n }\n counts.collections++\n report?.({ phase: 'collections', done: index + 1, total: parsedCollections.length })\n await maybeYield(index + 1, batchSize)\n }\n\n // Import notes\n report?.({ phase: 'notes', done: 0, total: parsedNotes.length })\n for (const [index, shardNote] of parsedNotes.entries()) {\n const note = noteFromShard(shardNote)\n const contentHash = computeHash(new TextEncoder().encode(note.original_content))\n\n if (strategy === 'replace') {\n // Upsert note\n await tx.query(\n `INSERT INTO note (id, title, format, source, is_starred, is_archived, created_at, updated_at, deleted_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n ON CONFLICT (id) DO UPDATE SET title = $2, format = $3, source = $4,\n is_starred = $5, is_archived = $6, updated_at = $8, deleted_at = $9`,\n [\n note.id, note.title, note.format, note.source,\n note.is_starred, note.is_archived,\n note.created_at, note.updated_at, note.deleted_at,\n ],\n )\n // Upsert original — note_original has id PK, so check if one exists for this note_id\n const existingOrig = await tx.query(\n `SELECT id FROM note_original WHERE note_id = $1`,\n [note.id],\n )\n if (existingOrig.rows.length > 0) {\n await tx.query(\n `UPDATE note_original SET content = $1, content_hash = $2 WHERE note_id = $3`,\n [note.original_content, contentHash, note.id],\n )\n } else {\n await tx.query(\n `INSERT INTO note_original (id, note_id, content, content_hash) VALUES ($1, $2, $3, $4)`,\n [generateId(), note.id, note.original_content, contentHash],\n )\n }\n // Upsert current revision (note_id is PK)\n await tx.query(\n `INSERT INTO note_revised_current (note_id, content)\n VALUES ($1, $2)\n ON CONFLICT (note_id) DO UPDATE SET content = $2`,\n [note.id, note.revised_content ?? note.original_content],\n )\n } else {\n // Insert note\n await tx.query(\n `INSERT INTO note (id, title, format, source, is_starred, is_archived, created_at, updated_at, deleted_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ${conflictClause}`,\n [\n note.id, note.title, note.format, note.source,\n note.is_starred, note.is_archived,\n note.created_at, note.updated_at, note.deleted_at,\n ],\n )\n // Insert original (unique on note_id)\n await tx.query(\n `INSERT INTO note_original (id, note_id, content, content_hash)\n VALUES ($1, $2, $3, $4) ${conflictClause}`,\n [generateId(), note.id, note.original_content, contentHash],\n )\n // Insert current revision\n await tx.query(\n `INSERT INTO note_revised_current (note_id, content)\n VALUES ($1, $2) ${conflictClause}`,\n [note.id, note.revised_content ?? note.original_content],\n )\n }\n\n // Import note tags\n for (const tag of note.tags) {\n await tx.query(\n `INSERT INTO note_tag (id, note_id, tag) VALUES ($1, $2, $3)\n ON CONFLICT (note_id, tag) DO NOTHING`,\n [generateId(), note.id, tag],\n )\n }\n\n counts.notes++\n report?.({ phase: 'notes', done: index + 1, total: parsedNotes.length })\n await maybeYield(index + 1, batchSize)\n }\n\n // Import SKOS schemes and concepts before note concept assignments.\n const totalSkos = parsedSkosSchemes.length + parsedSkosConcepts.length + parsedSkosRelations.length + parsedNoteSkosTags.length\n let doneSkos = 0\n report?.({ phase: 'skos', done: doneSkos, total: totalSkos })\n for (const scheme of parsedSkosSchemes) {\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO skos_scheme (id, title, description, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (id) DO UPDATE SET title = $2, description = $3, updated_at = $5`,\n [scheme.id, scheme.title, scheme.description, scheme.created_at, scheme.updated_at],\n )\n } else {\n await tx.query(\n `INSERT INTO skos_scheme (id, title, description, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5) ${conflictClause}`,\n [scheme.id, scheme.title, scheme.description, scheme.created_at, scheme.updated_at],\n )\n }\n counts.skos_schemes++\n report?.({ phase: 'skos', done: ++doneSkos, total: totalSkos })\n await maybeYield(doneSkos, batchSize)\n }\n\n for (const concept of parsedSkosConcepts) {\n const altLabels = JSON.stringify(concept.alt_labels ?? [])\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO skos_concept (id, scheme_id, pref_label, alt_labels, definition, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n ON CONFLICT (id) DO UPDATE SET scheme_id = $2, pref_label = $3, alt_labels = $4, definition = $5, updated_at = $7`,\n [concept.id, concept.scheme_id, concept.pref_label, altLabels, concept.definition, concept.created_at, concept.updated_at],\n )\n } else {\n await tx.query(\n `INSERT INTO skos_concept (id, scheme_id, pref_label, alt_labels, definition, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7) ${conflictClause}`,\n [concept.id, concept.scheme_id, concept.pref_label, altLabels, concept.definition, concept.created_at, concept.updated_at],\n )\n }\n counts.skos_concepts++\n report?.({ phase: 'skos', done: ++doneSkos, total: totalSkos })\n await maybeYield(doneSkos, batchSize)\n }\n\n // Import links\n report?.({ phase: 'links', done: 0, total: parsedLinks.length })\n for (const [index, shardLink] of parsedLinks.entries()) {\n const link = linkFromShard(shardLink)\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO link (id, source_note_id, target_note_id, link_type, confidence, created_at)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (id) DO UPDATE SET link_type = $4, confidence = $5`,\n [link.id, link.source_note_id, link.target_note_id, link.link_type, link.confidence, link.created_at],\n )\n } else {\n await tx.query(\n `INSERT INTO link (id, source_note_id, target_note_id, link_type, confidence, created_at)\n VALUES ($1, $2, $3, $4, $5, $6) ${conflictClause}`,\n [link.id, link.source_note_id, link.target_note_id, link.link_type, link.confidence, link.created_at],\n )\n }\n counts.links++\n report?.({ phase: 'links', done: index + 1, total: parsedLinks.length })\n await maybeYield(index + 1, batchSize)\n }\n\n // Import SKOS relations and note assignments after concepts and notes.\n for (const relation of parsedSkosRelations) {\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO skos_concept_relation (id, source_concept_id, target_concept_id, relation_type, created_at)\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (id) DO UPDATE SET source_concept_id = $2, target_concept_id = $3, relation_type = $4`,\n [relation.id, relation.source_concept_id, relation.target_concept_id, relation.relation_type, relation.created_at],\n )\n } else {\n await tx.query(\n `INSERT INTO skos_concept_relation (id, source_concept_id, target_concept_id, relation_type, created_at)\n VALUES ($1, $2, $3, $4, $5) ${conflictClause}`,\n [relation.id, relation.source_concept_id, relation.target_concept_id, relation.relation_type, relation.created_at],\n )\n }\n counts.skos_relations++\n report?.({ phase: 'skos', done: ++doneSkos, total: totalSkos })\n await maybeYield(doneSkos, batchSize)\n }\n\n for (const tag of parsedNoteSkosTags) {\n await tx.query(\n `INSERT INTO note_skos_tag (id, note_id, concept_id, created_at)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (note_id, concept_id) DO NOTHING`,\n [tag.id, tag.note_id, tag.concept_id, tag.created_at],\n )\n counts.note_skos_tags++\n report?.({ phase: 'skos', done: ++doneSkos, total: totalSkos })\n await maybeYield(doneSkos, batchSize)\n }\n\n // Import provenance edges.\n report?.({ phase: 'provenance', done: 0, total: parsedProvenanceEdges.length })\n for (const [index, edge] of parsedProvenanceEdges.entries()) {\n const attributes = edge.attributes === null ? null : JSON.stringify(edge.attributes)\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO provenance_edge (id, entity_type, entity_id, activity, agent, started_at, ended_at, attributes)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8)\n ON CONFLICT (id) DO UPDATE SET entity_type = $2, entity_id = $3, activity = $4, agent = $5, started_at = $6, ended_at = $7, attributes = $8`,\n [edge.id, edge.entity_type, edge.entity_id, edge.activity, edge.agent, edge.started_at, edge.ended_at, attributes],\n )\n } else {\n await tx.query(\n `INSERT INTO provenance_edge (id, entity_type, entity_id, activity, agent, started_at, ended_at, attributes)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8) ${conflictClause}`,\n [edge.id, edge.entity_type, edge.entity_id, edge.activity, edge.agent, edge.started_at, edge.ended_at, attributes],\n )\n }\n counts.provenance_edges++\n report?.({ phase: 'provenance', done: index + 1, total: parsedProvenanceEdges.length })\n await maybeYield(index + 1, batchSize)\n }\n\n // Import embedding sets\n report?.({ phase: 'embedding_sets', done: 0, total: parsedEmbSets.length })\n for (const [index, shardSet] of parsedEmbSets.entries()) {\n const set = embeddingSetFromShard(shardSet)\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO embedding_set (\n id, name, purpose, model_name, dimensions, kind, mode, truncate_dimension,\n criteria_json, source_json, compatibility_json, materialization_json, freshness_json, created_at, updated_at\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::jsonb, $10::jsonb, $11::jsonb, $12::jsonb, $13::jsonb, $14, COALESCE($15::timestamptz, $14::timestamptz))\n ON CONFLICT (id) DO UPDATE SET name = $2, purpose = $3, model_name = $4, dimensions = $5,\n kind = $6, mode = $7, truncate_dimension = $8, criteria_json = $9::jsonb, source_json = $10::jsonb,\n compatibility_json = $11::jsonb, materialization_json = $12::jsonb, freshness_json = $13::jsonb, updated_at = COALESCE($15::timestamptz, $14::timestamptz)`,\n [set.id, set.name, set.purpose, set.model_name, set.dimensions, set.kind, set.mode, set.truncate_dimension, set.criteria_json, set.source_json, set.compatibility_json, set.materialization_json, set.freshness_json, set.created_at, set.updated_at],\n )\n } else {\n await tx.query(\n `INSERT INTO embedding_set (\n id, name, purpose, model_name, dimensions, kind, mode, truncate_dimension,\n criteria_json, source_json, compatibility_json, materialization_json, freshness_json, created_at, updated_at\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::jsonb, $10::jsonb, $11::jsonb, $12::jsonb, $13::jsonb, $14, COALESCE($15::timestamptz, $14::timestamptz)) ${conflictClause}`,\n [set.id, set.name, set.purpose, set.model_name, set.dimensions, set.kind, set.mode, set.truncate_dimension, set.criteria_json, set.source_json, set.compatibility_json, set.materialization_json, set.freshness_json, set.created_at, set.updated_at],\n )\n }\n counts.embedding_sets++\n report?.({ phase: 'embedding_sets', done: index + 1, total: parsedEmbSets.length })\n await maybeYield(index + 1, batchSize)\n }\n\n // Import embeddings\n report?.({ phase: 'embeddings', done: 0, total: parsedEmbeddings.length })\n for (const [index, shardEmb] of parsedEmbeddings.entries()) {\n const emb = embeddingFromShard(shardEmb)\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO embedding (id, note_id, embedding_set_id, vector, created_at)\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (id) DO UPDATE SET vector = $4`,\n [emb.id, emb.note_id, emb.embedding_set_id, emb.vector, emb.created_at],\n )\n } else {\n await tx.query(\n `INSERT INTO embedding (id, note_id, embedding_set_id, vector, created_at)\n VALUES ($1, $2, $3, $4, $5) ${conflictClause}`,\n [emb.id, emb.note_id, emb.embedding_set_id, emb.vector, emb.created_at],\n )\n }\n counts.embeddings++\n report?.({ phase: 'embeddings', done: index + 1, total: parsedEmbeddings.length })\n await maybeYield(index + 1, batchSize)\n }\n\n\n\n // Import graph/community artifacts after primary graph inputs exist.\n const totalGraph = parsedGraphSources.length + parsedGraphEdges.length\n let doneGraph = 0\n report?.({ phase: 'graph', done: doneGraph, total: totalGraph })\n for (const source of parsedGraphSources) {\n const parameters = source.parameters == null ? null : JSON.stringify(source.parameters)\n const freshness = JSON.stringify({ ...(source.freshness ?? {}), status: 'unknown' })\n await tx.query(\n `INSERT INTO graph_source (\n id, name, kind, source_table, embedding_set_id, virtual_set_id, model, dimension,\n truncate_dimension, metric, algorithm, parameters_json, input_hash, freshness_json, created_at\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12::jsonb, $13, $14::jsonb, $15)\n ${strategy === 'replace'\n ? 'ON CONFLICT (id) DO UPDATE SET name = $2, kind = $3, source_table = $4, embedding_set_id = $5, virtual_set_id = $6, model = $7, dimension = $8, truncate_dimension = $9, metric = $10, algorithm = $11, parameters_json = $12::jsonb, input_hash = $13, freshness_json = $14::jsonb, created_at = $15'\n : conflictClause}`,\n [source.id, source.name, source.kind, source.source_table ?? null, source.embedding_set_id ?? null, source.virtual_set_id ?? null, source.model ?? null, source.dimension ?? null, source.truncate_dimension ?? null, source.metric ?? null, source.algorithm ?? null, parameters, source.input_hash, freshness, source.created_at],\n )\n counts.graph_sources++\n report?.({ phase: 'graph', done: ++doneGraph, total: totalGraph })\n await maybeYield(doneGraph, batchSize)\n }\n\n for (const edge of parsedGraphEdges) {\n const metadata = edge.metadata == null ? null : JSON.stringify(edge.metadata)\n await tx.query(\n `INSERT INTO graph_edge_artifact (graph_source_id, from_note_id, to_note_id, weight, kind, rank, metadata_json)\n VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb)\n ${strategy === 'replace'\n ? 'ON CONFLICT (graph_source_id, from_note_id, to_note_id, kind) DO UPDATE SET weight = $4, rank = $6, metadata_json = $7::jsonb'\n : conflictClause}`,\n [edge.graph_source_id, edge.from_note_id, edge.to_note_id, edge.weight, edge.kind, edge.rank ?? null, metadata],\n )\n counts.graph_edges++\n report?.({ phase: 'graph', done: ++doneGraph, total: totalGraph })\n await maybeYield(doneGraph, batchSize)\n }\n\n const totalCommunities = parsedCommunitySets.length + parsedCommunitySets.reduce((sum, set) => sum + (set.communities?.length ?? 0), 0) + parsedCommunityAssignments.length\n let doneCommunities = 0\n report?.({ phase: 'communities', done: doneCommunities, total: totalCommunities })\n for (const set of parsedCommunitySets) {\n const parameters = set.parameters == null ? null : JSON.stringify(set.parameters)\n const freshness = JSON.stringify({ ...(set.freshness ?? {}), status: 'unknown' })\n await tx.query(\n `INSERT INTO community_set (id, graph_source_id, name, source_type, algorithm, parameters_json, input_hash, freshness_json, created_at)\n VALUES ($1, $2, $3, $4, $5, $6::jsonb, $7, $8::jsonb, $9)\n ${strategy === 'replace'\n ? 'ON CONFLICT (id) DO UPDATE SET graph_source_id = $2, name = $3, source_type = $4, algorithm = $5, parameters_json = $6::jsonb, input_hash = $7, freshness_json = $8::jsonb, created_at = $9'\n : conflictClause}`,\n [set.id, set.graph_source_id, set.name, set.source_type, set.algorithm ?? null, parameters, set.input_hash, freshness, set.created_at],\n )\n counts.community_sets++\n report?.({ phase: 'communities', done: ++doneCommunities, total: totalCommunities })\n await maybeYield(doneCommunities, batchSize)\n\n for (const community of set.communities ?? []) {\n const metadata = community.metadata == null ? null : JSON.stringify(community.metadata)\n await tx.query(\n `INSERT INTO community (community_set_id, id, label, rank, size, confidence, representative_note_ids, metadata_json)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8::jsonb)\n ${strategy === 'replace'\n ? 'ON CONFLICT (community_set_id, id) DO UPDATE SET label = $3, rank = $4, size = $5, confidence = $6, representative_note_ids = $7, metadata_json = $8::jsonb'\n : conflictClause}`,\n [set.id, community.id, community.label ?? null, community.rank ?? null, community.size ?? null, community.confidence ?? null, community.representative_note_ids ?? [], metadata],\n )\n counts.communities++\n report?.({ phase: 'communities', done: ++doneCommunities, total: totalCommunities })\n await maybeYield(doneCommunities, batchSize)\n }\n }\n\n for (const assignment of parsedCommunityAssignments) {\n const metadata = assignment.metadata == null ? null : JSON.stringify(assignment.metadata)\n await tx.query(\n `INSERT INTO community_assignment (community_set_id, community_id, note_id, confidence, source_type, metadata_json)\n VALUES ($1, $2, $3, $4, $5, $6::jsonb)\n ${strategy === 'replace'\n ? 'ON CONFLICT (community_set_id, note_id) DO UPDATE SET community_id = $2, confidence = $4, source_type = $5, metadata_json = $6::jsonb'\n : conflictClause}`,\n [assignment.community_set_id, assignment.community_id, assignment.note_id, assignment.confidence ?? null, assignment.source_type, metadata],\n )\n counts.community_assignments++\n report?.({ phase: 'communities', done: ++doneCommunities, total: totalCommunities })\n await maybeYield(doneCommunities, batchSize)\n }\n\n // Import embedding set members\n report?.({ phase: 'embedding_set_members', done: 0, total: parsedEmbMembers.length })\n for (const [index, member] of parsedEmbMembers.entries()) {\n await tx.query(\n `INSERT INTO embedding_set_member (embedding_set_id, note_id, embedding_id)\n VALUES ($1, $2, $3) ON CONFLICT DO NOTHING`,\n [member.embedding_set_id, member.note_id, member.embedding_id],\n )\n counts.embedding_set_members++\n report?.({ phase: 'embedding_set_members', done: index + 1, total: parsedEmbMembers.length })\n await maybeYield(index + 1, batchSize)\n }\n })\n report?.({ phase: 'index', done: 1, total: 1 })\n } catch (err) {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: [`Transaction failed (rolled back): ${err instanceof Error ? err.message : String(err)}`],\n duration_ms: performance.now() - start,\n }\n }\n\n return {\n success: true,\n counts,\n skipped,\n warnings,\n errors,\n duration_ms: performance.now() - start,\n }\n}\n\n// ── Parsing helpers ───────────────────────────────────────────────────────\n\nfunction parseJsonl<T>(data: Uint8Array | undefined): T[] {\n if (!data || data.byteLength === 0) return []\n const text = decoder.decode(data)\n return text\n .split('\\n')\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as T)\n}\n\nfunction parseJsonArray<T>(data: Uint8Array | undefined): T[] {\n if (!data || data.byteLength === 0) return []\n return JSON.parse(decoder.decode(data)) as T[]\n}\n","/**\n * In-place Knowledge Shard reader (issue #189) — the static-file backend.\n *\n * A shard is already a self-describing bundle of formatted component files\n * (`notes.jsonl`, `links.jsonl`, `note_skos_tags.jsonl`, `skos_concepts.json`, …)\n * plus a `manifest.json`. `importShard` loads all of it into PGlite; this reader\n * is the *second* access mode of the SAME format: open the manifest and query the\n * component (or clustered) files directly, with NO PGlite — read-only, lightest.\n *\n * Capabilities (read-only): browse + get note, full-text + facet search, lazy\n * links/tags/concepts + full record. Semantic is opt-in via a pluggable provider\n * (none / brute-force cosine / prebuilt ANN snapshot) — see `StaticSemanticProvider`.\n */\n\nimport type {\n ShardClusterRef,\n ShardComponent,\n ShardLink,\n ShardManifest,\n ShardNote,\n ShardNoteSkosTag,\n ShardProvenanceEdge,\n ShardSkosConcept,\n ShardSkosRelation,\n} from './types.js'\nimport { CURRENT_SHARD_VERSION } from './types.js'\nimport { noteFromShard, type BrowserNoteExport } from './field-mapper.js'\nimport { unpackTarGz } from './shard-tar.js'\n\nconst decoder = new TextDecoder()\n\nfunction parseJsonlBytes<T>(data: Uint8Array | undefined): T[] {\n if (!data || data.byteLength === 0) return []\n return decoder.decode(data)\n .split('\\n')\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as T)\n}\n\nfunction parseJsonArrayBytes<T>(data: Uint8Array | undefined): T[] {\n if (!data || data.byteLength === 0) return []\n return JSON.parse(decoder.decode(data)) as T[]\n}\n\n/** The public note shape — the same browser-insertable record `importShard` produces. */\nexport type ShardReaderNote = BrowserNoteExport\n\nexport interface ShardSearchWeights {\n title: number\n content: number\n tag: number\n}\n\nconst DEFAULT_WEIGHTS: ShardSearchWeights = { title: 4, content: 1, tag: 2 }\n\nexport interface ShardListOptions {\n offset?: number\n limit?: number\n /** Include archived notes (default true). */\n includeArchived?: boolean\n /** Include soft-deleted notes (default false). */\n includeDeleted?: boolean\n}\n\nexport interface ShardSearchOptions extends ShardListOptions {\n /** AND-filter: note must carry every listed tag. */\n tags?: string[]\n /** OR-filter on note source. */\n source?: string[]\n rank?: boolean\n snippets?: boolean\n snippetLength?: number\n weights?: Partial<ShardSearchWeights>\n}\n\nexport interface ShardSearchRankedNote {\n note: ShardReaderNote\n rank: number\n snippet?: string\n}\n\nexport interface ShardSearchResult {\n items: ShardReaderNote[]\n total: number\n facets: { tags: Record<string, number>; source: Record<string, number> }\n rankedItems?: ShardSearchRankedNote[]\n /** Cluster files fetched to serve this query (0 when served from cache). */\n fetchedClusters: number\n}\n\nexport interface ShardNoteFull {\n note: ShardReaderNote\n links: ShardLink[]\n concepts: ShardSkosConcept[]\n provenance: ShardProvenanceEdge[]\n}\n\n/**\n * Opt-in semantic search over static files. The reader stays text/facets-only\n * unless a provider is supplied. Implementations span the tradeoff points:\n * brute-force cosine over a small static vector set, or a prebuilt ANN snapshot\n * for the full corpus. `prepare()` may lazily load whatever static asset it needs.\n */\nexport interface StaticSemanticProvider {\n prepare?(store: ShardComponentStore): Promise<void>\n search(query: string, k: number): Promise<Array<{ id: string; score: number }>>\n}\n\nexport interface OpenShardOptions {\n /** Static base URL when `source` is unpacked component files. */\n baseUrl?: string\n fetchImpl?: typeof fetch\n /** Optional semantic provider; absent → `semantic()` returns []. */\n semantic?: StaticSemanticProvider\n /** Bounds the cross-page search match cache (total cached note records). Default 5000. */\n maxCachedMatches?: number\n}\n\n/** Reads shard component/cluster files from a packed map or a static base URL. */\nexport interface ShardComponentStore {\n readonly manifest: ShardManifest\n read(filename: string): Promise<Uint8Array | undefined>\n}\n\nexport type ShardReaderSource = Uint8Array | Blob | { baseUrl: string; fetchImpl?: typeof fetch }\n\nasync function toBytes(blobOrBytes: Uint8Array | Blob): Promise<Uint8Array> {\n if (blobOrBytes instanceof Uint8Array) return blobOrBytes\n return new Uint8Array(await blobOrBytes.arrayBuffer())\n}\n\n/** A store backed by a fully-unpacked in-memory file map (packed tar.gz source). */\nclass PackedComponentStore implements ShardComponentStore {\n readonly manifest: ShardManifest\n private files: Map<string, Uint8Array>\n constructor(files: Map<string, Uint8Array>, manifest: ShardManifest) {\n this.files = files\n this.manifest = manifest\n }\n read(filename: string): Promise<Uint8Array | undefined> {\n return Promise.resolve(this.files.get(filename))\n }\n}\n\n/** A store that lazily fetches component/cluster files from a static base URL. */\nclass UrlComponentStore implements ShardComponentStore {\n readonly manifest: ShardManifest\n private baseUrl: string\n private fetchImpl: typeof fetch\n private cache = new Map<string, Uint8Array | undefined>()\n constructor(baseUrl: string, fetchImpl: typeof fetch, manifest: ShardManifest) {\n this.baseUrl = baseUrl.replace(/\\/$/, '')\n this.fetchImpl = fetchImpl\n this.manifest = manifest\n }\n async read(filename: string): Promise<Uint8Array | undefined> {\n if (this.cache.has(filename)) return this.cache.get(filename)\n const response = await this.fetchImpl(`${this.baseUrl}/${filename}`)\n if (!response.ok) {\n this.cache.set(filename, undefined)\n return undefined\n }\n const bytes = new Uint8Array(await response.arrayBuffer())\n this.cache.set(filename, bytes)\n return bytes\n }\n}\n\nasync function resolveStore(source: ShardReaderSource): Promise<ShardComponentStore> {\n if (typeof source === 'object' && 'baseUrl' in source) {\n const fetchImpl = source.fetchImpl ?? (globalThis.fetch as typeof fetch)\n const base = source.baseUrl.replace(/\\/$/, '')\n const manifestResponse = await fetchImpl(`${base}/manifest.json`)\n if (!manifestResponse.ok) {\n throw new Error(`Failed to fetch shard manifest (${manifestResponse.status}): ${base}/manifest.json`)\n }\n const manifest = (await manifestResponse.json()) as ShardManifest\n return new UrlComponentStore(base, fetchImpl, manifest)\n }\n const bytes = await toBytes(source)\n const files = unpackTarGz(bytes)\n const manifestBytes = files.get('manifest.json')\n if (!manifestBytes) throw new Error('Missing manifest.json in shard archive')\n const manifest = JSON.parse(decoder.decode(manifestBytes)) as ShardManifest\n return new PackedComponentStore(files, manifest)\n}\n\nfunction tokenize(query: string): string[] {\n return query.toLowerCase().split(/[^a-z0-9]+/i).filter((token) => token.length > 0)\n}\n\nfunction noteSearchText(note: ShardNote): string {\n return `${note.title ?? ''} ${note.original_content} ${note.revised_content ?? ''}`.toLowerCase()\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (!needle) return 0\n let count = 0\n let index = haystack.indexOf(needle)\n while (index !== -1) {\n count += 1\n index = haystack.indexOf(needle, index + needle.length)\n }\n return count\n}\n\nfunction noteMatchesTokens(note: ShardNote, tokens: string[]): boolean {\n if (tokens.length === 0) return true\n const text = noteSearchText(note)\n const tagText = note.tags.join(' ').toLowerCase()\n // AND semantics, matching Postgres plainto_tsquery (all lexemes required).\n return tokens.every((token) => text.includes(token) || tagText.includes(token))\n}\n\nfunction rankNote(note: ShardNote, tokens: string[], weights: ShardSearchWeights): number {\n if (tokens.length === 0) return 0\n const title = (note.title ?? '').toLowerCase()\n const content = `${note.original_content} ${note.revised_content ?? ''}`.toLowerCase()\n const tagText = note.tags.join(' ').toLowerCase()\n let score = 0\n for (const token of tokens) {\n score += countOccurrences(title, token) * weights.title\n score += countOccurrences(content, token) * weights.content\n if (tagText.includes(token)) score += weights.tag\n }\n return score\n}\n\nfunction makeSnippet(note: ShardNote, tokens: string[], length: number): string {\n const content = `${note.original_content} ${note.revised_content ?? ''}`.trim()\n if (tokens.length === 0) return content.slice(0, length)\n const lower = content.toLowerCase()\n const firstAt = tokens\n .map((token) => lower.indexOf(token))\n .filter((index) => index !== -1)\n .sort((a, b) => a - b)[0] ?? 0\n const start = Math.max(0, firstAt - Math.floor(length / 3))\n return (start > 0 ? '…' : '') + content.slice(start, start + length) + (start + length < content.length ? '…' : '')\n}\n\nfunction passesFilters(note: ShardNote, options: ShardSearchOptions): boolean {\n if (!options.includeDeleted && note.deleted_at) return false\n if (options.includeArchived === false && note.archived) return false\n if (options.tags && !options.tags.every((tag) => note.tags.includes(tag))) return false\n if (options.source && !options.source.includes(note.source)) return false\n return true\n}\n\nfunction facetCounts(notes: ShardNote[]): { tags: Record<string, number>; source: Record<string, number> } {\n const tags: Record<string, number> = {}\n const source: Record<string, number> = {}\n for (const note of notes) {\n for (const tag of note.tags) tags[tag] = (tags[tag] ?? 0) + 1\n source[note.source] = (source[note.source] ?? 0) + 1\n }\n return { tags, source }\n}\n\nexport interface ShardReader {\n readonly manifest: ShardManifest\n listNotes(options?: ShardListOptions): Promise<{ items: ShardReaderNote[]; total: number }>\n getNote(id: string): Promise<ShardReaderNote | null>\n search(query: string, options?: ShardSearchOptions): Promise<ShardSearchResult>\n linksOf(id: string): Promise<ShardLink[]>\n conceptsOf(id: string): Promise<ShardSkosConcept[]>\n relationsOf(conceptId: string): Promise<ShardSkosRelation[]>\n provenanceOf(id: string): Promise<ShardProvenanceEdge[]>\n getNoteFull(id: string): Promise<ShardNoteFull | null>\n semantic(query: string, k?: number): Promise<Array<{ note: ShardReaderNote; score: number }>>\n close(): void\n}\n\nclass ShardReaderImpl implements ShardReader {\n readonly manifest: ShardManifest\n private store: ShardComponentStore\n private options: OpenShardOptions\n private noteClusterCache = new Map<string, ShardNote[]>()\n private allNotes: ShardNote[] | null = null\n private links: ShardLink[] | null = null\n private noteSkos: ShardNoteSkosTag[] | null = null\n private concepts: Map<string, ShardSkosConcept> | null = null\n private relations: ShardSkosRelation[] | null = null\n private provenanceEdges: ShardProvenanceEdge[] | null = null\n private matchCache = new Map<string, ShardNote[]>()\n private maxCachedMatches: number\n private semanticPrepared = false\n\n constructor(store: ShardComponentStore, options: OpenShardOptions) {\n this.store = store\n this.manifest = store.manifest\n this.options = options\n this.maxCachedMatches = options.maxCachedMatches && options.maxCachedMatches > 0 ? options.maxCachedMatches : 5000\n }\n\n private noteClusters(): ShardClusterRef[] | null {\n return this.manifest.layout?.clusters?.notes ?? null\n }\n\n private async readCluster(ref: ShardClusterRef): Promise<{ notes: ShardNote[]; fetched: boolean }> {\n const cached = this.noteClusterCache.get(ref.href)\n if (cached) return { notes: cached, fetched: false }\n const notes = parseJsonlBytes<ShardNote>(await this.store.read(ref.href))\n this.noteClusterCache.set(ref.href, notes)\n return { notes, fetched: true }\n }\n\n /** Load every note (clustered or monolithic). Returns count of cluster files fetched. */\n private async loadAllNotes(): Promise<{ notes: ShardNote[]; fetched: number }> {\n const clusters = this.noteClusters()\n if (!clusters) {\n if (!this.allNotes) {\n this.allNotes = parseJsonlBytes<ShardNote>(await this.store.read('notes.jsonl'))\n return { notes: this.allNotes, fetched: 1 }\n }\n return { notes: this.allNotes, fetched: 0 }\n }\n const all: ShardNote[] = []\n let fetched = 0\n for (const ref of clusters) {\n const loaded = await this.readCluster(ref)\n if (loaded.fetched) fetched += 1\n all.push(...loaded.notes)\n }\n return { notes: all, fetched }\n }\n\n async listNotes(options: ShardListOptions = {}): Promise<{ items: ShardReaderNote[]; total: number }> {\n const offset = options.offset ?? 0\n const limit = options.limit ?? Number.MAX_SAFE_INTEGER\n // Browse needs a stable, filtered total, so it loads all notes (clustered or\n // monolithic). Per-record exclusion (deleted/archived) would make a pure\n // range-skip miscount, so range-limited cluster fetch is reserved for search's\n // match cache rather than applied here.\n const { notes } = await this.loadAllNotes()\n const filtered = notes.filter((note) => passesFilters(note, options))\n const page = filtered.slice(offset, offset + limit)\n return { items: page.map(noteFromShard), total: filtered.length }\n }\n\n async getNote(id: string): Promise<ShardReaderNote | null> {\n const { notes } = await this.loadAllNotes()\n const found = notes.find((note) => note.id === id)\n return found ? noteFromShard(found) : null\n }\n\n private matchKey(query: string, options: ShardSearchOptions): string {\n return JSON.stringify({\n q: query.trim().toLowerCase(),\n tags: options.tags ?? null,\n source: options.source ?? null,\n includeArchived: options.includeArchived ?? true,\n includeDeleted: options.includeDeleted ?? false,\n weights: { ...DEFAULT_WEIGHTS, ...options.weights },\n })\n }\n\n private cacheMatches(key: string, notes: ShardNote[]): void {\n this.matchCache.delete(key)\n this.matchCache.set(key, notes)\n let total = 0\n for (const set of this.matchCache.values()) total += set.length\n while (total > this.maxCachedMatches && this.matchCache.size > 1) {\n const oldest = this.matchCache.keys().next().value\n if (oldest === undefined || oldest === key) break\n total -= this.matchCache.get(oldest)?.length ?? 0\n this.matchCache.delete(oldest)\n }\n }\n\n async search(query: string, options: ShardSearchOptions = {}): Promise<ShardSearchResult> {\n const tokens = tokenize(query)\n const weights = { ...DEFAULT_WEIGHTS, ...options.weights }\n const offset = options.offset ?? 0\n const limit = options.limit ?? Number.MAX_SAFE_INTEGER\n const key = this.matchKey(query, options)\n\n let matched = this.matchCache.get(key)\n let fetchedClusters = 0\n if (matched) {\n this.matchCache.delete(key)\n this.matchCache.set(key, matched)\n } else {\n const { notes, fetched } = await this.loadAllNotes()\n fetchedClusters = fetched\n matched = notes.filter((note) => passesFilters(note, options) && noteMatchesTokens(note, tokens))\n if (tokens.length > 0 && options.rank !== false) {\n matched = [...matched].sort((a, b) => rankNote(b, tokens, weights) - rankNote(a, tokens, weights))\n }\n this.cacheMatches(key, matched)\n }\n\n const page = matched.slice(offset, offset + limit)\n const result: ShardSearchResult = {\n items: page.map(noteFromShard),\n total: matched.length,\n facets: facetCounts(matched),\n fetchedClusters,\n }\n if (options.rank || options.snippets) {\n const snippetLength = options.snippetLength ?? 160\n result.rankedItems = page.map((note) => ({\n note: noteFromShard(note),\n rank: rankNote(note, tokens, weights),\n ...(options.snippets ? { snippet: makeSnippet(note, tokens, snippetLength) } : {}),\n }))\n }\n return result\n }\n\n private async loadLinks(): Promise<ShardLink[]> {\n if (!this.links) this.links = parseJsonlBytes<ShardLink>(await this.store.read('links.jsonl'))\n return this.links\n }\n\n async linksOf(id: string): Promise<ShardLink[]> {\n const links = await this.loadLinks()\n return links.filter((link) => link.from_note_id === id || link.to_note_id === id)\n }\n\n private async loadConcepts(): Promise<{ noteSkos: ShardNoteSkosTag[]; concepts: Map<string, ShardSkosConcept> }> {\n if (!this.noteSkos) {\n this.noteSkos = parseJsonlBytes<ShardNoteSkosTag>(await this.store.read('note_skos_tags.jsonl'))\n }\n if (!this.concepts) {\n const list = parseJsonArrayBytes<ShardSkosConcept>(await this.store.read('skos_concepts.json'))\n this.concepts = new Map(list.map((concept) => [concept.id, concept]))\n }\n return { noteSkos: this.noteSkos, concepts: this.concepts }\n }\n\n async conceptsOf(id: string): Promise<ShardSkosConcept[]> {\n const { noteSkos, concepts } = await this.loadConcepts()\n const out: ShardSkosConcept[] = []\n for (const tag of noteSkos) {\n if (tag.note_id !== id) continue\n const concept = concepts.get(tag.concept_id)\n if (concept) out.push(concept)\n }\n return out\n }\n\n private async loadRelations(): Promise<ShardSkosRelation[]> {\n if (!this.relations) {\n this.relations = parseJsonlBytes<ShardSkosRelation>(await this.store.read('skos_relations.jsonl'))\n }\n return this.relations\n }\n\n async relationsOf(conceptId: string): Promise<ShardSkosRelation[]> {\n const relations = await this.loadRelations()\n return relations.filter(\n (relation) => relation.source_concept_id === conceptId || relation.target_concept_id === conceptId,\n )\n }\n\n private async loadProvenanceEdges(): Promise<ShardProvenanceEdge[]> {\n if (!this.provenanceEdges) {\n this.provenanceEdges = parseJsonlBytes<ShardProvenanceEdge>(await this.store.read('provenance_edges.jsonl'))\n }\n return this.provenanceEdges\n }\n\n async provenanceOf(id: string): Promise<ShardProvenanceEdge[]> {\n const edges = await this.loadProvenanceEdges()\n return edges\n .filter((edge) => edge.entity_type === 'note' && edge.entity_id === id)\n .sort((a, b) => a.started_at.localeCompare(b.started_at))\n }\n\n async getNoteFull(id: string): Promise<ShardNoteFull | null> {\n const note = await this.getNote(id)\n if (!note) return null\n const [links, concepts, provenance] = await Promise.all([\n this.linksOf(id),\n this.conceptsOf(id),\n this.provenanceOf(id),\n ])\n return { note, links, concepts, provenance }\n }\n\n async semantic(query: string, k = 10): Promise<Array<{ note: ShardReaderNote; score: number }>> {\n const provider = this.options.semantic\n if (!provider) return []\n if (!this.semanticPrepared) {\n await provider.prepare?.(this.store)\n this.semanticPrepared = true\n }\n const hits = await provider.search(query, k)\n const { notes } = await this.loadAllNotes()\n const byId = new Map(notes.map((note) => [note.id, note]))\n const out: Array<{ note: ShardReaderNote; score: number }> = []\n for (const hit of hits) {\n const note = byId.get(hit.id)\n if (note) out.push({ note: noteFromShard(note), score: hit.score })\n }\n return out\n }\n\n close(): void {\n this.noteClusterCache.clear()\n this.matchCache.clear()\n this.allNotes = null\n this.links = null\n this.noteSkos = null\n this.concepts = null\n this.relations = null\n this.provenanceEdges = null\n }\n}\n\n/**\n * Open a Knowledge Shard for in-place, read-only query — NO PGlite. `source` is a\n * packed tar.gz (`Uint8Array`/`Blob`) or a static base URL serving the unpacked\n * component/cluster files. Honors `min_reader_version`: a shard that needs a newer\n * reader than this build throws (the host should fall back to `importShard`).\n */\nexport async function openShard(\n source: ShardReaderSource,\n options: OpenShardOptions = {},\n): Promise<ShardReader> {\n const store = await resolveStore(source)\n if (store.manifest.min_reader_version && store.manifest.min_reader_version > CURRENT_SHARD_VERSION) {\n throw new Error(\n `Shard requires reader version ${store.manifest.min_reader_version}, ` +\n `but this build supports ${CURRENT_SHARD_VERSION}. Import the shard instead.`,\n )\n }\n return new ShardReaderImpl(store, options)\n}\n\nexport { type ShardComponent }\n","/**\n * Pluggable semantic providers for the in-place shard reader (issue #189).\n *\n * The static-file tier is text/facets-only by default. Semantic is opt-in via a\n * `StaticSemanticProvider`, with three tradeoff points the host chooses from:\n *\n * 1. none — don't configure a provider (text/facets only). Lightest.\n * 2. cosine-small — `createCosineSemanticProvider`: brute-force cosine over a\n * small static vectors file. Zero prebuild; small corpora only.\n * 3. ANN-full — implement `StaticSemanticProvider` yourself over a prebuilt\n * ANN snapshot (HNSW / flat-IVF served as a static asset),\n * loading it in `prepare()` and querying it in `search()`.\n * The interface is the extension point; no ANN engine is\n * bundled here.\n */\n\nimport type { ShardComponentStore, StaticSemanticProvider } from './shard-reader.js'\n\nconst decoder = new TextDecoder()\n\n/** A note id paired with its embedding vector, as stored in a static vectors file. */\nexport interface VectorEntry {\n id: string\n vector: number[]\n}\n\nexport interface CosineSemanticProviderOptions {\n /**\n * Embeds the query into the SAME space as the corpus vectors. Host-owned so it\n * matches the build-time embedding model exactly (sync or async).\n */\n embedQuery: (query: string) => Promise<number[]> | number[]\n /**\n * JSONL file (one `{ id, vector }` per line) mapping note id → vector, served\n * as a static asset alongside the shard. Default `vectors.jsonl`.\n */\n vectorsFile?: string\n /** Pre-supplied vectors — skips loading from the component store. */\n vectors?: VectorEntry[]\n}\n\nfunction cosine(a: number[], b: number[]): number {\n let dot = 0\n let normA = 0\n let normB = 0\n const len = Math.min(a.length, b.length)\n for (let i = 0; i < len; i++) {\n dot += a[i] * b[i]\n normA += a[i] * a[i]\n normB += b[i] * b[i]\n }\n if (normA === 0 || normB === 0) return 0\n return dot / (Math.sqrt(normA) * Math.sqrt(normB))\n}\n\n/**\n * Brute-force cosine semantic provider — the \"cosine-small\" tradeoff point. Loads\n * a static vectors file and scores the query embedding against every corpus\n * vector. Fine for small/demo corpora; for the full corpus, supply a prebuilt-ANN\n * `StaticSemanticProvider` instead.\n */\nexport function createCosineSemanticProvider(\n options: CosineSemanticProviderOptions,\n): StaticSemanticProvider {\n let vectors: VectorEntry[] = options.vectors ?? []\n return {\n async prepare(store: ShardComponentStore): Promise<void> {\n if (options.vectors) return\n const bytes = await store.read(options.vectorsFile ?? 'vectors.jsonl')\n if (!bytes || bytes.byteLength === 0) {\n vectors = []\n return\n }\n vectors = decoder.decode(bytes)\n .split('\\n')\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as VectorEntry)\n },\n async search(query: string, k: number): Promise<Array<{ id: string; score: number }>> {\n const queryVector = await options.embedQuery(query)\n return vectors\n .map((entry) => ({ id: entry.id, score: cosine(queryVector, entry.vector) }))\n .sort((a, b) => b.score - a.score)\n .slice(0, k)\n },\n }\n}\n","/**\n * Shard warm / prefetch API — pre-stage and (optionally) verify shard bytes\n * without building the index.\n *\n * Staged corpus loading (text-first, then opt-in summary vectors, then opt-in\n * full content) wants the operator's hard rule honored: **no blocking waits**.\n * The HNSW index build has to happen on the user's click (it is heavy and is\n * shown with progress — that is correct). The *download* of the shard bytes\n * does not: it can be warmed in the background on idle so the click is purely\n * the index build.\n *\n * fortemi-react is server-free and local-first — shards are **static assets**\n * (typically generated at build time and served as static files, or bundled\n * and handed in directly as bytes). `prefetchShard` warms those static bytes;\n * it does not assume any API/server. The eventual `importShard` reads the warm\n * bytes via {@link fromPrefetched}, so import is just the index build.\n *\n * Two-layer integrity:\n * - `prefetchShard(url, { expectedSha256 })` verifies the whole-archive SHA-256\n * against a build-time-known hash (emitted alongside the static shard).\n * - `importShard` still validates the per-file checksums inside the manifest\n * on import. Both layers share core's `sha256Hex`.\n *\n * @implements #181 prefetchShard / shard warm API\n */\n\nimport { sha256Hex } from './checksum.js'\n\n/** Options for {@link prefetchShard}. */\nexport interface PrefetchOptions {\n /**\n * Provide the shard bytes directly instead of fetching `url` — e.g. a\n * build-time-generated `.shard` imported as a bundled asset. The `url` is\n * still used as the warm-store key. When set, no network/disk fetch happens.\n */\n bytes?: ArrayBuffer | Uint8Array\n /**\n * Compute the SHA-256 of the warmed bytes (stored on the result and in the\n * warm store). Implied when `expectedSha256` is set.\n */\n verify?: boolean\n /**\n * Build-time-known SHA-256 (hex) of the whole shard archive. When set, the\n * warmed bytes are verified against it and a mismatch throws — nothing is\n * stored. Case-insensitive.\n */\n expectedSha256?: string\n /**\n * Fetch implementation to use. Defaults to `globalThis.fetch`. Inject for\n * tests or non-standard environments.\n */\n fetchImpl?: typeof fetch\n /**\n * Also persist the warmed bytes to the Cache Storage API so warmth survives\n * a reload. Feature-detected — a no-op when `caches` is unavailable (e.g.\n * Node, or a worker without Cache access).\n */\n useCacheStorage?: boolean\n /** Cache Storage cache name. Default: `'fortemi-shards'`. */\n cacheName?: string\n /** Abort signal forwarded to the fetch. */\n signal?: AbortSignal\n}\n\n/** Result of a {@link prefetchShard} call. */\nexport interface PrefetchResult {\n /** The warm-store key (the `url` passed to prefetchShard). */\n url: string\n /** The warmed shard bytes (also retrievable via {@link fromPrefetched}). */\n bytes: Uint8Array\n /** Convenience: `bytes.byteLength`. */\n byteLength: number\n /** SHA-256 hex of the warmed bytes when computed (`verify` or `expectedSha256`), else `undefined`. */\n sha256?: string\n /** True when the bytes came from the Cache Storage API rather than a fresh fetch. */\n fromCache: boolean\n}\n\ninterface WarmEntry {\n bytes: Uint8Array\n sha256?: string\n}\n\nconst DEFAULT_CACHE_NAME = 'fortemi-shards'\n\n/** In-memory warm store: url → bytes. Survives until cleared or page reload. */\nconst warmStore = new Map<string, WarmEntry>()\n/** In-flight prefetches keyed by url, so concurrent warms of the same url share one fetch. */\nconst inFlight = new Map<string, Promise<PrefetchResult>>()\n\nfunction toUint8(data: ArrayBuffer | Uint8Array): Uint8Array {\n return data instanceof Uint8Array ? data : new Uint8Array(data)\n}\n\nfunction getCacheStorage(): CacheStorage | undefined {\n return (globalThis as { caches?: CacheStorage }).caches\n}\n\nasync function readFromCacheStorage(url: string, cacheName: string): Promise<Uint8Array | null> {\n const caches = getCacheStorage()\n if (!caches) return null\n try {\n const cache = await caches.open(cacheName)\n const res = await cache.match(url)\n if (!res) return null\n return new Uint8Array(await res.arrayBuffer())\n } catch {\n return null\n }\n}\n\nasync function writeToCacheStorage(url: string, bytes: Uint8Array, cacheName: string): Promise<void> {\n const caches = getCacheStorage()\n if (!caches) return\n try {\n const cache = await caches.open(cacheName)\n // Copy into a standalone ArrayBuffer so the stored body is independent.\n const body = bytes.slice().buffer\n await cache.put(url, new Response(body))\n } catch {\n // Best-effort: a Cache write failure must not fail the prefetch.\n }\n}\n\nasync function maybeHash(\n bytes: Uint8Array,\n options: PrefetchOptions | undefined,\n): Promise<string | undefined> {\n const expected = options?.expectedSha256\n if (expected !== undefined) {\n const actual = await sha256Hex(bytes)\n if (actual.toLowerCase() !== expected.toLowerCase()) {\n throw new Error(\n `Shard SHA-256 mismatch: expected ${expected.toLowerCase()}, got ${actual}`,\n )\n }\n return actual\n }\n if (options?.verify) {\n return sha256Hex(bytes)\n }\n return undefined\n}\n\n/**\n * Pre-stage shard bytes into the warm store without building the index.\n *\n * Resolution order for the bytes:\n * 1. `options.bytes` (a directly-provided / bundled asset), else\n * 2. the Cache Storage API (when `useCacheStorage` and a prior write exists), else\n * 3. `fetch(url)` of the static asset.\n *\n * Concurrent calls for the same `url` (without `options.bytes`) share a single\n * fetch. On `expectedSha256` mismatch the call throws and nothing is stored.\n *\n * @param url - Static asset URL (also the warm-store key).\n * @param options - See {@link PrefetchOptions}.\n * @returns The warm result (bytes are also retrievable via {@link fromPrefetched}).\n *\n * @example\n * ```ts\n * // Warm on idle so the user's opt-in click is just the index build.\n * requestIdleCallback(() => {\n * void prefetchShard('/shards/research.shard', { expectedSha256: RESEARCH_SHARD_SHA256 })\n * })\n * // ...later, on click:\n * await importShard(db, fromPrefetched('/shards/research.shard'), { onProgress })\n * ```\n */\nexport function prefetchShard(url: string, options?: PrefetchOptions): Promise<PrefetchResult> {\n // Direct-bytes path: no fetch, no in-flight dedupe.\n if (options?.bytes !== undefined) {\n const bytes = toUint8(options.bytes)\n return (async () => {\n const sha256 = await maybeHash(bytes, options)\n warmStore.set(url, { bytes, sha256 })\n if (options.useCacheStorage) {\n await writeToCacheStorage(url, bytes, options.cacheName ?? DEFAULT_CACHE_NAME)\n }\n return { url, bytes, byteLength: bytes.byteLength, sha256, fromCache: false }\n })()\n }\n\n const existing = inFlight.get(url)\n if (existing) return existing\n\n const cacheName = options?.cacheName ?? DEFAULT_CACHE_NAME\n const fetchImpl = options?.fetchImpl ?? globalThis.fetch\n\n const work = (async (): Promise<PrefetchResult> => {\n let bytes: Uint8Array | null = null\n let fromCache = false\n\n if (options?.useCacheStorage) {\n bytes = await readFromCacheStorage(url, cacheName)\n fromCache = bytes !== null\n }\n\n if (!bytes) {\n if (typeof fetchImpl !== 'function') {\n throw new Error('prefetchShard: no fetch implementation available (pass options.fetchImpl)')\n }\n const res = await fetchImpl(url, options?.signal ? { signal: options.signal } : undefined)\n if (!res.ok) {\n throw new Error(`Failed to prefetch shard ${url}: HTTP ${res.status} ${res.statusText}`)\n }\n bytes = new Uint8Array(await res.arrayBuffer())\n }\n\n const sha256 = await maybeHash(bytes, options)\n warmStore.set(url, { bytes, sha256 })\n\n if (options?.useCacheStorage && !fromCache) {\n await writeToCacheStorage(url, bytes, cacheName)\n }\n\n return { url, bytes, byteLength: bytes.byteLength, sha256, fromCache }\n })()\n\n const tracked = work.finally(() => {\n inFlight.delete(url)\n })\n inFlight.set(url, tracked)\n return tracked\n}\n\n/**\n * Return previously-warmed shard bytes for `url`, ready to hand to `importShard`.\n *\n * @throws If the url was not prefetched (call {@link prefetchShard} first).\n *\n * @example\n * ```ts\n * await importShard(db, fromPrefetched('/shards/research.shard'), { onProgress })\n * ```\n */\nexport function fromPrefetched(url: string): Uint8Array {\n const entry = warmStore.get(url)\n if (!entry) {\n throw new Error(`Shard not prefetched: ${url}. Call prefetchShard(url) first.`)\n }\n return entry.bytes\n}\n\n/** Whether `url` has warm bytes in the in-memory store. */\nexport function isShardPrefetched(url: string): boolean {\n return warmStore.has(url)\n}\n\n/** The computed SHA-256 (hex) of a warmed shard, if it was verified/hashed. */\nexport function getPrefetchedSha256(url: string): string | undefined {\n return warmStore.get(url)?.sha256\n}\n\n/**\n * Evict warm bytes from the in-memory store. With no argument, clears all.\n *\n * Note: this does not delete Cache Storage entries — those persist by design\n * (that is the cross-reload warmth). Manage the Cache Storage cache directly if\n * you need to evict it.\n */\nexport function clearPrefetchedShard(url?: string): void {\n if (url === undefined) {\n warmStore.clear()\n return\n }\n warmStore.delete(url)\n}\n","export type AiwgFortemiRecordType =\n | 'crm.contact'\n | 'crm.organization'\n | 'crm.event'\n | 'crm.interaction'\n | 'aiwg.artifact'\n | 'docs.page'\n\nexport type AiwgPrivacyClassification = 'private' | 'sanitized' | 'public'\nexport type AiwgProvenanceConfidence = 'source' | 'candidate' | 'reviewed' | 'rejected'\nexport type AiwgReviewAction = 'accept' | 'reject' | 'defer'\n\nexport interface AiwgFortemiRecordSource {\n path: string\n repo_relative_path: string\n locator: string\n}\n\nexport interface AiwgFortemiRelationship {\n type: string\n target_id: string\n source_path?: string\n label?: string\n confidence?: number\n privacy?: AiwgPrivacyClassification\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiProvenance {\n field: string\n source: string\n path: string\n confidence: AiwgProvenanceConfidence\n privacy: AiwgPrivacyClassification\n}\n\nexport type AiwgFortemiSkosRelationType = 'broader' | 'narrower' | 'related' | string\n\nexport interface AiwgFortemiSkosConcept {\n id: string\n prefLabel: string\n definition?: string\n scheme?: string\n notation?: string\n uri?: string\n altLabels?: string[]\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiSkosRelation {\n type: AiwgFortemiSkosRelationType\n source_id: string\n target_id: string\n source_path?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiProvenanceEvent {\n id?: string\n activity: string\n agent?: string\n started_at?: string\n ended_at?: string\n source?: string\n path?: string\n confidence?: AiwgProvenanceConfidence\n privacy?: AiwgPrivacyClassification\n attributes?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiRecord {\n schema_version: 'aiwg.fortemi.index.record.v1'\n id: string\n type: AiwgFortemiRecordType\n source: AiwgFortemiRecordSource\n title: string\n text: string\n facets: Record<string, string[]>\n tags: string[]\n concepts: string[]\n relationships: AiwgFortemiRelationship[]\n provenance: AiwgFortemiProvenance[]\n /** Optional rich SKOS metadata for static consumers that need labels/definitions without opening a shard. */\n skos_concepts?: AiwgFortemiSkosConcept[]\n /** Optional SKOS relationship edges among concepts referenced by this record. */\n skos_relations?: AiwgFortemiSkosRelation[]\n /** Optional W3C PROV-style activity chain for this record. */\n provenance_events?: AiwgFortemiProvenanceEvent[]\n privacy: {\n classification: AiwgPrivacyClassification\n pii: boolean\n }\n updated_at: string\n}\n\nexport interface AiwgFortemiIndexExport {\n schema_version: 'aiwg.fortemi.index.export.v1'\n generated_at: string\n source: {\n repo: string\n privacy: AiwgPrivacyClassification\n }\n items: AiwgFortemiRecord[]\n}\n\nexport interface AiwgFortemiChunkPartRef {\n href: string\n offset: number\n count: number\n}\n\n// Fields a scan part must retain for query/browse/rank/facet to work. The rest\n// (source, provenance, relationships, updated_at) are detail-only and may be\n// dropped from scan parts via `projection`, then resolved on demand by id.\nexport const AIWG_SCAN_REQUIRED_FIELDS: Array<keyof AiwgFortemiRecord> = [\n 'schema_version',\n 'id',\n 'type',\n 'title',\n 'text',\n 'facets',\n 'tags',\n 'concepts',\n 'privacy',\n]\n\n// A record as it appears in a scan part. With no manifest `projection`, this is a\n// full AiwgFortemiRecord. With a projection, detail-only fields are absent — read\n// them via the controller's getRecord(). Typed as the full record for ergonomics;\n// query/browse code guards the projectable fields.\nexport type AiwgFortemiProjectedRecord =\n Pick<AiwgFortemiRecord, 'schema_version' | 'id' | 'type' | 'title' | 'text' | 'facets' | 'tags' | 'concepts' | 'privacy'>\n & Partial<AiwgFortemiRecord>\n\n// How a record id is encoded into a detail filename/path segment.\n// - 'base64url': path-safe, single segment, no '%' — works on every static host,\n// including ids containing '/' (default for new builds; see #177).\n// - 'uri': encodeURIComponent — legacy. Breaks for ids containing '/' on static\n// servers that reject %2F (path-traversal protection → 404).\nexport type AiwgDetailIdEncoding = 'uri' | 'base64url'\n\n// How the controller resolves a full record by id when scan parts are projected.\nexport interface AiwgFortemiChunkDetailRef {\n // href template containing `{id}`, relative to the manifest base — e.g.\n // \"detail/{id}.json\". The `{id}` is encoded per `encoding` at substitution.\n href: string\n // id→segment encoding. Absent is treated as 'uri' for backward compatibility\n // with manifests built before #177; new builds default to 'base64url'.\n encoding?: AiwgDetailIdEncoding\n}\n\nexport interface AiwgFortemiChunkManifest {\n schema_version: 'aiwg.fortemi.index.chunk-manifest.v1'\n generated_at: string\n source: AiwgFortemiIndexExport['source']\n total: number\n part_size: number\n facets?: Record<string, Record<string, number>>\n // Field names present in scan-part items. Absent → scan parts carry whole records.\n // When set, must include AIWG_SCAN_REQUIRED_FIELDS.\n projection?: Array<keyof AiwgFortemiRecord>\n // Resolver for full records by id (used with `projection` to lazy-load detail).\n detail?: AiwgFortemiChunkDetailRef\n parts: AiwgFortemiChunkPartRef[]\n}\n\nexport interface AiwgFortemiChunkPart {\n schema_version: 'aiwg.fortemi.index.chunk.v1'\n manifest_schema_version: 'aiwg.fortemi.index.chunk-manifest.v1'\n offset: number\n items: AiwgFortemiRecord[]\n}\n\nexport interface AiwgIndexValidationResult {\n valid: boolean\n errors: string[]\n counts: Partial<Record<AiwgFortemiRecordType, number>>\n}\n\nexport interface AiwgChunkedIndexValidationResult {\n valid: boolean\n errors: string[]\n}\n\nexport interface AiwgIndexQueryOptions {\n types?: AiwgFortemiRecordType[]\n facets?: Record<string, string[]>\n tags?: string[]\n concepts?: string[]\n privacy?: AiwgPrivacyClassification[]\n relationshipTargetId?: string\n limit?: number\n offset?: number\n rank?: boolean\n snippets?: boolean\n snippetLength?: number\n weights?: Partial<AiwgIndexQueryWeights>\n includeMatches?: boolean\n}\n\nexport interface AiwgIndexQueryWeights {\n title: number\n text: number\n tag: number\n concept: number\n}\n\nexport interface AiwgIndexQueryMatch {\n field: 'title' | 'text' | 'tag' | 'concept'\n value: string\n}\n\nexport interface AiwgIndexQueryRankedItem {\n item: AiwgFortemiRecord\n rank: number\n snippet?: string\n matches?: AiwgIndexQueryMatch[]\n}\n\nexport interface AiwgIndexQueryResult {\n items: AiwgFortemiRecord[]\n total: number\n facets: Record<string, Record<string, number>>\n rankedItems?: AiwgIndexQueryRankedItem[]\n}\n\nexport type AiwgChunkedIndexLoader = (\n part: AiwgFortemiChunkPartRef,\n manifest: AiwgFortemiChunkManifest,\n) => Promise<unknown>\n\n// Resolves a full record by id (used with projected scan parts). Returns the\n// parsed record JSON; validated by the controller before use.\nexport type AiwgChunkedIndexDetailLoader = (\n id: string,\n manifest: AiwgFortemiChunkManifest,\n) => Promise<unknown>\n\nexport interface AiwgChunkedIndexLoadOptions {\n maxCachedParts?: number\n // Required to resolve detail for projected indexes via getRecord(); ignored otherwise.\n detailLoader?: AiwgChunkedIndexDetailLoader\n maxCachedDetails?: number\n // Bounds the filtered/ranked match-set cache used to page a query without\n // re-scanning every part. Counts total cached entries across all queries\n // (LRU-evicted). Defaults to 5000. The cache is keyed on query + filters +\n // weights, so paging the same query (varying only offset/limit/sort/snippets)\n // reuses the scan; see queryChunked.\n maxCachedMatches?: number\n}\n\nexport type AiwgChunkedIndexProgressPhase = 'part' | 'query'\n\nexport interface AiwgChunkedIndexProgress {\n phase: AiwgChunkedIndexProgressPhase\n done: number\n total: number\n href?: string\n}\n\nexport interface AiwgChunkedIndexQueryOptions extends AiwgIndexQueryOptions {\n onProgress?: (progress: AiwgChunkedIndexProgress) => void\n}\n\nexport interface AiwgChunkedIndexQueryResult extends AiwgIndexQueryResult {\n manifestTotal: number\n scannedParts: number\n fetchedParts: number\n complete: boolean\n}\n\nexport interface AiwgReviewDecision {\n item_id: string\n action: AiwgReviewAction\n reason?: string\n updated_at: string\n}\n\nexport interface AiwgReviewDecisionExport {\n schema_version: 'aiwg.fortemi.review-decisions.v1'\n generated_at: string\n source_export_schema_version: string\n decisions: AiwgReviewDecision[]\n}\n\nexport interface AiwgIndexGraphOptions {\n communityFacet?: string\n communityTagPrefix?: string\n relationshipWeights?: Record<string, number>\n includeDanglingRelationships?: boolean\n}\n\nexport interface AiwgReviewInput {\n item_id: string\n action: AiwgReviewAction\n reason?: string\n}\n\nexport interface AiwgIndexControllerSnapshot {\n index: AiwgFortemiIndexExport | null\n chunked: {\n manifest: AiwgFortemiChunkManifest\n cachedParts: number\n maxCachedParts: number\n } | null\n data: AiwgIndexQueryResult | null\n error: Error | null\n reviewDecisions: AiwgReviewDecision[]\n}\n\nexport type AiwgIndexControllerListener = (snapshot: AiwgIndexControllerSnapshot) => void\n\nexport interface AiwgIndexController {\n loadIndex(value: unknown): AiwgFortemiIndexExport\n loadChunkedIndex(\n manifest: unknown,\n loader: AiwgChunkedIndexLoader,\n options?: AiwgChunkedIndexLoadOptions,\n ): AiwgFortemiChunkManifest\n getIndex(): AiwgFortemiIndexExport | null\n getChunkedManifest(): AiwgFortemiChunkManifest | null\n getSnapshot(): AiwgIndexControllerSnapshot\n query(query?: string, options?: AiwgIndexQueryOptions): AiwgIndexQueryResult\n queryChunked(query?: string, options?: AiwgChunkedIndexQueryOptions): Promise<AiwgChunkedIndexQueryResult>\n // Resolve a full record by id. For a projected chunked index, fetches detail via\n // the detailLoader (bounded cache); for a whole-record index/parts, returns the\n // record from loaded data. Rejects if detail is unavailable.\n getRecord(id: string): Promise<AiwgFortemiRecord>\n clearChunkCache(): void\n toCommunityGraph(options?: AiwgIndexGraphOptions): ReturnType<typeof aiwgFortemiIndexToCommunityGraph>\n setReviewDecision(input: AiwgReviewInput): AiwgReviewDecision\n clearReviewDecision(itemId: string): void\n createReviewDecisionExport(generatedAt?: string): AiwgReviewDecisionExport\n subscribe(listener: AiwgIndexControllerListener): () => void\n}\n\nconst REQUIRED_RECORD_FIELDS: Array<keyof AiwgFortemiRecord> = [\n 'schema_version',\n 'id',\n 'type',\n 'source',\n 'title',\n 'text',\n 'facets',\n 'tags',\n 'concepts',\n 'relationships',\n 'provenance',\n 'privacy',\n 'updated_at',\n]\n\nconst VALID_TYPES = new Set<AiwgFortemiRecordType>([\n 'crm.contact',\n 'crm.organization',\n 'crm.event',\n 'crm.interaction',\n 'aiwg.artifact',\n 'docs.page',\n])\n\nconst DEFAULT_QUERY_WEIGHTS: AiwgIndexQueryWeights = {\n title: 4,\n tag: 3,\n concept: 2,\n text: 1,\n}\n\nfunction hasString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0\n}\n\nfunction pushFacet(counts: Record<string, Record<string, number>>, name: string, value: string) {\n counts[name] ??= {}\n counts[name][value] = (counts[name][value] ?? 0) + 1\n}\n\nfunction hasNonNegativeInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === 'number' && value >= 0\n}\n\nfunction hasPositiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === 'number' && value > 0\n}\n\nfunction isFacetCounts(value: unknown): value is Record<string, Record<string, number>> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false\n return Object.values(value).every((counts) => (\n !!counts\n && typeof counts === 'object'\n && !Array.isArray(counts)\n && Object.values(counts).every((count) => hasNonNegativeInteger(count))\n ))\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isOptionalStringArray(value: unknown): boolean {\n return value === undefined || (Array.isArray(value) && value.every((item) => typeof item === 'string'))\n}\n\nfunction validateOptionalRichMetadata(item: Partial<AiwgFortemiRecord>, index: number, errors: string[]): void {\n if (item.skos_concepts !== undefined) {\n if (!Array.isArray(item.skos_concepts)) {\n errors.push('items[' + index + '].skos_concepts must be an array when present')\n } else {\n for (const [conceptIndex, concept] of item.skos_concepts.entries()) {\n if (!hasString(concept.id)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].id is required')\n if (!hasString(concept.prefLabel)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].prefLabel is required')\n if (!isOptionalStringArray(concept.altLabels)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].altLabels must be a string array')\n if (concept.metadata !== undefined && !isPlainRecord(concept.metadata)) {\n errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.skos_relations !== undefined) {\n if (!Array.isArray(item.skos_relations)) {\n errors.push('items[' + index + '].skos_relations must be an array when present')\n } else {\n for (const [relationIndex, relation] of item.skos_relations.entries()) {\n if (!hasString(relation.type)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].type is required')\n if (!hasString(relation.source_id)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].source_id is required')\n if (!hasString(relation.target_id)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].target_id is required')\n if (relation.metadata !== undefined && !isPlainRecord(relation.metadata)) {\n errors.push('items[' + index + '].skos_relations[' + relationIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.provenance_events !== undefined) {\n if (!Array.isArray(item.provenance_events)) {\n errors.push('items[' + index + '].provenance_events must be an array when present')\n } else {\n for (const [eventIndex, event] of item.provenance_events.entries()) {\n if (!hasString(event.activity)) errors.push('items[' + index + '].provenance_events[' + eventIndex + '].activity is required')\n if (event.attributes !== undefined && !isPlainRecord(event.attributes)) {\n errors.push('items[' + index + '].provenance_events[' + eventIndex + '].attributes must be an object')\n }\n }\n }\n }\n if (Array.isArray(item.relationships)) {\n for (const [relationshipIndex, relationship] of item.relationships.entries()) {\n if (relationship.metadata !== undefined && !isPlainRecord(relationship.metadata)) {\n errors.push('items[' + index + '].relationships[' + relationshipIndex + '].metadata must be an object')\n }\n }\n }\n}\n\nexport function validateAiwgFortemiIndexExport(value: unknown): AiwgIndexValidationResult {\n const errors: string[] = []\n const counts: Partial<Record<AiwgFortemiRecordType, number>> = {}\n const data = value as Partial<AiwgFortemiIndexExport>\n\n if (data?.schema_version !== 'aiwg.fortemi.index.export.v1') {\n errors.push('schema_version must be aiwg.fortemi.index.export.v1')\n }\n if (!hasString(data?.generated_at)) errors.push('generated_at is required')\n if (!hasString(data?.source?.repo)) errors.push('source.repo is required')\n if (!hasString(data?.source?.privacy)) errors.push('source.privacy is required')\n if (!Array.isArray(data?.items)) errors.push('items must be an array')\n\n const ids = new Set<string>()\n let previousId = ''\n for (const [index, item] of (data.items ?? []).entries()) {\n for (const field of REQUIRED_RECORD_FIELDS) {\n if (!(field in item)) errors.push('items[' + index + '].' + field + ' is required')\n }\n if (item.schema_version !== 'aiwg.fortemi.index.record.v1') {\n errors.push('items[' + index + '].schema_version must be aiwg.fortemi.index.record.v1')\n }\n if (!hasString(item.id)) errors.push('items[' + index + '].id is required')\n if (hasString(item.id) && ids.has(item.id)) errors.push('duplicate id: ' + item.id)\n if (hasString(item.id)) ids.add(item.id)\n if (previousId && hasString(item.id) && previousId.localeCompare(item.id) > 0) {\n errors.push('items must be sorted by id: ' + previousId + ' before ' + item.id)\n }\n if (hasString(item.id)) previousId = item.id\n if (!VALID_TYPES.has(item.type)) errors.push('items[' + index + '].type is invalid')\n else counts[item.type] = (counts[item.type] ?? 0) + 1\n if (!hasString(item.source?.path)) errors.push('items[' + index + '].source.path is required')\n if (!hasString(item.source?.repo_relative_path)) errors.push('items[' + index + '].source.repo_relative_path is required')\n if (!hasString(item.source?.locator)) errors.push('items[' + index + '].source.locator is required')\n if (!Array.isArray(item.tags)) errors.push('items[' + index + '].tags must be an array')\n if (!Array.isArray(item.concepts)) errors.push('items[' + index + '].concepts must be an array')\n if (!Array.isArray(item.relationships)) errors.push('items[' + index + '].relationships must be an array')\n if (!Array.isArray(item.provenance) || item.provenance.length === 0) {\n errors.push('items[' + index + '].provenance must be a non-empty array')\n }\n validateOptionalRichMetadata(item, index, errors)\n if (!item.privacy || typeof item.privacy.pii !== 'boolean' || !hasString(item.privacy.classification)) {\n errors.push('items[' + index + '].privacy requires classification and pii')\n }\n }\n\n return { valid: errors.length === 0, errors, counts }\n}\n\nexport function assertAiwgFortemiIndexExport(value: unknown): AiwgFortemiIndexExport {\n const result = validateAiwgFortemiIndexExport(value)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi index export:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiIndexExport\n}\n\nexport function validateAiwgFortemiChunkManifest(value: unknown): AiwgChunkedIndexValidationResult {\n const errors: string[] = []\n const data = value as Partial<AiwgFortemiChunkManifest>\n\n if (data?.schema_version !== 'aiwg.fortemi.index.chunk-manifest.v1') {\n errors.push('schema_version must be aiwg.fortemi.index.chunk-manifest.v1')\n }\n if (!hasString(data?.generated_at)) errors.push('generated_at is required')\n if (!hasString(data?.source?.repo)) errors.push('source.repo is required')\n if (!hasString(data?.source?.privacy)) errors.push('source.privacy is required')\n if (!hasNonNegativeInteger(data?.total)) errors.push('total must be a non-negative integer')\n if (!hasPositiveInteger(data?.part_size)) errors.push('part_size must be a positive integer')\n if (data.facets !== undefined && !isFacetCounts(data.facets)) {\n errors.push('facets must be a nested string-to-number count object')\n }\n if (data.projection !== undefined) {\n if (!Array.isArray(data.projection) || !data.projection.every((field) => typeof field === 'string')) {\n errors.push('projection must be an array of field names')\n } else {\n const present = new Set(data.projection)\n for (const field of AIWG_SCAN_REQUIRED_FIELDS) {\n if (!present.has(field)) errors.push('projection must include scan-required field ' + field)\n }\n }\n }\n if (data.detail !== undefined) {\n if (!hasString(data.detail.href)) errors.push('detail.href is required')\n else if (!data.detail.href.includes('{id}')) errors.push('detail.href must contain the {id} placeholder')\n if (\n data.detail.encoding !== undefined &&\n data.detail.encoding !== 'uri' &&\n data.detail.encoding !== 'base64url'\n ) {\n errors.push(\"detail.encoding must be 'uri' or 'base64url'\")\n }\n }\n if (!Array.isArray(data?.parts)) errors.push('parts must be an array')\n\n let expectedOffset = 0\n const parts = Array.isArray(data?.parts) ? data.parts : []\n for (const [index, part] of parts.entries()) {\n if (!hasString(part.href)) errors.push('parts[' + index + '].href is required')\n if (!hasNonNegativeInteger(part.offset)) errors.push('parts[' + index + '].offset must be a non-negative integer')\n if (!hasNonNegativeInteger(part.count)) errors.push('parts[' + index + '].count must be a non-negative integer')\n if (hasNonNegativeInteger(part.offset) && part.offset !== expectedOffset) {\n errors.push('parts[' + index + '].offset must be ' + expectedOffset)\n }\n if (hasNonNegativeInteger(part.count)) expectedOffset += part.count\n }\n if (hasNonNegativeInteger(data?.total) && expectedOffset !== data.total) {\n errors.push('parts counts must add up to total')\n }\n\n return { valid: errors.length === 0, errors }\n}\n\nexport function assertAiwgFortemiChunkManifest(value: unknown): AiwgFortemiChunkManifest {\n const result = validateAiwgFortemiChunkManifest(value)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi chunk manifest:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiChunkManifest\n}\n\n// Validate projected (slim) scan-part items: scan-required fields only, ids unique + sorted.\nfunction validateProjectedRecords(items: Array<Partial<AiwgFortemiRecord>>): string[] {\n const errors: string[] = []\n const ids = new Set<string>()\n let previousId = ''\n for (const [index, item] of items.entries()) {\n if (item.schema_version !== 'aiwg.fortemi.index.record.v1') {\n errors.push('items[' + index + '].schema_version must be aiwg.fortemi.index.record.v1')\n }\n if (!hasString(item.id)) errors.push('items[' + index + '].id is required')\n if (hasString(item.id) && ids.has(item.id)) errors.push('duplicate id: ' + item.id)\n if (hasString(item.id)) ids.add(item.id)\n if (previousId && hasString(item.id) && previousId.localeCompare(item.id) > 0) {\n errors.push('items must be sorted by id: ' + previousId + ' before ' + item.id)\n }\n if (hasString(item.id)) previousId = item.id\n if (!item.type || !VALID_TYPES.has(item.type)) errors.push('items[' + index + '].type is invalid')\n if (!hasString(item.title)) errors.push('items[' + index + '].title is required')\n if (typeof item.text !== 'string') errors.push('items[' + index + '].text is required')\n if (!item.facets || typeof item.facets !== 'object' || Array.isArray(item.facets)) {\n errors.push('items[' + index + '].facets must be an object')\n }\n if (!Array.isArray(item.tags)) errors.push('items[' + index + '].tags must be an array')\n if (!Array.isArray(item.concepts)) errors.push('items[' + index + '].concepts must be an array')\n if (!item.privacy || !hasString(item.privacy.classification)) {\n errors.push('items[' + index + '].privacy.classification is required')\n }\n }\n return errors\n}\n\nexport function validateAiwgFortemiChunkPart(\n value: unknown,\n partRef?: AiwgFortemiChunkPartRef,\n manifest?: AiwgFortemiChunkManifest,\n): AiwgChunkedIndexValidationResult {\n const errors: string[] = []\n const data = value as Partial<AiwgFortemiChunkPart>\n\n if (data?.schema_version !== 'aiwg.fortemi.index.chunk.v1') {\n errors.push('schema_version must be aiwg.fortemi.index.chunk.v1')\n }\n if (data?.manifest_schema_version !== 'aiwg.fortemi.index.chunk-manifest.v1') {\n errors.push('manifest_schema_version must be aiwg.fortemi.index.chunk-manifest.v1')\n }\n if (!hasNonNegativeInteger(data?.offset)) errors.push('offset must be a non-negative integer')\n if (!Array.isArray(data?.items)) errors.push('items must be an array')\n\n if (partRef && hasNonNegativeInteger(data?.offset) && data.offset !== partRef.offset) {\n errors.push('offset must match manifest part offset ' + partRef.offset)\n }\n if (partRef && Array.isArray(data?.items) && data.items.length !== partRef.count) {\n errors.push('items length must match manifest part count ' + partRef.count)\n }\n\n if (Array.isArray(data?.items)) {\n if (manifest?.projection) {\n errors.push(...validateProjectedRecords(data.items).map((error) => 'items.' + error))\n } else {\n const validation = validateAiwgFortemiIndexExport({\n schema_version: 'aiwg.fortemi.index.export.v1',\n generated_at: manifest?.generated_at ?? '1970-01-01T00:00:00.000Z',\n source: manifest?.source ?? { repo: 'chunk', privacy: 'public' },\n items: data.items,\n })\n errors.push(...validation.errors.map((error) => 'items.' + error))\n }\n }\n\n return { valid: errors.length === 0, errors }\n}\n\nexport function assertAiwgFortemiChunkPart(\n value: unknown,\n partRef?: AiwgFortemiChunkPartRef,\n manifest?: AiwgFortemiChunkManifest,\n): AiwgFortemiChunkPart {\n const result = validateAiwgFortemiChunkPart(value, partRef, manifest)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi chunk part:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiChunkPart\n}\n\nexport function createAiwgFetchChunkLoader(baseUrl?: string | URL): AiwgChunkedIndexLoader {\n return async (part) => {\n const href = baseUrl ? new URL(part.href, baseUrl).toString() : part.href\n const response = await fetch(href)\n if (!response.ok) throw new Error('Failed to fetch AIWG index chunk ' + href + ': ' + response.status)\n return response.json()\n }\n}\n\n// Encode a record id into a single, path-safe detail filename segment.\n// - 'base64url' (default): UTF-8 → base64url (no '+', '/', '=', '%'). Safe for ids\n// containing '/' on static hosts that reject %2F (#177).\n// - 'uri': encodeURIComponent (legacy).\nexport function encodeAiwgDetailId(id: string, encoding: AiwgDetailIdEncoding = 'base64url'): string {\n if (encoding === 'uri') return encodeURIComponent(id)\n const bytes = new TextEncoder().encode(id)\n let binary = ''\n for (const byte of bytes) binary += String.fromCharCode(byte)\n // btoa is available in browsers and Node ≥16.\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n// Resolve a manifest detail.href template for a given id, honoring detail.encoding\n// (absent → 'uri' for backward compatibility). The writer and the loader both go\n// through this so emitted filenames and fetched paths always agree.\nexport function aiwgDetailHrefForId(detail: AiwgFortemiChunkDetailRef, id: string): string {\n return detail.href.replace('{id}', encodeAiwgDetailId(id, detail.encoding ?? 'uri'))\n}\n\n// Detail loader for projected indexes: resolves the manifest's detail.href {id}\n// template (encoded per detail.encoding) against baseUrl and fetches the full record.\nexport function createAiwgFetchDetailLoader(baseUrl?: string | URL): AiwgChunkedIndexDetailLoader {\n return async (id, manifest) => {\n if (!manifest.detail?.href) throw new Error('Manifest has no detail.href for record resolution')\n const relative = aiwgDetailHrefForId(manifest.detail, id)\n const href = baseUrl ? new URL(relative, baseUrl).toString() : relative\n const response = await fetch(href)\n if (!response.ok) throw new Error('Failed to fetch AIWG index detail ' + href + ': ' + response.status)\n return response.json()\n }\n}\n\nexport function getAiwgFortemiFacets(items: AiwgFortemiRecord[]): Record<string, Record<string, number>> {\n const result: Record<string, Record<string, number>> = {}\n for (const item of items) {\n pushFacet(result, 'type', item.type)\n pushFacet(result, 'privacy', item.privacy.classification)\n for (const tag of item.tags) pushFacet(result, 'tag', tag)\n for (const concept of item.concepts) pushFacet(result, 'concept', concept)\n for (const [name, values] of Object.entries(item.facets)) {\n for (const value of values) pushFacet(result, name, value)\n }\n }\n return result\n}\n\nexport interface AiwgChunkedIndexBuildOptions {\n partSize?: number\n // When set, scan parts carry only these fields; full records go to `details`.\n projection?: Array<keyof AiwgFortemiRecord>\n // Detail href template (with {id}); defaults to \"detail/{id}.json\" when projecting.\n detailHref?: string\n // id→filename encoding for detail files; defaults to 'base64url' (path-safe,\n // works for ids containing '/'; see #177).\n idEncoding?: AiwgDetailIdEncoding\n generatedAt?: string\n}\n\nexport interface AiwgChunkedIndexBuildResult {\n manifest: AiwgFortemiChunkManifest\n parts: Array<{ href: string; part: AiwgFortemiChunkPart }>\n // Empty unless projecting. Each entry carries the full record plus the resolved,\n // encoding-correct `href` to host it at — write the record to that path so the\n // detail loader (which uses the same encoding) can fetch it back.\n details: Array<{ id: string; href: string; record: AiwgFortemiRecord }>\n}\n\n// Pure builder (no I/O): project an index export into the chunked manifest + parts\n// (+ detail records when projecting). The caller writes the returned objects to disk.\n// Manifest facets are computed from the full records, so global counts are exact even\n// when scan parts are slim.\nexport function buildAiwgChunkedIndex(\n index: AiwgFortemiIndexExport,\n options: AiwgChunkedIndexBuildOptions = {},\n): AiwgChunkedIndexBuildResult {\n const partSize = hasPositiveInteger(options.partSize) ? options.partSize : 500\n const projection = options.projection\n const idEncoding = options.idEncoding ?? 'base64url'\n const detailHref = options.detailHref ?? 'detail/{id}.json'\n const items = index.items\n const pad = (value: number): string => String(value).padStart(4, '0')\n const project = (record: AiwgFortemiRecord): AiwgFortemiRecord => {\n if (!projection) return record\n const slim: Record<string, unknown> = {}\n for (const field of projection) slim[field] = record[field]\n return slim as unknown as AiwgFortemiRecord\n }\n\n const parts: Array<{ href: string; part: AiwgFortemiChunkPart }> = []\n const partRefs: AiwgFortemiChunkPartRef[] = []\n for (let offset = 0, partIndex = 0; offset < items.length; offset += partSize, partIndex += 1) {\n const slice = items.slice(offset, offset + partSize)\n const href = 'part-' + pad(partIndex) + '.json'\n parts.push({\n href,\n part: {\n schema_version: 'aiwg.fortemi.index.chunk.v1',\n manifest_schema_version: 'aiwg.fortemi.index.chunk-manifest.v1',\n offset,\n items: slice.map(project),\n },\n })\n partRefs.push({ href, offset, count: slice.length })\n }\n\n const manifest: AiwgFortemiChunkManifest = {\n schema_version: 'aiwg.fortemi.index.chunk-manifest.v1',\n generated_at: options.generatedAt ?? index.generated_at,\n source: index.source,\n total: items.length,\n part_size: partSize,\n facets: getAiwgFortemiFacets(items),\n parts: partRefs,\n ...(projection ? { projection, detail: { href: detailHref, encoding: idEncoding } } : {}),\n }\n\n return {\n manifest,\n parts,\n details: projection\n ? items.map((record) => ({\n id: record.id,\n href: aiwgDetailHrefForId({ href: detailHref, encoding: idEncoding }, record.id),\n record,\n }))\n : [],\n }\n}\n\nfunction includesAll(actual: string[], expected: string[] | undefined): boolean {\n if (!expected || expected.length === 0) return true\n const actualSet = new Set(actual)\n return expected.every((value) => actualSet.has(value))\n}\n\nfunction matchesFacetFilters(item: AiwgFortemiRecord, filters: Record<string, string[]> | undefined): boolean {\n if (!filters) return true\n return Object.entries(filters).every(([name, expected]) => includesAll(item.facets[name] ?? [], expected))\n}\n\nfunction queryMatches(item: AiwgFortemiRecord, q: string): AiwgIndexQueryMatch[] {\n if (!q) return []\n const matches: AiwgIndexQueryMatch[] = []\n if (item.title.toLowerCase().includes(q)) matches.push({ field: 'title', value: item.title })\n if (item.text.toLowerCase().includes(q)) matches.push({ field: 'text', value: item.text })\n for (const tag of item.tags) {\n if (tag.toLowerCase().includes(q)) matches.push({ field: 'tag', value: tag })\n }\n for (const concept of item.concepts) {\n if (concept.toLowerCase().includes(q)) matches.push({ field: 'concept', value: concept })\n }\n return matches\n}\n\nfunction rankMatches(matches: AiwgIndexQueryMatch[], weights: AiwgIndexQueryWeights): number {\n return matches.reduce((total, match) => total + weights[match.field], 0)\n}\n\nfunction clipSnippet(value: string, q: string, maxLength: number): string {\n const normalizedLength = Math.max(20, maxLength)\n if (!value) return ''\n if (!q) return value.length > normalizedLength ? `${value.slice(0, normalizedLength).trimEnd()}...` : value\n\n const lower = value.toLowerCase()\n const index = lower.indexOf(q)\n if (index < 0) return value.length > normalizedLength ? `${value.slice(0, normalizedLength).trimEnd()}...` : value\n\n const context = Math.max(0, Math.floor((normalizedLength - q.length) / 2))\n const start = Math.max(0, index - context)\n const end = Math.min(value.length, start + normalizedLength)\n const prefix = start > 0 ? '...' : ''\n const suffix = end < value.length ? '...' : ''\n return `${prefix}${value.slice(start, end).trim()}${suffix}`\n}\n\nfunction createSnippet(item: AiwgFortemiRecord, matches: AiwgIndexQueryMatch[], q: string, maxLength: number): string {\n const textMatch = matches.find((match) => match.field === 'text')\n const titleMatch = matches.find((match) => match.field === 'title')\n const firstMatch = textMatch ?? titleMatch ?? matches[0]\n return clipSnippet(firstMatch?.value ?? item.text, q, maxLength)\n}\n\ninterface AiwgRankedEntry {\n item: AiwgFortemiRecord\n ordinal: number\n rank: number\n matches: AiwgIndexQueryMatch[]\n}\n\nfunction createRankedEntries(\n items: AiwgFortemiRecord[],\n q: string,\n options: AiwgIndexQueryOptions,\n ordinalBase = 0,\n): AiwgRankedEntry[] {\n const weights = { ...DEFAULT_QUERY_WEIGHTS, ...options.weights }\n return items.map((item, ordinal) => ({ item, ordinal: ordinalBase + ordinal, matches: queryMatches(item, q) }))\n .filter(({ item, matches }) => {\n if (q && matches.length === 0) return false\n if (options.types && !options.types.includes(item.type)) return false\n if (options.privacy && !options.privacy.includes(item.privacy.classification)) return false\n if (!includesAll(item.tags, options.tags)) return false\n if (!includesAll(item.concepts, options.concepts)) return false\n if (!matchesFacetFilters(item, options.facets)) return false\n if (options.relationshipTargetId && !(item.relationships ?? []).some((rel) => rel.target_id === options.relationshipTargetId)) {\n return false\n }\n return true\n })\n .map(({ item, ordinal, matches }) => ({\n item,\n ordinal,\n rank: rankMatches(matches, weights),\n matches,\n }))\n}\n\nfunction sortRankedEntries(entries: AiwgRankedEntry[], rank?: boolean): AiwgRankedEntry[] {\n return [...entries].sort((left, right) => {\n if (rank) return right.rank - left.rank || left.ordinal - right.ordinal\n return left.ordinal - right.ordinal\n })\n}\n\nfunction createQueryResultFromRankedEntries(\n entries: AiwgRankedEntry[],\n query: string,\n options: AiwgIndexQueryOptions,\n): AiwgIndexQueryResult {\n const ranked = sortRankedEntries(entries, options.rank)\n const offset = options.offset ?? 0\n const limit = options.limit ?? ranked.length\n const page = ranked.slice(offset, offset + limit)\n const result: AiwgIndexQueryResult = {\n items: page.map((entry) => entry.item),\n total: ranked.length,\n facets: getAiwgFortemiFacets(ranked.map((entry) => entry.item)),\n }\n if (options.rank || options.snippets || options.includeMatches) {\n const snippetLength = options.snippetLength ?? 160\n result.rankedItems = page.map((entry) => ({\n item: entry.item,\n rank: entry.rank,\n ...(options.snippets ? { snippet: createSnippet(entry.item, entry.matches, query, snippetLength) } : {}),\n ...(options.includeMatches ? { matches: entry.matches } : {}),\n }))\n }\n return result\n}\n\nexport function queryAiwgFortemiIndex(\n index: AiwgFortemiIndexExport,\n query = '',\n options: AiwgIndexQueryOptions = {},\n): AiwgIndexQueryResult {\n const q = query.trim().toLowerCase()\n return createQueryResultFromRankedEntries(createRankedEntries(index.items, q, options), q, options)\n}\n\ninterface AiwgChunkedIndexRuntime {\n manifest: AiwgFortemiChunkManifest\n loader: AiwgChunkedIndexLoader\n maxCachedParts: number\n partCache: Map<string, AiwgFortemiChunkPart>\n detailLoader?: AiwgChunkedIndexDetailLoader\n maxCachedDetails: number\n detailCache: Map<string, AiwgFortemiRecord>\n maxCachedMatches: number\n // query+filter+weights key -> the full filtered/ranked entry set for that\n // query (offset/limit/sort/snippets independent). LRU-ordered; bounded by\n // maxCachedMatches (total entries). Lets pagination reuse a single scan.\n matchCache: Map<string, AiwgRankedEntry[]>\n}\n\nfunction chunkPartCacheKey(part: AiwgFortemiChunkPartRef): string {\n return `${part.offset}:${part.href}`\n}\n\nfunction clampMaxCachedParts(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 3\n return value\n}\n\nfunction clampMaxCachedDetails(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 32\n return value\n}\n\nfunction clampMaxCachedMatches(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 5000\n return value\n}\n\n// Stable key over the inputs that determine the filtered/ranked entry SET and\n// each entry's rank value — but not offset/limit/sort/snippets, which only shape\n// the page projected from a cached set. Caller-stable option objects (same field\n// order each page) hit the cache; a reordered object simply misses (still correct).\nfunction matchSetCacheKey(q: string, options: AiwgIndexQueryOptions): string {\n return JSON.stringify({\n q,\n types: options.types ?? null,\n facets: options.facets ?? null,\n tags: options.tags ?? null,\n concepts: options.concepts ?? null,\n privacy: options.privacy ?? null,\n rel: options.relationshipTargetId ?? null,\n weights: { ...DEFAULT_QUERY_WEIGHTS, ...options.weights },\n })\n}\n\nfunction cacheMatchEntries(runtime: AiwgChunkedIndexRuntime, key: string, entries: AiwgRankedEntry[]): void {\n runtime.matchCache.delete(key)\n runtime.matchCache.set(key, entries)\n let total = 0\n for (const set of runtime.matchCache.values()) total += set.length\n // Evict oldest sets until within budget, but always keep the just-inserted set\n // so paging a large result still benefits from the single scan.\n while (total > runtime.maxCachedMatches && runtime.matchCache.size > 1) {\n const oldest = runtime.matchCache.keys().next().value\n if (oldest === undefined || oldest === key) break\n total -= runtime.matchCache.get(oldest)?.length ?? 0\n runtime.matchCache.delete(oldest)\n }\n}\n\nfunction isDirectChunkBrowse(query: string, options: AiwgIndexQueryOptions): boolean {\n return query.trim() === ''\n && !options.rank\n && !options.snippets\n && !options.includeMatches\n && !options.types\n && !options.facets\n && !options.tags\n && !options.concepts\n && !options.privacy\n && !options.relationshipTargetId\n}\n\nfunction getPartsForRange(\n manifest: AiwgFortemiChunkManifest,\n offset: number,\n limit: number,\n): AiwgFortemiChunkPartRef[] {\n const end = offset + limit\n return manifest.parts.filter((part) => part.count > 0 && part.offset < end && part.offset + part.count > offset)\n}\n\nasync function loadChunkPart(\n runtime: AiwgChunkedIndexRuntime,\n part: AiwgFortemiChunkPartRef,\n): Promise<{ part: AiwgFortemiChunkPart; fetched: boolean }> {\n const key = chunkPartCacheKey(part)\n const cached = runtime.partCache.get(key)\n if (cached) {\n runtime.partCache.delete(key)\n runtime.partCache.set(key, cached)\n return { part: cached, fetched: false }\n }\n\n const parsed = assertAiwgFortemiChunkPart(await runtime.loader(part, runtime.manifest), part, runtime.manifest)\n runtime.partCache.set(key, parsed)\n while (runtime.partCache.size > runtime.maxCachedParts) {\n const oldest = runtime.partCache.keys().next().value\n if (oldest === undefined) break\n runtime.partCache.delete(oldest)\n }\n return { part: parsed, fetched: true }\n}\n\nasync function getChunkRecord(runtime: AiwgChunkedIndexRuntime, id: string): Promise<AiwgFortemiRecord> {\n const cached = runtime.detailCache.get(id)\n if (cached) {\n runtime.detailCache.delete(id)\n runtime.detailCache.set(id, cached)\n return cached\n }\n // Whole-record parts already in cache: serve without a detail fetch.\n if (!runtime.manifest.projection) {\n for (const part of runtime.partCache.values()) {\n const found = part.items.find((item) => item.id === id)\n if (found) return found\n }\n }\n if (!runtime.detailLoader) {\n throw new Error('No detailLoader configured to resolve record ' + id)\n }\n const raw = await runtime.detailLoader(id, runtime.manifest)\n const record = assertAiwgFortemiIndexExport({\n schema_version: 'aiwg.fortemi.index.export.v1',\n generated_at: runtime.manifest.generated_at,\n source: runtime.manifest.source,\n items: [raw],\n }).items[0]\n if (record.id !== id) {\n throw new Error('Detail record id mismatch: expected ' + id + ', got ' + record.id)\n }\n runtime.detailCache.set(id, record)\n while (runtime.detailCache.size > runtime.maxCachedDetails) {\n const oldest = runtime.detailCache.keys().next().value\n if (oldest === undefined) break\n runtime.detailCache.delete(oldest)\n }\n return record\n}\n\nasync function queryChunkedAiwgFortemiIndex(\n runtime: AiwgChunkedIndexRuntime,\n query = '',\n options: AiwgChunkedIndexQueryOptions = {},\n): Promise<AiwgChunkedIndexQueryResult> {\n const q = query.trim().toLowerCase()\n let scannedParts = 0\n let fetchedParts = 0\n\n if (isDirectChunkBrowse(query, options)) {\n const offset = options.offset ?? 0\n const limit = options.limit ?? runtime.manifest.total\n const parts = getPartsForRange(runtime.manifest, offset, limit)\n const items: AiwgFortemiRecord[] = []\n for (const partRef of parts) {\n const loaded = await loadChunkPart(runtime, partRef)\n if (loaded.fetched) fetchedParts += 1\n scannedParts += 1\n options.onProgress?.({ phase: 'part', done: scannedParts, total: parts.length, href: partRef.href })\n const start = Math.max(0, offset - partRef.offset)\n const end = Math.min(loaded.part.items.length, offset + limit - partRef.offset)\n items.push(...loaded.part.items.slice(start, end))\n }\n return {\n items,\n total: runtime.manifest.total,\n facets: runtime.manifest.facets ?? {},\n manifestTotal: runtime.manifest.total,\n scannedParts,\n fetchedParts,\n complete: true,\n }\n }\n\n // Reuse the filtered/ranked entry set across pages of the same query: the\n // expensive part scan is offset/limit/sort/snippet independent. A hit projects\n // a new page from cached entries without touching parts (scanned/fetched = 0).\n const matchKey = matchSetCacheKey(q, options)\n const cached = runtime.matchCache.get(matchKey)\n if (cached) {\n runtime.matchCache.delete(matchKey)\n runtime.matchCache.set(matchKey, cached)\n return {\n ...createQueryResultFromRankedEntries(cached, q, options),\n manifestTotal: runtime.manifest.total,\n scannedParts: 0,\n fetchedParts: 0,\n complete: true,\n }\n }\n\n const entries: AiwgRankedEntry[] = []\n for (const partRef of runtime.manifest.parts) {\n const loaded = await loadChunkPart(runtime, partRef)\n if (loaded.fetched) fetchedParts += 1\n scannedParts += 1\n options.onProgress?.({ phase: 'part', done: scannedParts, total: runtime.manifest.parts.length, href: partRef.href })\n entries.push(...createRankedEntries(loaded.part.items, q, options, partRef.offset))\n options.onProgress?.({ phase: 'query', done: scannedParts, total: runtime.manifest.parts.length, href: partRef.href })\n }\n cacheMatchEntries(runtime, matchKey, entries)\n\n return {\n ...createQueryResultFromRankedEntries(entries, q, options),\n manifestTotal: runtime.manifest.total,\n scannedParts,\n fetchedParts,\n complete: true,\n }\n}\n\nexport function createAiwgReviewDecisionExport(\n // Only the export schema_version is needed — so this works in chunked mode\n // (where no whole index is loaded) by passing a minimal source. See #178.\n source: Pick<AiwgFortemiIndexExport, 'schema_version'>,\n decisions: AiwgReviewDecision[],\n generatedAt = new Date().toISOString(),\n): AiwgReviewDecisionExport {\n return {\n schema_version: 'aiwg.fortemi.review-decisions.v1',\n generated_at: generatedAt,\n source_export_schema_version: source.schema_version,\n decisions: [...decisions].sort((left, right) => left.item_id.localeCompare(right.item_id)),\n }\n}\n\nexport function createAiwgIndexController(initialIndex?: AiwgFortemiIndexExport): AiwgIndexController {\n let index: AiwgFortemiIndexExport | null = initialIndex ?? null\n let chunked: AiwgChunkedIndexRuntime | null = null\n let data: AiwgIndexQueryResult | null = null\n let error: Error | null = null\n let reviewDecisions: AiwgReviewDecision[] = []\n const listeners = new Set<AiwgIndexControllerListener>()\n\n const snapshot = (): AiwgIndexControllerSnapshot => ({\n index,\n chunked: chunked\n ? {\n manifest: chunked.manifest,\n cachedParts: chunked.partCache.size,\n maxCachedParts: chunked.maxCachedParts,\n }\n : null,\n data,\n error,\n reviewDecisions: [...reviewDecisions],\n })\n const notify = () => {\n const current = snapshot()\n for (const listener of listeners) listener(current)\n }\n const requireIndex = (): AiwgFortemiIndexExport => {\n if (!index) throw new Error('No AIWG index export loaded')\n return index\n }\n\n return {\n loadIndex(value: unknown): AiwgFortemiIndexExport {\n try {\n const parsed = assertAiwgFortemiIndexExport(value)\n index = parsed\n chunked = null\n data = null\n reviewDecisions = []\n error = null\n notify()\n return parsed\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n loadChunkedIndex(\n manifest: unknown,\n loader: AiwgChunkedIndexLoader,\n options: AiwgChunkedIndexLoadOptions = {},\n ): AiwgFortemiChunkManifest {\n try {\n const parsed = assertAiwgFortemiChunkManifest(manifest)\n index = null\n chunked = {\n manifest: parsed,\n loader,\n maxCachedParts: clampMaxCachedParts(options.maxCachedParts),\n partCache: new Map(),\n detailLoader: options.detailLoader,\n maxCachedDetails: clampMaxCachedDetails(options.maxCachedDetails),\n detailCache: new Map(),\n maxCachedMatches: clampMaxCachedMatches(options.maxCachedMatches),\n matchCache: new Map(),\n }\n data = null\n reviewDecisions = []\n error = null\n notify()\n return parsed\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n getIndex(): AiwgFortemiIndexExport | null {\n return index\n },\n getChunkedManifest(): AiwgFortemiChunkManifest | null {\n return chunked?.manifest ?? null\n },\n getSnapshot(): AiwgIndexControllerSnapshot {\n return snapshot()\n },\n query(query = '', options?: AiwgIndexQueryOptions): AiwgIndexQueryResult {\n const result = queryAiwgFortemiIndex(requireIndex(), query, options)\n data = result\n error = null\n notify()\n return result\n },\n async queryChunked(query = '', options?: AiwgChunkedIndexQueryOptions): Promise<AiwgChunkedIndexQueryResult> {\n if (!chunked) throw new Error('No AIWG chunked index manifest loaded')\n try {\n const result = await queryChunkedAiwgFortemiIndex(chunked, query, options)\n data = result\n error = null\n notify()\n return result\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n async getRecord(id: string): Promise<AiwgFortemiRecord> {\n if (chunked) {\n try {\n return await getChunkRecord(chunked, id)\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n }\n const found = requireIndex().items.find((item) => item.id === id)\n if (!found) throw new Error('Record not found: ' + id)\n return found\n },\n clearChunkCache(): void {\n chunked?.partCache.clear()\n chunked?.detailCache.clear()\n chunked?.matchCache.clear()\n error = null\n notify()\n },\n toCommunityGraph(options?: AiwgIndexGraphOptions) {\n return aiwgFortemiIndexToCommunityGraph(requireIndex(), options)\n },\n setReviewDecision(input: AiwgReviewInput): AiwgReviewDecision {\n const decision: AiwgReviewDecision = {\n ...input,\n updated_at: new Date().toISOString(),\n }\n reviewDecisions = [\n ...reviewDecisions.filter((item) => item.item_id !== decision.item_id),\n decision,\n ].sort((left, right) => left.item_id.localeCompare(right.item_id))\n error = null\n notify()\n return decision\n },\n clearReviewDecision(itemId: string): void {\n reviewDecisions = reviewDecisions.filter((item) => item.item_id !== itemId)\n error = null\n notify()\n },\n createReviewDecisionExport(generatedAt?: string): AiwgReviewDecisionExport {\n // The review-decisions export only needs the export schema_version, not the\n // items — so it works in chunked mode by synthesizing a minimal source (#178).\n const source: Pick<AiwgFortemiIndexExport, 'schema_version'> | null =\n index ?? (chunked ? { schema_version: 'aiwg.fortemi.index.export.v1' } : null)\n if (!source) throw new Error('No AIWG index export or chunked manifest loaded')\n return createAiwgReviewDecisionExport(source, reviewDecisions, generatedAt)\n },\n subscribe(listener: AiwgIndexControllerListener): () => void {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n }\n}\n\nexport function aiwgFortemiIndexToCommunityGraph(\n index: AiwgFortemiIndexExport,\n options: AiwgIndexGraphOptions = {},\n) {\n const ids = new Set(index.items.map((item) => item.id))\n const relationshipWeights = options.relationshipWeights ?? {}\n const edgeCounts = new Map<string, { source: string; target: string; kind: string; weight: number }>()\n\n for (const item of index.items) {\n for (const relationship of item.relationships) {\n if (!ids.has(relationship.target_id) && !options.includeDanglingRelationships) continue\n const kind = relationship.type\n const baseWeight = relationshipWeights[kind] ?? 1\n const key = `${item.id}\\u0000${relationship.target_id}\\u0000${kind}`\n const existing = edgeCounts.get(key)\n if (existing) existing.weight += baseWeight\n else edgeCounts.set(key, { source: item.id, target: relationship.target_id, kind, weight: baseWeight })\n }\n }\n\n const communities = new Map<string, string[]>()\n for (const item of index.items) {\n const communityIds = communityIdsFor(item, options)\n for (const communityId of communityIds) {\n const nodes = communities.get(communityId) ?? []\n nodes.push(item.id)\n communities.set(communityId, nodes)\n }\n }\n\n return {\n nodes: index.items.map((item) => ({ id: item.id })),\n edges: Array.from(edgeCounts.values()).sort((left, right) => (\n left.source.localeCompare(right.source)\n || left.target.localeCompare(right.target)\n || left.kind.localeCompare(right.kind)\n )),\n communities: Array.from(communities.entries())\n .map(([id, nodes]) => ({ id, nodes: [...new Set(nodes)].sort() }))\n .sort((left, right) => left.id.localeCompare(right.id)),\n }\n}\n\nfunction communityIdsFor(item: AiwgFortemiRecord, options: AiwgIndexGraphOptions): string[] {\n if (options.communityFacet) {\n const values = item.facets[options.communityFacet] ?? []\n if (values.length > 0) return values.map((value) => `${options.communityFacet}:${value}`)\n }\n if (options.communityTagPrefix) {\n const prefix = options.communityTagPrefix\n const tags = item.tags.filter((tag) => tag.startsWith(prefix))\n if (tags.length > 0) return tags\n }\n if (item.concepts.length > 0) return item.concepts.map((concept) => `concept:${concept}`)\n return [`type:${item.type}`]\n}\n","export const VERSION = '2026.6.8'\n\nexport { generateId } from './uuid.js'\n\nexport { TypedEventBus } from './event-bus.js'\nexport type { EventMap, IDisposable } from './event-bus.js'\n\nexport { createPGliteInstance } from './db.js'\nexport type { PersistenceMode, CreatePGliteOptions } from './db.js'\n\nexport {\n dumpDbSnapshot,\n restoreDbSnapshot,\n verifyDbSnapshotMeta,\n DbSnapshotVersionError,\n DB_SNAPSHOT_SCHEMA_VERSION,\n SUPPORTED_PGLITE_VERSION,\n CURRENT_MIGRATION_HEAD,\n} from './data-archive.js'\nexport type {\n DbSnapshot,\n DbSnapshotMeta,\n DbSnapshotCompat,\n DbSnapshotExpectations,\n DbSnapshotSource,\n DbSnapshotCompression,\n DumpableDb,\n DumpDbSnapshotOptions,\n RestoreDbSnapshotOptions,\n} from './data-archive.js'\n\n// Backend seam (#191) — uniform tool-intent operation interface + negotiation\nexport {\n selectBackend,\n createPGliteBackend,\n createShardBackend,\n createRemoteBackend,\n} from './data-backend.js'\nexport type {\n DataBackend,\n BackendCapabilities,\n BackendSemanticTier,\n BackendStartupCost,\n BackendNote,\n BackendNoteFull,\n BackendLink,\n BackendConcept,\n BackendProvenanceEdge,\n BackendSearchHit,\n BackendSearchResult,\n BackendListOptions,\n BackendSearchQueryOptions,\n BackendRequest,\n BackendCandidate,\n BackendSelection,\n PGliteBackendOptions,\n ShardBackendOptions,\n RemoteBackendConfig,\n RemoteBackendPaths,\n} from './data-backend.js'\n\nexport {\n PGliteStorageBackend,\n PGliteStorageBackendFactory,\n PGliteWorkerStorageBackend,\n PGliteWorkerStorageBackendFactory,\n defaultStorageBackendFactory,\n} from './storage-backend.js'\nexport type {\n DatabaseClient,\n QueryExecutor,\n QueryResult,\n StorageBackend,\n StorageBackendFactory,\n StorageOpenRequest,\n StorageTopology,\n PGliteWorkerStorageBackendFactoryOptions,\n} from './storage-backend.js'\n\nexport { CapabilityManager } from './capability-manager.js'\nexport type { CapabilityName, CapabilityState } from './capability-manager.js'\n\nexport { MigrationRunner } from './migration-runner.js'\nexport type { Migration } from './migration-runner.js'\nexport { allMigrations } from './migrations/index.js'\n\nexport { ArchiveManager } from './archive-manager.js'\nexport type { ArchiveInfo } from './archive-manager.js'\n\nexport { createFortemi } from './create-fortemi.js'\nexport type { FortemiCore, FortemiConfig } from './create-fortemi.js'\n\nexport { computeHash } from './hash.js'\n\nexport { registerServiceWorker } from './service-worker/register.js'\nexport type { SWRegistrationResult } from './service-worker/register.js'\n\nexport { createRoutes, matchRoute } from './service-worker/routes.js'\nexport type { RouteHandler } from './service-worker/routes.js'\n\nexport { createBlobStore, MemoryBlobStore } from './blob-store.js'\nexport type { BlobStore } from './blob-store.js'\n\nexport type { WorkerRequest, WorkerResponse } from './worker/protocol.js'\nexport { PGliteWorkerClient, TransactionProxy } from './worker/worker-client.js'\n\nexport { NotesRepository } from './repositories/notes-repository.js'\nexport { SearchRepository } from './repositories/search-repository.js'\nexport { EmbeddingSetsRepository } from './repositories/embedding-sets-repository.js'\nexport { GraphRepository, detectCommunities } from './repositories/graph-repository.js'\nexport { CommunitiesRepository } from './repositories/communities-repository.js'\nexport { buildNoteConditions } from './repositories/condition-builder.js'\nexport type { ConditionResult } from './repositories/condition-builder.js'\nexport type {\n NoteSummary,\n NoteFull,\n NoteCreateInput,\n NoteUpdateInput,\n NoteListOptions,\n PaginatedResult,\n SearchResult,\n SearchResponse,\n SearchFacets,\n SearchOptions,\n NoteRevision,\n} from './repositories/types.js'\nexport type {\n EmbeddingSetRow,\n EmbeddingSetCreateInput,\n EmbeddingSetEmbeddingInput,\n EmbeddingSetKind,\n EmbeddingSetMode,\n EmbeddingSetCriteria,\n EmbeddingSetFreshness,\n EmbeddingCompatibilityPolicy,\n VirtualMaterializationPolicy,\n VirtualEmbeddingSetSource,\n VirtualEmbeddingSetDefinition,\n EmbeddingSetSelector,\n EmbeddingSetDescriptor,\n VirtualEmbeddingSetValidationError,\n ResolvedEmbeddingSet,\n ResolvedEmbeddingRow,\n} from './repositories/embedding-sets-repository.js'\nexport type { GraphNode, GraphEdge, GraphCommunity, CommunityGraph, SimilarityGraphOptions, SimilarityGraphRequest, SimilarityGraphCacheKey, SimilarityGraphResult, CommunityOptions } from './repositories/graph-repository.js'\nexport type { CommunitySourceType, CommunityFilterDefinition, CommunitySourceDescriptor, CommunityAssignmentView, CommunitySummary, CommunityCreateInput } from './repositories/communities-repository.js'\n\nexport {\n JobQueueWorker,\n titleGenerationHandler,\n aiRevisionHandler,\n conceptTaggingHandler,\n linkingHandler,\n enqueueJob,\n enqueueNoteCreationJobs,\n enqueueFullWorkflow,\n getJobQueueStatus,\n JOB_PRIORITIES,\n JOB_CAPABILITIES,\n} from './job-queue-worker.js'\nexport type { JobQueueOptions, JobType, EnqueueJobInput, JobStatus } from './job-queue-worker.js'\n\nexport { TagsRepository } from './repositories/tags-repository.js'\nexport { CollectionsRepository } from './repositories/collections-repository.js'\nexport type { CollectionRow, CollectionCreateInput } from './repositories/collections-repository.js'\nexport { LinksRepository } from './repositories/links-repository.js'\nexport type { LinkRow } from './repositories/links-repository.js'\nexport { SkosRepository } from './repositories/skos-repository.js'\nexport type { SkosScheme, SkosConcept, SkosRelation, NoteSkosTag } from './repositories/skos-repository.js'\nexport { ProvenanceRepository } from './repositories/provenance-repository.js'\nexport type { ProvenanceEdge, RecordProvenanceInput } from './repositories/provenance-repository.js'\n\nexport { captureKnowledge, manageNote, searchTool } from './tools/index.js'\nexport type { CaptureKnowledgeResult, ManageNoteResult } from './tools/index.js'\nexport {\n CaptureKnowledgeInputSchema,\n ManageNoteInputSchema,\n SearchInputSchema,\n} from './tools/index.js'\nexport type { CaptureKnowledgeInput, ManageNoteInput, SearchInput } from './tools/index.js'\nexport { FortemiToolManifest, fortemiManifest } from './tools/index.js'\nexport type { FortemiToolDefinition, BridgeCapability } from './tools/index.js'\n\nexport { getNote, GetNoteInputSchema } from './tools/index.js'\nexport type { GetNoteInput } from './tools/index.js'\nexport { listNotes, ListNotesInputSchema } from './tools/index.js'\nexport type { ListNotesInput } from './tools/index.js'\nexport { manageTags, ManageTagsInputSchema } from './tools/index.js'\nexport type { ManageTagsInput, ManageTagsResult } from './tools/index.js'\nexport { manageCollections, ManageCollectionsInputSchema } from './tools/index.js'\nexport type { ManageCollectionsInput, ManageCollectionsResult } from './tools/index.js'\nexport { manageLinks, ManageLinksInputSchema } from './tools/index.js'\nexport type { ManageLinksInput, ManageLinksResult } from './tools/index.js'\nexport { manageArchive, ManageArchiveInputSchema } from './tools/index.js'\nexport type { ManageArchiveInput, ManageArchiveResult } from './tools/index.js'\nexport { manageCapabilities, ManageCapabilitiesInputSchema } from './tools/index.js'\nexport type { ManageCapabilitiesInput, ManageCapabilitiesResult, CapabilityInfo } from './tools/index.js'\nexport { manageAttachments, ManageAttachmentsInputSchema } from './tools/index.js'\nexport type { ManageAttachmentsInput, ManageAttachmentsResult } from './tools/index.js'\n\nexport { detectGpuCapabilities, estimateVramTier, selectLlmModel } from './capabilities/gpu-detect.js'\nexport type { GpuCapabilities, VramTier } from './capabilities/gpu-detect.js'\n\nexport {\n detectInferenceCapabilities,\n estimateVramMB,\n estimateModelFit,\n} from './capabilities/inference-detect.js'\nexport type {\n InferenceCapabilities,\n RecommendedTier,\n ModelFitResult,\n} from './capabilities/inference-detect.js'\n\nexport { AttachmentsRepository } from './repositories/attachments-repository.js'\nexport type { AttachmentRow, AttachmentBlobRow, AttachInput } from './repositories/attachments-repository.js'\n\nexport { chunkText } from './capabilities/chunking.js'\nexport {\n setEmbedFunction,\n getEmbedFunction,\n embeddingGenerationHandler,\n} from './capabilities/embedding-handler.js'\nexport type { EmbedFunction } from './capabilities/embedding-handler.js'\n\nexport { setLlmFunction, getLlmFunction } from './capabilities/llm-handler.js'\nexport type { LlmCompleteFn } from './capabilities/llm-handler.js'\n\nexport { cosineSimilarity, suggestTags } from './capabilities/auto-tag.js'\n\nexport {\n registerSemanticCapability,\n registerSemanticCapabilityWorker,\n unregisterSemanticCapability,\n} from './capabilities/semantic-loader.js'\nexport {\n createWorkerEmbedFunction,\n handleEmbedRequests,\n EMBED_REQUEST_KIND,\n EMBED_RESPONSE_KIND,\n} from './capabilities/embed-worker-transport.js'\nexport type {\n EmbedTransportPort,\n EmbedWorkerOptions,\n EmbedRequestMessage,\n EmbedResponseMessage,\n} from './capabilities/embed-worker-transport.js'\nexport { registerLlmCapability, unregisterLlmCapability } from './capabilities/llm-loader.js'\nexport type { LlmCapabilityOptions } from './capabilities/llm-loader.js'\n\nexport { ProviderRegistry, createLegacyProvider } from './capabilities/provider-registry.js'\nexport { OpenAICompatibleProvider } from './capabilities/openai-provider.js'\nexport type { OpenAIProviderConfig } from './capabilities/openai-provider.js'\n\nexport {\n discoverLocalProviders,\n classifyModel,\n LOCAL_ENDPOINTS,\n} from './capabilities/local-discovery.js'\nexport { FallbackRouter, classifyError } from './capabilities/fallback-router.js'\nexport type {\n FallbackRouterConfig,\n CooldownConfig,\n ErrorCategory,\n FallbackEvent,\n CooldownEvent,\n} from './capabilities/fallback-router.js'\n\nexport type {\n DiscoveredProvider,\n DiscoveryOptions,\n LocalEndpoint,\n ModelCategory,\n} from './capabilities/local-discovery.js'\n\nexport {\n getFortemiBridge,\n getFortemiSecretStore,\n hasFortemiSecureSecrets,\n} from './fortemi-bridge.js'\nexport type {\n BridgeProviderInfo,\n FortemiBridge,\n FortemiBridgeCapabilities,\n FortemiBridgeHost,\n FortemiInferenceRouter,\n FortemiSecretStore,\n} from './fortemi-bridge.js'\n\nexport type {\n InferenceProvider,\n ProviderCapabilities,\n ProviderTier,\n EmbedRequest,\n EmbedResponse,\n CompletionRequest,\n CompletionResponse,\n StreamChunk,\n ModelInfo,\n ProbeResult,\n ProbeStatus,\n} from './capabilities/inference-provider.js'\n\nexport {\n buildPluginCsp,\n computeSri,\n verifySri,\n isPluginScriptAllowed,\n fetchPluginScript,\n appendPluginScript,\n parseCspReport,\n createCspReportHandler,\n} from './security/plugin-content.js'\nexport type {\n CspDirectiveName,\n CspDirectives,\n PluginCspOptions,\n PluginScriptPolicy,\n PluginScriptDescriptor,\n LoadedPluginScript,\n CspViolationReport,\n} from './security/plugin-content.js'\n\n// Shard import/export\nexport {\n CURRENT_SHARD_VERSION,\n SHARD_FORMAT,\n packTarGz,\n unpackTarGz,\n sha256Hex,\n validateChecksums,\n noteToShard,\n noteFromShard,\n linkToShard,\n linkFromShard,\n collectionToShard,\n collectionFromShard,\n tagsToShard,\n tagsFromShard,\n embeddingSetToShard,\n embeddingSetFromShard,\n embeddingSetMemberToShard,\n embeddingToShard,\n embeddingFromShard,\n skosSchemeToShard,\n skosConceptToShard,\n skosRelationToShard,\n noteSkosTagToShard,\n provenanceEdgeToShard,\n exportShard,\n importShard,\n openShard,\n createCosineSemanticProvider,\n prefetchShard,\n fromPrefetched,\n isShardPrefetched,\n getPrefetchedSha256,\n clearPrefetchedShard,\n} from './shard/index.js'\nexport type {\n ShardReader,\n ShardReaderSource,\n ShardReaderNote,\n OpenShardOptions,\n ShardListOptions,\n ShardSearchOptions,\n ShardSearchResult,\n ShardSearchRankedNote,\n ShardSearchWeights,\n ShardNoteFull,\n StaticSemanticProvider,\n ShardComponentStore,\n VectorEntry,\n CosineSemanticProviderOptions,\n ShardClusterRef,\n ShardLayout,\n PrefetchOptions,\n PrefetchResult,\n ShardManifest,\n ShardComponent,\n ExportOptions,\n ImportOptions,\n ImportProgress,\n ImportProgressPhase,\n ImportResult,\n ImportCounts,\n ConflictStrategy,\n ShardNote,\n ShardCollection,\n ShardTag,\n ShardLink,\n ShardEmbeddingSet,\n ShardEmbeddingSetMember,\n ShardEmbedding,\n ShardSkosScheme,\n ShardSkosConcept,\n ShardSkosRelation,\n ShardNoteSkosTag,\n ShardProvenanceEdge,\n BrowserNoteExport,\n} from './shard/index.js'\n\nexport {\n AIWG_SCAN_REQUIRED_FIELDS,\n assertAiwgFortemiIndexExport,\n assertAiwgFortemiChunkManifest,\n assertAiwgFortemiChunkPart,\n aiwgFortemiIndexToCommunityGraph,\n buildAiwgChunkedIndex,\n createAiwgFetchChunkLoader,\n createAiwgFetchDetailLoader,\n createAiwgIndexController,\n createAiwgReviewDecisionExport,\n getAiwgFortemiFacets,\n queryAiwgFortemiIndex,\n validateAiwgFortemiChunkManifest,\n validateAiwgFortemiChunkPart,\n validateAiwgFortemiIndexExport,\n} from './aiwg-index.js'\nexport type {\n AiwgChunkedIndexBuildOptions,\n AiwgChunkedIndexBuildResult,\n AiwgChunkedIndexDetailLoader,\n AiwgChunkedIndexLoadOptions,\n AiwgChunkedIndexLoader,\n AiwgChunkedIndexProgress,\n AiwgChunkedIndexProgressPhase,\n AiwgChunkedIndexQueryOptions,\n AiwgChunkedIndexQueryResult,\n AiwgChunkedIndexValidationResult,\n AiwgFortemiChunkDetailRef,\n AiwgFortemiChunkManifest,\n AiwgFortemiChunkPart,\n AiwgFortemiChunkPartRef,\n AiwgFortemiIndexExport,\n AiwgFortemiProjectedRecord,\n AiwgFortemiProvenance,\n AiwgFortemiProvenanceEvent,\n AiwgFortemiRecord,\n AiwgFortemiRecordSource,\n AiwgFortemiRecordType,\n AiwgFortemiRelationship,\n AiwgFortemiSkosConcept,\n AiwgFortemiSkosRelation,\n AiwgFortemiSkosRelationType,\n AiwgIndexController,\n AiwgIndexControllerListener,\n AiwgIndexControllerSnapshot,\n AiwgIndexGraphOptions,\n AiwgIndexQueryMatch,\n AiwgIndexQueryOptions,\n AiwgIndexQueryRankedItem,\n AiwgIndexQueryResult,\n AiwgIndexQueryWeights,\n AiwgIndexValidationResult,\n AiwgPrivacyClassification,\n AiwgProvenanceConfidence,\n AiwgReviewAction,\n AiwgReviewDecision,\n AiwgReviewDecisionExport,\n AiwgReviewInput,\n} from './aiwg-index.js'\n"]}
1
+ {"version":3,"sources":["../src/uuid.ts","../src/event-bus.ts","../src/db.ts","../src/migrations/0001_initial_schema.ts","../src/migrations/0002_skos_tagging.ts","../src/migrations/0003_attachments.ts","../src/migrations/0004_embeddings.ts","../src/migrations/0005_link_confidence.ts","../src/migrations/0006_embedding_set_metadata.ts","../src/migrations/0007_virtual_embedding_sets.ts","../src/migrations/0008_graph_community_artifacts.ts","../src/migrations/0009_vector_selector_performance.ts","../src/migrations/index.ts","../src/data-archive.ts","../src/hash.ts","../src/repositories/notes-repository.ts","../src/repositories/condition-builder.ts","../src/repositories/embedding-sets-repository.ts","../src/repositories/search-repository.ts","../src/repositories/links-repository.ts","../src/tools/schemas.ts","../src/tools/manage-note.ts","../src/data-backend.ts","../src/worker/worker-client.ts","../src/storage-backend.ts","../src/capability-manager.ts","../src/migration-runner.ts","../src/archive-manager.ts","../src/create-fortemi.ts","../src/service-worker/register.ts","../src/service-worker/routes.ts","../src/blob-store.ts","../src/repositories/graph-repository.ts","../src/repositories/communities-repository.ts","../src/capabilities/llm-handler.ts","../src/job-queue-worker.ts","../src/repositories/tags-repository.ts","../src/repositories/collections-repository.ts","../src/repositories/skos-repository.ts","../src/repositories/provenance-repository.ts","../src/tools/capture-knowledge.ts","../src/tools/search.ts","../src/tools/manifest.ts","../src/tools/get-note.ts","../src/tools/list-notes.ts","../src/tools/manage-tags.ts","../src/tools/manage-collections.ts","../src/tools/manage-links.ts","../src/tools/manage-archive.ts","../src/tools/manage-capabilities.ts","../src/repositories/attachments-repository.ts","../src/tools/manage-attachments.ts","../src/capabilities/gpu-detect.ts","../src/capabilities/inference-detect.ts","../src/capabilities/chunking.ts","../src/capabilities/embedding-handler.ts","../src/capabilities/auto-tag.ts","../src/capabilities/embed-worker-transport.ts","../src/capabilities/semantic-loader.ts","../src/capabilities/llm-loader.ts","../src/capabilities/provider-registry.ts","../src/capabilities/openai-provider.ts","../src/capabilities/local-discovery.ts","../src/capabilities/fallback-router.ts","../src/fortemi-bridge.ts","../src/security/plugin-content.ts","../src/shard/types.ts","../src/shard/shard-tar.ts","../src/shard/checksum.ts","../src/shard/field-mapper.ts","../src/shard/shard-export.ts","../src/shard/shard-import.ts","../src/shard/shard-reader.ts","../src/shard/semantic-providers.ts","../src/shard/prefetch.ts","../src/aiwg-index.ts","../src/index.ts"],"names":["uuidv7","vector","json","hashJson","graph","llmFn","title","z","embedFn","decoder","jsonObject","parseVector","iso","yieldToEventLoop","maybeYield","manifest","sha256","cosineSimilarity"],"mappings":"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","file":"index.js","sourcesContent":["import { v7 as uuidv7 } from 'uuid'\n\n/**\n * Generate a RFC 9562 UUIDv7 identifier.\n *\n * UUIDv7 embeds a Unix timestamp in the high bits, making IDs\n * time-sortable and monotonic within the same millisecond.\n */\nexport function generateId(): string {\n return uuidv7()\n}\n","/**\n * Typed event bus with IDisposable subscriptions (Monaco-style).\n * SSE-style pub/sub across all layers.\n *\n * Features:\n * - Exact event subscriptions via on() and once()\n * - Wildcard prefix subscriptions: on('note.*', handler)\n * - Cross-context bridging via bridge(port: MessagePort)\n */\n\nexport interface IDisposable {\n dispose(): void\n}\n\nexport interface EventMap {\n 'note.created': { id: string }\n 'note.updated': { id: string }\n 'note.deleted': { id: string }\n 'note.restored': { id: string }\n 'note.revised': { id: string; revisionNumber: number }\n 'search.reindexed': Record<string, never>\n 'embedding.ready': { noteId: string }\n 'capability.ready': { name: string }\n 'capability.disabled': { name: string }\n 'capability.loading': { name: string; progress?: number }\n 'capability.required': { name: string; jobId: string; noteId: string; type: string; message: string }\n 'job.completed': { id: string; noteId: string; type: string }\n 'job.failed': { id: string; noteId: string; type: string; error: string }\n 'job.blocked': { id: string; noteId: string; type: string; capability: string; message: string }\n 'archive.switched': { name: string }\n 'migration.applied': { version: number }\n 'provider.added': { id: string; name: string }\n 'provider.removed': { id: string }\n 'provider.active': { id: string; name: string }\n 'provider.fallback': { fromProvider: string; toProvider: string; errorCategory: string; error: string }\n 'provider.cooldown': { providerId: string; errorCategory: string; cooldownMs: number; expiresAt: number }\n}\n\ntype EventHandler<T> = (payload: T) => void\n\n/** Wildcard pattern: a string literal ending with '.*' */\ntype WildcardPattern = `${string}.*`\n\n/** Bridge message envelope sent over a MessagePort */\ninterface BridgeMessage {\n type: 'event'\n event: string\n payload: unknown\n}\n\nexport class TypedEventBus {\n private listeners = new Map<string, Set<EventHandler<unknown>>>()\n private wildcardListeners = new Map<string, Set<EventHandler<unknown>>>()\n\n // ---------------------------------------------------------------------------\n // on() — exact subscription\n // ---------------------------------------------------------------------------\n\n on<K extends keyof EventMap>(\n event: K,\n handler: EventHandler<EventMap[K]>,\n ): IDisposable\n\n on(\n pattern: WildcardPattern,\n handler: EventHandler<unknown>,\n ): IDisposable\n\n on(\n eventOrPattern: string,\n handler: EventHandler<unknown>,\n ): IDisposable {\n if (eventOrPattern.endsWith('.*')) {\n return this._onWildcard(eventOrPattern as WildcardPattern, handler)\n }\n return this._onExact(eventOrPattern, handler)\n }\n\n private _onExact(event: string, handler: EventHandler<unknown>): IDisposable {\n let set = this.listeners.get(event)\n if (!set) {\n set = new Set()\n this.listeners.set(event, set)\n }\n set.add(handler)\n\n return {\n dispose: () => {\n set!.delete(handler)\n if (set!.size === 0) {\n this.listeners.delete(event)\n }\n },\n }\n }\n\n private _onWildcard(pattern: WildcardPattern, handler: EventHandler<unknown>): IDisposable {\n // Store under the prefix (everything before '.*')\n const prefix = pattern.slice(0, -2)\n let set = this.wildcardListeners.get(prefix)\n if (!set) {\n set = new Set()\n this.wildcardListeners.set(prefix, set)\n }\n set.add(handler)\n\n return {\n dispose: () => {\n set!.delete(handler)\n if (set!.size === 0) {\n this.wildcardListeners.delete(prefix)\n }\n },\n }\n }\n\n // ---------------------------------------------------------------------------\n // once() — auto-disposing subscription\n // ---------------------------------------------------------------------------\n\n once<K extends keyof EventMap>(\n event: K,\n handler: EventHandler<EventMap[K]>,\n ): IDisposable {\n // eslint-disable-next-line prefer-const\n let sub: IDisposable | undefined\n\n const wrapper: EventHandler<EventMap[K]> = (payload) => {\n sub?.dispose()\n handler(payload)\n }\n\n sub = this._onExact(event as string, wrapper as EventHandler<unknown>)\n return sub\n }\n\n // ---------------------------------------------------------------------------\n // emit() — fire event to exact + wildcard listeners\n // ---------------------------------------------------------------------------\n\n emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): void {\n // Exact listeners\n const exactSet = this.listeners.get(event as string)\n if (exactSet) {\n for (const handler of exactSet) {\n handler(payload)\n }\n }\n\n // Wildcard listeners — match prefix before the first '.'\n // e.g. 'note.created' matches prefix 'note'\n const dotIndex = (event as string).indexOf('.')\n if (dotIndex !== -1) {\n const prefix = (event as string).slice(0, dotIndex)\n const wildcardSet = this.wildcardListeners.get(prefix)\n if (wildcardSet) {\n for (const handler of wildcardSet) {\n handler(payload)\n }\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // bridge() — cross-context forwarding via MessagePort\n // ---------------------------------------------------------------------------\n\n bridge(port: MessagePort): IDisposable {\n // Forward all locally emitted events to the port.\n // We intercept emit by wrapping it — instead, subscribe to every possible\n // event via a broadcast interceptor added around emit.\n const forwardingInterceptor = (event: string, payload: unknown): void => {\n port.postMessage({ type: 'event', event, payload } satisfies BridgeMessage)\n }\n\n // Track bridging state so dispose can stop forwarding.\n let active = true\n\n // Patch emit to forward when bridge is active.\n const originalEmit = this.emit.bind(this)\n this.emit = <K extends keyof EventMap>(event: K, payload: EventMap[K]): void => {\n originalEmit(event, payload)\n if (active) {\n forwardingInterceptor(event as string, payload)\n }\n }\n\n // Listen on the port for incoming events and re-emit locally.\n const messageHandler = (e: MessageEvent): void => {\n const data = e.data as BridgeMessage\n if (data?.type === 'event' && typeof data.event === 'string') {\n // Re-emit without triggering the bridge forward (would cause loops).\n // Use the original emit to avoid forwarding back.\n originalEmit(data.event as keyof EventMap, data.payload as never)\n }\n }\n\n port.addEventListener('message', messageHandler)\n\n return {\n dispose: () => {\n active = false\n this.emit = originalEmit\n port.removeEventListener('message', messageHandler)\n },\n }\n }\n\n // ---------------------------------------------------------------------------\n // removeAllListeners()\n // ---------------------------------------------------------------------------\n\n removeAllListeners(): void {\n this.listeners.clear()\n this.wildcardListeners.clear()\n }\n}\n","/**\n * PGlite database factory.\n * Enforces PGlite 0.4.x conventions (explicit database: 'postgres').\n * Selects persistence adapter based on config.\n */\n\nimport { PGlite } from '@electric-sql/pglite'\nimport { vector } from '@electric-sql/pglite/vector'\n\nexport type PersistenceMode = 'opfs' | 'idb' | 'memory'\n\nfunction getDataDir(persistence: PersistenceMode, archiveName: string): string | undefined {\n switch (persistence) {\n case 'opfs':\n return `opfs-ahp://fortemi-${archiveName}`\n case 'idb':\n return `idb://fortemi-${archiveName}`\n case 'memory':\n return undefined\n }\n}\n\nexport interface CreatePGliteOptions {\n /**\n * Restore the instance from a physical data-dir snapshot (issue #187) — schema\n * + rows + INDEXES in one binary load, with no migration / import / reindex.\n * The blob comes from PGlite's `dumpDataDir`; see `dumpDbSnapshot`/`restoreDbSnapshot`.\n * When set, callers MUST NOT run migrations — the restored dir already carries them.\n */\n loadDataDir?: Blob | File\n}\n\nexport async function createPGliteInstance(\n persistence: PersistenceMode,\n archiveName: string = 'default',\n options: CreatePGliteOptions = {},\n): Promise<PGlite> {\n const dataDir = getDataDir(persistence, archiveName)\n\n const pgliteOptions: Record<string, unknown> = {\n database: 'postgres', // PGlite 0.4.x breaking change: explicit required\n extensions: { vector },\n }\n\n if (dataDir) {\n pgliteOptions.dataDir = dataDir\n }\n\n if (options.loadDataDir) {\n pgliteOptions.loadDataDir = options.loadDataDir\n }\n\n const db = await PGlite.create(pgliteOptions)\n\n // Enable pgvector extension (idempotent — already present on a restored dir).\n await db.exec('CREATE EXTENSION IF NOT EXISTS vector')\n\n return db\n}\n","/**\n * Migration 0001: Core tables.\n * Creates: archive, note, note_original, note_revised_current,\n * note_revision, collection, job_queue, api_key, link,\n * provenance_edge.\n * All tables use UUIDv7 PKs, soft-delete (deleted_at), timestamps.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0001: Migration = {\n version: 1,\n name: '0001_initial_schema',\n sql: `\n -- Archive (multi-database tracking)\n CREATE TABLE IF NOT EXISTS archive (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n schema_version INTEGER NOT NULL DEFAULT 0,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Note (core entity)\n CREATE TABLE IF NOT EXISTS note (\n id TEXT PRIMARY KEY,\n archive_id TEXT REFERENCES archive(id),\n title TEXT,\n format TEXT NOT NULL DEFAULT 'markdown',\n source TEXT NOT NULL DEFAULT 'user',\n visibility TEXT NOT NULL DEFAULT 'private',\n revision_mode TEXT NOT NULL DEFAULT 'standard',\n is_starred BOOLEAN NOT NULL DEFAULT false,\n is_pinned BOOLEAN NOT NULL DEFAULT false,\n is_archived BOOLEAN NOT NULL DEFAULT false,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ,\n tsv tsvector GENERATED ALWAYS AS (to_tsvector('english', coalesce(title, ''))) STORED\n );\n\n -- Note original content (immutable)\n CREATE TABLE IF NOT EXISTS note_original (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n content TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Note revised current (mutable, latest revision)\n CREATE TABLE IF NOT EXISTS note_revised_current (\n note_id TEXT PRIMARY KEY REFERENCES note(id),\n content TEXT NOT NULL,\n ai_metadata JSONB,\n generation_count INTEGER NOT NULL DEFAULT 0,\n model TEXT,\n is_user_edited BOOLEAN NOT NULL DEFAULT false,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Note revision history\n CREATE TABLE IF NOT EXISTS note_revision (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n revision_number INTEGER NOT NULL,\n type TEXT NOT NULL DEFAULT 'ai',\n content TEXT NOT NULL,\n ai_metadata JSONB,\n model TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (note_id, revision_number)\n );\n\n -- Collection (folders/categories)\n CREATE TABLE IF NOT EXISTS collection (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n parent_id TEXT REFERENCES collection(id),\n position INTEGER NOT NULL DEFAULT 0,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n -- Collection membership\n CREATE TABLE IF NOT EXISTS collection_note (\n collection_id TEXT NOT NULL REFERENCES collection(id),\n note_id TEXT NOT NULL REFERENCES note(id),\n position INTEGER NOT NULL DEFAULT 0,\n added_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n PRIMARY KEY (collection_id, note_id)\n );\n\n -- Job queue (async processing)\n CREATE TABLE IF NOT EXISTS job_queue (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n job_type TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n priority INTEGER NOT NULL DEFAULT 5,\n required_capability TEXT,\n retry_count INTEGER NOT NULL DEFAULT 0,\n max_retries INTEGER NOT NULL DEFAULT 3,\n error TEXT,\n result JSONB,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- API key\n CREATE TABLE IF NOT EXISTS api_key (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n key_hash TEXT NOT NULL,\n permissions JSONB NOT NULL DEFAULT '[]',\n expires_at TIMESTAMPTZ,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n -- Link (bidirectional note links)\n CREATE TABLE IF NOT EXISTS link (\n id TEXT PRIMARY KEY,\n source_note_id TEXT NOT NULL REFERENCES note(id),\n target_note_id TEXT NOT NULL REFERENCES note(id),\n link_type TEXT NOT NULL DEFAULT 'related',\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n -- Provenance edge\n CREATE TABLE IF NOT EXISTS provenance_edge (\n id TEXT PRIMARY KEY,\n entity_type TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n activity TEXT NOT NULL,\n agent TEXT NOT NULL,\n started_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n ended_at TIMESTAMPTZ,\n attributes JSONB\n );\n\n CREATE INDEX IF NOT EXISTS idx_note_deleted_at ON note(deleted_at);\n CREATE INDEX IF NOT EXISTS idx_note_created_at ON note(created_at);\n CREATE INDEX IF NOT EXISTS idx_note_tsv ON note USING gin(tsv);\n CREATE INDEX IF NOT EXISTS idx_job_queue_status ON job_queue(status, priority DESC);\n CREATE INDEX IF NOT EXISTS idx_job_queue_note ON job_queue(note_id);\n CREATE INDEX IF NOT EXISTS idx_collection_parent ON collection(parent_id);\n CREATE INDEX IF NOT EXISTS idx_link_source ON link(source_note_id);\n CREATE INDEX IF NOT EXISTS idx_link_target ON link(target_note_id);\n CREATE INDEX IF NOT EXISTS idx_provenance_entity ON provenance_edge(entity_type, entity_id);\n `,\n}\n","/**\n * Migration 0002: SKOS tagging schema.\n * Creates: skos_scheme, skos_concept, skos_concept_relation,\n * note_tag, note_skos_tag.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0002: Migration = {\n version: 2,\n name: '0002_skos_tagging',\n sql: `\n -- SKOS Scheme (taxonomy container)\n CREATE TABLE IF NOT EXISTS skos_scheme (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n description TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n -- SKOS Concept (individual taxonomy term)\n CREATE TABLE IF NOT EXISTS skos_concept (\n id TEXT PRIMARY KEY,\n scheme_id TEXT NOT NULL REFERENCES skos_scheme(id),\n pref_label TEXT NOT NULL,\n alt_labels JSONB DEFAULT '[]',\n definition TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n CREATE INDEX IF NOT EXISTS idx_skos_concept_scheme ON skos_concept(scheme_id);\n\n -- SKOS Concept Relation (broader/narrower/related)\n CREATE TABLE IF NOT EXISTS skos_concept_relation (\n id TEXT PRIMARY KEY,\n source_concept_id TEXT NOT NULL REFERENCES skos_concept(id),\n target_concept_id TEXT NOT NULL REFERENCES skos_concept(id),\n relation_type TEXT NOT NULL CHECK (relation_type IN ('broader', 'narrower', 'related')),\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n CREATE INDEX IF NOT EXISTS idx_skos_relation_source ON skos_concept_relation(source_concept_id);\n CREATE INDEX IF NOT EXISTS idx_skos_relation_target ON skos_concept_relation(target_concept_id);\n\n -- Note tag (free-form tags)\n CREATE TABLE IF NOT EXISTS note_tag (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n tag TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (note_id, tag)\n );\n\n CREATE INDEX IF NOT EXISTS idx_note_tag_note ON note_tag(note_id);\n CREATE INDEX IF NOT EXISTS idx_note_tag_tag ON note_tag(tag);\n\n -- Note SKOS tag (structured taxonomy tags)\n CREATE TABLE IF NOT EXISTS note_skos_tag (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n concept_id TEXT NOT NULL REFERENCES skos_concept(id),\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (note_id, concept_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_note_skos_tag_note ON note_skos_tag(note_id);\n CREATE INDEX IF NOT EXISTS idx_note_skos_tag_concept ON note_skos_tag(concept_id);\n `,\n}\n","/**\n * Migration 0003: Attachments schema.\n * Creates: document_type, attachment_blob, attachment.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0003: Migration = {\n version: 3,\n name: '0003_attachments',\n sql: `\n -- Document type (MIME classification)\n CREATE TABLE IF NOT EXISTS document_type (\n id TEXT PRIMARY KEY,\n mime_type TEXT NOT NULL UNIQUE,\n label TEXT NOT NULL,\n category TEXT NOT NULL DEFAULT 'other',\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Attachment blob (content-addressable storage metadata)\n CREATE TABLE IF NOT EXISTS attachment_blob (\n id TEXT PRIMARY KEY,\n content_hash TEXT NOT NULL UNIQUE,\n size_bytes INTEGER NOT NULL,\n storage_path TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Attachment (links note to blob)\n CREATE TABLE IF NOT EXISTS attachment (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n blob_id TEXT NOT NULL REFERENCES attachment_blob(id),\n document_type_id TEXT REFERENCES document_type(id),\n filename TEXT NOT NULL,\n display_name TEXT,\n position INTEGER NOT NULL DEFAULT 0,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n deleted_at TIMESTAMPTZ\n );\n\n CREATE INDEX IF NOT EXISTS idx_attachment_note ON attachment(note_id);\n CREATE INDEX IF NOT EXISTS idx_attachment_blob ON attachment(blob_id);\n `,\n}\n","/**\n * Migration 0004: Embeddings and vector linking schema.\n * Creates: embedding_set, embedding, embedding_set_member.\n * Requires: pgvector extension (loaded via PGlite vector extension).\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0004: Migration = {\n version: 4,\n name: '0004_embeddings',\n sql: `\n -- Embedding set (model configuration)\n CREATE TABLE IF NOT EXISTS embedding_set (\n id TEXT PRIMARY KEY,\n model_name TEXT NOT NULL,\n dimensions INTEGER NOT NULL DEFAULT 384,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n -- Embedding (vector per note)\n CREATE TABLE IF NOT EXISTS embedding (\n id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL REFERENCES note(id),\n embedding_set_id TEXT NOT NULL REFERENCES embedding_set(id),\n vector vector(384) NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (note_id, embedding_set_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_embedding_note ON embedding(note_id);\n CREATE INDEX IF NOT EXISTS idx_embedding_set ON embedding(embedding_set_id);\n CREATE INDEX IF NOT EXISTS idx_embedding_vector ON embedding USING hnsw (vector vector_cosine_ops)\n WITH (m = 16, ef_construction = 64);\n\n -- Embedding set member (tracks which notes have embeddings)\n CREATE TABLE IF NOT EXISTS embedding_set_member (\n embedding_set_id TEXT NOT NULL REFERENCES embedding_set(id),\n note_id TEXT NOT NULL REFERENCES note(id),\n embedding_id TEXT NOT NULL REFERENCES embedding(id),\n PRIMARY KEY (embedding_set_id, note_id)\n );\n `,\n}\n","/**\n * Migration 0005: Add confidence score and updated_at to link table.\n * The linkingHandler stores similarity confidence (1 - cosine distance)\n * and the server's link table includes these columns.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0005: Migration = {\n version: 5,\n name: '0005_link_confidence',\n sql: `\n ALTER TABLE link ADD COLUMN IF NOT EXISTS confidence REAL;\n ALTER TABLE link ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ DEFAULT now();\n `,\n}\n","/**\n * Migration 0006: Embedding set authoring metadata.\n * Adds human-facing labels so multiple embedding sets can be selected in UI.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0006: Migration = {\n version: 6,\n name: '0006_embedding_set_metadata',\n sql: `\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS name TEXT NOT NULL DEFAULT 'Full content';\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS purpose TEXT;\n `,\n}\n","/**\n * Migration 0007: Virtual embedding set metadata.\n * Adds durable selector-definition fields while preserving existing physical sets.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0007: Migration = {\n version: 7,\n name: '0007_virtual_embedding_sets',\n sql: `\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS kind TEXT NOT NULL DEFAULT 'physical';\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS mode TEXT;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS truncate_dimension INTEGER;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS criteria_json JSONB;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS source_json JSONB;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS compatibility_json JSONB;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS materialization_json JSONB;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS freshness_json JSONB;\n\n ALTER TABLE embedding_set\n ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ NOT NULL DEFAULT now();\n `,\n}\n","/**\n * Migration 0008: Persisted graph and community shard artifacts.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0008: Migration = {\n version: 8,\n name: '0008_graph_community_artifacts',\n sql: `\n CREATE TABLE IF NOT EXISTS graph_source (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n kind TEXT NOT NULL,\n source_table TEXT,\n embedding_set_id TEXT,\n virtual_set_id TEXT,\n model TEXT,\n dimension INTEGER,\n truncate_dimension INTEGER,\n metric TEXT,\n algorithm TEXT,\n parameters_json JSONB,\n input_hash TEXT NOT NULL,\n freshness_json JSONB NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n CREATE TABLE IF NOT EXISTS graph_edge_artifact (\n graph_source_id TEXT NOT NULL REFERENCES graph_source(id) ON DELETE CASCADE,\n from_note_id TEXT NOT NULL REFERENCES note(id),\n to_note_id TEXT NOT NULL REFERENCES note(id),\n weight DOUBLE PRECISION NOT NULL,\n kind TEXT NOT NULL,\n rank INTEGER,\n metadata_json JSONB,\n PRIMARY KEY (graph_source_id, from_note_id, to_note_id, kind)\n );\n\n CREATE TABLE IF NOT EXISTS community_set (\n id TEXT PRIMARY KEY,\n graph_source_id TEXT NOT NULL REFERENCES graph_source(id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n source_type TEXT NOT NULL,\n algorithm TEXT,\n parameters_json JSONB,\n input_hash TEXT NOT NULL,\n freshness_json JSONB NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n );\n\n CREATE TABLE IF NOT EXISTS community (\n id TEXT NOT NULL,\n community_set_id TEXT NOT NULL REFERENCES community_set(id) ON DELETE CASCADE,\n label TEXT,\n rank INTEGER,\n size INTEGER,\n confidence DOUBLE PRECISION,\n representative_note_ids TEXT[],\n metadata_json JSONB,\n PRIMARY KEY (community_set_id, id)\n );\n\n CREATE TABLE IF NOT EXISTS community_assignment (\n community_set_id TEXT NOT NULL REFERENCES community_set(id) ON DELETE CASCADE,\n community_id TEXT NOT NULL,\n note_id TEXT NOT NULL REFERENCES note(id),\n confidence DOUBLE PRECISION,\n source_type TEXT NOT NULL,\n metadata_json JSONB,\n PRIMARY KEY (community_set_id, note_id),\n FOREIGN KEY (community_set_id, community_id) REFERENCES community(community_set_id, id) ON DELETE CASCADE\n );\n `,\n}\n","/**\n * Migration 0009: Indexes for property-scoped vector selectors.\n */\n\nimport type { Migration } from '../migration-runner.js'\n\nexport const migration0009: Migration = {\n version: 9,\n name: '0009_vector_selector_performance',\n sql: `\n CREATE INDEX IF NOT EXISTS idx_embedding_set_kind ON embedding_set(kind);\n CREATE INDEX IF NOT EXISTS idx_embedding_set_member_set ON embedding_set_member(embedding_set_id);\n CREATE INDEX IF NOT EXISTS idx_embedding_set_member_note ON embedding_set_member(note_id);\n CREATE INDEX IF NOT EXISTS idx_embedding_set_member_embedding ON embedding_set_member(embedding_id);\n\n CREATE INDEX IF NOT EXISTS idx_note_source ON note(source);\n CREATE INDEX IF NOT EXISTS idx_note_format ON note(format);\n CREATE INDEX IF NOT EXISTS idx_note_visibility ON note(visibility);\n CREATE INDEX IF NOT EXISTS idx_note_starred ON note(is_starred);\n CREATE INDEX IF NOT EXISTS idx_note_archived ON note(is_archived);\n CREATE INDEX IF NOT EXISTS idx_note_updated_at ON note(updated_at);\n\n CREATE INDEX IF NOT EXISTS idx_note_revised_current_user_edited ON note_revised_current(is_user_edited);\n CREATE INDEX IF NOT EXISTS idx_note_revised_current_generation_count ON note_revised_current(generation_count);\n `,\n}\n","import type { Migration } from '../migration-runner.js'\nimport { migration0001 } from './0001_initial_schema.js'\nimport { migration0002 } from './0002_skos_tagging.js'\nimport { migration0003 } from './0003_attachments.js'\nimport { migration0004 } from './0004_embeddings.js'\nimport { migration0005 } from './0005_link_confidence.js'\nimport { migration0006 } from './0006_embedding_set_metadata.js'\nimport { migration0007 } from './0007_virtual_embedding_sets.js'\nimport { migration0008 } from './0008_graph_community_artifacts.js'\nimport { migration0009 } from './0009_vector_selector_performance.js'\n\nexport const allMigrations: Migration[] = [\n migration0001,\n migration0002,\n migration0003,\n migration0004,\n migration0005,\n migration0006,\n migration0007,\n migration0008,\n migration0009,\n]\n","/**\n * Physical data-dir snapshot (issue #187).\n *\n * A *snapshot* is a binary dump of a populated PGlite data directory — schema +\n * rows + INDEXES (including the HNSW vector index from migration 0004) — that\n * restores in a single binary load with NO migration, NO shard import, and NO\n * client-side HNSW build. It is the fast, pre-indexed, single-version restore\n * option, complementary to logical Knowledge Shards (which are portable + mergeable\n * but pay the import + reindex cost on every load).\n *\n * Named \"snapshot\" to stay distinct from:\n * - `ArchiveManager` / `archiveName` — a *named persistence store* (idb/opfs namespace).\n * - Knowledge Shards — logical, portable, mergeable interchange (`importShard`).\n *\n * Safety (the one real risk of the physical format): a Postgres data dir is coupled\n * to the PGlite/pgvector version and the schema-migration head it was built with.\n * Every snapshot carries a version stamp (a JSON sidecar); `restoreDbSnapshot`\n * verifies compatibility BEFORE loading and fails fast (`DbSnapshotVersionError`) on\n * mismatch, so a host can fall back to a shard import.\n */\n\nimport type { PGlite } from '@electric-sql/pglite'\nimport { createPGliteInstance, type CreatePGliteOptions, type PersistenceMode } from './db.js'\nimport { allMigrations } from './migrations/index.js'\n\n/** Snapshot meta envelope schema. */\nexport const DB_SNAPSHOT_SCHEMA_VERSION = 'fortemi.db-snapshot.v1' as const\n\n/**\n * PGlite version this build of @fortemi/core bundles and can safely restore a\n * snapshot from. Kept in sync with the `@electric-sql/pglite` dependency; a unit\n * test asserts it matches package.json so it can't silently drift.\n */\nexport const SUPPORTED_PGLITE_VERSION = '0.4.1'\n\n/** Schema-migration head this build expects a restored snapshot to carry. */\nexport const CURRENT_MIGRATION_HEAD: number = allMigrations.reduce(\n (head, migration) => Math.max(head, migration.version),\n 0,\n)\n\nexport type DbSnapshotCompression = 'none' | 'gzip' | 'auto'\n\nexport interface DbSnapshotMeta {\n schema_version: typeof DB_SNAPSHOT_SCHEMA_VERSION\n /** PGlite version the data dir was dumped from (data-dir format coupling). */\n pglite_version: string\n /** pgvector extension version at dump time (advisory). */\n pgvector_version: string | null\n /** Max applied migration version at dump time (schema coupling). */\n migration_head: number\n /** ISO-8601 dump time. */\n created_at: string\n /** @fortemi/core version that produced the snapshot (diagnostic only). */\n fortemi_version?: string\n}\n\nexport interface DbSnapshot {\n /** The PGlite data-dir dump (gzip by default). Serve as a static asset. */\n data: Blob | File\n /** Version stamp — serve alongside `data` as a `<name>.meta.json` sidecar. */\n meta: DbSnapshotMeta\n}\n\n/** Minimal shape `dumpDbSnapshot` needs — PGlite satisfies it structurally. */\nexport interface DumpableDb {\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{ rows: T[] }>\n dumpDataDir(compression?: DbSnapshotCompression): Promise<Blob | File>\n}\n\nexport interface DumpDbSnapshotOptions {\n /** Defaults to 'gzip'. */\n compression?: DbSnapshotCompression\n /** Recorded in meta for diagnostics. */\n fortemiVersion?: string\n /** Override the timestamp (tests / reproducible builds). */\n createdAt?: string\n}\n\nasync function readMigrationHead(db: DumpableDb): Promise<number> {\n try {\n const result = await db.query<{ head: number }>(\n 'SELECT COALESCE(MAX(version), 0) AS head FROM schema_version',\n )\n return Number(result.rows[0]?.head ?? 0)\n } catch {\n // No schema_version table → an unmigrated dir; head 0.\n return 0\n }\n}\n\nasync function readPgvectorVersion(db: DumpableDb): Promise<string | null> {\n try {\n const result = await db.query<{ extversion: string }>(\n \"SELECT extversion FROM pg_extension WHERE extname = 'vector'\",\n )\n return result.rows[0]?.extversion ?? null\n } catch {\n return null\n }\n}\n\n/**\n * Dump a populated PGlite into a versioned snapshot. Build-time (Node), after the\n * corpus is loaded and the HNSW index has been built once.\n *\n * Returns `{ data, meta }`: write `data` to e.g. `corpus.pgdata` and `meta` to\n * `corpus.pgdata.meta.json` (the sidecar `restoreDbSnapshot(url)` looks for).\n */\nexport async function dumpDbSnapshot(\n db: DumpableDb,\n options: DumpDbSnapshotOptions = {},\n): Promise<DbSnapshot> {\n const migration_head = await readMigrationHead(db)\n const pgvector_version = await readPgvectorVersion(db)\n const data = await db.dumpDataDir(options.compression ?? 'gzip')\n const meta: DbSnapshotMeta = {\n schema_version: DB_SNAPSHOT_SCHEMA_VERSION,\n pglite_version: SUPPORTED_PGLITE_VERSION,\n pgvector_version,\n migration_head,\n created_at: options.createdAt ?? new Date().toISOString(),\n ...(options.fortemiVersion ? { fortemi_version: options.fortemiVersion } : {}),\n }\n return { data, meta }\n}\n\nexport interface DbSnapshotExpectations {\n migrationHead?: number\n pgliteVersion?: string\n /** When provided, a differing snapshot pgvector version is a warning, not a failure. */\n pgvectorVersion?: string | null\n}\n\nexport interface DbSnapshotCompat {\n compatible: boolean\n /** Hard incompatibilities — restore must refuse. */\n reasons: string[]\n /** Advisory differences — restore proceeds. */\n warnings: string[]\n}\n\nfunction majorMinor(version: string): string {\n const parts = version.split('.')\n return `${parts[0] ?? '0'}.${parts[1] ?? '0'}`\n}\n\n/**\n * Verify a snapshot's version stamp against what this build supports. Pure —\n * unit-testable with no PGlite. Hard gates: snapshot schema, migration head\n * (exact), PGlite major.minor (data-dir format). pgvector is advisory.\n */\nexport function verifyDbSnapshotMeta(\n meta: DbSnapshotMeta,\n expected: DbSnapshotExpectations = {},\n): DbSnapshotCompat {\n const reasons: string[] = []\n const warnings: string[] = []\n const expectedHead = expected.migrationHead ?? CURRENT_MIGRATION_HEAD\n const expectedPglite = expected.pgliteVersion ?? SUPPORTED_PGLITE_VERSION\n\n if (meta.schema_version !== DB_SNAPSHOT_SCHEMA_VERSION) {\n reasons.push(`unsupported snapshot schema_version: ${String(meta.schema_version)}`)\n }\n if (meta.migration_head !== expectedHead) {\n reasons.push(`migration head mismatch: snapshot=${meta.migration_head}, supported=${expectedHead}`)\n }\n if (majorMinor(meta.pglite_version) !== majorMinor(expectedPglite)) {\n reasons.push(`PGlite version mismatch: snapshot=${meta.pglite_version}, supported=${expectedPglite}`)\n }\n if (expected.pgvectorVersion !== undefined && meta.pgvector_version !== expected.pgvectorVersion) {\n warnings.push(`pgvector version differs: snapshot=${String(meta.pgvector_version)}, expected=${String(expected.pgvectorVersion)}`)\n }\n\n return { compatible: reasons.length === 0, reasons, warnings }\n}\n\n/** Thrown by `restoreDbSnapshot` when the snapshot is incompatible with this build. */\nexport class DbSnapshotVersionError extends Error {\n readonly reasons: string[]\n readonly meta: DbSnapshotMeta\n constructor(reasons: string[], meta: DbSnapshotMeta) {\n super(`Incompatible DB snapshot: ${reasons.join('; ')}`)\n this.name = 'DbSnapshotVersionError'\n this.reasons = reasons\n this.meta = meta\n }\n}\n\nexport type DbSnapshotSource =\n | DbSnapshot\n | string\n | { dataUrl: string; metaUrl?: string }\n\nexport interface RestoreDbSnapshotOptions {\n /** Persistence for the restored instance. Defaults to 'memory' (read-only demos). */\n persistence?: PersistenceMode\n archiveName?: string\n /** Verification expectations (defaults to this build's supported values). */\n expectations?: DbSnapshotExpectations\n /** Injectable fetch (tests / non-browser). Defaults to global `fetch`. */\n fetchImpl?: typeof fetch\n}\n\nfunction isInlineSnapshot(source: DbSnapshotSource): source is DbSnapshot {\n return typeof source === 'object' && 'data' in source && 'meta' in source\n}\n\nasync function resolveSnapshotSource(\n source: DbSnapshotSource,\n fetchImpl: typeof fetch,\n): Promise<DbSnapshot> {\n if (isInlineSnapshot(source)) return source\n\n const dataUrl = typeof source === 'string' ? source : source.dataUrl\n const metaUrl = typeof source === 'string'\n ? `${source}.meta.json`\n : (source.metaUrl ?? `${source.dataUrl}.meta.json`)\n\n const metaResponse = await fetchImpl(metaUrl)\n if (!metaResponse.ok) {\n throw new Error(`Failed to fetch snapshot meta (${metaResponse.status}): ${metaUrl}`)\n }\n const meta = (await metaResponse.json()) as DbSnapshotMeta\n\n const dataResponse = await fetchImpl(dataUrl)\n if (!dataResponse.ok) {\n throw new Error(`Failed to fetch snapshot data (${dataResponse.status}): ${dataUrl}`)\n }\n const data = await dataResponse.blob()\n\n return { data, meta }\n}\n\n/**\n * Restore a PGlite from a physical snapshot — verify the version stamp first,\n * then load the data dir with **no migration / import / HNSW build**. Throws\n * `DbSnapshotVersionError` on incompatibility (catch it to fall back to a shard\n * import). The returned instance is ready to query; do NOT run migrations on it.\n */\nexport async function restoreDbSnapshot(\n source: DbSnapshotSource,\n options: RestoreDbSnapshotOptions = {},\n): Promise<PGlite> {\n const fetchImpl = options.fetchImpl ?? (globalThis.fetch as typeof fetch)\n const { data, meta } = await resolveSnapshotSource(source, fetchImpl)\n\n const compat = verifyDbSnapshotMeta(meta, options.expectations)\n if (!compat.compatible) {\n throw new DbSnapshotVersionError(compat.reasons, meta)\n }\n\n const createOptions: CreatePGliteOptions = { loadDataDir: data }\n return createPGliteInstance(options.persistence ?? 'memory', options.archiveName ?? 'default', createOptions)\n}\n","import { sha256 } from '@noble/hashes/sha256'\nimport { bytesToHex } from '@noble/hashes/utils'\n\n/**\n * Compute a SHA-256 content hash for the given byte array.\n *\n * Returns a string in `algorithm:hex` format to match the server-side\n * convention, e.g. `sha256:a3b4c5...` (64 hex characters after the prefix).\n *\n * @param data - Raw bytes to hash\n * @returns `'sha256:<64-char lowercase hex>'`\n */\nexport function computeHash(data: Uint8Array): string {\n const digest = sha256(data)\n return `sha256:${bytesToHex(digest)}`\n}\n","/**\n * NotesRepository — CRUD and lifecycle operations for the note entity.\n *\n * Responsibilities:\n * - Create notes with immutable original content and mutable current revision\n * - Manage note lifecycle: soft-delete, restore, star, pin, archive\n * - List notes with filtering, pagination, and sorting\n * - Emit domain events via TypedEventBus on every mutation\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\nimport { computeHash } from '../hash.js'\nimport type { TypedEventBus } from '../event-bus.js'\nimport type {\n NoteFull,\n NoteSummary,\n NoteCreateInput,\n NoteUpdateInput,\n NoteListOptions,\n NoteRevision,\n PaginatedResult,\n} from './types.js'\n\nexport class NotesRepository {\n constructor(\n private db: DatabaseClient,\n private events?: TypedEventBus,\n ) {}\n\n /**\n * Create a new note with its original content record, current revision,\n * optional tags, and an auto-queued title_generation job when no title\n * is provided.\n *\n * All writes happen in a single transaction.\n */\n async create(input: NoteCreateInput): Promise<NoteFull> {\n const noteId = generateId()\n const originalId = generateId()\n const contentHash = computeHash(new TextEncoder().encode(input.content))\n\n await this.db.transaction(async (tx) => {\n // Insert note\n await tx.query(\n `INSERT INTO note (id, archive_id, title, format, source, visibility)\n VALUES ($1, $2, $3, $4, $5, $6)`,\n [\n noteId,\n input.archive_id ?? null,\n input.title ?? null,\n input.format ?? 'markdown',\n input.source ?? 'user',\n input.visibility ?? 'private',\n ],\n )\n\n // Insert note_original (immutable — never updated)\n await tx.query(\n `INSERT INTO note_original (id, note_id, content, content_hash)\n VALUES ($1, $2, $3, $4)`,\n [originalId, noteId, input.content, contentHash],\n )\n\n // Insert note_revised_current (mutable — tracks latest revision)\n await tx.query(\n `INSERT INTO note_revised_current (note_id, content)\n VALUES ($1, $2)`,\n [noteId, input.content],\n )\n\n // Insert free-form tags\n if (input.tags?.length) {\n for (const tag of input.tags) {\n await tx.query(\n `INSERT INTO note_tag (id, note_id, tag) VALUES ($1, $2, $3)`,\n [generateId(), noteId, tag],\n )\n }\n }\n\n // Queue the note creation pipeline:\n // ai_revision (1, requires llm), title_generation (2), embedding (3, requires semantic)\n await tx.query(\n `INSERT INTO job_queue (id, note_id, job_type, status, priority, required_capability)\n VALUES ($1, $2, 'ai_revision', 'pending', 1, 'llm')`,\n [generateId(), noteId],\n )\n if (!input.title) {\n await tx.query(\n `INSERT INTO job_queue (id, note_id, job_type, status, priority)\n VALUES ($1, $2, 'title_generation', 'pending', 2)`,\n [generateId(), noteId],\n )\n }\n await tx.query(\n `INSERT INTO job_queue (id, note_id, job_type, status, priority, required_capability)\n VALUES ($1, $2, 'embedding', 'pending', 3, 'semantic')`,\n [generateId(), noteId],\n )\n })\n\n this.events?.emit('note.created', { id: noteId })\n return this.get(noteId)\n }\n\n /**\n * Fetch a single note by its ID.\n * Returns NoteFull which includes original content, current revision, and tags.\n * Throws when the note does not exist.\n */\n async get(id: string): Promise<NoteFull> {\n const noteResult = await this.db.query<{\n id: string\n archive_id: string | null\n title: string | null\n format: string\n source: string\n visibility: string\n revision_mode: string\n is_starred: boolean\n is_pinned: boolean\n is_archived: boolean\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n original_id: string\n original_content: string\n content_hash: string\n original_created_at: Date\n current_content: string\n ai_metadata: unknown | null\n generation_count: number\n model: string | null\n is_user_edited: boolean\n current_updated_at: Date\n }>(\n `SELECT n.id, n.archive_id, n.title, n.format, n.source, n.visibility,\n n.revision_mode, n.is_starred, n.is_pinned, n.is_archived,\n n.created_at, n.updated_at, n.deleted_at,\n o.id AS original_id,\n o.content AS original_content,\n o.content_hash,\n o.created_at AS original_created_at,\n c.content AS current_content,\n c.ai_metadata,\n c.generation_count,\n c.model,\n c.is_user_edited,\n c.updated_at AS current_updated_at\n FROM note n\n LEFT JOIN note_original o ON o.note_id = n.id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE n.id = $1`,\n [id],\n )\n\n if (noteResult.rows.length === 0) {\n throw new Error(`Note not found: ${id}`)\n }\n\n const row = noteResult.rows[0]\n\n const tagsResult = await this.db.query<{ tag: string }>(\n `SELECT tag FROM note_tag WHERE note_id = $1 ORDER BY tag`,\n [id],\n )\n\n return {\n id: row.id,\n archive_id: row.archive_id,\n title: row.title,\n format: row.format,\n source: row.source,\n visibility: row.visibility,\n revision_mode: row.revision_mode,\n is_starred: row.is_starred,\n is_pinned: row.is_pinned,\n is_archived: row.is_archived,\n created_at: row.created_at,\n updated_at: row.updated_at,\n deleted_at: row.deleted_at,\n tags: tagsResult.rows.map((r) => r.tag),\n original: {\n id: row.original_id,\n content: row.original_content,\n content_hash: row.content_hash,\n created_at: row.original_created_at,\n },\n current: {\n content: row.current_content,\n ai_metadata: row.ai_metadata,\n generation_count: row.generation_count,\n model: row.model,\n is_user_edited: row.is_user_edited,\n updated_at: row.current_updated_at,\n },\n }\n }\n\n /**\n * List notes with optional filtering, sorting, and pagination.\n * Excludes soft-deleted notes by default (pass include_deleted: true to override).\n */\n async list(options: NoteListOptions = {}): Promise<PaginatedResult<NoteSummary>> {\n const {\n limit = 50,\n offset = 0,\n sort = 'created_at',\n order = 'desc',\n is_starred,\n is_pinned,\n is_archived,\n include_deleted = false,\n collection_id,\n tags,\n } = options\n\n const conditions: string[] = []\n const params: unknown[] = []\n let paramIndex = 1\n\n if (!include_deleted) {\n conditions.push('n.deleted_at IS NULL')\n }\n if (is_starred !== undefined) {\n conditions.push(`n.is_starred = $${paramIndex++}`)\n params.push(is_starred)\n }\n if (is_pinned !== undefined) {\n conditions.push(`n.is_pinned = $${paramIndex++}`)\n params.push(is_pinned)\n }\n if (is_archived !== undefined) {\n conditions.push(`n.is_archived = $${paramIndex++}`)\n params.push(is_archived)\n }\n if (collection_id) {\n conditions.push(\n `EXISTS (SELECT 1 FROM collection_note cn WHERE cn.note_id = n.id AND cn.collection_id = $${paramIndex++})`,\n )\n params.push(collection_id)\n }\n if (tags?.length) {\n conditions.push(\n `EXISTS (SELECT 1 FROM note_tag nt WHERE nt.note_id = n.id AND nt.tag = ANY($${paramIndex++}))`,\n )\n params.push(tags)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Validate sort column against allowlist to prevent SQL injection\n const validSorts = ['created_at', 'updated_at', 'title'] as const\n const sortCol = (validSorts as readonly string[]).includes(sort) ? sort : 'created_at'\n const sortDir = order === 'asc' ? 'ASC' : 'DESC'\n\n // Count total matching rows\n const countResult = await this.db.query<{ count: string }>(\n `SELECT COUNT(*) AS count FROM note n ${where}`,\n params,\n )\n const total = parseInt(countResult.rows[0].count, 10)\n\n // Fetch paginated rows\n const listParams = [...params, limit, offset]\n const rowsResult = await this.db.query<{\n id: string\n title: string | null\n format: string\n source: string\n visibility: string\n is_starred: boolean\n is_pinned: boolean\n is_archived: boolean\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n }>(\n `SELECT n.id, n.title, n.format, n.source, n.visibility,\n n.is_starred, n.is_pinned, n.is_archived,\n n.created_at, n.updated_at, n.deleted_at\n FROM note n ${where}\n ORDER BY n.${sortCol} ${sortDir}\n LIMIT $${paramIndex++} OFFSET $${paramIndex++}`,\n listParams,\n )\n\n // Batch-load tags for all returned notes\n const noteIds = rowsResult.rows.map((r) => r.id)\n const tagMap = new Map<string, string[]>()\n\n if (noteIds.length > 0) {\n const tagsResult = await this.db.query<{ note_id: string; tag: string }>(\n `SELECT note_id, tag FROM note_tag WHERE note_id = ANY($1) ORDER BY tag`,\n [noteIds],\n )\n for (const row of tagsResult.rows) {\n const existing = tagMap.get(row.note_id) ?? []\n existing.push(row.tag)\n tagMap.set(row.note_id, existing)\n }\n }\n\n const items: NoteSummary[] = rowsResult.rows.map((r) => ({\n id: r.id,\n title: r.title,\n format: r.format,\n source: r.source,\n visibility: r.visibility,\n is_starred: r.is_starred,\n is_pinned: r.is_pinned,\n is_archived: r.is_archived,\n created_at: r.created_at,\n updated_at: r.updated_at,\n deleted_at: r.deleted_at,\n tags: tagMap.get(r.id) ?? [],\n }))\n\n return { items, total, limit, offset }\n }\n\n /**\n * Update mutable note fields.\n * When content changes, the previous current content is saved as a numbered\n * revision before the new content is applied.\n */\n async update(id: string, input: NoteUpdateInput): Promise<NoteFull> {\n // Determine the next revision number before entering the transaction\n const countResult = await this.db.query<{ count: string }>(\n `SELECT COUNT(*) AS count FROM note_revision WHERE note_id = $1`,\n [id],\n )\n const nextRevision = parseInt(countResult.rows[0].count, 10) + 1\n\n await this.db.transaction(async (tx) => {\n // Build dynamic SET clause for note table fields\n const setClauses: string[] = ['updated_at = now()']\n const noteParams: unknown[] = []\n let paramIdx = 1\n\n if (input.title !== undefined) {\n setClauses.push(`title = $${paramIdx++}`)\n noteParams.push(input.title)\n }\n if (input.format !== undefined) {\n setClauses.push(`format = $${paramIdx++}`)\n noteParams.push(input.format)\n }\n if (input.visibility !== undefined) {\n setClauses.push(`visibility = $${paramIdx++}`)\n noteParams.push(input.visibility)\n }\n\n noteParams.push(id)\n await tx.query(\n `UPDATE note SET ${setClauses.join(', ')} WHERE id = $${paramIdx}`,\n noteParams,\n )\n\n // When content changes, archive the current content as a revision\n if (input.content !== undefined) {\n const currentResult = await tx.query<{ content: string }>(\n `SELECT content FROM note_revised_current WHERE note_id = $1`,\n [id],\n )\n if (currentResult.rows.length > 0) {\n await tx.query(\n `INSERT INTO note_revision (id, note_id, revision_number, type, content)\n VALUES ($1, $2, $3, 'user', $4)`,\n [generateId(), id, nextRevision, currentResult.rows[0].content],\n )\n }\n\n await tx.query(\n `UPDATE note_revised_current\n SET content = $1, is_user_edited = true, updated_at = now()\n WHERE note_id = $2`,\n [input.content, id],\n )\n }\n })\n\n this.events?.emit('note.updated', { id })\n return this.get(id)\n }\n\n /**\n * Soft-delete a note by setting deleted_at to the current timestamp.\n */\n async delete(id: string): Promise<void> {\n await this.db.query(\n `UPDATE note SET deleted_at = now(), updated_at = now() WHERE id = $1`,\n [id],\n )\n this.events?.emit('note.deleted', { id })\n }\n\n /**\n * Restore a soft-deleted note by clearing deleted_at.\n */\n async restore(id: string): Promise<NoteFull> {\n await this.db.query(\n `UPDATE note SET deleted_at = NULL, updated_at = now() WHERE id = $1`,\n [id],\n )\n this.events?.emit('note.restored', { id })\n return this.get(id)\n }\n\n /**\n * Toggle the is_starred field on a note.\n */\n async star(id: string, starred: boolean): Promise<void> {\n await this.db.query(\n `UPDATE note SET is_starred = $1, updated_at = now() WHERE id = $2`,\n [starred, id],\n )\n this.events?.emit('note.updated', { id })\n }\n\n /**\n * Toggle the is_pinned field on a note.\n */\n async pin(id: string, pinned: boolean): Promise<void> {\n await this.db.query(\n `UPDATE note SET is_pinned = $1, updated_at = now() WHERE id = $2`,\n [pinned, id],\n )\n this.events?.emit('note.updated', { id })\n }\n\n /**\n * Toggle the is_archived field on a note.\n */\n async archive(id: string, archived: boolean): Promise<void> {\n await this.db.query(\n `UPDATE note SET is_archived = $1, updated_at = now() WHERE id = $2`,\n [archived, id],\n )\n this.events?.emit('note.updated', { id })\n }\n\n /**\n * Get revision history for a note, ordered by revision_number descending.\n */\n async getRevisions(noteId: string): Promise<NoteRevision[]> {\n const result = await this.db.query<NoteRevision>(\n `SELECT id, note_id, revision_number, type, content, ai_metadata, model, created_at\n FROM note_revision\n WHERE note_id = $1\n ORDER BY revision_number DESC`,\n [noteId],\n )\n return result.rows\n }\n}\n","/**\n * Shared SQL condition builder for note filtering.\n * Used by both SearchRepository and NotesRepository to prevent drift\n * when adding new filter fields.\n *\n * @implements #87 shared condition builder\n */\n\nimport type { SearchOptions } from './types.js'\n\nexport interface ConditionResult {\n conditions: string[]\n params: unknown[]\n nextIdx: number\n}\n\n/**\n * Build WHERE clause conditions for note filtering.\n * Generates parameterized SQL conditions for all shared filter fields.\n *\n * @param options - Filter options (any subset of SearchOptions fields)\n * @param startIdx - Starting parameter index ($N)\n * @param includeDeleted - Whether to include soft-deleted notes (default: false)\n */\nexport function buildNoteConditions(\n options: Pick<SearchOptions, 'tags' | 'collection_id' | 'date_from' | 'date_to' | 'is_starred' | 'is_archived' | 'format' | 'source' | 'visibility'>,\n startIdx: number,\n includeDeleted = false,\n): ConditionResult {\n const conditions: string[] = []\n const params: unknown[] = []\n let idx = startIdx\n\n if (!includeDeleted) {\n conditions.push('n.deleted_at IS NULL')\n }\n\n if (options.tags?.length) {\n conditions.push(\n `EXISTS (SELECT 1 FROM note_tag nt WHERE nt.note_id = n.id AND nt.tag = ANY($${idx++}))`,\n )\n params.push(options.tags)\n }\n\n if (options.collection_id) {\n conditions.push(\n `EXISTS (SELECT 1 FROM collection_note cn WHERE cn.note_id = n.id AND cn.collection_id = $${idx++})`,\n )\n params.push(options.collection_id)\n }\n\n if (options.date_from) {\n conditions.push(`n.created_at >= $${idx++}`)\n params.push(options.date_from)\n }\n\n if (options.date_to) {\n conditions.push(`n.created_at <= $${idx++}`)\n params.push(options.date_to)\n }\n\n if (options.is_starred !== undefined) {\n conditions.push(`n.is_starred = $${idx++}`)\n params.push(options.is_starred)\n }\n\n if (options.is_archived !== undefined) {\n conditions.push(`n.is_archived = $${idx++}`)\n params.push(options.is_archived)\n }\n\n if (options.format) {\n conditions.push(`n.format = $${idx++}`)\n params.push(options.format)\n }\n\n if (options.source) {\n conditions.push(`n.source = $${idx++}`)\n params.push(options.source)\n }\n\n if (options.visibility) {\n conditions.push(`n.visibility = $${idx++}`)\n params.push(options.visibility)\n }\n\n return { conditions, params, nextIdx: idx }\n}\n","/**\n * EmbeddingSetsRepository - named, filter, and virtual embedding set API.\n */\n\nimport type { QueryExecutor } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\nimport { computeHash } from '../hash.js'\n\nexport type EmbeddingSetKind = 'physical' | 'filter' | 'virtual'\nexport type EmbeddingSetMode = 'auto' | 'manual' | 'mixed'\n\nexport interface EmbeddingSetCriteria {\n query?: string\n tags?: string[]\n collectionIds?: string[]\n conceptIds?: string[]\n noteIds?: string[]\n sources?: string[]\n formats?: string[]\n visibilities?: string[]\n isStarred?: boolean\n isArchived?: boolean\n hasTitle?: boolean\n hasEmbedding?: boolean\n isUserEdited?: boolean\n hasAiMetadata?: boolean\n hasRevisions?: boolean\n minGenerationCount?: number\n maxGenerationCount?: number\n updatedAfter?: string\n updatedBefore?: string\n}\n\nexport interface EmbeddingSetFreshness {\n status: 'fresh' | 'stale' | 'unknown'\n sourceHash?: string\n checkedAt?: string\n reason?: string\n}\n\nexport interface EmbeddingCompatibilityPolicy {\n model: 'require-same' | 'allow-compatible-family'\n dimension: 'require-same' | 'allow-truncation'\n duplicateVectors: 'prefer-latest' | 'prefer-set-order' | 'error'\n missingVectors: 'omit' | 'include-unembedded-note' | 'error'\n}\n\nexport interface VirtualMaterializationPolicy {\n allowed: boolean\n includeResolvedMembers?: boolean\n includeResolvedEdges?: boolean\n freshness: 'fresh' | 'stale' | 'unknown'\n inputHash?: string\n generatedAt?: string\n resolvedMemberCount?: number\n}\n\nexport interface CriteriaVirtualSource {\n type: 'criteria'\n baseSetId: string\n criteria: EmbeddingSetCriteria\n}\n\nexport interface SetOperationVirtualSource {\n type: 'set-operation'\n operation: 'union' | 'intersection' | 'difference'\n setIds: string[]\n}\n\nexport interface FallbackVirtualSource {\n type: 'fallback'\n preferredSetIds: string[]\n}\n\nexport interface LatestCompatibleVirtualSource {\n type: 'latest-compatible'\n candidateSetIds: string[]\n model?: string\n dimension?: number\n}\n\nexport interface SnapshotVirtualSource {\n type: 'snapshot'\n snapshotId: string\n sourceDefinitionId: string\n generatedAt: string\n inputHash: string\n}\n\nexport type VirtualEmbeddingSetSource =\n | CriteriaVirtualSource\n | SetOperationVirtualSource\n | FallbackVirtualSource\n | LatestCompatibleVirtualSource\n | SnapshotVirtualSource\n\nexport interface VirtualEmbeddingSetDefinition {\n id: string\n name: string\n purpose?: string | null\n source: VirtualEmbeddingSetSource\n compatibility: EmbeddingCompatibilityPolicy\n materialization?: VirtualMaterializationPolicy\n createdAt?: string\n updatedAt?: string\n}\n\nexport interface EmbeddingSetSelector {\n kind: 'default' | 'embedding-set' | 'virtual-definition'\n embeddingSetId?: string\n definition?: VirtualEmbeddingSetDefinition\n}\n\nexport interface EmbeddingSetDescriptor {\n id: string\n name: string\n purpose?: string | null\n kind: EmbeddingSetKind\n mode?: EmbeddingSetMode\n model?: string\n dimension?: number\n truncateDimension?: number | null\n criteria?: EmbeddingSetCriteria | null\n createdAt?: string\n updatedAt?: string\n freshness?: EmbeddingSetFreshness\n}\n\nexport type VirtualEmbeddingSetValidationError =\n | { code: 'mixed-models'; setIds: string[] }\n | { code: 'mixed-dimensions'; setIds: string[] }\n | { code: 'missing-vector'; noteId: string; setId: string }\n | { code: 'duplicate-vector'; noteId: string; setIds: string[] }\n | { code: 'stale-snapshot'; snapshotId: string }\n | { code: 'unsupported-criteria'; field: string }\n\nexport interface ResolvedEmbeddingRow {\n note_id: string\n embedding_set_id: string\n embedding_id: string\n vector: string\n created_at: Date\n}\n\nexport interface ResolvedEmbeddingSet {\n selector: EmbeddingSetSelector\n rows: ResolvedEmbeddingRow[]\n noteIds: string[]\n embeddingIds: string[]\n errors: VirtualEmbeddingSetValidationError[]\n freshness: EmbeddingSetFreshness\n resolutionSource: 'live' | 'materialized'\n}\n\nexport interface EmbeddingSetRow {\n id: string\n name: string\n purpose: string | null\n model_name: string\n dimensions: number\n kind: EmbeddingSetKind\n mode: EmbeddingSetMode | null\n truncate_dimension: number | null\n criteria_json: unknown | null\n source_json: unknown | null\n compatibility_json: unknown | null\n materialization_json: unknown | null\n freshness_json: unknown | null\n created_at: Date\n updated_at: Date\n}\n\nexport interface EmbeddingSetCreateInput {\n id?: string\n name: string\n purpose?: string | null\n model_name?: string\n dimensions?: number\n kind?: EmbeddingSetKind\n mode?: EmbeddingSetMode | null\n truncate_dimension?: number | null\n criteria?: EmbeddingSetCriteria | null\n}\n\nexport interface EmbeddingSetEmbeddingInput {\n id?: string\n note_id: string\n embedding_set_id: string\n vector: number[]\n}\n\nconst DEFAULT_COMPATIBILITY: EmbeddingCompatibilityPolicy = {\n model: 'require-same',\n dimension: 'require-same',\n duplicateVectors: 'prefer-set-order',\n missingVectors: 'omit',\n}\n\nfunction jsonParam(value: unknown): string | null {\n return value == null ? null : JSON.stringify(value)\n}\n\nfunction asObject<T>(value: unknown): T | null {\n if (value == null) return null\n if (typeof value === 'string') return JSON.parse(value) as T\n return value as T\n}\n\nfunction dateString(value: Date | string | undefined): string | undefined {\n if (!value) return undefined\n return value instanceof Date ? value.toISOString() : value\n}\n\nfunction dateMillis(value: Date | string): number {\n return value instanceof Date ? value.getTime() : new Date(value).getTime()\n}\n\nfunction hashJson(value: unknown): string {\n return computeHash(new TextEncoder().encode(JSON.stringify(value)))\n}\n\nexport class EmbeddingSetsRepository {\n constructor(private db: QueryExecutor) {}\n\n async create(input: EmbeddingSetCreateInput): Promise<EmbeddingSetRow> {\n const id = input.id ?? generateId()\n await this.db.query(\n `INSERT INTO embedding_set (\n id, name, purpose, model_name, dimensions, kind, mode,\n truncate_dimension, criteria_json\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::jsonb)`,\n [\n id,\n input.name,\n input.purpose ?? null,\n input.model_name ?? 'all-MiniLM-L6-v2',\n input.dimensions ?? 384,\n input.kind ?? 'physical',\n input.mode ?? null,\n input.truncate_dimension ?? null,\n jsonParam(input.criteria ?? null),\n ],\n )\n return this.get(id)\n }\n\n async createVirtualDefinition(input: VirtualEmbeddingSetDefinition): Promise<EmbeddingSetRow> {\n const id = input.id ?? generateId()\n await this.db.query(\n `INSERT INTO embedding_set (\n id, name, purpose, model_name, dimensions, kind, mode,\n source_json, compatibility_json, materialization_json, freshness_json, created_at, updated_at\n ) VALUES ($1, $2, $3, $4, $5, 'virtual', 'auto', $6::jsonb, $7::jsonb, $8::jsonb, $9::jsonb,\n COALESCE($10::timestamptz, now()), COALESCE($11::timestamptz, now()))`,\n [\n id,\n input.name,\n input.purpose ?? null,\n this.inferDefinitionModel(input) ?? 'virtual',\n this.inferDefinitionDimension(input) ?? 0,\n jsonParam(input.source),\n jsonParam(input.compatibility),\n jsonParam(input.materialization ?? null),\n jsonParam({ status: input.materialization?.freshness ?? 'unknown' }),\n input.createdAt ?? null,\n input.updatedAt ?? null,\n ],\n )\n const row = await this.get(id)\n if (input.materialization?.allowed) {\n await this.refreshMaterializedVirtualSet(id)\n return this.get(id)\n }\n return row\n }\n\n async ensureDefault(): Promise<EmbeddingSetRow> {\n const existing = await this.db.query<EmbeddingSetRow>(\n `SELECT * FROM embedding_set WHERE name = $1 AND model_name = $2 AND kind = 'physical' ORDER BY created_at LIMIT 1`,\n ['Full content', 'all-MiniLM-L6-v2'],\n )\n if (existing.rows.length > 0) return existing.rows[0]\n\n return this.create({\n name: 'Full content',\n purpose: 'Semantic search over full revised note content',\n model_name: 'all-MiniLM-L6-v2',\n dimensions: 384,\n kind: 'physical',\n })\n }\n\n async get(id: string): Promise<EmbeddingSetRow> {\n const result = await this.db.query<EmbeddingSetRow>(\n `SELECT * FROM embedding_set WHERE id = $1`,\n [id],\n )\n if (result.rows.length === 0) throw new Error(`Embedding set not found: ${id}`)\n return result.rows[0]\n }\n\n async list(): Promise<EmbeddingSetRow[]> {\n const result = await this.db.query<EmbeddingSetRow>(\n `SELECT * FROM embedding_set ORDER BY created_at, name`,\n )\n return result.rows\n }\n\n async listDescriptors(): Promise<EmbeddingSetDescriptor[]> {\n const rows = await this.list()\n return rows.map((row) => this.toDescriptor(row))\n }\n\n toDescriptor(row: EmbeddingSetRow): EmbeddingSetDescriptor {\n return {\n id: row.id,\n name: row.name,\n purpose: row.purpose,\n kind: row.kind,\n mode: row.mode ?? undefined,\n model: row.model_name,\n dimension: row.dimensions,\n truncateDimension: row.truncate_dimension,\n criteria: asObject<EmbeddingSetCriteria>(row.criteria_json),\n createdAt: dateString(row.created_at),\n updatedAt: dateString(row.updated_at),\n freshness: asObject<EmbeddingSetFreshness>(row.freshness_json) ?? { status: 'fresh' },\n }\n }\n\n async putEmbedding(input: EmbeddingSetEmbeddingInput): Promise<{ id: string }> {\n const set = await this.get(input.embedding_set_id)\n if (set.kind === 'virtual') {\n throw new Error(`Cannot store vectors directly in virtual embedding set: ${set.id}`)\n }\n if (input.vector.length !== set.dimensions) {\n throw new Error(\n `Embedding vector has ${input.vector.length} dimensions; set ${set.id} expects ${set.dimensions}`,\n )\n }\n\n await this.db.query(\n `DELETE FROM embedding_set_member WHERE note_id = $1 AND embedding_set_id = $2`,\n [input.note_id, input.embedding_set_id],\n )\n await this.db.query(\n `DELETE FROM embedding WHERE note_id = $1 AND embedding_set_id = $2`,\n [input.note_id, input.embedding_set_id],\n )\n\n const embeddingId = input.id ?? generateId()\n const vector = `[${input.vector.join(',')}]`\n await this.db.query(\n `INSERT INTO embedding (id, note_id, embedding_set_id, vector)\n VALUES ($1, $2, $3, $4::vector)`,\n [embeddingId, input.note_id, input.embedding_set_id, vector],\n )\n\n await this.db.query(\n `INSERT INTO embedding_set_member (embedding_set_id, note_id, embedding_id)\n VALUES ($1, $2, $3)`,\n [input.embedding_set_id, input.note_id, embeddingId],\n )\n\n return { id: embeddingId }\n }\n\n async resolveSelector(selector: EmbeddingSetSelector): Promise<ResolvedEmbeddingSet> {\n if (selector.kind === 'default') {\n const set = await this.ensureDefault()\n return this.resolvePhysicalSet({ kind: 'embedding-set', embeddingSetId: set.id }, set.id)\n }\n if (selector.kind === 'embedding-set') {\n if (!selector.embeddingSetId) throw new Error('embedding-set selector requires embeddingSetId')\n const set = await this.get(selector.embeddingSetId)\n if (set.kind === 'virtual') {\n const definition = this.definitionFromRow(set)\n return this.resolveDefinition({ kind: 'embedding-set', embeddingSetId: set.id }, definition, set)\n }\n return this.resolvePhysicalSet(selector, set.id)\n }\n if (!selector.definition) throw new Error('virtual-definition selector requires definition')\n return this.resolveDefinition(selector, selector.definition)\n }\n\n async refreshMaterializedVirtualSet(setId: string): Promise<ResolvedEmbeddingSet> {\n const set = await this.get(setId)\n if (set.kind !== 'virtual') throw new Error(`Embedding set is not virtual: ${setId}`)\n const definition = this.definitionFromRow(set)\n if (!definition.materialization?.allowed) {\n throw new Error(`Virtual embedding set does not allow materialization: ${setId}`)\n }\n\n const live = await this.resolveDefinition(\n { kind: 'embedding-set', embeddingSetId: setId },\n definition,\n set,\n { forceLive: true },\n )\n await this.db.query(`DELETE FROM embedding_set_member WHERE embedding_set_id = $1`, [setId])\n for (const row of live.rows) {\n await this.db.query(\n `INSERT INTO embedding_set_member (embedding_set_id, note_id, embedding_id)\n VALUES ($1, $2, $3)\n ON CONFLICT DO NOTHING`,\n [setId, row.note_id, row.embedding_id],\n )\n }\n\n const inputHash = this.resolutionInputHash(definition, live.rows)\n const generatedAt = new Date().toISOString()\n const materialization: VirtualMaterializationPolicy = {\n ...definition.materialization,\n allowed: true,\n includeResolvedMembers: true,\n freshness: 'fresh',\n inputHash,\n generatedAt,\n resolvedMemberCount: live.rows.length,\n }\n const freshness: EmbeddingSetFreshness = {\n status: 'fresh',\n sourceHash: inputHash,\n checkedAt: generatedAt,\n }\n await this.db.query(\n `UPDATE embedding_set\n SET materialization_json = $2::jsonb, freshness_json = $3::jsonb, updated_at = now()\n WHERE id = $1`,\n [setId, jsonParam(materialization), jsonParam(freshness)],\n )\n\n return this.finalizeResolution(\n { kind: 'embedding-set', embeddingSetId: setId },\n live.rows,\n live.errors,\n definition.compatibility,\n 'fresh',\n 'materialized',\n )\n }\n\n async markVirtualSetStale(setId: string, reason: string): Promise<void> {\n const set = await this.get(setId)\n if (set.kind !== 'virtual') throw new Error(`Embedding set is not virtual: ${setId}`)\n const definition = this.definitionFromRow(set)\n const now = new Date().toISOString()\n const materialization = definition.materialization\n ? { ...definition.materialization, freshness: 'stale' as const }\n : null\n await this.db.query(\n `UPDATE embedding_set\n SET materialization_json = $2::jsonb, freshness_json = $3::jsonb, updated_at = now()\n WHERE id = $1`,\n [\n setId,\n jsonParam(materialization),\n jsonParam({ status: 'stale', sourceHash: definition.materialization?.inputHash, checkedAt: now, reason }),\n ],\n )\n }\n\n private async resolveDefinition(\n selector: EmbeddingSetSelector,\n definition: VirtualEmbeddingSetDefinition,\n set?: EmbeddingSetRow,\n options: { forceLive?: boolean } = {},\n ): Promise<ResolvedEmbeddingSet> {\n if (!options.forceLive && set && definition.materialization?.allowed && definition.materialization.freshness === 'fresh') {\n const materialized = await this.resolveMaterializedRows(set.id)\n if (materialized.length > 0 || definition.materialization.resolvedMemberCount === 0) {\n return this.finalizeResolution(\n selector,\n materialized,\n [],\n definition.compatibility,\n 'fresh',\n 'materialized',\n )\n }\n }\n\n let rows: ResolvedEmbeddingRow[]\n const errors: VirtualEmbeddingSetValidationError[] = []\n switch (definition.source.type) {\n case 'criteria':\n rows = await this.resolveCriteriaSource(definition.source)\n break\n case 'set-operation':\n rows = await this.resolveSetOperationSource(definition.source, definition.compatibility, errors)\n break\n case 'fallback':\n rows = await this.resolveFallbackSource(definition.source.preferredSetIds, definition.compatibility, errors)\n break\n case 'latest-compatible':\n rows = await this.resolveLatestCompatibleSource(definition.source, definition.compatibility, errors)\n break\n case 'snapshot':\n rows = await this.resolvePhysicalRows(definition.source.snapshotId)\n break\n default:\n rows = []\n }\n return this.finalizeResolution(selector, rows, errors, definition.compatibility, definition.materialization?.freshness ?? 'unknown', 'live')\n }\n\n private async resolvePhysicalSet(selector: EmbeddingSetSelector, setId: string): Promise<ResolvedEmbeddingSet> {\n return this.finalizeResolution(selector, await this.resolvePhysicalRows(setId), [], DEFAULT_COMPATIBILITY, 'fresh', 'live')\n }\n\n private async resolvePhysicalRows(setId: string): Promise<ResolvedEmbeddingRow[]> {\n const result = await this.db.query<ResolvedEmbeddingRow>(\n `SELECT note_id, embedding_set_id, id as embedding_id, vector::text as vector, created_at\n FROM embedding\n WHERE embedding_set_id = $1\n ORDER BY note_id, created_at DESC`,\n [setId],\n )\n return result.rows\n }\n\n private async resolveMaterializedRows(setId: string): Promise<ResolvedEmbeddingRow[]> {\n const result = await this.db.query<ResolvedEmbeddingRow>(\n `SELECT e.note_id, e.embedding_set_id, e.id as embedding_id, e.vector::text as vector, e.created_at\n FROM embedding_set_member m\n JOIN embedding e ON e.id = m.embedding_id\n WHERE m.embedding_set_id = $1\n ORDER BY e.note_id, e.created_at DESC`,\n [setId],\n )\n return result.rows\n }\n\n private async resolveCriteriaSource(source: CriteriaVirtualSource): Promise<ResolvedEmbeddingRow[]> {\n const criteria = source.criteria\n if (criteria.conceptIds && criteria.conceptIds.length > 0) {\n throw new Error('Unsupported virtual embedding-set criteria field: conceptIds')\n }\n const conditions = ['e.embedding_set_id = $1']\n const params: unknown[] = [source.baseSetId]\n let idx = 2\n if (criteria.noteIds?.length) {\n conditions.push(`n.id = ANY($${idx++})`)\n params.push(criteria.noteIds)\n }\n if (criteria.tags?.length) {\n conditions.push(`EXISTS (SELECT 1 FROM note_tag nt WHERE nt.note_id = n.id AND nt.tag = ANY($${idx++}))`)\n params.push(criteria.tags)\n }\n if (criteria.collectionIds?.length) {\n conditions.push(`EXISTS (SELECT 1 FROM collection_note cn WHERE cn.note_id = n.id AND cn.collection_id = ANY($${idx++}))`)\n params.push(criteria.collectionIds)\n }\n if (criteria.sources?.length) {\n conditions.push(`n.source = ANY($${idx++})`)\n params.push(criteria.sources)\n }\n if (criteria.formats?.length) {\n conditions.push(`n.format = ANY($${idx++})`)\n params.push(criteria.formats)\n }\n if (criteria.visibilities?.length) {\n conditions.push(`n.visibility = ANY($${idx++})`)\n params.push(criteria.visibilities)\n }\n if (criteria.isStarred !== undefined) {\n conditions.push(`n.is_starred = $${idx++}`)\n params.push(criteria.isStarred)\n }\n if (criteria.isArchived !== undefined) {\n conditions.push(`n.is_archived = $${idx++}`)\n params.push(criteria.isArchived)\n }\n if (criteria.hasTitle !== undefined) {\n conditions.push(criteria.hasTitle ? `n.title IS NOT NULL AND n.title <> ''` : `(n.title IS NULL OR n.title = '')`)\n }\n if (criteria.hasEmbedding === false) {\n conditions.push('FALSE')\n }\n if (criteria.isUserEdited !== undefined) {\n conditions.push(`COALESCE(c.is_user_edited, false) = $${idx++}`)\n params.push(criteria.isUserEdited)\n }\n if (criteria.hasAiMetadata !== undefined) {\n conditions.push(criteria.hasAiMetadata ? `c.ai_metadata IS NOT NULL` : `c.ai_metadata IS NULL`)\n }\n if (criteria.hasRevisions !== undefined) {\n conditions.push(criteria.hasRevisions\n ? `EXISTS (SELECT 1 FROM note_revision nr WHERE nr.note_id = n.id)`\n : `NOT EXISTS (SELECT 1 FROM note_revision nr WHERE nr.note_id = n.id)`)\n }\n if (criteria.minGenerationCount !== undefined) {\n conditions.push(`COALESCE(c.generation_count, 0) >= $${idx++}`)\n params.push(criteria.minGenerationCount)\n }\n if (criteria.maxGenerationCount !== undefined) {\n conditions.push(`COALESCE(c.generation_count, 0) <= $${idx++}`)\n params.push(criteria.maxGenerationCount)\n }\n if (criteria.updatedAfter) {\n conditions.push(`n.updated_at >= $${idx++}`)\n params.push(criteria.updatedAfter)\n }\n if (criteria.updatedBefore) {\n conditions.push(`n.updated_at <= $${idx++}`)\n params.push(criteria.updatedBefore)\n }\n if (criteria.query?.trim()) {\n conditions.push(`(n.tsv @@ plainto_tsquery('english', $${idx}) OR to_tsvector('english', coalesce(c.content, '')) @@ plainto_tsquery('english', $${idx}))`)\n params.push(criteria.query)\n }\n\n const result = await this.db.query<ResolvedEmbeddingRow>(\n `SELECT e.note_id, e.embedding_set_id, e.id as embedding_id, e.vector::text as vector, e.created_at\n FROM embedding e\n JOIN note n ON n.id = e.note_id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${conditions.join(' AND ')}\n ORDER BY e.note_id, e.created_at DESC`,\n params,\n )\n return result.rows\n }\n\n private async resolveSetOperationSource(\n source: SetOperationVirtualSource,\n compatibility: EmbeddingCompatibilityPolicy,\n errors: VirtualEmbeddingSetValidationError[],\n ): Promise<ResolvedEmbeddingRow[]> {\n const bySet = new Map<string, ResolvedEmbeddingRow[]>()\n for (const setId of source.setIds) bySet.set(setId, await this.resolvePhysicalRows(setId))\n await this.validateCompatibility(source.setIds, compatibility, errors)\n\n const noteSets = source.setIds.map((setId) => new Set((bySet.get(setId) ?? []).map((row) => row.note_id)))\n const firstRows = bySet.get(source.setIds[0]) ?? []\n if (source.operation === 'difference') {\n const excluded = new Set(noteSets.slice(1).flatMap((set) => Array.from(set)))\n return firstRows.filter((row) => !excluded.has(row.note_id))\n }\n if (source.operation === 'intersection') {\n return firstRows.filter((row) => noteSets.every((set) => set.has(row.note_id)))\n }\n return this.resolveDuplicateRows(source.setIds.flatMap((setId) => bySet.get(setId) ?? []), compatibility, errors)\n }\n\n private async resolveFallbackSource(\n setIds: string[],\n compatibility: EmbeddingCompatibilityPolicy,\n errors: VirtualEmbeddingSetValidationError[],\n ): Promise<ResolvedEmbeddingRow[]> {\n await this.validateCompatibility(setIds, compatibility, errors)\n const selected = new Map<string, ResolvedEmbeddingRow>()\n for (const setId of setIds) {\n for (const row of await this.resolvePhysicalRows(setId)) {\n if (!selected.has(row.note_id)) selected.set(row.note_id, row)\n }\n }\n return Array.from(selected.values()).sort((a, b) => a.note_id.localeCompare(b.note_id))\n }\n\n private async resolveLatestCompatibleSource(\n source: LatestCompatibleVirtualSource,\n compatibility: EmbeddingCompatibilityPolicy,\n errors: VirtualEmbeddingSetValidationError[],\n ): Promise<ResolvedEmbeddingRow[]> {\n const sets = []\n for (const setId of source.candidateSetIds) {\n const set = await this.get(setId)\n if (source.model && set.model_name !== source.model) continue\n if (source.dimension && set.dimensions !== source.dimension) continue\n sets.push(set)\n }\n sets.sort((a, b) => dateMillis(b.updated_at) - dateMillis(a.updated_at) || dateMillis(b.created_at) - dateMillis(a.created_at))\n return this.resolveFallbackSource(sets.map((set) => set.id), compatibility, errors)\n }\n\n private async validateCompatibility(\n setIds: string[],\n compatibility: EmbeddingCompatibilityPolicy,\n errors: VirtualEmbeddingSetValidationError[],\n ): Promise<void> {\n const sets = []\n for (const setId of setIds) sets.push(await this.get(setId))\n if (compatibility.model === 'require-same' && new Set(sets.map((set) => set.model_name)).size > 1) {\n errors.push({ code: 'mixed-models', setIds })\n }\n if (compatibility.dimension === 'require-same' && new Set(sets.map((set) => set.dimensions)).size > 1) {\n errors.push({ code: 'mixed-dimensions', setIds })\n }\n }\n\n private resolveDuplicateRows(\n rows: ResolvedEmbeddingRow[],\n compatibility: EmbeddingCompatibilityPolicy,\n errors: VirtualEmbeddingSetValidationError[],\n ): ResolvedEmbeddingRow[] {\n const byNote = new Map<string, ResolvedEmbeddingRow[]>()\n for (const row of rows) {\n const existing = byNote.get(row.note_id) ?? []\n existing.push(row)\n byNote.set(row.note_id, existing)\n }\n const resolved: ResolvedEmbeddingRow[] = []\n for (const [noteId, noteRows] of byNote) {\n if (noteRows.length > 1 && compatibility.duplicateVectors === 'error') {\n errors.push({ code: 'duplicate-vector', noteId, setIds: noteRows.map((row) => row.embedding_set_id) })\n continue\n }\n const ordered = [...noteRows]\n if (compatibility.duplicateVectors === 'prefer-latest') {\n ordered.sort((a, b) => dateMillis(b.created_at) - dateMillis(a.created_at))\n }\n resolved.push(ordered[0])\n }\n return resolved.sort((a, b) => a.note_id.localeCompare(b.note_id))\n }\n\n private finalizeResolution(\n selector: EmbeddingSetSelector,\n rows: ResolvedEmbeddingRow[],\n errors: VirtualEmbeddingSetValidationError[],\n compatibility: EmbeddingCompatibilityPolicy,\n freshness: EmbeddingSetFreshness['status'],\n resolutionSource: ResolvedEmbeddingSet['resolutionSource'],\n ): ResolvedEmbeddingSet {\n const deduped = this.resolveDuplicateRows(rows, compatibility, errors)\n return {\n selector,\n rows: deduped,\n noteIds: deduped.map((row) => row.note_id),\n embeddingIds: deduped.map((row) => row.embedding_id),\n errors,\n freshness: { status: freshness },\n resolutionSource,\n }\n }\n\n private resolutionInputHash(\n definition: VirtualEmbeddingSetDefinition,\n rows: ResolvedEmbeddingRow[],\n ): string {\n return hashJson({\n source: definition.source,\n compatibility: definition.compatibility,\n members: rows.map((row) => [row.note_id, row.embedding_set_id, row.embedding_id]),\n })\n }\n\n private definitionFromRow(row: EmbeddingSetRow): VirtualEmbeddingSetDefinition {\n const source = asObject<VirtualEmbeddingSetSource>(row.source_json)\n if (!source) throw new Error(`Virtual embedding set has no source definition: ${row.id}`)\n return {\n id: row.id,\n name: row.name,\n purpose: row.purpose,\n source,\n compatibility: asObject<EmbeddingCompatibilityPolicy>(row.compatibility_json) ?? DEFAULT_COMPATIBILITY,\n materialization: asObject<VirtualMaterializationPolicy>(row.materialization_json) ?? undefined,\n createdAt: dateString(row.created_at),\n updatedAt: dateString(row.updated_at),\n }\n }\n\n private inferDefinitionModel(input: VirtualEmbeddingSetDefinition): string | null {\n if (input.source.type === 'latest-compatible') return input.source.model ?? null\n return null\n }\n\n private inferDefinitionDimension(input: VirtualEmbeddingSetDefinition): number | null {\n if (input.source.type === 'latest-compatible') return input.source.dimension ?? null\n return null\n }\n}\n","/**\n * SearchRepository - full-text search using DatabaseClient tsvector/tsquery,\n * with optional semantic search (pgvector) and hybrid (BM25 + vector RRF).\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport type { SearchResponse, SearchOptions, SearchFacets, SearchResult } from './types.js'\nimport { buildNoteConditions } from './condition-builder.js'\nimport { EmbeddingSetsRepository, type EmbeddingSetSelector, type ResolvedEmbeddingSet } from './embedding-sets-repository.js'\n\nexport class SearchRepository {\n constructor(\n private db: DatabaseClient,\n private semanticAvailable = false,\n ) {}\n\n private tsqueryFn(query: string): string {\n return query.includes('\"') ? 'phraseto_tsquery' : 'plainto_tsquery'\n }\n\n private async fetchEmbeddingSet(noteIds: string[], embeddingSetId?: string): Promise<Set<string>> {\n if (noteIds.length === 0) return new Set()\n const params: unknown[] = [noteIds]\n const setFilter = embeddingSetId ? ' AND embedding_set_id = $2' : ''\n if (embeddingSetId) params.push(embeddingSetId)\n const result = await this.db.query<{ note_id: string }>(\n 'SELECT note_id FROM embedding WHERE note_id = ANY($1)' + setFilter,\n params,\n )\n return new Set(result.rows.map((r) => r.note_id))\n }\n\n private selectorFromOptions(options: SearchOptions): EmbeddingSetSelector | null {\n if (options.embeddingSetSelector) return options.embeddingSetSelector\n if (options.embeddingSetId) return { kind: 'embedding-set', embeddingSetId: options.embeddingSetId }\n return null\n }\n\n private async resolveEmbeddingSet(options: SearchOptions): Promise<ResolvedEmbeddingSet | null> {\n const selector = this.selectorFromOptions(options)\n if (!selector) return null\n return new EmbeddingSetsRepository(this.db).resolveSelector(selector)\n }\n\n private scopeToResolvedEmbeddingSet(\n conditions: string[],\n params: unknown[],\n paramIdx: number,\n resolved: ResolvedEmbeddingSet | null,\n ): number {\n if (!resolved) return paramIdx\n if (resolved.noteIds.length === 0) {\n conditions.push('FALSE')\n return paramIdx\n }\n conditions.push('n.id = ANY($' + paramIdx + ')')\n params.push(resolved.noteIds)\n return paramIdx + 1\n }\n\n private scopeToResolvedEmbeddingRows(\n conditions: string[],\n params: unknown[],\n paramIdx: number,\n resolved: ResolvedEmbeddingSet | null,\n ): number {\n if (!resolved) return paramIdx\n if (resolved.embeddingIds.length === 0) {\n conditions.push('FALSE')\n return paramIdx\n }\n conditions.push('e.id = ANY($' + paramIdx + ')')\n params.push(resolved.embeddingIds)\n return paramIdx + 1\n }\n\n private async fetchEmbeddingStatus(\n noteIds: string[],\n resolved: ResolvedEmbeddingSet | null,\n embeddingSetId?: string,\n ): Promise<Set<string>> {\n if (resolved) return new Set(noteIds.filter((id) => resolved.noteIds.includes(id)))\n return this.fetchEmbeddingSet(noteIds, embeddingSetId)\n }\n\n private attachEmbeddingStatus(\n results: Omit<SearchResult, 'has_embedding'>[],\n embeddingSet: Set<string>,\n ): SearchResult[] {\n return results.map((r) => ({ ...r, has_embedding: embeddingSet.has(r.id) }))\n }\n\n async search(\n query: string,\n options: SearchOptions = {},\n queryEmbedding?: number[],\n ): Promise<SearchResponse> {\n const { limit = 20, offset = 0 } = options\n const mode = options.mode ?? 'auto'\n\n if (mode === 'text') {\n if (!query.trim()) return this.recentNotes(options)\n } else if (mode === 'semantic') {\n if (!queryEmbedding || queryEmbedding.length === 0) {\n throw new Error('mode=semantic requires a query embedding')\n }\n return this.semanticSearch(queryEmbedding, options)\n } else if (mode === 'hybrid') {\n if (!queryEmbedding || queryEmbedding.length === 0) {\n throw new Error('mode=hybrid requires a query embedding')\n }\n return this.hybridSearch(query, queryEmbedding, options)\n } else {\n if (queryEmbedding && queryEmbedding.length > 0) {\n if (query.trim()) return this.hybridSearch(query, queryEmbedding, options)\n return this.semanticSearch(queryEmbedding, options)\n }\n if (!query.trim()) return this.recentNotes(options)\n }\n\n if (!query.trim()) return this.recentNotes(options)\n\n const resolvedEmbeddingSet = await this.resolveEmbeddingSet(options)\n const tsqFn = this.tsqueryFn(query)\n const { conditions, params, nextIdx } = buildNoteConditions(options, 2)\n conditions.unshift(\n `(n.tsv @@ ${tsqFn}('english', $1) OR\n to_tsvector('english', coalesce(c.content, '')) @@ ${tsqFn}('english', $1))`,\n )\n let paramIdx = this.scopeToResolvedEmbeddingSet(conditions, params, nextIdx, resolvedEmbeddingSet)\n const allParams = [query, ...params]\n const where = conditions.join(' AND ')\n\n const countResult = await this.db.query<{ count: string }>(\n `SELECT COUNT(*) as count\n FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${where}`,\n allParams,\n )\n const total = parseInt(countResult.rows[0].count, 10)\n\n const searchParams = [...allParams, limit, offset]\n const result = await this.db.query<{\n id: string\n title: string | null\n created_at: Date\n updated_at: Date\n rank: number\n snippet: string\n }>(\n `SELECT n.id, n.title, n.created_at, n.updated_at,\n ts_rank(\n setweight(n.tsv, 'A') || setweight(to_tsvector('english', coalesce(c.content, '')), 'B'),\n ${tsqFn}('english', $1)\n ) as rank,\n ts_headline(\n 'english',\n coalesce(c.content, ''),\n ${tsqFn}('english', $1),\n 'StartSel=<mark>, StopSel=</mark>, MaxWords=35, MinWords=15'\n ) as snippet\n FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${where}\n ORDER BY rank DESC, n.created_at DESC\n LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n searchParams,\n )\n\n const resultIds = result.rows.map((r) => r.id)\n const [tagMap, embeddingSet] = await Promise.all([\n this.fetchTagMap(resultIds),\n this.fetchEmbeddingStatus(resultIds, resolvedEmbeddingSet, options.embeddingSetId),\n ])\n\n let facets: SearchFacets | undefined\n if (options.include_facets) {\n const idsResult = await this.db.query<{ id: string }>(\n `SELECT n.id FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${where}`,\n allParams,\n )\n facets = await this.fetchFacets(idsResult.rows.map((r) => r.id))\n }\n\n const baseResults = result.rows.map((r) => ({\n id: r.id,\n title: r.title,\n snippet: r.snippet ?? '',\n rank: r.rank,\n created_at: r.created_at,\n updated_at: r.updated_at,\n tags: tagMap.get(r.id) ?? [],\n }))\n\n return {\n results: this.attachEmbeddingStatus(baseResults, embeddingSet),\n total,\n query,\n mode: 'text',\n semantic_available: this.semanticAvailable,\n limit,\n offset,\n facets,\n }\n }\n\n async semanticSearch(queryEmbedding: number[], options: SearchOptions = {}): Promise<SearchResponse> {\n const { limit = 20, offset = 0 } = options\n const vectorStr = `[${queryEmbedding.join(',')}]`\n const resolvedEmbeddingSet = await this.resolveEmbeddingSet(options)\n const { conditions, params, nextIdx } = buildNoteConditions(options, 1)\n let paramIdx = this.scopeToResolvedEmbeddingRows(conditions, params, nextIdx, resolvedEmbeddingSet)\n const where = conditions.join(' AND ')\n\n const countResult = await this.db.query<{ count: string }>(\n `SELECT COUNT(*) as count\n FROM embedding e\n JOIN note n ON n.id = e.note_id\n WHERE ${where}`,\n params,\n )\n const total = parseInt(countResult.rows[0].count, 10)\n\n const vecIdx = paramIdx++\n const limIdx = paramIdx++\n const offIdx = paramIdx++\n const result = await this.db.query<{\n id: string\n title: string | null\n created_at: Date\n updated_at: Date\n distance: number\n snippet: string\n }>(\n `SELECT n.id, n.title, n.created_at, n.updated_at,\n (e.vector <=> $${vecIdx}::vector) as distance,\n LEFT(coalesce(c.content, ''), 200) as snippet\n FROM embedding e\n JOIN note n ON n.id = e.note_id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${where}\n ORDER BY e.vector <=> $${vecIdx}::vector ASC\n LIMIT $${limIdx} OFFSET $${offIdx}`,\n [...params, vectorStr, limit, offset],\n )\n\n const tagMap = await this.fetchTagMap(result.rows.map((r) => r.id))\n const facets = options.include_facets\n ? await this.fetchFacets((await this.db.query<{ id: string }>(\n `SELECT n.id FROM embedding e JOIN note n ON n.id = e.note_id WHERE ${where}`,\n params,\n )).rows.map((r) => r.id))\n : undefined\n\n return {\n results: result.rows.map((r) => ({\n id: r.id,\n title: r.title,\n snippet: r.snippet ?? '',\n rank: 1 - r.distance,\n created_at: r.created_at,\n updated_at: r.updated_at,\n tags: tagMap.get(r.id) ?? [],\n has_embedding: true,\n })),\n total,\n query: '',\n mode: 'semantic',\n semantic_available: this.semanticAvailable,\n limit,\n offset,\n facets,\n }\n }\n\n async hybridSearch(\n query: string,\n queryEmbedding: number[],\n options: SearchOptions = {},\n ): Promise<SearchResponse> {\n const { limit = 20, offset = 0 } = options\n const vectorStr = `[${queryEmbedding.join(',')}]`\n const k = 60\n const tsqFn = this.tsqueryFn(query)\n const resolvedEmbeddingSet = await this.resolveEmbeddingSet(options)\n\n const textCond = buildNoteConditions(options, 2)\n const textConditions = [\n ...textCond.conditions,\n `(n.tsv @@ ${tsqFn}('english', $1) OR\n to_tsvector('english', coalesce(c.content, '')) @@ ${tsqFn}('english', $1))`,\n ]\n this.scopeToResolvedEmbeddingSet(textConditions, textCond.params, textCond.nextIdx, resolvedEmbeddingSet)\n const textWhere = textConditions.join(' AND ')\n const textParams = [query, ...textCond.params]\n\n const textResult = await this.db.query<{ id: string; rank: number }>(\n `SELECT n.id,\n ts_rank(\n setweight(n.tsv, 'A') || setweight(to_tsvector('english', coalesce(c.content, '')), 'B'),\n ${tsqFn}('english', $1)\n ) as rank\n FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${textWhere}\n ORDER BY rank DESC\n LIMIT 100`,\n textParams,\n )\n\n const vecCond = buildNoteConditions(options, 1)\n vecCond.nextIdx = this.scopeToResolvedEmbeddingRows(vecCond.conditions, vecCond.params, vecCond.nextIdx, resolvedEmbeddingSet)\n const vecWhere = vecCond.conditions.join(' AND ')\n const vecVecIdx = vecCond.nextIdx\n\n const vectorResult = await this.db.query<{ id: string; distance: number }>(\n `SELECT n.id, (e.vector <=> $${vecVecIdx}::vector) as distance\n FROM embedding e\n JOIN note n ON n.id = e.note_id\n WHERE ${vecWhere}\n ORDER BY e.vector <=> $${vecVecIdx}::vector ASC\n LIMIT 100`,\n [...vecCond.params, vectorStr],\n )\n\n const rrfScores = new Map<string, number>()\n textResult.rows.forEach((row, idx) => {\n rrfScores.set(row.id, (rrfScores.get(row.id) ?? 0) + 1 / (k + idx + 1))\n })\n vectorResult.rows.forEach((row, idx) => {\n rrfScores.set(row.id, (rrfScores.get(row.id) ?? 0) + 1 / (k + idx + 1))\n })\n\n const sortedIds = Array.from(rrfScores.entries()).sort((a, b) => b[1] - a[1]).map(([id]) => id)\n const total = sortedIds.length\n const pageIds = sortedIds.slice(offset, offset + limit)\n\n if (pageIds.length === 0) {\n return { results: [], total, query, mode: 'hybrid', semantic_available: this.semanticAvailable, limit, offset }\n }\n\n const noteResult = await this.db.query<{\n id: string\n title: string | null\n created_at: Date\n updated_at: Date\n snippet: string\n }>(\n `SELECT n.id, n.title, n.created_at, n.updated_at,\n LEFT(coalesce(c.content, ''), 200) as snippet\n FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE n.id = ANY($1)`,\n [pageIds],\n )\n\n const noteMap = new Map(noteResult.rows.map((r) => [r.id, r]))\n const [tagMap, embeddingSet] = await Promise.all([\n this.fetchTagMap(pageIds),\n this.fetchEmbeddingStatus(pageIds, resolvedEmbeddingSet, options.embeddingSetId),\n ])\n const facets = options.include_facets ? await this.fetchFacets(sortedIds) : undefined\n\n return {\n results: pageIds\n .map((id) => {\n const r = noteMap.get(id)\n if (!r) return null\n return {\n id: r.id,\n title: r.title,\n snippet: r.snippet ?? '',\n rank: rrfScores.get(id) ?? 0,\n created_at: r.created_at,\n updated_at: r.updated_at,\n tags: tagMap.get(id) ?? [],\n has_embedding: embeddingSet.has(id),\n }\n })\n .filter((r): r is NonNullable<typeof r> => r !== null),\n total,\n query,\n mode: 'hybrid',\n semantic_available: this.semanticAvailable,\n limit,\n offset,\n facets,\n }\n }\n\n private async recentNotes(options: SearchOptions = {}): Promise<SearchResponse> {\n const { limit = 20, offset = 0 } = options\n const resolvedEmbeddingSet = await this.resolveEmbeddingSet(options)\n const { conditions, params, nextIdx } = buildNoteConditions(options, 1)\n let paramIdx = this.scopeToResolvedEmbeddingSet(conditions, params, nextIdx, resolvedEmbeddingSet)\n const where = conditions.join(' AND ')\n\n const countResult = await this.db.query<{ count: string }>(\n `SELECT COUNT(*) as count FROM note n WHERE ${where}`,\n params,\n )\n const total = parseInt(countResult.rows[0].count, 10)\n\n const listParams = [...params, limit, offset]\n const result = await this.db.query<{\n id: string\n title: string | null\n created_at: Date\n updated_at: Date\n snippet: string\n }>(\n `SELECT n.id, n.title, n.created_at, n.updated_at,\n LEFT(coalesce(c.content, ''), 200) as snippet\n FROM note n\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE ${where}\n ORDER BY n.created_at DESC\n LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n listParams,\n )\n\n const resultIds = result.rows.map((r) => r.id)\n const embeddingSet = await this.fetchEmbeddingStatus(resultIds, resolvedEmbeddingSet, options.embeddingSetId)\n\n return {\n results: result.rows.map((r) => ({\n id: r.id,\n title: r.title,\n snippet: r.snippet ?? '',\n rank: 0,\n created_at: r.created_at,\n updated_at: r.updated_at,\n tags: [],\n has_embedding: embeddingSet.has(r.id),\n })),\n total,\n query: '',\n mode: 'text',\n semantic_available: this.semanticAvailable,\n limit,\n offset,\n }\n }\n\n private async fetchFacets(noteIds: string[]): Promise<SearchFacets> {\n if (noteIds.length === 0) return { tags: [], collections: [] }\n\n const [tagResult, collResult] = await Promise.all([\n this.db.query<{ tag: string; count: string }>(\n `SELECT nt.tag, COUNT(*) as count FROM note_tag nt\n WHERE nt.note_id = ANY($1) GROUP BY nt.tag ORDER BY count DESC LIMIT 20`,\n [noteIds],\n ),\n this.db.query<{ id: string; name: string; count: string }>(\n `SELECT col.id, col.name, COUNT(*) as count FROM collection_note cn\n JOIN collection col ON col.id = cn.collection_id\n WHERE cn.note_id = ANY($1) GROUP BY col.id, col.name ORDER BY count DESC LIMIT 20`,\n [noteIds],\n ),\n ])\n\n return {\n tags: tagResult.rows.map((r) => ({ tag: r.tag, count: parseInt(r.count, 10) })),\n collections: collResult.rows.map((r) => ({ id: r.id, name: r.name, count: parseInt(r.count, 10) })),\n }\n }\n\n private async fetchTagMap(noteIds: string[]): Promise<Map<string, string[]>> {\n const tagMap = new Map<string, string[]>()\n if (noteIds.length === 0) return tagMap\n\n const tagsResult = await this.db.query<{ note_id: string; tag: string }>(\n `SELECT note_id, tag FROM note_tag WHERE note_id = ANY($1) ORDER BY tag`,\n [noteIds],\n )\n for (const row of tagsResult.rows) {\n const existing = tagMap.get(row.note_id) ?? []\n existing.push(row.tag)\n tagMap.set(row.note_id, existing)\n }\n return tagMap\n }\n}\n","/**\n * LinksRepository — bidirectional note link management.\n *\n * Responsibilities:\n * - Create typed links between notes with duplicate prevention\n * - Soft-delete links\n * - Query outbound, inbound, and backlinks for a note\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\n\nexport interface LinkRow {\n id: string\n source_note_id: string\n target_note_id: string\n link_type: string\n confidence: number | null\n created_at: Date\n updated_at: Date | null\n deleted_at: Date | null\n}\n\nexport class LinksRepository {\n constructor(private db: DatabaseClient) {}\n\n async create(\n sourceNoteId: string,\n targetNoteId: string,\n linkType: string = 'related',\n ): Promise<LinkRow> {\n // Duplicate prevention — return existing active link if it already exists\n const existing = await this.db.query<LinkRow>(\n `SELECT * FROM link WHERE source_note_id = $1 AND target_note_id = $2 AND link_type = $3 AND deleted_at IS NULL`,\n [sourceNoteId, targetNoteId, linkType],\n )\n if (existing.rows.length > 0) return existing.rows[0]\n\n const id = generateId()\n await this.db.query(\n `INSERT INTO link (id, source_note_id, target_note_id, link_type) VALUES ($1, $2, $3, $4)`,\n [id, sourceNoteId, targetNoteId, linkType],\n )\n return this.get(id)\n }\n\n async get(id: string): Promise<LinkRow> {\n const result = await this.db.query<LinkRow>(\n `SELECT * FROM link WHERE id = $1`,\n [id],\n )\n if (result.rows.length === 0) throw new Error(`Link not found: ${id}`)\n return result.rows[0]\n }\n\n async listForNote(noteId: string): Promise<{ outbound: LinkRow[]; inbound: LinkRow[] }> {\n const outbound = await this.db.query<LinkRow>(\n `SELECT * FROM link WHERE source_note_id = $1 AND deleted_at IS NULL`,\n [noteId],\n )\n const inbound = await this.db.query<LinkRow>(\n `SELECT * FROM link WHERE target_note_id = $1 AND deleted_at IS NULL`,\n [noteId],\n )\n return { outbound: outbound.rows, inbound: inbound.rows }\n }\n\n async getBacklinks(noteId: string): Promise<string[]> {\n const result = await this.db.query<{ source_note_id: string }>(\n `SELECT source_note_id FROM link WHERE target_note_id = $1 AND deleted_at IS NULL`,\n [noteId],\n )\n return result.rows.map((r) => r.source_note_id)\n }\n\n async delete(id: string): Promise<void> {\n await this.db.query(`UPDATE link SET deleted_at = now() WHERE id = $1`, [id])\n }\n}\n","/**\n * Zod schemas for tool function inputs.\n *\n * These schemas are the contract between callers (e.g. host platform bridge) and\n * the tool functions. All inputs are validated at the tool boundary so that\n * repository methods only receive well-typed data.\n */\n\nimport { z } from 'zod'\n\n// ---------------------------------------------------------------------------\n// capture_knowledge\n// ---------------------------------------------------------------------------\n\nexport const CaptureKnowledgeInputSchema = z.object({\n action: z.enum(['create', 'bulk_create', 'from_template']),\n // For create\n content: z.string().optional(),\n title: z.string().optional(),\n format: z.enum(['markdown', 'plain', 'html']).default('markdown'),\n source: z.string().default('user'),\n visibility: z.enum(['private', 'shared', 'public']).default('private'),\n tags: z.array(z.string()).optional(),\n archive_id: z.string().optional(),\n // For bulk_create\n notes: z\n .array(\n z.object({\n content: z.string(),\n title: z.string().optional(),\n format: z.enum(['markdown', 'plain', 'html']).default('markdown'),\n tags: z.array(z.string()).optional(),\n }),\n )\n .optional(),\n // For from_template\n template: z.string().optional(),\n variables: z.record(z.string()).optional(),\n})\n\nexport type CaptureKnowledgeInput = z.infer<typeof CaptureKnowledgeInputSchema>\n\n// ---------------------------------------------------------------------------\n// manage_note\n// ---------------------------------------------------------------------------\n\nexport const ManageNoteInputSchema = z.object({\n action: z.enum(['update', 'delete', 'restore', 'archive', 'unarchive', 'star', 'unstar']),\n note_id: z.string(),\n // For update\n title: z.string().optional(),\n content: z.string().optional(),\n format: z.string().optional(),\n visibility: z.string().optional(),\n})\n\nexport type ManageNoteInput = z.infer<typeof ManageNoteInputSchema>\n\n// ---------------------------------------------------------------------------\n// search\n// ---------------------------------------------------------------------------\n\nexport const SearchInputSchema = z.object({\n query: z.string(),\n mode: z.enum(['text', 'semantic', 'hybrid', 'auto']).default('text'),\n query_embedding: z.array(z.number()).optional(),\n embeddingSetId: z.string().optional(),\n limit: z.number().int().min(1).max(100).default(20),\n offset: z.number().int().min(0).default(0),\n tags: z.array(z.string()).optional(),\n collection_id: z.string().optional(),\n date_from: z.coerce.date().optional(),\n date_to: z.coerce.date().optional(),\n is_starred: z.boolean().optional(),\n is_archived: z.boolean().optional(),\n format: z.enum(['markdown', 'plain', 'html']).optional(),\n source: z.string().optional(),\n visibility: z.enum(['private', 'shared', 'public']).optional(),\n include_facets: z.boolean().default(false),\n})\n\nexport type SearchInput = z.infer<typeof SearchInputSchema>\n","/**\n * manageNote — tool function for note lifecycle operations.\n *\n * Supports: update, delete, restore, archive, unarchive, star, unstar.\n *\n * Input is Zod-validated at entry. All mutations delegate to NotesRepository.\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport type { TypedEventBus } from '../event-bus.js'\nimport { NotesRepository } from '../repositories/notes-repository.js'\nimport { ManageNoteInputSchema } from './schemas.js'\nimport type { NoteFull } from '../repositories/types.js'\n\nexport interface ManageNoteResult {\n action: string\n note_id: string\n note?: NoteFull\n}\n\nexport async function manageNote(\n db: DatabaseClient,\n rawInput: unknown,\n events?: TypedEventBus,\n): Promise<ManageNoteResult> {\n const input = ManageNoteInputSchema.parse(rawInput)\n const repo = new NotesRepository(db, events)\n\n switch (input.action) {\n case 'update': {\n const note = await repo.update(input.note_id, {\n title: input.title,\n content: input.content,\n format: input.format,\n visibility: input.visibility,\n })\n return { action: 'update', note_id: input.note_id, note }\n }\n\n case 'delete': {\n await repo.delete(input.note_id)\n return { action: 'delete', note_id: input.note_id }\n }\n\n case 'restore': {\n const note = await repo.restore(input.note_id)\n return { action: 'restore', note_id: input.note_id, note }\n }\n\n case 'archive': {\n await repo.archive(input.note_id, true)\n const note = await repo.get(input.note_id)\n return { action: 'archive', note_id: input.note_id, note }\n }\n\n case 'unarchive': {\n await repo.archive(input.note_id, false)\n const note = await repo.get(input.note_id)\n return { action: 'unarchive', note_id: input.note_id, note }\n }\n\n case 'star': {\n await repo.star(input.note_id, true)\n const note = await repo.get(input.note_id)\n return { action: 'star', note_id: input.note_id, note }\n }\n\n case 'unstar': {\n await repo.star(input.note_id, false)\n const note = await repo.get(input.note_id)\n return { action: 'unstar', note_id: input.note_id, note }\n }\n }\n}\n","/**\n * Backend seam (#191) — a uniform tool-intent operation interface that lets the\n * PGlite database backend (#187) and the static-file shard backend (#189) be\n * selected and dispatched against the same way, plus a capability-negotiation\n * API so a caller asks for the operations it needs and gets the lightest backend\n * that provides them.\n *\n * The seam sits one level above SQL: every adapter exposes the same read\n * operations (and optional relationship, write, semantic, and full-content ops)\n * regardless of whether the data lives in a queryable PGlite instance, a set of\n * static shard files fetched over HTTP, or the Fortemi server tier.\n */\n\nimport type { DatabaseClient } from './storage-backend.js'\nimport { NotesRepository } from './repositories/notes-repository.js'\nimport { SearchRepository } from './repositories/search-repository.js'\nimport { LinksRepository } from './repositories/links-repository.js'\nimport type { LinkRow } from './repositories/links-repository.js'\nimport type { NoteSummary, NoteFull, SearchResult } from './repositories/types.js'\nimport { manageNote } from './tools/manage-note.js'\nimport type { ShardReader, ShardReaderNote } from './shard/shard-reader.js'\nimport type { ShardLink, ShardProvenanceEdge, ShardSkosConcept } from './shard/types.js'\n\n// ── Capabilities ──────────────────────────────────────────────────────────\n\n/**\n * Semantic-search tier a backend offers, in increasing capability:\n * - `none` — no vector search (text / facets only)\n * - `cosine-small` — brute-force cosine over a small static vector set (#189)\n * - `ann-full` — prebuilt/queryable approximate-nearest-neighbour over the full\n * corpus (PGlite + pgvector, or a prebuilt ANN snapshot)\n * - `server` — delegated to the remote Fortemi server backend\n */\nexport type BackendSemanticTier = 'none' | 'cosine-small' | 'ann-full' | 'server'\n\n/** Relative startup cost of bringing a backend online. */\nexport type BackendStartupCost = 'instant' | 'index-build' | 'network'\n\n/** What a backend can do — the unit of capability negotiation. */\nexport interface BackendCapabilities {\n /** Can answer list / get / search read operations. */\n read: boolean\n /** Can mutate notes (manageNote). */\n write: boolean\n /** Can merge external shards into its store. */\n merge: boolean\n /** Coordinates concurrent multi-user writes. */\n multiUser: boolean\n /** Highest semantic-search tier available. */\n semantic: BackendSemanticTier\n /** Relative cost to bring the backend online. */\n startupCost: BackendStartupCost\n}\n\n// ── Neutral record shapes ─────────────────────────────────────────────────\n\n/**\n * Backend-neutral note record. `source`/`starred`/`archived` are optional\n * because lean read paths (PGlite full-text search) do not return them; list,\n * get, and every shard path populate all fields.\n */\nexport interface BackendNote {\n id: string\n title: string | null\n tags: string[]\n createdAt: string\n updatedAt: string\n source?: string\n starred?: boolean\n archived?: boolean\n}\n\n/** A note plus its current rendered content. */\nexport interface BackendNoteFull extends BackendNote {\n content: string\n links?: BackendLink[]\n concepts?: BackendConcept[]\n provenance?: BackendProvenanceEdge[]\n}\n\nexport interface BackendLink {\n id: string\n fromNoteId: string\n toNoteId: string\n kind: string\n score: number | null\n createdAt: string\n metadata?: Record<string, unknown>\n}\n\nexport interface BackendConcept {\n id: string\n schemeId: string\n prefLabel: string\n altLabels: string[]\n definition: string | null\n createdAt: string\n updatedAt: string\n}\n\nexport interface BackendProvenanceEdge {\n id: string\n entityType: string\n entityId: string\n activity: string\n agent: string\n startedAt: string\n endedAt: string | null\n attributes: Record<string, unknown> | null\n}\n\n/** One search hit — note plus optional rank/snippet when the backend ranks. */\nexport interface BackendSearchHit {\n note: BackendNote\n rank?: number\n snippet?: string\n}\n\n/** Search response with optional facet counts. */\nexport interface BackendSearchResult {\n hits: BackendSearchHit[]\n total: number\n facets?: {\n tags: Record<string, number>\n source?: Record<string, number>\n }\n}\n\nexport interface BackendListOptions {\n offset?: number\n limit?: number\n}\n\nexport interface BackendSearchQueryOptions extends BackendListOptions {\n /** AND-filter: note must carry every listed tag. */\n tags?: string[]\n /** OR-filter on note source. */\n source?: string[]\n}\n\ninterface RemoteNoteRecord {\n id: string\n title: string | null\n tags?: string[]\n createdAt?: string\n created_at?: string\n updatedAt?: string\n updated_at?: string\n source?: string\n starred?: boolean\n is_starred?: boolean\n archived?: boolean\n is_archived?: boolean\n content?: string\n current?: { content?: string }\n}\n\n// ── The uniform operation interface ───────────────────────────────────────\n\n/**\n * Uniform tool-intent operation interface. Every backend implements the read\n * core; `getNoteFull`, `semantic`, and `manageNote` are optional and present\n * only on backends whose capabilities advertise them.\n */\nexport interface DataBackend {\n readonly id: string\n readonly capabilities: BackendCapabilities\n\n listNotes(options?: BackendListOptions): Promise<{ items: BackendNote[]; total: number }>\n getNote(id: string): Promise<BackendNote | null>\n search(query: string, options?: BackendSearchQueryOptions): Promise<BackendSearchResult>\n\n /** Lazy full content (present when capabilities.read). */\n getNoteFull?(id: string): Promise<BackendNoteFull | null>\n /** Note links (present when capabilities.read). */\n linksOf?(id: string): Promise<BackendLink[]>\n /** SKOS concepts assigned to a note (present when capabilities.read). */\n conceptsOf?(id: string): Promise<BackendConcept[]>\n /** W3C PROV edges for a note (present when capabilities.read). */\n provenanceOf?(id: string): Promise<BackendProvenanceEdge[]>\n /** Vector search (present when capabilities.semantic !== 'none'). */\n semantic?(query: string, k?: number): Promise<BackendSearchHit[]>\n /** Write op (present when capabilities.write). */\n manageNote?(input: unknown): Promise<unknown>\n}\n\n// ── Capability negotiation ────────────────────────────────────────────────\n\n/** What a caller needs. Booleans require `true`; `semantic` is a minimum tier. */\nexport interface BackendRequest {\n read?: boolean\n write?: boolean\n merge?: boolean\n multiUser?: boolean\n /** Minimum acceptable semantic tier (a higher tier satisfies a lower request). */\n semantic?: BackendSemanticTier\n}\n\nexport interface BackendCandidate {\n backend: DataBackend\n /** Requested capabilities this backend cannot satisfy ([] = fully satisfies). */\n missing: string[]\n}\n\nexport interface BackendSelection {\n /** Chosen backend — fully-satisfying-and-lightest, else fewest-missing. Null only when no backends are available. */\n backend: DataBackend | null\n capabilities: BackendCapabilities | null\n /** Requested capabilities the chosen backend cannot satisfy. */\n missing: string[]\n /** Every candidate with its own missing set, ordered as evaluated. */\n candidates: BackendCandidate[]\n}\n\nconst SEMANTIC_RANK: Record<BackendSemanticTier, number> = {\n none: 0,\n 'cosine-small': 1,\n 'ann-full': 2,\n server: 3,\n}\n\nconst STARTUP_RANK: Record<BackendStartupCost, number> = {\n instant: 0,\n 'index-build': 1,\n network: 2,\n}\n\nfunction missingFor(request: BackendRequest, caps: BackendCapabilities): string[] {\n const missing: string[] = []\n if (request.read && !caps.read) missing.push('read')\n if (request.write && !caps.write) missing.push('write')\n if (request.merge && !caps.merge) missing.push('merge')\n if (request.multiUser && !caps.multiUser) missing.push('multiUser')\n if (request.semantic && SEMANTIC_RANK[caps.semantic] < SEMANTIC_RANK[request.semantic]) {\n missing.push(`semantic:${request.semantic}`)\n }\n return missing\n}\n\n/**\n * Pick the backend that best satisfies `request` from `available`. Prefers a\n * fully-satisfying backend with the lightest startup cost; if none fully\n * satisfy, returns the one missing the fewest capabilities (lightest on ties) so\n * the caller can degrade with eyes open via `selection.missing`.\n */\nexport function selectBackend(request: BackendRequest, available: DataBackend[]): BackendSelection {\n const candidates: BackendCandidate[] = available.map((backend) => ({\n backend,\n missing: missingFor(request, backend.capabilities),\n }))\n\n if (candidates.length === 0) {\n return { backend: null, capabilities: null, missing: [], candidates }\n }\n\n const lighter = (a: DataBackend, b: DataBackend): number =>\n STARTUP_RANK[a.capabilities.startupCost] - STARTUP_RANK[b.capabilities.startupCost]\n\n const fullySatisfying = candidates.filter((c) => c.missing.length === 0)\n const pool = fullySatisfying.length > 0 ? fullySatisfying : candidates\n\n const chosen = [...pool].sort((a, b) => {\n // Fewest missing first, then lightest startup, preserving input order on ties.\n if (a.missing.length !== b.missing.length) return a.missing.length - b.missing.length\n return lighter(a.backend, b.backend)\n })[0]\n\n return {\n backend: chosen.backend,\n capabilities: chosen.backend.capabilities,\n missing: chosen.missing,\n candidates,\n }\n}\n\n// ── PGlite adapter (#187 — wraps the repositories/tools) ──────────────────\n\nfunction toIso(d: Date | string): string {\n return d instanceof Date ? d.toISOString() : String(d)\n}\n\nfunction summaryToBackend(s: NoteSummary): BackendNote {\n return {\n id: s.id,\n title: s.title,\n tags: s.tags,\n createdAt: toIso(s.created_at),\n updatedAt: toIso(s.updated_at),\n source: s.source,\n starred: s.is_starred,\n archived: s.is_archived,\n }\n}\n\nfunction searchResultToBackend(r: SearchResult): BackendNote {\n // PGlite full-text rows are lean — no source/starred/archived.\n return {\n id: r.id,\n title: r.title,\n tags: r.tags,\n createdAt: toIso(r.created_at),\n updatedAt: toIso(r.updated_at),\n }\n}\n\nfunction remoteNoteToBackend(n: RemoteNoteRecord): BackendNote {\n return {\n id: n.id,\n title: n.title,\n tags: n.tags ?? [],\n createdAt: n.createdAt ?? n.created_at ?? '',\n updatedAt: n.updatedAt ?? n.updated_at ?? '',\n source: n.source,\n starred: n.starred ?? n.is_starred,\n archived: n.archived ?? n.is_archived,\n }\n}\n\nfunction remoteFullToBackend(n: RemoteNoteRecord): BackendNoteFull {\n return {\n ...remoteNoteToBackend(n),\n content: n.content ?? n.current?.content ?? '',\n }\n}\n\nfunction linkToBackend(link: LinkRow): BackendLink {\n return {\n id: link.id,\n fromNoteId: link.source_note_id,\n toNoteId: link.target_note_id,\n kind: link.link_type,\n score: link.confidence,\n createdAt: toIso(link.created_at),\n }\n}\n\nfunction shardLinkToBackend(link: ShardLink): BackendLink {\n return {\n id: link.id,\n fromNoteId: link.from_note_id,\n toNoteId: link.to_note_id,\n kind: link.kind,\n score: link.score,\n createdAt: link.created_at,\n ...(link.metadata ? { metadata: link.metadata } : {}),\n }\n}\n\nfunction conceptToBackend(concept: {\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[] | string\n definition: string | null\n created_at: Date | string\n updated_at: Date | string\n}): BackendConcept {\n const altLabels = typeof concept.alt_labels === 'string'\n ? JSON.parse(concept.alt_labels) as string[]\n : concept.alt_labels\n return {\n id: concept.id,\n schemeId: concept.scheme_id,\n prefLabel: concept.pref_label,\n altLabels,\n definition: concept.definition,\n createdAt: toIso(concept.created_at),\n updatedAt: toIso(concept.updated_at),\n }\n}\n\nfunction shardConceptToBackend(concept: ShardSkosConcept): BackendConcept {\n return conceptToBackend(concept)\n}\n\nfunction parseAttributes(attributes: Record<string, unknown> | string | null): Record<string, unknown> | null {\n if (attributes === null) return null\n if (typeof attributes === 'string') return JSON.parse(attributes) as Record<string, unknown>\n return attributes\n}\n\nfunction provenanceToBackend(edge: {\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: Date | string\n ended_at: Date | string | null\n attributes: Record<string, unknown> | string | null\n}): BackendProvenanceEdge {\n return {\n id: edge.id,\n entityType: edge.entity_type,\n entityId: edge.entity_id,\n activity: edge.activity,\n agent: edge.agent,\n startedAt: toIso(edge.started_at),\n endedAt: edge.ended_at ? toIso(edge.ended_at) : null,\n attributes: parseAttributes(edge.attributes),\n }\n}\n\nfunction shardProvenanceToBackend(edge: ShardProvenanceEdge): BackendProvenanceEdge {\n return provenanceToBackend(edge)\n}\n\nfunction remoteLinkToBackend(link: Partial<BackendLink> & {\n id: string\n from_note_id?: string\n source_note_id?: string\n to_note_id?: string\n target_note_id?: string\n kind?: string\n link_type?: string\n score?: number | null\n confidence?: number | null\n created_at?: string\n}): BackendLink {\n return {\n id: link.id,\n fromNoteId: link.fromNoteId ?? link.from_note_id ?? link.source_note_id ?? '',\n toNoteId: link.toNoteId ?? link.to_note_id ?? link.target_note_id ?? '',\n kind: link.kind ?? link.link_type ?? '',\n score: link.score ?? link.confidence ?? null,\n createdAt: link.createdAt ?? link.created_at ?? '',\n ...(link.metadata ? { metadata: link.metadata } : {}),\n }\n}\n\nfunction remoteConceptToBackend(concept: BackendConcept | Parameters<typeof conceptToBackend>[0]): BackendConcept {\n if ('schemeId' in concept) return concept\n return conceptToBackend(concept)\n}\n\nfunction remoteProvenanceToBackend(\n edge: BackendProvenanceEdge | Parameters<typeof provenanceToBackend>[0],\n): BackendProvenanceEdge {\n if ('entityType' in edge) return edge\n return provenanceToBackend(edge)\n}\n\nexport interface PGliteBackendOptions {\n id?: string\n /** Whether embeddings exist so search can use the semantic path. */\n semanticAvailable?: boolean\n}\n\n/**\n * Wrap a PGlite-backed `DatabaseClient` as a `DataBackend`. Read ops delegate to\n * the repositories; writes go through the `manageNote` tool. Advertises full\n * read+write+merge with `ann-full` semantic when embeddings are present.\n */\nexport function createPGliteBackend(db: DatabaseClient, options: PGliteBackendOptions = {}): DataBackend {\n const semanticAvailable = options.semanticAvailable ?? false\n const notes = new NotesRepository(db)\n const search = new SearchRepository(db, semanticAvailable)\n const links = new LinksRepository(db)\n\n async function linksOf(id: string): Promise<BackendLink[]> {\n const result = await links.listForNote(id)\n return [...result.outbound, ...result.inbound].map(linkToBackend)\n }\n\n async function conceptsOf(id: string): Promise<BackendConcept[]> {\n const result = await db.query<{\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[] | string\n definition: string | null\n created_at: Date | string\n updated_at: Date | string\n }>(\n `SELECT c.*\n FROM skos_concept c\n INNER JOIN note_skos_tag nst ON nst.concept_id = c.id\n WHERE nst.note_id = $1 AND c.deleted_at IS NULL\n ORDER BY c.pref_label`,\n [id],\n )\n return result.rows.map(conceptToBackend)\n }\n\n async function provenanceOf(id: string): Promise<BackendProvenanceEdge[]> {\n const result = await db.query<{\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: Date | string\n ended_at: Date | string | null\n attributes: Record<string, unknown> | string | null\n }>(\n `SELECT *\n FROM provenance_edge\n WHERE entity_type = 'note' AND entity_id = $1\n ORDER BY started_at`,\n [id],\n )\n return result.rows.map(provenanceToBackend)\n }\n\n return {\n id: options.id ?? 'pglite',\n capabilities: {\n read: true,\n write: true,\n merge: true,\n multiUser: false,\n semantic: semanticAvailable ? 'ann-full' : 'none',\n startupCost: 'index-build',\n },\n\n async listNotes(o) {\n const r = await notes.list({ offset: o?.offset, limit: o?.limit })\n return { items: r.items.map(summaryToBackend), total: r.total }\n },\n\n async getNote(id) {\n try {\n const f: NoteFull = await notes.get(id)\n return summaryToBackend(f)\n } catch {\n return null\n }\n },\n\n async search(query, o) {\n const r = await search.search(query, {\n limit: o?.limit,\n offset: o?.offset,\n tags: o?.tags,\n source: o?.source?.[0],\n include_facets: true,\n })\n const hits: BackendSearchHit[] = r.results.map((res) => ({\n note: searchResultToBackend(res),\n rank: res.rank,\n snippet: res.snippet,\n }))\n const facets = r.facets\n ? {\n tags: Object.fromEntries(r.facets.tags.map((t) => [t.tag, t.count])),\n }\n : undefined\n return { hits, total: r.total, facets }\n },\n\n async getNoteFull(id) {\n try {\n const f: NoteFull = await notes.get(id)\n const [noteLinks, concepts, provenance] = await Promise.all([\n linksOf(id),\n conceptsOf(id),\n provenanceOf(id),\n ])\n return { ...summaryToBackend(f), content: f.current.content, links: noteLinks, concepts, provenance }\n } catch {\n return null\n }\n },\n\n linksOf,\n conceptsOf,\n provenanceOf,\n\n async manageNote(input) {\n return manageNote(db, input)\n },\n }\n}\n\n// ── Remote server adapter (#197 — HTTP proxy to the full Fortemi server) ─────\n\nexport interface RemoteBackendPaths {\n notes: string\n note: string\n search: string\n links: string\n concepts: string\n provenance: string\n manageNote: string\n semantic: string\n}\n\nexport interface RemoteBackendConfig {\n baseUrl: string\n id?: string\n fetchImpl?: typeof fetch\n headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>)\n authToken?: string\n paths?: Partial<RemoteBackendPaths>\n}\n\nconst DEFAULT_REMOTE_PATHS: RemoteBackendPaths = {\n notes: '/api/v1/notes',\n note: '/api/v1/notes/:id',\n search: '/api/v1/search',\n links: '/api/v1/notes/:id/links',\n concepts: '/api/v1/notes/:id/concepts',\n provenance: '/api/v1/notes/:id/provenance',\n manageNote: '/api/v1/tools/manage-note',\n semantic: '/api/v1/semantic/search',\n}\n\nfunction remotePath(template: string, id?: string): string {\n return id ? template.replace(':id', encodeURIComponent(id)) : template\n}\n\nfunction remoteUrl(baseUrl: string, path: string, params?: Record<string, unknown>): string {\n const url = new URL(path, baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`)\n for (const [key, value] of Object.entries(params ?? {})) {\n if (value === undefined) continue\n if (Array.isArray(value)) {\n for (const item of value) url.searchParams.append(key, String(item))\n } else {\n url.searchParams.set(key, String(value))\n }\n }\n return url.toString()\n}\n\nasync function remoteHeaders(config: RemoteBackendConfig, json = false): Promise<HeadersInit> {\n const configured = typeof config.headers === 'function' ? await config.headers() : config.headers\n const headers = new Headers(configured)\n if (config.authToken) headers.set('Authorization', `Bearer ${config.authToken}`)\n if (json) headers.set('Content-Type', 'application/json')\n return headers\n}\n\nasync function remoteJson<T>(config: RemoteBackendConfig, path: string, init: RequestInit = {}): Promise<T> {\n const fetchImpl = config.fetchImpl ?? globalThis.fetch\n const response = await fetchImpl(remoteUrl(config.baseUrl, path), init)\n if (!response.ok) {\n throw new Error(`Remote backend request failed (${response.status}): ${path}`)\n }\n return response.json() as Promise<T>\n}\n\nexport function createRemoteBackend(config: RemoteBackendConfig): DataBackend {\n const paths = { ...DEFAULT_REMOTE_PATHS, ...config.paths }\n\n async function getJson<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n return remoteJson<T>(config, remoteUrl(config.baseUrl, path, params), {\n method: 'GET',\n headers: await remoteHeaders(config),\n })\n }\n\n async function postJson<T>(path: string, body: unknown): Promise<T> {\n return remoteJson<T>(config, path, {\n method: 'POST',\n headers: await remoteHeaders(config, true),\n body: JSON.stringify(body),\n })\n }\n\n async function getNoteFull(id: string): Promise<BackendNoteFull | null> {\n try {\n const note = await getJson<RemoteNoteRecord>(remotePath(paths.note, id), { full: true })\n const [links, concepts, provenance] = await Promise.all([\n linksOf(id),\n conceptsOf(id),\n provenanceOf(id),\n ])\n return { ...remoteFullToBackend(note), links, concepts, provenance }\n } catch {\n return null\n }\n }\n\n async function linksOf(id: string): Promise<BackendLink[]> {\n const links = await getJson<Array<Parameters<typeof remoteLinkToBackend>[0]>>(remotePath(paths.links, id))\n return links.map(remoteLinkToBackend)\n }\n\n async function conceptsOf(id: string): Promise<BackendConcept[]> {\n const concepts = await getJson<Array<BackendConcept | Parameters<typeof conceptToBackend>[0]>>(\n remotePath(paths.concepts, id),\n )\n return concepts.map(remoteConceptToBackend)\n }\n\n async function provenanceOf(id: string): Promise<BackendProvenanceEdge[]> {\n const edges = await getJson<Array<BackendProvenanceEdge | Parameters<typeof provenanceToBackend>[0]>>(\n remotePath(paths.provenance, id),\n )\n return edges.map(remoteProvenanceToBackend)\n }\n\n return {\n id: config.id ?? 'remote-server',\n capabilities: {\n read: true,\n write: true,\n merge: true,\n multiUser: true,\n semantic: 'server',\n startupCost: 'network',\n },\n\n async listNotes(o) {\n const result = await getJson<{ items: RemoteNoteRecord[]; total: number }>(paths.notes, o ? { ...o } : undefined)\n return { items: result.items.map(remoteNoteToBackend), total: result.total }\n },\n\n async getNote(id) {\n try {\n return remoteNoteToBackend(await getJson<RemoteNoteRecord>(remotePath(paths.note, id)))\n } catch {\n return null\n }\n },\n\n async search(query, o) {\n const result = await getJson<{\n results?: Array<{ note?: RemoteNoteRecord; rank?: number; snippet?: string } & RemoteNoteRecord>\n hits?: BackendSearchHit[]\n total: number\n facets?: BackendSearchResult['facets']\n }>(paths.search, { query, ...o })\n if (result.hits) return { hits: result.hits, total: result.total, facets: result.facets }\n return {\n hits: (result.results ?? []).map((hit) => ({\n note: remoteNoteToBackend(hit.note ?? hit),\n rank: hit.rank,\n snippet: hit.snippet,\n })),\n total: result.total,\n facets: result.facets,\n }\n },\n\n getNoteFull,\n linksOf,\n conceptsOf,\n provenanceOf,\n\n async semantic(query, k) {\n const result = await getJson<{ hits: BackendSearchHit[] }>(paths.semantic, { query, k })\n return result.hits\n },\n\n async manageNote(input) {\n return postJson<unknown>(paths.manageNote, input)\n },\n }\n}\n\n// ── Static-file adapter (#189 — wraps the shard reader) ───────────────────\n\nfunction shardNoteToBackend(n: ShardReaderNote): BackendNote {\n return {\n id: n.id,\n title: n.title,\n tags: n.tags,\n createdAt: toIso(n.created_at),\n updatedAt: toIso(n.updated_at),\n source: n.source,\n starred: n.is_starred,\n archived: n.is_archived,\n }\n}\n\nexport interface ShardBackendOptions {\n id?: string\n /** Declared semantic tier this shard provides (default `none`). Set to `cosine-small` when the reader has a vector provider. */\n semantic?: BackendSemanticTier\n}\n\n/**\n * Wrap a `ShardReader` (#189) as a read-only `DataBackend`. Startup is instant\n * (no index build) and the semantic tier is whatever the reader's provider\n * offers — `none` for text/facets-only shards, `cosine-small` when a vector\n * provider is attached.\n */\nexport function createShardBackend(reader: ShardReader, options: ShardBackendOptions = {}): DataBackend {\n const semantic = options.semantic ?? 'none'\n\n return {\n id: options.id ?? 'static-file',\n capabilities: {\n read: true,\n write: false,\n merge: false,\n multiUser: false,\n semantic,\n startupCost: 'instant',\n },\n\n async listNotes(o) {\n const r = await reader.listNotes(o)\n return { items: r.items.map(shardNoteToBackend), total: r.total }\n },\n\n async getNote(id) {\n const n = await reader.getNote(id)\n return n ? shardNoteToBackend(n) : null\n },\n\n async search(query, o) {\n // Request ranking + snippets so hits carry rank/snippet uniformly with the\n // PGlite backend (whose ts_rank always ranks).\n const r = await reader.search(query, { ...o, rank: true, snippets: true })\n const hits: BackendSearchHit[] = r.rankedItems\n ? r.rankedItems.map((it) => ({\n note: shardNoteToBackend(it.note),\n rank: it.rank,\n snippet: it.snippet,\n }))\n : r.items.map((note) => ({ note: shardNoteToBackend(note) }))\n return { hits, total: r.total, facets: r.facets }\n },\n\n async getNoteFull(id) {\n const f = await reader.getNoteFull(id)\n if (!f) return null\n return {\n ...shardNoteToBackend(f.note),\n content: f.note.revised_content ?? f.note.original_content,\n links: f.links.map(shardLinkToBackend),\n concepts: f.concepts.map(shardConceptToBackend),\n provenance: f.provenance.map(shardProvenanceToBackend),\n }\n },\n\n async linksOf(id) {\n return (await reader.linksOf(id)).map(shardLinkToBackend)\n },\n\n async conceptsOf(id) {\n return (await reader.conceptsOf(id)).map(shardConceptToBackend)\n },\n\n async provenanceOf(id) {\n return (await reader.provenanceOf(id)).map(shardProvenanceToBackend)\n },\n\n async semantic(query, k) {\n const r = await reader.semantic(query, k)\n return r.map(({ note, score }) => ({ note: shardNoteToBackend(note), rank: score }))\n },\n }\n}\n","/**\n * Type-safe client for the PGlite Worker.\n *\n * PGliteWorkerClient wraps a Worker instance and exposes the same surface as\n * PGlite (query / exec / transaction) but serialises every call to a typed\n * postMessage exchange. Each outgoing request is tagged with a UUIDv7 `id`;\n * the worker echoes that id in its reply so the client can resolve or reject\n * the matching Promise.\n *\n * TransactionProxy is a lightweight wrapper handed to the callback in\n * transaction(), forwarding TX_QUERY / TX_EXEC messages with the active txId.\n */\n\nimport { generateId } from '../uuid.js'\nimport type { WorkerResponse } from './protocol.js'\n\nexport class PGliteWorkerClient {\n private pending = new Map<string, { resolve: (v: WorkerResponse) => void; reject: (e: Error) => void }>()\n private readyPromise: Promise<void>\n private resolveReady!: () => void\n\n constructor(private worker: Worker) {\n this.readyPromise = new Promise<void>((resolve) => {\n this.resolveReady = resolve\n })\n\n this.worker.addEventListener('message', (e: MessageEvent<WorkerResponse>) => {\n const msg = e.data\n\n if (msg.type === 'READY') {\n this.resolveReady()\n return\n }\n\n if (!('id' in msg)) return\n\n const pending = this.pending.get(msg.id)\n if (!pending) return\n this.pending.delete(msg.id)\n\n if (msg.type === 'ERROR') {\n pending.reject(new Error(msg.error))\n } else {\n pending.resolve(msg)\n }\n })\n }\n\n /** Resolves when the worker broadcasts READY after database initialisation. */\n async waitReady(): Promise<void> {\n return this.readyPromise\n }\n\n private send<T extends WorkerResponse>(request: { type: string } & Record<string, unknown>): Promise<T> {\n const id = generateId()\n return new Promise<T>((resolve, reject) => {\n this.pending.set(id, {\n resolve: resolve as (v: WorkerResponse) => void,\n reject,\n })\n this.worker.postMessage({ ...request, id })\n })\n }\n\n async query<T = Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n ): Promise<{ rows: T[]; fields?: Array<{ name: string; dataTypeID: number }> }> {\n const resp = await this.send<Extract<WorkerResponse, { type: 'RESULT' }>>({ type: 'QUERY', sql, params })\n return { rows: resp.rows as T[], fields: resp.fields }\n }\n\n async exec(sql: string): Promise<void> {\n await this.send({ type: 'EXEC', sql })\n }\n\n async transaction<T>(fn: (tx: TransactionProxy) => Promise<T>): Promise<T> {\n const resp = await this.send<Extract<WorkerResponse, { type: 'TX_STARTED' }>>({ type: 'BEGIN' })\n const txId = resp.txId\n const proxy = new TransactionProxy(this, txId)\n try {\n const result = await fn(proxy)\n await this.send({ type: 'COMMIT', txId })\n return result\n } catch (err) {\n // Best-effort rollback — ignore secondary errors so the original throws.\n await this.send({ type: 'ROLLBACK', txId }).catch(() => {})\n throw err\n }\n }\n\n /** Forward TX_QUERY for TransactionProxy — not part of the public surface. */\n async _txQuery<T>(txId: string, sql: string, params?: unknown[]): Promise<{ rows: T[] }> {\n const resp = await this.send<Extract<WorkerResponse, { type: 'RESULT' }>>({\n type: 'TX_QUERY',\n txId,\n sql,\n params,\n })\n return { rows: resp.rows as T[] }\n }\n\n /** Forward TX_EXEC for TransactionProxy — not part of the public surface. */\n async _txExec(txId: string, sql: string): Promise<void> {\n await this.send({ type: 'TX_EXEC', txId, sql })\n }\n\n async ping(): Promise<void> {\n await this.send({ type: 'PING' })\n }\n\n async close(): Promise<void> {\n await this.send({ type: 'CLOSE' })\n this.worker.terminate()\n }\n}\n\n/** Proxy passed to the transaction callback — scopes queries to the active txId. */\nexport class TransactionProxy {\n constructor(\n private client: PGliteWorkerClient,\n private txId: string,\n ) {}\n\n async query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{ rows: T[] }> {\n return this.client._txQuery<T>(this.txId, sql, params)\n }\n\n async exec(sql: string): Promise<void> {\n return this.client._txExec(this.txId, sql)\n }\n}\n","import type { PGlite } from '@electric-sql/pglite'\nimport { createPGliteInstance, type PersistenceMode } from './db.js'\nimport { PGliteWorkerClient } from './worker/worker-client.js'\n\nexport interface QueryResult<T = Record<string, unknown>> {\n rows: T[]\n fields?: Array<{ name: string; dataTypeID: number }>\n}\n\nexport interface QueryExecutor {\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>\n exec(sql: string): Promise<unknown>\n}\n\nexport interface DatabaseClient extends QueryExecutor {\n transaction<T>(fn: (tx: QueryExecutor) => Promise<T>): Promise<T>\n}\n\nexport interface StorageBackend extends DatabaseClient {\n readonly id: string\n readonly mode: 'readwrite' | 'readonly'\n close(): Promise<void>\n}\n\nexport interface StorageOpenRequest {\n archiveName: string\n persistence: PersistenceMode\n}\n\nexport interface StorageBackendFactory {\n open(input: StorageOpenRequest): Promise<StorageBackend>\n}\n\nexport interface StorageTopology {\n primary: StorageBackend\n secondary?: StorageBackend\n policy: 'primary-only' | 'read-through-secondary' | 'explicit-replication'\n}\n\nexport class PGliteStorageBackend implements StorageBackend {\n readonly mode = 'readwrite'\n\n constructor(\n readonly id: string,\n private db: PGlite,\n ) {}\n\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>> {\n return this.db.query<T>(sql, params)\n }\n\n exec(sql: string): Promise<unknown> {\n return this.db.exec(sql)\n }\n\n async transaction<T>(fn: (tx: QueryExecutor) => Promise<T>): Promise<T> {\n return this.db.transaction((tx) => fn(tx))\n }\n\n close(): Promise<void> {\n return this.db.close()\n }\n}\n\nexport class PGliteStorageBackendFactory implements StorageBackendFactory {\n async open(input: StorageOpenRequest): Promise<StorageBackend> {\n const db = await createPGliteInstance(input.persistence, input.archiveName)\n return new PGliteStorageBackend(`pglite:${input.persistence}:${input.archiveName}`, db)\n }\n}\n\nexport const defaultStorageBackendFactory = new PGliteStorageBackendFactory()\n\nexport class PGliteWorkerStorageBackend implements StorageBackend {\n readonly mode = 'readwrite'\n\n constructor(\n readonly id: string,\n private client: PGliteWorkerClient,\n ) {}\n\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>> {\n return this.client.query<T>(sql, params)\n }\n\n exec(sql: string): Promise<unknown> {\n return this.client.exec(sql)\n }\n\n transaction<T>(fn: (tx: QueryExecutor) => Promise<T>): Promise<T> {\n return this.client.transaction(fn)\n }\n\n close(): Promise<void> {\n return this.client.close()\n }\n}\n\nexport interface PGliteWorkerStorageBackendFactoryOptions {\n createWorker: () => Worker\n}\n\nexport class PGliteWorkerStorageBackendFactory implements StorageBackendFactory {\n constructor(private options: PGliteWorkerStorageBackendFactoryOptions) {}\n\n async open(input: StorageOpenRequest): Promise<StorageBackend> {\n const worker = this.options.createWorker()\n const client = new PGliteWorkerClient(worker)\n worker.postMessage({\n type: 'INIT',\n persistence: input.persistence,\n archiveName: input.archiveName,\n })\n await client.waitReady()\n return new PGliteWorkerStorageBackend(`pglite-worker:${input.persistence}:${input.archiveName}`, client)\n }\n}\n","/**\n * Capability module system (ADR-002).\n * Tracks opt-in WASM module states. No WASM loaded by default (CAP-001).\n *\n * State machine (valid transitions):\n * unloaded -> loading (via enable)\n * loading -> ready (via markReady or successful loader)\n * loading -> error (via markError or failed loader)\n * ready -> disabled (via disable)\n * disabled -> loading (via enable, re-enable)\n * error -> loading (via enable, retry)\n */\n\nimport type { TypedEventBus } from './event-bus.js'\n\nexport type CapabilityState = 'unloaded' | 'loading' | 'ready' | 'error' | 'disabled'\n\nexport type CapabilityName = 'semantic' | 'llm' | 'audio' | 'vision' | 'pdf'\n\ninterface CapabilityEntry {\n name: CapabilityName\n state: CapabilityState\n error?: string\n}\n\n/** Valid source states that allow the given transition. */\nconst VALID_TRANSITIONS: Record<string, CapabilityState[]> = {\n enable: ['unloaded', 'disabled', 'error'],\n disable: ['ready'],\n markReady: ['loading'],\n markError: ['loading'],\n}\n\nfunction assertTransition(\n method: string,\n name: CapabilityName,\n current: CapabilityState,\n): void {\n const allowed = VALID_TRANSITIONS[method]\n if (!allowed.includes(current)) {\n throw new Error(\n `CapabilityManager.${method}('${name}'): invalid transition from state '${current}'. ` +\n `Allowed source states: ${allowed.join(', ')}.`,\n )\n }\n}\n\nexport class CapabilityManager {\n private capabilities = new Map<CapabilityName, CapabilityEntry>()\n private loaders = new Map<CapabilityName, () => Promise<void>>()\n private progressMessages = new Map<CapabilityName, string>()\n\n constructor(private events: TypedEventBus) {\n const names: CapabilityName[] = ['semantic', 'llm', 'audio', 'vision', 'pdf']\n for (const name of names) {\n this.capabilities.set(name, { name, state: 'unloaded' })\n }\n }\n\n /**\n * Register an async loader for a capability.\n * Called by enable(); if no loader is registered the capability transitions\n * directly to ready (useful for capabilities that require no async init).\n */\n registerLoader(name: CapabilityName, loader: () => Promise<void>): void {\n this.loaders.set(name, loader)\n }\n\n getState(name: CapabilityName): CapabilityState {\n return this.capabilities.get(name)?.state ?? 'unloaded'\n }\n\n isReady(name: CapabilityName): boolean {\n return this.getState(name) === 'ready'\n }\n\n /**\n * Enable a capability.\n * Valid from: unloaded, disabled, error (retry).\n * Runs the registered loader if present; transitions to ready on success,\n * error on failure.\n */\n async enable(name: CapabilityName): Promise<void> {\n const entry = this.capabilities.get(name)\n if (!entry) return\n\n // Idempotent: already loading or ready -- do nothing.\n if (entry.state === 'ready' || entry.state === 'loading') return\n\n assertTransition('enable', name, entry.state)\n\n entry.state = 'loading'\n entry.error = undefined\n this.events.emit('capability.loading', { name })\n\n const loader = this.loaders.get(name)\n if (!loader) {\n // No loader registered -- transition directly to ready.\n entry.state = 'ready'\n this.events.emit('capability.ready', { name })\n return\n }\n\n try {\n await loader()\n // Only transition if still in loading -- external markReady/markError\n // (e.g. bridge protocol) may have already advanced state.\n if (entry.state === 'loading') {\n entry.state = 'ready'\n this.events.emit('capability.ready', { name })\n }\n } catch (err) {\n if (entry.state === 'loading') {\n const message = err instanceof Error ? err.message : String(err)\n entry.state = 'error'\n entry.error = message\n }\n }\n }\n\n /**\n * Disable a ready capability.\n * Valid from: ready only.\n */\n disable(name: CapabilityName): void {\n const entry = this.capabilities.get(name)\n if (!entry) return\n\n assertTransition('disable', name, entry.state)\n\n entry.state = 'disabled'\n this.events.emit('capability.disabled', { name })\n }\n\n /**\n * Mark a loading capability as ready (external use, e.g. bridge protocol).\n * Valid from: loading only.\n */\n markReady(name: CapabilityName): void {\n const entry = this.capabilities.get(name)\n if (!entry) return\n\n assertTransition('markReady', name, entry.state)\n\n entry.state = 'ready'\n entry.error = undefined\n this.events.emit('capability.ready', { name })\n }\n\n /**\n * Mark a loading capability as errored (external use, e.g. bridge protocol).\n * Valid from: loading only.\n */\n markError(name: CapabilityName, error: string): void {\n const entry = this.capabilities.get(name)\n if (!entry) return\n\n assertTransition('markError', name, entry.state)\n\n entry.state = 'error'\n entry.error = error\n }\n\n /**\n * Report loading progress (0-100).\n * Emits capability.loading with progress if the capability is currently loading.\n * No-op if the capability is not in loading state.\n */\n reportProgress(name: CapabilityName, progress: number): void {\n const entry = this.capabilities.get(name)\n if (!entry || entry.state !== 'loading') return\n\n this.events.emit('capability.loading', { name, progress })\n }\n\n /** Set a human-readable progress message for a loading capability */\n setProgress(name: CapabilityName, message: string): void {\n this.progressMessages.set(name, message)\n this.events.emit('capability.loading', { name, progress: -1 })\n }\n\n /** Get the current progress message for a capability */\n getProgress(name: CapabilityName): string | undefined {\n return this.progressMessages.get(name)\n }\n\n getError(name: CapabilityName): string | undefined {\n return this.capabilities.get(name)?.error\n }\n\n listAll(): Array<{ name: CapabilityName; state: CapabilityState }> {\n return Array.from(this.capabilities.values()).map(({ name, state }) => ({\n name,\n state,\n }))\n }\n}\n","/**\n * Sequential SQL migration runner for DatabaseClient.\n * Tracks applied migrations in a schema_version table.\n * Each migration runs in a transaction; version updated atomically.\n */\n\nimport type { DatabaseClient } from './storage-backend.js'\nimport type { TypedEventBus } from './event-bus.js'\n\nexport interface Migration {\n version: number\n name: string\n sql: string\n}\n\nexport class MigrationRunner {\n constructor(\n private db: DatabaseClient,\n private events?: TypedEventBus,\n ) {}\n\n async ensureSchemaTable(): Promise<void> {\n await this.db.exec(`\n CREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER NOT NULL,\n name TEXT NOT NULL,\n applied_at TIMESTAMPTZ DEFAULT now(),\n PRIMARY KEY (version)\n )\n `)\n }\n\n async getCurrentVersion(): Promise<number> {\n const result = await this.db.query<{ version: number }>(\n 'SELECT COALESCE(MAX(version), 0) AS version FROM schema_version',\n )\n return result.rows[0].version\n }\n\n async apply(migrations: Migration[]): Promise<number> {\n await this.ensureSchemaTable()\n const currentVersion = await this.getCurrentVersion()\n\n const pending = migrations\n .filter((m) => m.version > currentVersion)\n .sort((a, b) => a.version - b.version)\n\n let applied = 0\n\n for (const migration of pending) {\n await this.db.transaction(async (tx) => {\n await tx.exec(migration.sql)\n await tx.query(\n 'INSERT INTO schema_version (version, name) VALUES ($1, $2)',\n [migration.version, migration.name],\n )\n })\n\n applied++\n this.events?.emit('migration.applied', { version: migration.version })\n }\n\n return applied\n }\n\n async getAppliedMigrations(): Promise<Array<{ version: number; name: string }>> {\n const result = await this.db.query<{ version: number; name: string }>(\n 'SELECT version, name FROM schema_version ORDER BY version',\n )\n return result.rows\n }\n}\n","/**\n * Multi-archive manager for Fortemi.\n * Each archive is a separate PGlite instance with its own persistence path.\n * Migrations are applied automatically on open.\n */\n\nimport type { PersistenceMode } from './db.js'\nimport { MigrationRunner } from './migration-runner.js'\nimport { allMigrations } from './migrations/index.js'\nimport type { TypedEventBus } from './event-bus.js'\nimport { defaultStorageBackendFactory, type StorageBackend, type StorageBackendFactory } from './storage-backend.js'\n\nexport interface ArchiveInfo {\n name: string\n createdAt: string // ISO 8601\n}\n\nexport class ArchiveManager {\n private currentArchive: string = 'default'\n private db: StorageBackend | null = null\n private archives = new Map<string, ArchiveInfo>()\n private persistence: PersistenceMode\n private backendFactory: StorageBackendFactory\n\n constructor(\n persistenceOrFactory: PersistenceMode | StorageBackendFactory,\n private events?: TypedEventBus,\n persistenceOverride?: PersistenceMode,\n ) {\n if (typeof persistenceOrFactory === 'string') {\n this.persistence = persistenceOrFactory\n this.backendFactory = defaultStorageBackendFactory\n } else {\n this.persistence = persistenceOverride ?? 'memory'\n this.backendFactory = persistenceOrFactory\n }\n\n // Default archive always exists\n this.archives.set('default', {\n name: 'default',\n createdAt: new Date().toISOString(),\n })\n }\n\n getCurrentArchiveName(): string {\n return this.currentArchive\n }\n\n getDb(): StorageBackend | null {\n return this.db\n }\n\n async open(archiveName: string = 'default'): Promise<StorageBackend> {\n if (this.db) {\n await this.db.close()\n }\n\n this.db = await this.backendFactory.open({\n archiveName,\n persistence: this.persistence,\n })\n\n // Run migrations\n const runner = new MigrationRunner(this.db, this.events)\n await runner.apply(allMigrations)\n\n this.currentArchive = archiveName\n\n if (!this.archives.has(archiveName)) {\n this.archives.set(archiveName, {\n name: archiveName,\n createdAt: new Date().toISOString(),\n })\n }\n\n this.events?.emit('archive.switched', { name: archiveName })\n\n return this.db\n }\n\n /**\n * Adopt an already-created backend WITHOUT running migrations — for a backend\n * whose schema is already present, e.g. a PGlite restored from a physical\n * data-dir snapshot (issue #187, `restoreDbSnapshot`). Running migrations here\n * would be wrong: the restored dir already carries them (and the HNSW index).\n */\n async adopt(backend: StorageBackend, archiveName: string = 'default'): Promise<StorageBackend> {\n if (this.db) {\n await this.db.close()\n }\n this.db = backend\n this.currentArchive = archiveName\n if (!this.archives.has(archiveName)) {\n this.archives.set(archiveName, {\n name: archiveName,\n createdAt: new Date().toISOString(),\n })\n }\n this.events?.emit('archive.switched', { name: archiveName })\n return this.db\n }\n\n async create(archiveName: string): Promise<StorageBackend> {\n if (this.archives.has(archiveName)) {\n throw new Error(`Archive '${archiveName}' already exists`)\n }\n return this.open(archiveName)\n }\n\n async switchTo(archiveName: string): Promise<StorageBackend> {\n return this.open(archiveName)\n }\n\n async delete(archiveName: string): Promise<void> {\n if (archiveName === 'default') {\n throw new Error('Cannot delete the default archive')\n }\n if (this.currentArchive === archiveName && this.db) {\n await this.db.close()\n this.db = null\n }\n this.archives.delete(archiveName)\n // Note: actual OPFS/IDB data cleanup would require browser APIs\n // For now, we just remove from our registry\n }\n\n listArchives(): ArchiveInfo[] {\n return Array.from(this.archives.values())\n }\n\n async close(): Promise<void> {\n if (this.db) {\n await this.db.close()\n this.db = null\n }\n }\n}\n","/**\n * Factory function for creating a FortemiCore instance.\n * All deployment modes use this entry point.\n */\n\nimport { TypedEventBus } from './event-bus.js'\n\nexport interface FortemiConfig {\n persistence: 'opfs' | 'idb' | 'memory'\n archiveName?: string\n}\n\nexport interface FortemiCore {\n events: TypedEventBus\n config: FortemiConfig\n destroy(): void\n}\n\nexport function createFortemi(config: FortemiConfig): FortemiCore {\n const events = new TypedEventBus()\n\n return {\n events,\n config,\n destroy() {\n events.removeAllListeners()\n },\n }\n}\n","export interface SWRegistrationResult {\n registered: boolean\n registration?: ServiceWorkerRegistration\n error?: string\n}\n\nexport async function registerServiceWorker(\n swUrl: string = '/sw.js',\n): Promise<SWRegistrationResult> {\n if (!('serviceWorker' in navigator)) {\n return { registered: false, error: 'Service Workers not supported' }\n }\n\n try {\n const registration = await navigator.serviceWorker.register(swUrl, {\n type: 'module',\n scope: '/',\n })\n\n // Wait for the SW to become active\n if (registration.installing) {\n await new Promise<void>((resolve) => {\n registration.installing!.addEventListener('statechange', function handler() {\n if (this.state === 'activated') {\n this.removeEventListener('statechange', handler)\n resolve()\n }\n })\n })\n }\n\n return { registered: true, registration }\n } catch (err) {\n return {\n registered: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n}\n","/**\n * REST route definitions for Service Worker.\n * These are pure functions that transform HTTP Request → tool input and tool output → Response.\n * The actual DB connection is injected at registration time.\n *\n * All routes currently return 503 Not Implemented — the DB wiring happens in a later issue.\n * The URL structure and request/response shapes are the valuable contract defined here.\n */\n\nexport interface RouteHandler {\n method: string\n pattern: RegExp\n handler: (request: Request, match: RegExpMatchArray, params: URLSearchParams) => Promise<Response>\n}\n\n/** Parse JSON body safely — returns null when the body is absent or malformed */\nasync function parseJsonBody(request: Request): Promise<unknown> {\n try {\n return await request.json()\n } catch {\n return null\n }\n}\n\n/** Create a JSON response */\nfunction jsonResponse(data: unknown, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json' },\n })\n}\n\n/** Create an error response */\nfunction errorResponse(message: string, status: number): Response {\n return jsonResponse({ error: message }, status)\n}\n\nconst DB_NOT_CONNECTED = 'Database not connected. REST API available in standalone mode only.'\n\n/**\n * Create route handlers.\n * db parameter will be injected when the SW gets access to PGlite.\n * For now, returns 503 Not Implemented for all routes.\n */\nexport function createRoutes(): RouteHandler[] {\n return [\n // GET /api/v1/notes — list notes\n {\n method: 'GET',\n pattern: /^\\/api\\/v1\\/notes\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // POST /api/v1/notes — create note\n {\n method: 'POST',\n pattern: /^\\/api\\/v1\\/notes\\/?$/,\n handler: async (request) => {\n const body = await parseJsonBody(request)\n if (body === null) return errorResponse('Invalid JSON body', 400)\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // POST /api/v1/notes/:id/restore — restore soft-deleted note (must come before /:id)\n {\n method: 'POST',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/restore\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // POST /api/v1/notes/:id/star — star or unstar a note\n {\n method: 'POST',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/star\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // POST /api/v1/notes/:id/archive — archive or unarchive a note\n {\n method: 'POST',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/archive\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // GET /api/v1/notes/:id — get a single note\n {\n method: 'GET',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // PUT /api/v1/notes/:id — update a note\n {\n method: 'PUT',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // DELETE /api/v1/notes/:id — soft-delete a note\n {\n method: 'DELETE',\n pattern: /^\\/api\\/v1\\/notes\\/([^/]+)\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n\n // GET /api/v1/search — full-text search\n {\n method: 'GET',\n pattern: /^\\/api\\/v1\\/search\\/?$/,\n handler: async () => {\n return errorResponse(DB_NOT_CONNECTED, 503)\n },\n },\n ]\n}\n\n/**\n * Match a request against the registered routes and return the first matching\n * handler, or null if no route matches.\n */\nexport function matchRoute(routes: RouteHandler[], request: Request, url: URL): RouteHandler | null {\n for (const route of routes) {\n if (request.method !== route.method) continue\n const match = url.pathname.match(route.pattern)\n if (match) return route\n }\n return null\n}\n","/**\n * Content-addressable blob storage.\n *\n * Path format: blobs/{dir1}/{dir2}/{hash}\n * dir1 = first 2 hex chars of hash\n * dir2 = next 2 hex chars of hash\n * filename = full hash\n *\n * Two implementations are provided:\n * - OpfsBlobStore — Origin Private File System (Chrome/Edge 86+)\n * - IdbBlobStore — IndexedDB fallback (Firefox, Safari)\n *\n * Use createBlobStore() to get the best available implementation.\n * Export MemoryBlobStore for use in tests.\n */\n\n// ---------------------------------------------------------------------------\n// Interface\n// ---------------------------------------------------------------------------\n\nexport interface BlobStore {\n write(hash: string, data: Uint8Array): Promise<void>\n read(hash: string): Promise<Uint8Array | null>\n remove(hash: string): Promise<void>\n exists(hash: string): Promise<boolean>\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction hashPath(hash: string): { dir1: string; dir2: string; filename: string } {\n return {\n dir1: hash.slice(0, 2),\n dir2: hash.slice(2, 4),\n filename: hash,\n }\n}\n\n// ---------------------------------------------------------------------------\n// OPFS implementation\n// ---------------------------------------------------------------------------\n\nclass OpfsBlobStore implements BlobStore {\n constructor(private archiveName: string) {}\n\n private async getRoot(): Promise<FileSystemDirectoryHandle> {\n const root = await navigator.storage.getDirectory()\n return root.getDirectoryHandle(`fortemi-${this.archiveName}-blobs`, { create: true })\n }\n\n private async getFileHandle(\n hash: string,\n create: boolean,\n ): Promise<FileSystemFileHandle | null> {\n const { dir1, dir2, filename } = hashPath(hash)\n try {\n const root = await this.getRoot()\n const d1 = await root.getDirectoryHandle(dir1, { create })\n const d2 = await d1.getDirectoryHandle(dir2, { create })\n return d2.getFileHandle(filename, { create })\n } catch (err) {\n if (err instanceof DOMException && err.name === 'NotFoundError') {\n return null\n }\n throw err\n }\n }\n\n async write(hash: string, data: Uint8Array): Promise<void> {\n const fh = await this.getFileHandle(hash, true)\n if (!fh) throw new Error(`OpfsBlobStore: could not create file for hash ${hash}`)\n // createSyncAccessHandle is worker-only; use a writable stream instead.\n const writable = await fh.createWritable()\n // Slice to a plain ArrayBuffer so TS is happy with the stricter\n // FileSystemWritableFileStream.write() overload signature.\n await writable.write(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer)\n await writable.close()\n }\n\n async read(hash: string): Promise<Uint8Array | null> {\n const fh = await this.getFileHandle(hash, false)\n if (!fh) return null\n const file = await fh.getFile()\n const buffer = await file.arrayBuffer()\n return new Uint8Array(buffer)\n }\n\n async remove(hash: string): Promise<void> {\n const { dir1, dir2, filename } = hashPath(hash)\n try {\n const root = await this.getRoot()\n const d1 = await root.getDirectoryHandle(dir1, { create: false })\n const d2 = await d1.getDirectoryHandle(dir2, { create: false })\n await d2.removeEntry(filename)\n } catch (err) {\n if (err instanceof DOMException && err.name === 'NotFoundError') {\n return // already gone — idempotent\n }\n throw err\n }\n }\n\n async exists(hash: string): Promise<boolean> {\n const fh = await this.getFileHandle(hash, false)\n return fh !== null\n }\n}\n\n// ---------------------------------------------------------------------------\n// IDB implementation\n// ---------------------------------------------------------------------------\n\nconst IDB_STORE = 'blobs'\nconst IDB_VERSION = 1\n\nfunction openDb(dbName: string): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, IDB_VERSION)\n req.onupgradeneeded = () => {\n req.result.createObjectStore(IDB_STORE)\n }\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n })\n}\n\nclass IdbBlobStore implements BlobStore {\n private dbName: string\n private _db: IDBDatabase | null = null\n\n constructor(archiveName: string) {\n this.dbName = `fortemi-${archiveName}-blobs`\n }\n\n private async db(): Promise<IDBDatabase> {\n if (!this._db) {\n this._db = await openDb(this.dbName)\n }\n return this._db\n }\n\n async write(hash: string, data: Uint8Array): Promise<void> {\n const db = await this.db()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite')\n tx.objectStore(IDB_STORE).put(data, hash)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n }\n\n async read(hash: string): Promise<Uint8Array | null> {\n const db = await this.db()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readonly')\n const req = tx.objectStore(IDB_STORE).get(hash)\n req.onsuccess = () => resolve((req.result as Uint8Array | undefined) ?? null)\n req.onerror = () => reject(req.error)\n })\n }\n\n async remove(hash: string): Promise<void> {\n const db = await this.db()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite')\n tx.objectStore(IDB_STORE).delete(hash)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n }\n\n async exists(hash: string): Promise<boolean> {\n const db = await this.db()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readonly')\n const req = tx.objectStore(IDB_STORE).count(hash)\n req.onsuccess = () => resolve(req.result > 0)\n req.onerror = () => reject(req.error)\n })\n }\n}\n\n// ---------------------------------------------------------------------------\n// In-memory implementation (testing)\n// ---------------------------------------------------------------------------\n\nexport class MemoryBlobStore implements BlobStore {\n private store = new Map<string, Uint8Array>()\n\n async write(hash: string, data: Uint8Array): Promise<void> {\n this.store.set(hash, data)\n }\n\n async read(hash: string): Promise<Uint8Array | null> {\n return this.store.get(hash) ?? null\n }\n\n async remove(hash: string): Promise<void> {\n this.store.delete(hash)\n }\n\n async exists(hash: string): Promise<boolean> {\n return this.store.has(hash)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createBlobStore(archiveName: string): BlobStore {\n if (\n typeof navigator !== 'undefined' &&\n 'storage' in navigator &&\n 'getDirectory' in navigator.storage\n ) {\n return new OpfsBlobStore(archiveName)\n }\n return new IdbBlobStore(archiveName)\n}\n","import type { QueryExecutor } from '../storage-backend.js'\nimport { computeHash } from '../hash.js'\nimport { EmbeddingSetsRepository, type EmbeddingSetSelector, type ResolvedEmbeddingSet } from './embedding-sets-repository.js'\n\nexport interface GraphNode {\n id: string\n}\n\nexport interface GraphEdge {\n source: string\n target: string\n weight: number\n kind?: string\n}\n\nexport interface GraphCommunity {\n id: string\n nodes: string[]\n}\n\nexport interface CommunityGraph {\n nodes: GraphNode[]\n edges: GraphEdge[]\n communities: GraphCommunity[]\n}\n\nexport interface SimilarityGraphOptions {\n k?: number\n minSimilarity?: number\n threshold?: number\n metric?: 'cosine' | 'inner_product' | 'l2'\n batchSize?: number\n yieldEvery?: number\n onProgress?: (progress: SimilarityGraphProgress) => void\n}\n\nexport interface SimilarityGraphRequest extends SimilarityGraphOptions {\n selector: EmbeddingSetSelector\n source?: 'cache-preferred' | 'live-only' | 'cache-only'\n}\n\nexport interface SimilarityGraphProgress {\n phase: 'prepare' | 'neighbors'\n done: number\n total: number\n}\n\nexport interface SimilarityGraphCacheKey {\n selectorHash: string\n resolvedEmbeddingSetId?: string\n virtualSetId?: string\n k: number\n minSimilarity: number\n metric: 'cosine' | 'inner_product' | 'l2'\n model: string\n dimension: number\n truncateDimension?: number | null\n memberHash: string\n vectorHash: string\n parameterHash: string\n}\n\nexport interface SimilarityGraphResult {\n graph: CommunityGraph\n graphSource: {\n id: string\n name: string\n input_hash: string\n freshness: 'fresh' | 'stale' | 'unknown'\n }\n cache: 'hit' | 'miss-live-built' | 'stale-live-built' | 'live-only'\n freshness: 'fresh' | 'stale' | 'unknown'\n}\n\nexport interface CommunityOptions {\n maxIterations?: number\n}\n\nconst SIMILARITY_GRAPH_ALGORITHM = 'knn-batched-v1'\nconst DEFAULT_GRAPH_BATCH_SIZE = 64\n\nfunction hashJson(value: unknown): string {\n return computeHash(new TextEncoder().encode(JSON.stringify(value)))\n}\n\nfunction sourceIdFor(inputHash: string): string {\n return `similarity-${inputHash.replace(/^sha256:/, '').slice(0, 24)}`\n}\n\nfunction jsonObject(value: unknown): Record<string, unknown> | null {\n if (value == null) return null\n if (typeof value === 'string') return JSON.parse(value) as Record<string, unknown>\n return value as Record<string, unknown>\n}\n\nasync function yieldToEventLoop(): Promise<void> {\n const scheduler = (globalThis as unknown as { scheduler?: { yield?: () => Promise<void> } }).scheduler\n if (scheduler?.yield) {\n await scheduler.yield()\n return\n }\n await new Promise<void>((resolve) => setTimeout(resolve, 0))\n}\n\nasync function maybeYield(done: number, every: number): Promise<void> {\n if (every > 0 && done > 0 && done % every === 0) {\n await yieldToEventLoop()\n }\n}\n\nfunction parseVector(value: string): number[] {\n return value\n .replace(/^\\[/, '')\n .replace(/\\]$/, '')\n .split(',')\n .filter((part) => part.length > 0)\n .map(Number)\n}\n\nfunction vectorScore(\n left: number[],\n right: number[],\n metric: 'cosine' | 'inner_product' | 'l2',\n): { distance: number; similarity: number } {\n let dot = 0\n let leftNorm = 0\n let rightNorm = 0\n let squaredDistance = 0\n for (let i = 0; i < Math.min(left.length, right.length); i++) {\n dot += left[i] * right[i]\n leftNorm += left[i] * left[i]\n rightNorm += right[i] * right[i]\n const diff = left[i] - right[i]\n squaredDistance += diff * diff\n }\n if (metric === 'inner_product') {\n return { distance: -dot, similarity: dot }\n }\n if (metric === 'l2') {\n const distance = Math.sqrt(squaredDistance)\n return { distance, similarity: -distance }\n }\n const denominator = Math.sqrt(leftNorm) * Math.sqrt(rightNorm)\n const similarity = denominator === 0 ? 0 : dot / denominator\n return { distance: 1 - similarity, similarity }\n}\n\nexport function detectCommunities(\n edges: GraphEdge[],\n nodes: GraphNode[] = [],\n options: CommunityOptions = {},\n): GraphCommunity[] {\n const nodeIds = new Set(nodes.map((n) => n.id))\n for (const edge of edges) {\n nodeIds.add(edge.source)\n nodeIds.add(edge.target)\n }\n\n const labels = new Map<string, string>()\n const adjacency = new Map<string, Array<{ node: string; weight: number }>>()\n for (const id of nodeIds) {\n labels.set(id, id)\n adjacency.set(id, [])\n }\n for (const edge of edges) {\n adjacency.get(edge.source)?.push({ node: edge.target, weight: edge.weight })\n adjacency.get(edge.target)?.push({ node: edge.source, weight: edge.weight })\n }\n\n const orderedNodes = Array.from(nodeIds).sort()\n const maxIterations = options.maxIterations ?? 20\n for (let i = 0; i < maxIterations; i++) {\n let changed = false\n for (const node of orderedNodes) {\n const scores = new Map<string, number>()\n for (const neighbor of adjacency.get(node) ?? []) {\n const label = labels.get(neighbor.node) ?? neighbor.node\n scores.set(label, (scores.get(label) ?? 0) + neighbor.weight)\n }\n if (scores.size === 0) continue\n const nextLabel = Array.from(scores.entries())\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))[0][0]\n if (nextLabel !== labels.get(node)) {\n labels.set(node, nextLabel)\n changed = true\n }\n }\n if (!changed) break\n }\n\n const byLabel = new Map<string, string[]>()\n for (const node of orderedNodes) {\n const label = labels.get(node) ?? node\n const members = byLabel.get(label) ?? []\n members.push(node)\n byLabel.set(label, members)\n }\n\n return Array.from(byLabel.values())\n .sort((a, b) => b.length - a.length || a[0].localeCompare(b[0]))\n .map((members, index) => ({ id: `community-${index + 1}`, nodes: members }))\n}\n\nexport class GraphRepository {\n constructor(private db: QueryExecutor) {}\n\n normalizeSimilarityRequest(request: SimilarityGraphRequest): Required<Pick<SimilarityGraphRequest, 'selector' | 'k' | 'minSimilarity' | 'metric' | 'source'>> {\n if (request.minSimilarity !== undefined && request.threshold !== undefined && request.minSimilarity !== request.threshold) {\n throw new Error('conflicting-threshold')\n }\n return {\n selector: request.selector,\n k: request.k ?? 5,\n minSimilarity: request.minSimilarity ?? request.threshold ?? -1,\n metric: request.metric ?? 'cosine',\n source: request.source ?? 'cache-preferred',\n }\n }\n\n async buildSimilarityGraph(\n embeddingSet: string | EmbeddingSetSelector,\n options: SimilarityGraphOptions = {},\n ): Promise<CommunityGraph> {\n const selector = typeof embeddingSet === 'string'\n ? { kind: 'embedding-set' as const, embeddingSetId: embeddingSet }\n : embeddingSet\n return this.buildSimilarityGraphFromResolved(\n await new EmbeddingSetsRepository(this.db).resolveSelector(selector),\n options,\n )\n }\n\n async buildSimilarityGraphLive(request: SimilarityGraphRequest): Promise<CommunityGraph> {\n const normalized = this.normalizeSimilarityRequest({ ...request, source: 'live-only' })\n const resolved = await new EmbeddingSetsRepository(this.db).resolveSelector(normalized.selector)\n return this.buildSimilarityGraphFromResolved(resolved, normalized)\n }\n\n async getCachedSimilarityGraph(request: SimilarityGraphRequest): Promise<SimilarityGraphResult | null> {\n const normalized = this.normalizeSimilarityRequest(request)\n const resolved = await new EmbeddingSetsRepository(this.db).resolveSelector(normalized.selector)\n const cacheKey = await this.computeSimilarityGraphCacheKey(normalized, resolved)\n const inputHash = hashJson(cacheKey)\n const source = await this.findGraphSource(inputHash)\n if (!source) return null\n const graph = await this.graphFromArtifact(source.id, resolved.noteIds)\n return {\n graph,\n graphSource: { id: source.id, name: source.name, input_hash: source.input_hash, freshness: source.freshness },\n cache: 'hit',\n freshness: source.freshness,\n }\n }\n\n async buildOrLoadSimilarityGraph(request: SimilarityGraphRequest): Promise<SimilarityGraphResult> {\n const normalized = this.normalizeSimilarityRequest(request)\n const resolved = await new EmbeddingSetsRepository(this.db).resolveSelector(normalized.selector)\n const cacheKey = await this.computeSimilarityGraphCacheKey(normalized, resolved)\n const inputHash = hashJson(cacheKey)\n\n if (normalized.source !== 'live-only') {\n const cached = await this.findGraphSource(inputHash)\n if (cached?.freshness === 'fresh') {\n const graph = await this.graphFromArtifact(cached.id, resolved.noteIds)\n return {\n graph,\n graphSource: { id: cached.id, name: cached.name, input_hash: cached.input_hash, freshness: cached.freshness },\n cache: 'hit',\n freshness: 'fresh',\n }\n }\n if (normalized.source === 'cache-only') {\n throw new Error(cached ? 'similarity graph cache stale' : 'similarity graph cache miss')\n }\n const graph = await this.buildSimilarityGraphFromResolved(resolved, normalized)\n const graphSource = await this.saveSimilarityGraphArtifact({ graph, request: normalized, resolved, cacheKey, freshness: 'fresh' })\n return {\n graph,\n graphSource,\n cache: cached ? 'stale-live-built' : 'miss-live-built',\n freshness: cached ? cached.freshness : 'fresh',\n }\n }\n\n const graph = await this.buildSimilarityGraphFromResolved(resolved, normalized)\n return {\n graph,\n graphSource: { id: sourceIdFor(inputHash), name: 'Live similarity graph', input_hash: inputHash, freshness: 'unknown' },\n cache: 'live-only',\n freshness: 'unknown',\n }\n }\n\n async saveSimilarityGraphArtifact(input: {\n graph: CommunityGraph\n request: Required<Pick<SimilarityGraphRequest, 'selector' | 'k' | 'minSimilarity' | 'metric' | 'source'>>\n resolved: ResolvedEmbeddingSet\n cacheKey: SimilarityGraphCacheKey\n freshness?: 'fresh' | 'stale' | 'unknown'\n }): Promise<SimilarityGraphResult['graphSource']> {\n const inputHash = hashJson(input.cacheKey)\n const id = sourceIdFor(inputHash)\n const parameters = {\n k: input.request.k,\n minSimilarity: input.request.minSimilarity,\n metric: input.request.metric,\n algorithm: SIMILARITY_GRAPH_ALGORITHM,\n selectorHash: input.cacheKey.selectorHash,\n parameterHash: input.cacheKey.parameterHash,\n }\n await this.db.query(\n `INSERT INTO graph_source (id, name, kind, source_table, embedding_set_id, virtual_set_id, model, dimension, metric, algorithm, parameters_json, input_hash, freshness_json)\n VALUES ($1, $2, 'similarity', 'embedding', $3, $4, $5, $6, $7, $8, $9::jsonb, $10, $11::jsonb)\n ON CONFLICT (id) DO UPDATE SET parameters_json = $9::jsonb, input_hash = $10, freshness_json = $11::jsonb`,\n [\n id,\n 'Cached similarity graph',\n input.request.selector.kind === 'embedding-set' ? input.request.selector.embeddingSetId ?? null : null,\n input.request.selector.kind !== 'embedding-set' ? input.request.selector.definition?.id ?? null : null,\n input.cacheKey.model,\n input.cacheKey.dimension,\n input.request.metric,\n SIMILARITY_GRAPH_ALGORITHM,\n JSON.stringify(parameters),\n inputHash,\n JSON.stringify({ status: input.freshness ?? 'fresh' }),\n ],\n )\n await this.db.query(`DELETE FROM graph_edge_artifact WHERE graph_source_id = $1`, [id])\n let rank = 1\n for (const edge of input.graph.edges) {\n await this.db.query(\n `INSERT INTO graph_edge_artifact (graph_source_id, from_note_id, to_note_id, weight, kind, rank)\n VALUES ($1, $2, $3, $4, 'similarity', $5)`,\n [id, edge.source, edge.target, edge.weight, rank++],\n )\n }\n return { id, name: 'Cached similarity graph', input_hash: inputHash, freshness: input.freshness ?? 'fresh' }\n }\n\n async markSimilarityGraphStale(graphSourceId: string, reason: string): Promise<void> {\n await this.db.query(\n `UPDATE graph_source SET freshness_json = $2::jsonb WHERE id = $1`,\n [graphSourceId, JSON.stringify({ status: 'stale', stale_reason: reason, checked_at: new Date().toISOString() })],\n )\n }\n\n async loadGraphArtifact(graphSourceId: string, noteIds: string[] = []): Promise<CommunityGraph> {\n return this.graphFromArtifact(graphSourceId, noteIds)\n }\n\n private async buildSimilarityGraphFromResolved(\n resolved: ResolvedEmbeddingSet,\n options: SimilarityGraphOptions,\n ): Promise<CommunityGraph> {\n const k = options.k ?? 5\n const minSimilarity = options.minSimilarity ?? options.threshold ?? -1\n const metric = options.metric ?? 'cosine'\n const yieldEvery = options.yieldEvery ?? options.batchSize ?? DEFAULT_GRAPH_BATCH_SIZE\n const embeddings = resolved.rows\n\n const nodes = embeddings.map((row) => ({ id: row.note_id }))\n const edgeMap = new Map<string, GraphEdge>()\n const vectors = embeddings.map((row) => ({\n row,\n vector: parseVector(row.vector),\n }))\n options.onProgress?.({ phase: 'prepare', done: vectors.length, total: vectors.length })\n\n for (const [index, item] of vectors.entries()) {\n const neighbors = vectors\n .filter((candidate) => candidate.row.note_id !== item.row.note_id)\n .map((candidate) => {\n const score = vectorScore(item.vector, candidate.vector, metric)\n return { noteId: candidate.row.note_id, ...score }\n })\n .sort((a, b) => a.distance - b.distance || a.noteId.localeCompare(b.noteId))\n .slice(0, k)\n for (const neighbor of neighbors) {\n if (neighbor.similarity < minSimilarity) continue\n const [source, target] = [item.row.note_id, neighbor.noteId].sort()\n const id = `${source}\\u0000${target}`\n const existing = edgeMap.get(id)\n if (!existing || neighbor.similarity > existing.weight) {\n edgeMap.set(id, { source, target, weight: neighbor.similarity, kind: 'similarity' })\n }\n }\n options.onProgress?.({ phase: 'neighbors', done: index + 1, total: vectors.length })\n await maybeYield(index + 1, yieldEvery)\n }\n\n const edges = Array.from(edgeMap.values()).sort((a, b) =>\n a.source.localeCompare(b.source) || a.target.localeCompare(b.target),\n )\n return { nodes, edges, communities: detectCommunities(edges, nodes) }\n }\n\n private async computeSimilarityGraphCacheKey(\n request: Required<Pick<SimilarityGraphRequest, 'selector' | 'k' | 'minSimilarity' | 'metric' | 'source'>>,\n resolved: ResolvedEmbeddingSet,\n ): Promise<SimilarityGraphCacheKey> {\n const firstSetId = resolved.rows[0]?.embedding_set_id\n const set = firstSetId ? await new EmbeddingSetsRepository(this.db).get(firstSetId) : null\n return {\n selectorHash: hashJson(request.selector),\n resolvedEmbeddingSetId: request.selector.kind === 'embedding-set' ? request.selector.embeddingSetId : undefined,\n virtualSetId: request.selector.kind === 'virtual-definition' ? request.selector.definition?.id : undefined,\n k: request.k,\n minSimilarity: request.minSimilarity,\n metric: request.metric,\n model: set?.model_name ?? 'unknown',\n dimension: set?.dimensions ?? 0,\n truncateDimension: set?.truncate_dimension ?? null,\n memberHash: hashJson(resolved.rows.map((row) => [row.note_id, row.embedding_set_id, row.embedding_id])),\n vectorHash: hashJson(resolved.rows.map((row) => [row.embedding_id, row.vector])),\n parameterHash: hashJson({ k: request.k, minSimilarity: request.minSimilarity, metric: request.metric, algorithm: SIMILARITY_GRAPH_ALGORITHM }),\n }\n }\n\n private async findGraphSource(inputHash: string): Promise<{ id: string; name: string; input_hash: string; freshness: 'fresh' | 'stale' | 'unknown' } | null> {\n const result = await this.db.query<{ id: string; name: string; input_hash: string; freshness_json: unknown }>(\n `SELECT id, name, input_hash, freshness_json FROM graph_source WHERE kind = 'similarity' AND input_hash = $1 LIMIT 1`,\n [inputHash],\n )\n if (result.rows.length === 0) return null\n const row = result.rows[0]\n const freshness = jsonObject(row.freshness_json) as { status?: 'fresh' | 'stale' | 'unknown' } | null\n return { id: row.id, name: row.name, input_hash: row.input_hash, freshness: freshness?.status ?? 'unknown' }\n }\n\n private async graphFromArtifact(graphSourceId: string, noteIds: string[]): Promise<CommunityGraph> {\n const result = await this.db.query<GraphEdge>(\n `SELECT from_note_id as source, to_note_id as target, weight, kind\n FROM graph_edge_artifact\n WHERE graph_source_id = $1\n ORDER BY from_note_id, to_note_id`,\n [graphSourceId],\n )\n const nodes = Array.from(new Set([...noteIds, ...result.rows.flatMap((edge) => [edge.source, edge.target])]))\n .sort()\n .map((id) => ({ id }))\n return { nodes, edges: result.rows, communities: detectCommunities(result.rows, nodes) }\n }\n\n async buildLinkGraph(linkType?: string): Promise<CommunityGraph> {\n const params: unknown[] = []\n const typeFilter = linkType ? ' AND link_type = $1' : ''\n if (linkType) params.push(linkType)\n const result = await this.db.query<GraphEdge>(\n `SELECT source_note_id as source, target_note_id as target,\n COALESCE(confidence, 1.0) as weight, link_type as kind\n FROM link\n WHERE deleted_at IS NULL${typeFilter}\n ORDER BY source_note_id, target_note_id`,\n params,\n )\n const nodes = Array.from(new Set(result.rows.flatMap((edge) => [edge.source, edge.target])))\n .sort()\n .map((id) => ({ id }))\n return { nodes, edges: result.rows, communities: detectCommunities(result.rows, nodes) }\n }\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\nimport type { EmbeddingSetSelector } from './embedding-sets-repository.js'\nimport { SearchRepository } from './search-repository.js'\n\nexport type CommunitySourceType =\n | 'computed'\n | 'precomputed'\n | 'dynamic'\n | 'dynamic-snapshot'\n | 'user-authored'\n | 'imported'\n\nexport interface CommunityFilterDefinition {\n query?: string\n tags?: string[]\n collectionIds?: string[]\n conceptIds?: string[]\n noteIds?: string[]\n embeddingSetSelector?: EmbeddingSetSelector\n}\n\nexport interface CommunitySourceDescriptor {\n id: string\n name: string\n sourceType: CommunitySourceType\n graphSourceId?: string\n selector?: EmbeddingSetSelector\n searchQuery?: string\n filters?: CommunityFilterDefinition\n createdAt?: string\n updatedAt?: string\n freshness?: 'fresh' | 'stale' | 'unknown'\n}\n\nexport interface CommunityAssignmentView {\n communitySourceId: string\n communityId: string\n noteId: string\n label?: string | null\n confidence?: number | null\n sourceType: CommunitySourceType\n}\n\nexport interface CommunitySummary {\n id: string\n label: string\n sourceType: CommunitySourceType\n size: number\n confidence?: number | null\n representativeNoteIds: string[]\n freshness?: 'fresh' | 'stale' | 'unknown'\n}\n\nexport interface CommunityCreateInput {\n name: string\n label?: string\n sourceType: 'dynamic-snapshot' | 'user-authored'\n filters?: CommunityFilterDefinition\n noteIds?: string[]\n representativeNoteIds?: string[]\n}\n\nfunction json(value: unknown): string | null {\n return value == null ? null : JSON.stringify(value)\n}\n\nfunction parseObject<T>(value: unknown): T | undefined {\n if (value == null) return undefined\n if (typeof value === 'string') return JSON.parse(value) as T\n return value as T\n}\n\nfunction iso(value: Date | string | undefined): string | undefined {\n if (!value) return undefined\n return value instanceof Date ? value.toISOString() : value\n}\n\nexport class CommunitiesRepository {\n constructor(private db: DatabaseClient) {}\n\n async previewDynamicCommunity(filters: CommunityFilterDefinition): Promise<CommunityAssignmentView[]> {\n const noteIds = await this.resolveFilterNoteIds(filters)\n return noteIds.map((noteId) => ({\n communitySourceId: 'dynamic-preview',\n communityId: 'dynamic-preview',\n noteId,\n label: 'Dynamic preview',\n confidence: null,\n sourceType: 'dynamic',\n }))\n }\n\n async saveCommunity(input: CommunityCreateInput): Promise<CommunitySourceDescriptor> {\n const sourceId = generateId()\n const communitySetId = generateId()\n const communityId = generateId()\n const noteIds = input.noteIds ?? (input.filters ? await this.resolveFilterNoteIds(input.filters) : [])\n const sourceKind = input.sourceType === 'dynamic-snapshot' ? 'search' : 'manual'\n const freshness = input.sourceType === 'dynamic-snapshot' ? 'fresh' : 'unknown'\n\n await this.db.query(\n `INSERT INTO graph_source (id, name, kind, source_table, parameters_json, input_hash, freshness_json)\n VALUES ($1, $2, $3, 'manual', $4::jsonb, $5, $6::jsonb)`,\n [sourceId, input.name, sourceKind, json({ filters: input.filters ?? null }), `community:${sourceId}`, json({ status: freshness })],\n )\n await this.db.query(\n `INSERT INTO community_set (id, graph_source_id, name, source_type, parameters_json, input_hash, freshness_json)\n VALUES ($1, $2, $3, $4, $5::jsonb, $6, $7::jsonb)`,\n [communitySetId, sourceId, input.name, input.sourceType, json({ filters: input.filters ?? null }), `community:${communitySetId}`, json({ status: freshness })],\n )\n await this.db.query(\n `INSERT INTO community (community_set_id, id, label, rank, size, representative_note_ids)\n VALUES ($1, $2, $3, 1, $4, $5)`,\n [communitySetId, communityId, input.label ?? input.name, noteIds.length, input.representativeNoteIds ?? []],\n )\n for (const noteId of noteIds) {\n await this.db.query(\n `INSERT INTO community_assignment (community_set_id, community_id, note_id, confidence, source_type)\n VALUES ($1, $2, $3, NULL, $4)`,\n [communitySetId, communityId, noteId, input.sourceType],\n )\n }\n\n return {\n id: communitySetId,\n name: input.name,\n sourceType: input.sourceType,\n graphSourceId: sourceId,\n searchQuery: input.filters?.query,\n filters: input.filters,\n freshness,\n }\n }\n\n async rerunDynamicCommunity(sourceId: string): Promise<CommunityAssignmentView[]> {\n const result = await this.db.query<{ parameters_json: unknown; source_type: CommunitySourceType }>(\n `SELECT parameters_json, source_type FROM community_set WHERE id = $1`,\n [sourceId],\n )\n if (result.rows.length === 0) throw new Error(`Community source not found: ${sourceId}`)\n const parameters = parseObject<{ filters?: CommunityFilterDefinition | null }>(result.rows[0].parameters_json)\n if (!parameters?.filters) return this.getCommunityAssignments(sourceId)\n const preview = await this.previewDynamicCommunity(parameters.filters)\n return preview.map((assignment) => ({ ...assignment, communitySourceId: sourceId, sourceType: 'dynamic' }))\n }\n\n async listCommunitySources(): Promise<CommunitySourceDescriptor[]> {\n const result = await this.db.query<{\n id: string\n graph_source_id: string\n name: string\n source_type: CommunitySourceType\n parameters_json: unknown | null\n freshness_json: unknown | null\n created_at: Date\n }>(`SELECT * FROM community_set ORDER BY created_at, name`)\n return result.rows.map((row) => {\n const parameters = parseObject<{ filters?: CommunityFilterDefinition | null }>(row.parameters_json)\n const freshness = parseObject<{ status?: 'fresh' | 'stale' | 'unknown' }>(row.freshness_json)\n return {\n id: row.id,\n name: row.name,\n sourceType: row.source_type,\n graphSourceId: row.graph_source_id,\n searchQuery: parameters?.filters?.query,\n filters: parameters?.filters ?? undefined,\n createdAt: iso(row.created_at),\n freshness: freshness?.status ?? 'unknown',\n }\n })\n }\n\n async getCommunityAssignments(sourceId: string): Promise<CommunityAssignmentView[]> {\n const result = await this.db.query<{\n community_set_id: string\n community_id: string\n note_id: string\n label: string | null\n confidence: number | null\n source_type: CommunitySourceType\n }>(\n `SELECT ca.community_set_id, ca.community_id, ca.note_id, c.label, ca.confidence, ca.source_type\n FROM community_assignment ca\n LEFT JOIN community c ON c.community_set_id = ca.community_set_id AND c.id = ca.community_id\n WHERE ca.community_set_id = $1\n ORDER BY ca.community_id, ca.note_id`,\n [sourceId],\n )\n return result.rows.map((row) => ({\n communitySourceId: row.community_set_id,\n communityId: row.community_id,\n noteId: row.note_id,\n label: row.label,\n confidence: row.confidence,\n sourceType: row.source_type,\n }))\n }\n\n async listCommunitySummaries(sourceId: string): Promise<CommunitySummary[]> {\n const result = await this.db.query<{\n id: string\n label: string | null\n source_type: CommunitySourceType\n size: number | null\n confidence: number | null\n representative_note_ids: string[] | null\n freshness_json: unknown | null\n }>(\n `SELECT c.id, c.label, cs.source_type, c.size, c.confidence, c.representative_note_ids, cs.freshness_json\n FROM community c\n JOIN community_set cs ON cs.id = c.community_set_id\n WHERE c.community_set_id = $1\n ORDER BY c.rank NULLS LAST, c.id`,\n [sourceId],\n )\n return result.rows.map((row) => {\n const freshness = parseObject<{ status?: 'fresh' | 'stale' | 'unknown' }>(row.freshness_json)\n return {\n id: row.id,\n label: row.label ?? row.id,\n sourceType: row.source_type,\n size: row.size ?? 0,\n confidence: row.confidence,\n representativeNoteIds: row.representative_note_ids ?? [],\n freshness: freshness?.status ?? 'unknown',\n }\n })\n }\n\n private async resolveFilterNoteIds(filters: CommunityFilterDefinition): Promise<string[]> {\n if (filters.conceptIds?.length) {\n throw new Error('Community concept filters are not supported locally yet')\n }\n if (filters.noteIds?.length && !filters.query && !filters.tags?.length && !filters.collectionIds?.length && !filters.embeddingSetSelector) {\n return [...filters.noteIds].sort()\n }\n const result = await new SearchRepository(this.db, true).search(filters.query ?? '', {\n limit: 1000,\n tags: filters.tags,\n collection_id: filters.collectionIds?.[0],\n embeddingSetSelector: filters.embeddingSetSelector,\n })\n const ids = result.results.map((row) => row.id)\n return filters.noteIds?.length ? ids.filter((id) => filters.noteIds?.includes(id)) : ids\n }\n}\n","/**\n * LLM completion function injection.\n * Provides the slot for an LLM function — injected by the llm capability module.\n * No model loading by default (CAP-001).\n *\n * @implements #66 AI title generation\n */\n\n/** Type for the LLM completion function — injected by the llm capability module */\nexport type LlmCompleteFn = (\n prompt: string,\n options?: { maxTokens?: number; temperature?: number }\n) => Promise<string>\n\nlet llmFn: LlmCompleteFn | null = null\n\nexport function setLlmFunction(fn: LlmCompleteFn | null): void {\n llmFn = fn\n}\n\nexport function getLlmFunction(): LlmCompleteFn | null {\n return llmFn\n}\n","/**\n * Job queue worker — polls job_queue for pending jobs, dispatches to registered\n * handlers, manages status transitions and exponential backoff retries.\n *\n * Job types and priorities (lower = runs first):\n * ai_revision: 1 (LLM enriches content first, requires llm)\n * title_generation: 2 (generate title from enriched content)\n * embedding: 3 (vectorize final content, requires semantic)\n * concept_tagging: 4 (extract concepts from enriched content, requires llm)\n * linking: 5 (find related notes, requires embeddings to exist)\n */\n\nimport type { DatabaseClient } from './storage-backend.js'\nimport type { TypedEventBus } from './event-bus.js'\nimport type { CapabilityManager, CapabilityName } from './capability-manager.js'\nimport { getLlmFunction } from './capabilities/llm-handler.js'\nimport { generateId } from './uuid.js'\n\nexport interface JobQueueOptions {\n /** How often to poll for new jobs (ms). Default: 5000 */\n pollIntervalMs?: number\n /** Global max retries used when job.max_retries is 0. Default: 3 */\n maxRetries?: number\n /** Base delay for exponential backoff (ms). Default: 1000 */\n backoffBaseMs?: number\n /** Maximum backoff delay cap (ms). Default: 300000 (5 min) */\n backoffMaxMs?: number\n}\n\ninterface Job {\n id: string\n note_id: string\n job_type: string\n status: string\n priority: number\n required_capability: string | null\n retry_count: number\n max_retries: number\n error: string | null\n result: unknown | null\n created_at: Date\n updated_at: Date\n}\n\ntype JobHandler = (job: Job, db: DatabaseClient) => Promise<unknown>\n\n/** Job types listed in execution priority order (lower number = runs first) */\nexport type JobType =\n | 'ai_revision' // priority 1, requires llm — enriches content first\n | 'title_generation' // priority 2, generates title from enriched content\n | 'embedding' // priority 3, requires semantic\n | 'concept_tagging' // priority 4, requires llm\n | 'linking' // priority 5, requires embeddings to exist\n\n/**\n * Job priorities — lower number = runs first.\n * Correct dependency order:\n * 1. ai_revision — LLM enriches content first\n * 2. title_generation — generate title from enriched content\n * 3. embedding — vectorize final content\n * 4. concept_tagging — extract concepts from enriched content\n * 5. linking — find related notes (requires embeddings to exist)\n */\nexport const JOB_PRIORITIES: Record<JobType, number> = {\n ai_revision: 1,\n title_generation: 2,\n embedding: 3,\n concept_tagging: 4,\n linking: 5,\n}\n\nexport const JOB_CAPABILITIES: Partial<Record<JobType, string>> = {\n ai_revision: 'llm',\n embedding: 'semantic',\n concept_tagging: 'llm',\n}\n\nexport interface EnqueueJobInput {\n noteId: string\n jobType: JobType\n priority?: number\n requiredCapability?: string | null\n}\n\n/** Enqueue a job into the job_queue table. Returns the new job ID. */\nexport async function enqueueJob(db: DatabaseClient, input: EnqueueJobInput): Promise<string> {\n const id = generateId()\n const priority = input.priority ?? JOB_PRIORITIES[input.jobType] ?? 5\n const capability = input.requiredCapability !== undefined\n ? input.requiredCapability\n : JOB_CAPABILITIES[input.jobType] ?? null\n await db.query(\n `INSERT INTO job_queue (id, note_id, job_type, status, priority, required_capability, max_retries, retry_count)\n VALUES ($1, $2, $3, 'pending', $4, $5, 3, 0)`,\n [id, input.noteId, input.jobType, priority, capability],\n )\n return id\n}\n\n/** Enqueue the note creation pipeline: revision → title → embedding. */\nexport async function enqueueNoteCreationJobs(db: DatabaseClient, noteId: string, hasTitle: boolean): Promise<void> {\n await enqueueJob(db, { noteId, jobType: 'ai_revision' })\n if (!hasTitle) {\n await enqueueJob(db, { noteId, jobType: 'title_generation' })\n }\n await enqueueJob(db, { noteId, jobType: 'embedding' })\n}\n\n/**\n * Enqueue the complete workflow for a note.\n * Order: revision → title → embedding → concepts → linking.\n * Jobs run in priority order so each step has the richest content available.\n */\nexport async function enqueueFullWorkflow(db: DatabaseClient, noteId: string): Promise<void> {\n await enqueueJob(db, { noteId, jobType: 'ai_revision' })\n await enqueueJob(db, { noteId, jobType: 'title_generation' })\n await enqueueJob(db, { noteId, jobType: 'embedding' })\n await enqueueJob(db, { noteId, jobType: 'concept_tagging' })\n await enqueueJob(db, { noteId, jobType: 'linking' })\n}\n\nexport interface JobStatus {\n id: string\n note_id: string\n job_type: string\n status: string\n priority: number\n required_capability: string | null\n retry_count: number\n max_retries: number\n error: string | null\n result: unknown | null\n created_at: Date\n updated_at: Date\n}\n\n/** Query job queue status. Optionally filter by note_id. */\nexport async function getJobQueueStatus(db: DatabaseClient, noteId?: string): Promise<JobStatus[]> {\n const query = noteId\n ? `SELECT * FROM job_queue WHERE note_id = $1 ORDER BY created_at DESC LIMIT 50`\n : `SELECT * FROM job_queue ORDER BY created_at DESC LIMIT 50`\n const params = noteId ? [noteId] : []\n const result = await db.query<JobStatus>(query, params)\n return result.rows\n}\n\nexport class JobQueueWorker {\n private handlers = new Map<string, JobHandler>()\n private running = false\n private timer: ReturnType<typeof setTimeout> | null = null\n private options: Required<JobQueueOptions>\n\n constructor(\n private db: DatabaseClient,\n private events?: TypedEventBus,\n options: JobQueueOptions = {},\n private capabilityManager?: CapabilityManager,\n ) {\n this.options = {\n pollIntervalMs: options.pollIntervalMs ?? 5000,\n maxRetries: options.maxRetries ?? 3,\n backoffBaseMs: options.backoffBaseMs ?? 1000,\n backoffMaxMs: options.backoffMaxMs ?? 300000,\n }\n }\n\n registerHandler(jobType: string, handler: JobHandler): void {\n this.handlers.set(jobType, handler)\n }\n\n async start(): Promise<void> {\n if (this.running) return\n this.running = true\n // Recover jobs stuck in 'processing' from a previous session (app restart / crash)\n await this.recoverStaleJobs()\n this.poll()\n }\n\n /** Reset any 'processing' jobs back to 'pending' — they were interrupted by a restart */\n private async recoverStaleJobs(): Promise<void> {\n const result = await this.db.query<{ id: string; job_type: string }>(\n `UPDATE job_queue SET status = 'pending', updated_at = now()\n WHERE status = 'processing'\n RETURNING id, job_type`,\n )\n if (result.rows.length > 0) {\n console.log(`[JobQueue] Recovered ${result.rows.length} stale jobs:`, result.rows.map(r => r.job_type))\n }\n // Also clean up any legacy 'embedding_generation' jobs renamed to 'embedding'\n await this.db.query(\n `UPDATE job_queue SET job_type = 'embedding' WHERE job_type = 'embedding_generation'`,\n )\n }\n\n stop(): void {\n this.running = false\n if (this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n }\n }\n\n /** Process one batch of pending jobs. Useful for testing without polling. */\n async processOnce(): Promise<number> {\n return this.processPendingJobs()\n }\n\n private poll(): void {\n if (!this.running) return\n this.processPendingJobs()\n .catch(() => {})\n .finally(() => {\n if (this.running) {\n this.timer = setTimeout(() => this.poll(), this.options.pollIntervalMs)\n }\n })\n }\n\n private async processPendingJobs(): Promise<number> {\n const result = await this.db.query<Job>(\n `SELECT * FROM job_queue\n WHERE status = 'pending'\n ORDER BY priority ASC, created_at ASC\n LIMIT 10`,\n )\n\n let processed = 0\n\n if (result.rows.length > 0) {\n console.log(`[JobQueue] Found ${result.rows.length} pending jobs:`, result.rows.map(j => `${j.job_type}(${j.status})`))\n }\n\n for (const job of result.rows) {\n const handler = this.handlers.get(job.job_type)\n if (!handler) {\n console.warn(`[JobQueue] No handler for job type '${job.job_type}' — skipping job ${job.id.slice(0, 8)}`)\n continue\n }\n\n // Capability gating: skip jobs whose required capability is not ready\n if (job.required_capability) {\n const capName = job.required_capability as CapabilityName\n if (!this.capabilityManager?.isReady(capName)) {\n await this.blockForCapability(job, capName)\n continue\n }\n }\n\n // Mark as processing\n await this.db.query(\n `UPDATE job_queue SET status = 'processing', error = NULL, updated_at = now() WHERE id = $1`,\n [job.id],\n )\n\n try {\n console.log(`[JobQueue] Running ${job.job_type} for note ${job.note_id.slice(0, 8)}...`)\n const jobResult = await handler(job, this.db)\n console.log(`[JobQueue] Completed ${job.job_type}:`, jobResult)\n\n await this.db.query(\n `UPDATE job_queue SET status = 'completed', error = NULL, result = $1, updated_at = now() WHERE id = $2`,\n [JSON.stringify(jobResult ?? null), job.id],\n )\n\n this.events?.emit('job.completed', {\n id: job.id,\n noteId: job.note_id,\n type: job.job_type,\n })\n\n processed++\n } catch (err) {\n console.error(`[JobQueue] Failed ${job.job_type}:`, err)\n const errorMessage = err instanceof Error ? err.message : String(err)\n const newRetryCount = job.retry_count + 1\n\n if (newRetryCount >= (job.max_retries || this.options.maxRetries)) {\n await this.db.query(\n `UPDATE job_queue SET status = 'failed', error = $1, retry_count = $2, updated_at = now() WHERE id = $3`,\n [errorMessage, newRetryCount, job.id],\n )\n\n this.events?.emit('job.failed', {\n id: job.id,\n noteId: job.note_id,\n type: job.job_type,\n error: errorMessage,\n })\n } else {\n await this.db.query(\n `UPDATE job_queue SET status = 'pending', error = $1, retry_count = $2, updated_at = now() WHERE id = $3`,\n [errorMessage, newRetryCount, job.id],\n )\n }\n }\n }\n\n return processed\n }\n\n private async blockForCapability(job: Job, capability: string): Promise<void> {\n const message = `requires capability '${capability}' — not ready`\n console.log(`[JobQueue] Deferring ${job.job_type} — ${message}`)\n\n await this.db.query(\n `UPDATE job_queue\n SET status = 'pending', error = $1, updated_at = now()\n WHERE id = $2 AND error IS DISTINCT FROM $1`,\n [message, job.id],\n )\n\n this.events?.emit('job.blocked', {\n id: job.id,\n noteId: job.note_id,\n type: job.job_type,\n capability,\n message,\n })\n\n this.events?.emit('capability.required', {\n name: capability,\n jobId: job.id,\n noteId: job.note_id,\n type: job.job_type,\n message,\n })\n }\n\n getBackoffDelay(retryCount: number): number {\n const delay = this.options.backoffBaseMs * Math.pow(2, retryCount)\n return Math.min(delay, this.options.backoffMaxMs)\n }\n}\n\n// ---- Built-in job handlers ----\n\n/** Title generation: LLM first, fallback to first-line extraction */\nexport function titleGenerationHandler(job: Job, db: DatabaseClient): Promise<unknown> {\n return (async () => {\n const result = await db.query<{ content: string }>(\n `SELECT content FROM note_revised_current WHERE note_id = $1`,\n [job.note_id],\n )\n if (result.rows.length === 0) throw new Error(`No content found for note ${job.note_id}`)\n\n const content = result.rows[0].content\n const llmFn = getLlmFunction()\n\n // Try LLM title generation first\n if (llmFn) {\n const prompt =\n `Generate a concise title (under 100 characters) for this note. ` +\n `Respond with ONLY the title text, no quotes, no explanation.\\n\\nNote content:\\n${content.slice(0, 1000)}`\n\n const llmTitle = (await llmFn(prompt, { maxTokens: 60, temperature: 0.3 })).trim()\n if (llmTitle) {\n const title = llmTitle.length > 200 ? llmTitle.slice(0, 197) + '...' : llmTitle\n await db.query(\n `UPDATE note_revised_current\n SET model = $1, ai_metadata = $2, generation_count = generation_count + 1, updated_at = now()\n WHERE note_id = $3`,\n ['llm', JSON.stringify({ source: 'title_generation' }), job.note_id],\n )\n await db.query(`UPDATE note SET title = $1, updated_at = now() WHERE id = $2`, [title, job.note_id])\n return { title, model: 'llm' }\n }\n }\n\n // Fallback: extract title from first line with markdown stripping\n let title = content.split('\\n')[0] ?? ''\n title = title\n .replace(/^#{1,6}\\s+/, '')\n .replace(/\\*\\*(.*?)\\*\\*/g, '$1')\n .replace(/\\*(.*?)\\*/g, '$1')\n .replace(/`(.*?)`/g, '$1')\n .replace(/\\[(.*?)\\]\\(.*?\\)/g, '$1')\n .trim()\n\n if (title.length > 200) title = title.slice(0, 197) + '...'\n if (!title) title = 'Untitled Note'\n\n await db.query(`UPDATE note SET title = $1, updated_at = now() WHERE id = $2`, [title, job.note_id])\n return { title }\n })()\n}\n\n/** AI revision: LLM enhances note content, creates a revision record */\nexport function aiRevisionHandler(job: Job, db: DatabaseClient): Promise<unknown> {\n return (async () => {\n const llmFn = getLlmFunction()\n if (!llmFn) return { skipped: true, reason: 'no LLM function registered' }\n\n const result = await db.query<{ content: string }>(\n `SELECT content FROM note_revised_current WHERE note_id = $1`,\n [job.note_id],\n )\n if (result.rows.length === 0) throw new Error(`No content found for note ${job.note_id}`)\n\n const content = result.rows[0].content\n\n const prompt =\n `You are a knowledge management assistant. Enhance the following note by:\\n` +\n `- Improving clarity and structure\\n` +\n `- Adding markdown formatting where appropriate\\n` +\n `- Preserving all original information\\n` +\n `- Keeping the same general length\\n\\n` +\n `Respond with ONLY the enhanced note content, no explanation.\\n\\n` +\n `Original note:\\n${content}`\n\n const revised = (await llmFn(prompt, { maxTokens: 2000, temperature: 0.4 })).trim()\n if (!revised || revised === content) return { skipped: true, reason: 'no changes from LLM' }\n\n // Get next revision number\n const revResult = await db.query<{ max_rev: number }>(\n `SELECT COALESCE(MAX(revision_number), 0) as max_rev FROM note_revision WHERE note_id = $1`,\n [job.note_id],\n )\n const nextRev = (revResult.rows[0]?.max_rev ?? 0) + 1\n\n // Insert revision record (type='ai_enhancement' per server convention)\n const revId = generateId()\n await db.query(\n `INSERT INTO note_revision (id, note_id, revision_number, type, content, ai_metadata, model, created_at)\n VALUES ($1, $2, $3, 'ai_enhancement', $4, $5, 'llm', now())`,\n [revId, job.note_id, nextRev, revised, JSON.stringify({ source: 'ai_revision', original_length: content.length, revised_length: revised.length })],\n )\n\n // Update note_revised_current\n await db.query(\n `UPDATE note_revised_current\n SET content = $1, model = 'llm', ai_metadata = $2, generation_count = generation_count + 1, is_user_edited = false, updated_at = now()\n WHERE note_id = $3`,\n [revised, JSON.stringify({ source: 'ai_revision', revision_id: revId }), job.note_id],\n )\n\n // Chain: enqueue concept_tagging after ai_revision completes\n await enqueueJob(db, { noteId: job.note_id, jobType: 'concept_tagging' })\n\n return { revision_number: nextRev, revision_id: revId, model: 'llm' }\n })()\n}\n\n/** Concept tagging: LLM extracts SKOS concepts from revised content */\nexport function conceptTaggingHandler(job: Job, db: DatabaseClient): Promise<unknown> {\n return (async () => {\n const llmFn = getLlmFunction()\n if (!llmFn) return { skipped: true, reason: 'no LLM function registered' }\n\n const result = await db.query<{ content: string }>(\n `SELECT content FROM note_revised_current WHERE note_id = $1`,\n [job.note_id],\n )\n if (result.rows.length === 0) throw new Error(`No content found for note ${job.note_id}`)\n\n const content = result.rows[0].content\n\n const prompt =\n `Task: Extract 3-5 topic tags from the text below.\\n` +\n `Rules:\\n` +\n `- Each tag is 1-3 words, lowercase\\n` +\n `- Tags should be broad topics, not individual words from the text\\n` +\n `- Return ONLY a comma-separated list, nothing else\\n` +\n `- Example output: machine learning, web development, database design\\n\\n` +\n `Text:\\n${content.slice(0, 1500)}\\n\\nTags:`\n\n const response = (await llmFn(prompt, { maxTokens: 60, temperature: 0.1 })).trim()\n\n // Parse and validate tags aggressively\n const tags = response\n .split(/[,\\n]/)\n .map((t) => t.trim().toLowerCase().replace(/^[-*\\d.]+\\s*/, '').replace(/['\"]/g, ''))\n .filter((t) => {\n if (t.length < 2 || t.length > 40) return false\n // Must be multi-character words, not single letters or numbers\n if (/^\\d+$/.test(t)) return false\n // Reject if it's just a common stop word\n const stops = new Set(['the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could', 'should', 'may', 'might', 'shall', 'can', 'and', 'or', 'but', 'if', 'then', 'else', 'when', 'at', 'by', 'for', 'with', 'about', 'between', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'once', 'here', 'there', 'all', 'each', 'every', 'both', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 'just', 'because', 'as', 'until', 'while', 'of', 'this', 'that', 'these', 'those', 'it', 'its'])\n if (stops.has(t)) return false\n // Reject single-word tags shorter than 3 chars\n if (!t.includes(' ') && t.length < 3) return false\n return true\n })\n .slice(0, 5)\n\n if (tags.length === 0) {\n return { skipped: true, reason: 'LLM returned no valid tags', raw: response.slice(0, 200) }\n }\n\n for (const tag of tags) {\n await db.query(\n `INSERT INTO note_tag (id, note_id, tag) VALUES ($1, $2, $3)\n ON CONFLICT (note_id, tag) DO NOTHING`,\n [generateId(), job.note_id, tag],\n )\n }\n\n return { tags, count: tags.length }\n })()\n}\n\n/** Linking: find semantically related notes using FTS + vector RRF */\nexport function linkingHandler(job: Job, db: DatabaseClient): Promise<unknown> {\n return (async () => {\n // Check if this note has embeddings\n const embResult = await db.query<{ id: string }>(\n `SELECT id FROM embedding WHERE note_id = $1 LIMIT 1`,\n [job.note_id],\n )\n if (embResult.rows.length === 0) {\n return { skipped: true, reason: 'no embeddings for this note yet' }\n }\n\n // Get this note's embedding vector\n const vecResult = await db.query<{ vector: string }>(\n `SELECT vector::text FROM embedding WHERE note_id = $1 LIMIT 1`,\n [job.note_id],\n )\n if (vecResult.rows.length === 0) return { skipped: true, reason: 'no vector found' }\n\n // Find similar notes by vector cosine distance (top 5, excluding self)\n const similar = await db.query<{ note_id: string; distance: number }>(\n `SELECT e.note_id, e.vector <=> (SELECT vector FROM embedding WHERE note_id = $1 LIMIT 1) as distance\n FROM embedding e\n WHERE e.note_id != $1\n ORDER BY distance ASC\n LIMIT 5`,\n [job.note_id],\n )\n\n let created = 0\n for (const row of similar.rows) {\n if (row.distance > 0.8) continue // too dissimilar\n\n // Insert link if not already exists\n const existing = await db.query(\n `SELECT id FROM link WHERE source_note_id = $1 AND target_note_id = $2 AND link_type = 'semantic'`,\n [job.note_id, row.note_id],\n )\n if (existing.rows.length === 0) {\n await db.query(\n `INSERT INTO link (id, source_note_id, target_note_id, link_type, confidence, created_at, updated_at)\n VALUES ($1, $2, $3, 'semantic', $4, now(), now())`,\n [generateId(), job.note_id, row.note_id, 1.0 - row.distance],\n )\n created++\n }\n }\n\n return { links_created: created, candidates: similar.rows.length }\n })()\n}\n","/**\n * TagsRepository — free-form tag management for notes.\n *\n * Responsibilities:\n * - Add and remove tags from notes\n * - Look up tags by note or notes by tag\n * - List all tags with usage counts\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\nexport class TagsRepository {\n constructor(\n private db: DatabaseClient,\n ) {}\n\n async addTag(noteId: string, tag: string): Promise<void> {\n await this.db.query(\n `INSERT INTO note_tag (id, note_id, tag) VALUES ($1, $2, $3) ON CONFLICT (note_id, tag) DO NOTHING`,\n [generateId(), noteId, tag],\n )\n }\n\n async removeTag(noteId: string, tag: string): Promise<void> {\n await this.db.query(\n `DELETE FROM note_tag WHERE note_id = $1 AND tag = $2`,\n [noteId, tag],\n )\n }\n\n async getTagsForNote(noteId: string): Promise<string[]> {\n const result = await this.db.query<{ tag: string }>(\n `SELECT tag FROM note_tag WHERE note_id = $1 ORDER BY tag`,\n [noteId],\n )\n return result.rows.map((r) => r.tag)\n }\n\n async getNotesForTag(tag: string): Promise<string[]> {\n const result = await this.db.query<{ note_id: string }>(\n `SELECT note_id FROM note_tag WHERE tag = $1`,\n [tag],\n )\n return result.rows.map((r) => r.note_id)\n }\n\n async listAllTags(): Promise<Array<{ tag: string; count: number }>> {\n const result = await this.db.query<{ tag: string; count: string }>(\n `SELECT tag, COUNT(*) as count FROM note_tag GROUP BY tag ORDER BY count DESC, tag ASC`,\n )\n return result.rows.map((r) => ({ tag: r.tag, count: parseInt(r.count, 10) }))\n }\n}\n","/**\n * CollectionsRepository — folder/category management for notes.\n *\n * Responsibilities:\n * - Create, read, update, and soft-delete collections\n * - Prevent circular parent references\n * - Assign and unassign notes from collections\n * - Return flat list and shallow tree views\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\n\nexport interface CollectionRow {\n id: string\n name: string\n description: string | null\n parent_id: string | null\n position: number\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n}\n\nexport interface CollectionCreateInput {\n name: string\n description?: string\n parent_id?: string\n}\n\nexport class CollectionsRepository {\n constructor(private db: DatabaseClient) {}\n\n async create(input: CollectionCreateInput): Promise<CollectionRow> {\n const id = generateId()\n await this.db.query(\n `INSERT INTO collection (id, name, description, parent_id)\n VALUES ($1, $2, $3, $4)`,\n [id, input.name, input.description ?? null, input.parent_id ?? null],\n )\n return this.get(id)\n }\n\n async get(id: string): Promise<CollectionRow> {\n const result = await this.db.query<CollectionRow>(\n `SELECT * FROM collection WHERE id = $1 AND deleted_at IS NULL`,\n [id],\n )\n if (result.rows.length === 0) throw new Error(`Collection not found: ${id}`)\n return result.rows[0]\n }\n\n async list(): Promise<CollectionRow[]> {\n const result = await this.db.query<CollectionRow>(\n `SELECT * FROM collection WHERE deleted_at IS NULL ORDER BY position, name`,\n )\n return result.rows\n }\n\n async listTree(): Promise<Array<CollectionRow & { children: CollectionRow[] }>> {\n const all = await this.list()\n const roots = all.filter((c) => c.parent_id === null)\n return roots.map((root) => ({\n ...root,\n children: all.filter((c) => c.parent_id === root.id),\n }))\n }\n\n async update(\n id: string,\n fields: Partial<Pick<CollectionRow, 'name' | 'description' | 'parent_id' | 'position'>>,\n ): Promise<CollectionRow> {\n // Circular reference check\n if (fields.parent_id !== undefined) {\n if (fields.parent_id === id) throw new Error('Collection cannot be its own parent')\n // Check for deeper cycles by walking parent chain\n if (fields.parent_id) {\n let current = fields.parent_id\n const visited = new Set<string>([id])\n while (current) {\n if (visited.has(current)) throw new Error('Circular reference detected')\n visited.add(current)\n const parent = await this.db.query<{ parent_id: string | null }>(\n `SELECT parent_id FROM collection WHERE id = $1`,\n [current],\n )\n current = parent.rows[0]?.parent_id ?? ''\n if (!current) break\n }\n }\n }\n\n const setClauses: string[] = ['updated_at = now()']\n const params: unknown[] = []\n let idx = 1\n if (fields.name !== undefined) {\n setClauses.push(`name = $${idx++}`)\n params.push(fields.name)\n }\n if (fields.description !== undefined) {\n setClauses.push(`description = $${idx++}`)\n params.push(fields.description)\n }\n if (fields.parent_id !== undefined) {\n setClauses.push(`parent_id = $${idx++}`)\n params.push(fields.parent_id)\n }\n if (fields.position !== undefined) {\n setClauses.push(`position = $${idx++}`)\n params.push(fields.position)\n }\n\n params.push(id)\n await this.db.query(\n `UPDATE collection SET ${setClauses.join(', ')} WHERE id = $${idx}`,\n params,\n )\n return this.get(id)\n }\n\n async delete(id: string): Promise<void> {\n await this.db.query(`UPDATE collection SET deleted_at = now() WHERE id = $1`, [id])\n // Unassign notes from the deleted collection\n await this.db.query(`DELETE FROM collection_note WHERE collection_id = $1`, [id])\n }\n\n async assignNote(collectionId: string, noteId: string): Promise<void> {\n await this.db.query(\n `INSERT INTO collection_note (collection_id, note_id) VALUES ($1, $2) ON CONFLICT DO NOTHING`,\n [collectionId, noteId],\n )\n }\n\n async unassignNote(collectionId: string, noteId: string): Promise<void> {\n await this.db.query(\n `DELETE FROM collection_note WHERE collection_id = $1 AND note_id = $2`,\n [collectionId, noteId],\n )\n }\n\n async getNotesInCollection(collectionId: string): Promise<string[]> {\n const result = await this.db.query<{ note_id: string }>(\n `SELECT note_id FROM collection_note WHERE collection_id = $1 ORDER BY position`,\n [collectionId],\n )\n return result.rows.map((r) => r.note_id)\n }\n}\n","/**\n * SkosRepository — SKOS taxonomy management (schemes, concepts, relations).\n *\n * Responsibilities:\n * - Create and soft-delete SKOS schemes (taxonomy containers)\n * - Create, list, and soft-delete SKOS concepts within schemes\n * - Create and query broader/narrower/related concept relations\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\n\nexport interface SkosScheme {\n id: string\n title: string\n description: string | null\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n}\n\nexport interface SkosConcept {\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[]\n definition: string | null\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n}\n\nexport interface SkosRelation {\n id: string\n source_concept_id: string\n target_concept_id: string\n relation_type: string\n created_at: Date\n}\n\nexport interface NoteSkosTag {\n id: string\n note_id: string\n concept_id: string\n created_at: Date\n}\n\nexport class SkosRepository {\n constructor(private db: DatabaseClient) {}\n\n // ── Schemes ──────────────────────────────────────────────────────────────\n\n async createScheme(title: string, description?: string): Promise<SkosScheme> {\n const id = generateId()\n await this.db.query(\n `INSERT INTO skos_scheme (id, title, description) VALUES ($1, $2, $3)`,\n [id, title, description ?? null],\n )\n const result = await this.db.query<SkosScheme>(`SELECT * FROM skos_scheme WHERE id = $1`, [id])\n return result.rows[0]\n }\n\n async listSchemes(): Promise<SkosScheme[]> {\n const result = await this.db.query<SkosScheme>(\n `SELECT * FROM skos_scheme WHERE deleted_at IS NULL ORDER BY title`,\n )\n return result.rows\n }\n\n async deleteScheme(id: string): Promise<void> {\n await this.db.query(`UPDATE skos_scheme SET deleted_at = now() WHERE id = $1`, [id])\n }\n\n // ── Concepts ─────────────────────────────────────────────────────────────\n\n async createConcept(\n schemeId: string,\n prefLabel: string,\n options?: { altLabels?: string[]; definition?: string },\n ): Promise<SkosConcept> {\n const id = generateId()\n await this.db.query(\n `INSERT INTO skos_concept (id, scheme_id, pref_label, alt_labels, definition) VALUES ($1, $2, $3, $4, $5)`,\n [\n id,\n schemeId,\n prefLabel,\n JSON.stringify(options?.altLabels ?? []),\n options?.definition ?? null,\n ],\n )\n const result = await this.db.query<SkosConcept>(\n `SELECT * FROM skos_concept WHERE id = $1`,\n [id],\n )\n return result.rows[0]\n }\n\n async listConcepts(schemeId: string): Promise<SkosConcept[]> {\n const result = await this.db.query<SkosConcept>(\n `SELECT * FROM skos_concept WHERE scheme_id = $1 AND deleted_at IS NULL ORDER BY pref_label`,\n [schemeId],\n )\n return result.rows\n }\n\n async deleteConcept(id: string): Promise<void> {\n await this.db.query(`UPDATE skos_concept SET deleted_at = now() WHERE id = $1`, [id])\n }\n\n // ── Relations ─────────────────────────────────────────────────────────────\n\n async createRelation(\n sourceConceptId: string,\n targetConceptId: string,\n relationType: 'broader' | 'narrower' | 'related',\n ): Promise<SkosRelation> {\n const id = generateId()\n await this.db.query(\n `INSERT INTO skos_concept_relation (id, source_concept_id, target_concept_id, relation_type) VALUES ($1, $2, $3, $4)`,\n [id, sourceConceptId, targetConceptId, relationType],\n )\n const result = await this.db.query<SkosRelation>(\n `SELECT * FROM skos_concept_relation WHERE id = $1`,\n [id],\n )\n return result.rows[0]\n }\n\n async getRelations(conceptId: string): Promise<SkosRelation[]> {\n const result = await this.db.query<SkosRelation>(\n `SELECT * FROM skos_concept_relation WHERE source_concept_id = $1 OR target_concept_id = $1`,\n [conceptId],\n )\n return result.rows\n }\n\n // ── Note tagging ───────────────────────────────────────────────────────────\n\n async tagNote(noteId: string, conceptId: string): Promise<NoteSkosTag> {\n const existing = await this.db.query<NoteSkosTag>(\n `SELECT * FROM note_skos_tag WHERE note_id = $1 AND concept_id = $2`,\n [noteId, conceptId],\n )\n if (existing.rows.length > 0) return existing.rows[0]\n\n const id = generateId()\n await this.db.query(\n `INSERT INTO note_skos_tag (id, note_id, concept_id) VALUES ($1, $2, $3)`,\n [id, noteId, conceptId],\n )\n const result = await this.db.query<NoteSkosTag>(`SELECT * FROM note_skos_tag WHERE id = $1`, [id])\n return result.rows[0]\n }\n\n async untagNote(noteId: string, conceptId: string): Promise<void> {\n await this.db.query(\n `DELETE FROM note_skos_tag WHERE note_id = $1 AND concept_id = $2`,\n [noteId, conceptId],\n )\n }\n\n async conceptsForNote(noteId: string): Promise<SkosConcept[]> {\n const result = await this.db.query<SkosConcept>(\n `SELECT c.*\n FROM skos_concept c\n INNER JOIN note_skos_tag nst ON nst.concept_id = c.id\n WHERE nst.note_id = $1 AND c.deleted_at IS NULL\n ORDER BY c.pref_label`,\n [noteId],\n )\n return result.rows\n }\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { generateId } from '../uuid.js'\n\nexport interface ProvenanceEdge {\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: Date\n ended_at: Date | null\n attributes: Record<string, unknown> | null\n}\n\nexport interface RecordProvenanceInput {\n activity: string\n agent: string\n startedAt?: Date | string\n endedAt?: Date | string | null\n attributes?: Record<string, unknown> | null\n}\n\nexport class ProvenanceRepository {\n constructor(private db: DatabaseClient) {}\n\n async recordProvenance(\n entityType: string,\n entityId: string,\n input: RecordProvenanceInput,\n ): Promise<ProvenanceEdge> {\n const id = generateId()\n await this.db.query(\n `INSERT INTO provenance_edge (id, entity_type, entity_id, activity, agent, started_at, ended_at, attributes)\n VALUES ($1, $2, $3, $4, $5, COALESCE($6, now()), $7, $8)`,\n [\n id,\n entityType,\n entityId,\n input.activity,\n input.agent,\n input.startedAt ?? null,\n input.endedAt ?? null,\n input.attributes === undefined ? null : JSON.stringify(input.attributes),\n ],\n )\n const result = await this.db.query<ProvenanceEdge>(`SELECT * FROM provenance_edge WHERE id = $1`, [id])\n return result.rows[0]\n }\n\n async forEntity(entityType: string, entityId: string): Promise<ProvenanceEdge[]> {\n const result = await this.db.query<ProvenanceEdge>(\n `SELECT *\n FROM provenance_edge\n WHERE entity_type = $1 AND entity_id = $2\n ORDER BY started_at`,\n [entityType, entityId],\n )\n return result.rows\n }\n}\n","/**\n * captureKnowledge — tool function for creating notes.\n *\n * Supports three sub-actions:\n * create — create a single note from content\n * bulk_create — create multiple notes in sequence\n * from_template — interpolate a template string and create a note\n *\n * Input is Zod-validated at entry. All writes delegate to NotesRepository.\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport type { TypedEventBus } from '../event-bus.js'\nimport { NotesRepository } from '../repositories/notes-repository.js'\nimport { CaptureKnowledgeInputSchema } from './schemas.js'\nimport type { NoteFull } from '../repositories/types.js'\n\nexport interface CaptureKnowledgeResult {\n action: string\n notes: NoteFull[]\n}\n\nexport async function captureKnowledge(\n db: DatabaseClient,\n rawInput: unknown,\n events?: TypedEventBus,\n): Promise<CaptureKnowledgeResult> {\n const input = CaptureKnowledgeInputSchema.parse(rawInput)\n const repo = new NotesRepository(db, events)\n\n switch (input.action) {\n case 'create': {\n if (!input.content) throw new Error('content is required for create action')\n const note = await repo.create({\n content: input.content,\n title: input.title,\n format: input.format,\n source: input.source,\n visibility: input.visibility,\n tags: input.tags,\n archive_id: input.archive_id,\n })\n return { action: 'create', notes: [note] }\n }\n\n case 'bulk_create': {\n if (!input.notes?.length) throw new Error('notes array is required for bulk_create action')\n const results: NoteFull[] = []\n for (const noteInput of input.notes) {\n const note = await repo.create({\n content: noteInput.content,\n title: noteInput.title,\n format: noteInput.format,\n tags: noteInput.tags,\n })\n results.push(note)\n }\n return { action: 'bulk_create', notes: results }\n }\n\n case 'from_template': {\n if (!input.template) throw new Error('template is required for from_template action')\n let content = input.template\n if (input.variables) {\n for (const [key, value] of Object.entries(input.variables)) {\n content = content.replaceAll(`{{${key}}}`, value)\n }\n }\n const note = await repo.create({\n content,\n title: input.title,\n format: input.format,\n tags: input.tags,\n })\n return { action: 'from_template', notes: [note] }\n }\n }\n}\n","/**\n * searchTool — tool function wrapping SearchRepository.\n *\n * Text mode is always available. Semantic, hybrid, and auto modes are available\n * when the host passes a query_embedding; forced semantic/hybrid fail clearly\n * without one while auto falls back to lexical search.\n *\n * Input is Zod-validated at entry.\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { SearchRepository } from '../repositories/search-repository.js'\nimport { SearchInputSchema } from './schemas.js'\nimport type { SearchResponse } from '../repositories/types.js'\n\nexport async function searchTool(db: DatabaseClient, rawInput: unknown): Promise<SearchResponse> {\n const input = SearchInputSchema.parse(rawInput)\n const semanticAvailable = !!input.query_embedding?.length\n\n if ((input.mode === 'semantic' || input.mode === 'hybrid') && !semanticAvailable) {\n throw new Error(\n `Search mode '${input.mode}' requires query_embedding. semantic_available: false`,\n )\n }\n\n const repo = new SearchRepository(db, semanticAvailable)\n return repo.search(input.query, {\n limit: input.limit,\n offset: input.offset,\n mode: input.mode,\n tags: input.tags,\n collection_id: input.collection_id,\n date_from: input.date_from,\n date_to: input.date_to,\n is_starred: input.is_starred,\n is_archived: input.is_archived,\n format: input.format,\n source: input.source,\n visibility: input.visibility,\n include_facets: input.include_facets,\n embeddingSetId: input.embeddingSetId,\n }, input.query_embedding)\n}\n","/**\n * FortemiToolManifest — registry of all Fortemi tool definitions.\n *\n * Defines the full set of tool schemas and provides BridgeCapability\n * projection for bridge registration. Each tool definition follows the\n * WHEN/WHAT/HOW/OUT description pattern so consumers understand call sites.\n *\n * The 10 tools defined here are the initial subset covering core Fortemi\n * operations. Additional tools will be added incrementally as repositories\n * are implemented.\n */\n\nimport { z, type ZodType } from 'zod'\nimport {\n CaptureKnowledgeInputSchema,\n ManageNoteInputSchema,\n SearchInputSchema,\n} from './schemas.js'\n\n// ---------------------------------------------------------------------------\n// Public interfaces\n// ---------------------------------------------------------------------------\n\nexport interface FortemiToolDefinition {\n id: string\n name: string\n description: string\n category: 'capture' | 'search' | 'manage' | 'organize' | 'process' | 'analyze' | 'system'\n inputSchema: ZodType\n tags: string[]\n sideEffects: boolean\n requiredCapability?: string\n}\n\nexport interface BridgeCapability {\n id: string\n name: string\n description: string\n inputSchema: Record<string, unknown> // JSON Schema 7\n tags: string[]\n sideEffects: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Zod → JSON Schema conversion (simplified)\n//\n// A full implementation would delegate to `zod-to-json-schema`. This version\n// handles the concrete shapes used by Fortemi tools and is sufficient for\n// BridgeCapability projection until the dependency is added.\n// ---------------------------------------------------------------------------\n\nfunction zodToJsonSchema(schema: ZodType): Record<string, unknown> {\n if (schema instanceof z.ZodObject) {\n const shape = schema.shape as Record<string, ZodType>\n const properties: Record<string, unknown> = {}\n const required: string[] = []\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = resolvePropertySchema(value)\n\n // Required = not Optional and not Default\n if (!(value instanceof z.ZodOptional) && !(value instanceof z.ZodDefault)) {\n required.push(key)\n }\n }\n\n return {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n }\n }\n\n return { type: 'object' }\n}\n\nfunction resolvePropertySchema(value: ZodType): Record<string, unknown> {\n if (value instanceof z.ZodString) return { type: 'string' }\n if (value instanceof z.ZodNumber) return { type: 'number' }\n if (value instanceof z.ZodBoolean) return { type: 'boolean' }\n if (value instanceof z.ZodEnum) return { type: 'string', enum: value.options }\n if (value instanceof z.ZodArray) return { type: 'array' }\n if (value instanceof z.ZodRecord) return { type: 'object' }\n if (value instanceof z.ZodOptional) return resolvePropertySchema(value.unwrap())\n if (value instanceof z.ZodDefault) return resolvePropertySchema(value._def.innerType)\n if (value instanceof z.ZodObject) return zodToJsonSchema(value)\n return {}\n}\n\n// ---------------------------------------------------------------------------\n// Tool definitions\n// ---------------------------------------------------------------------------\n\nconst TOOL_DEFINITIONS: FortemiToolDefinition[] = [\n {\n id: 'fortemi.capture_knowledge',\n name: 'Capture Knowledge',\n description:\n 'WHEN you have text, ideas, or information to save. WHAT creates one or more notes in Fortemi. HOW accepts content, optional title/tags, supports create/bulk_create/from_template. OUT returns the created note(s) with full metadata.',\n category: 'capture',\n inputSchema: CaptureKnowledgeInputSchema,\n tags: ['create', 'notes', 'capture'],\n sideEffects: true,\n },\n {\n id: 'fortemi.manage_note',\n name: 'Manage Note',\n description:\n 'WHEN you need to modify an existing note. WHAT updates, deletes, restores, archives, or stars a note. HOW accepts note_id and action (update/delete/restore/archive/star). OUT returns the updated note.',\n category: 'manage',\n inputSchema: ManageNoteInputSchema,\n tags: ['update', 'delete', 'notes'],\n sideEffects: true,\n },\n {\n id: 'fortemi.search',\n name: 'Search Notes',\n description:\n 'WHEN you need to find notes by content or metadata. WHAT performs full-text search across all notes. HOW accepts query string with optional tag/collection filters. OUT returns ranked results with highlighted snippets.',\n category: 'search',\n inputSchema: SearchInputSchema,\n tags: ['search', 'find', 'query'],\n sideEffects: false,\n },\n {\n id: 'fortemi.get_note',\n name: 'Get Note',\n description:\n 'WHEN you need the full content of a specific note. WHAT retrieves a single note by ID. HOW accepts note_id. OUT returns complete note with content, metadata, tags, and revision info.',\n category: 'manage',\n inputSchema: z.object({ note_id: z.string() }),\n tags: ['read', 'notes'],\n sideEffects: false,\n },\n {\n id: 'fortemi.list_notes',\n name: 'List Notes',\n description:\n 'WHEN you need to browse or filter notes. WHAT lists notes with pagination and filtering. HOW accepts optional filters (starred, archived, tags, collection). OUT returns paginated note summaries.',\n category: 'manage',\n inputSchema: z.object({\n limit: z.number().int().min(1).max(100).default(50),\n offset: z.number().int().min(0).default(0),\n sort: z.enum(['created_at', 'updated_at', 'title']).default('created_at'),\n order: z.enum(['asc', 'desc']).default('desc'),\n is_starred: z.boolean().optional(),\n is_archived: z.boolean().optional(),\n tags: z.array(z.string()).optional(),\n collection_id: z.string().optional(),\n }),\n tags: ['list', 'browse', 'notes'],\n sideEffects: false,\n },\n {\n id: 'fortemi.manage_tags',\n name: 'Manage Tags',\n description:\n 'WHEN you need to organize notes with tags. WHAT adds or removes tags from notes. HOW accepts note_id, action (add/remove), and tag string. OUT confirms the tag operation.',\n category: 'organize',\n inputSchema: z.object({\n action: z.enum(['add', 'remove', 'list']),\n note_id: z.string().optional(),\n tag: z.string().optional(),\n }),\n tags: ['tags', 'organize'],\n sideEffects: true,\n },\n {\n id: 'fortemi.manage_collections',\n name: 'Manage Collections',\n description:\n 'WHEN you need to organize notes into folders. WHAT creates, updates, or manages collections. HOW accepts collection operations (create/list/assign/delete). OUT returns collection data.',\n category: 'organize',\n inputSchema: z.object({\n action: z.enum(['create', 'list', 'assign', 'unassign', 'delete']),\n name: z.string().optional(),\n collection_id: z.string().optional(),\n note_id: z.string().optional(),\n }),\n tags: ['collections', 'folders', 'organize'],\n sideEffects: true,\n },\n {\n id: 'fortemi.manage_links',\n name: 'Manage Links',\n description:\n 'WHEN you need to connect related notes. WHAT creates bidirectional links between notes. HOW accepts source/target note IDs and link type. OUT returns the link data.',\n category: 'organize',\n inputSchema: z.object({\n action: z.enum(['create', 'list', 'delete']),\n source_note_id: z.string().optional(),\n target_note_id: z.string().optional(),\n link_id: z.string().optional(),\n link_type: z.string().default('related'),\n }),\n tags: ['links', 'connections'],\n sideEffects: true,\n },\n {\n id: 'fortemi.manage_archive',\n name: 'Manage Archive',\n description:\n 'WHEN you need to switch between or manage knowledge archives. WHAT creates, lists, switches, or deletes archives. HOW accepts archive name and operation. OUT returns archive info.',\n category: 'system',\n inputSchema: z.object({\n action: z.enum(['list', 'create', 'switch', 'delete']),\n name: z.string().optional(),\n }),\n tags: ['archive', 'system'],\n sideEffects: true,\n },\n {\n id: 'fortemi.manage_capabilities',\n name: 'Manage Capabilities',\n description:\n 'WHEN you need to enable optional features like vector search or LLM. WHAT enables, disables, or queries WASM capability modules. HOW accepts capability name and action. OUT returns capability status.',\n category: 'system',\n inputSchema: z.object({\n action: z.enum(['list', 'enable', 'disable', 'status']),\n capability: z.string().optional(),\n }),\n tags: ['capabilities', 'system', 'wasm'],\n sideEffects: true,\n },\n]\n\n// ---------------------------------------------------------------------------\n// FortemiToolManifest\n// ---------------------------------------------------------------------------\n\nexport class FortemiToolManifest {\n private tools: Map<string, FortemiToolDefinition>\n\n constructor() {\n this.tools = new Map()\n for (const tool of TOOL_DEFINITIONS) {\n this.tools.set(tool.id, tool)\n }\n }\n\n /** Look up a single tool by its fully-qualified id. */\n get(id: string): FortemiToolDefinition | undefined {\n return this.tools.get(id)\n }\n\n /** Return all registered tools as a snapshot array. */\n list(): FortemiToolDefinition[] {\n return [...this.tools.values()]\n }\n\n /** Return tools matching a custom predicate. */\n filter(predicate: (tool: FortemiToolDefinition) => boolean): FortemiToolDefinition[] {\n return this.list().filter(predicate)\n }\n\n /** Return tools belonging to a specific category. */\n byCategory(category: string): FortemiToolDefinition[] {\n return this.filter(t => t.category === category)\n }\n\n /**\n * Full-text search across tool name, description, and tags.\n * Case-insensitive.\n */\n search(query: string): FortemiToolDefinition[] {\n const q = query.toLowerCase()\n return this.filter(\n t =>\n t.name.toLowerCase().includes(q) ||\n t.description.toLowerCase().includes(q) ||\n t.tags.some(tag => tag.includes(q)),\n )\n }\n\n /** Project all tools as BridgeCapability entries for bridge registration. */\n toBridgeCapabilities(): BridgeCapability[] {\n return this.list().map(tool => ({\n id: tool.id,\n name: tool.name,\n description: tool.description,\n inputSchema: zodToJsonSchema(tool.inputSchema),\n tags: tool.tags,\n sideEffects: tool.sideEffects,\n }))\n }\n\n /** Return the count of tools in each category. */\n getCategoryCounts(): Record<string, number> {\n const counts: Record<string, number> = {}\n for (const tool of this.tools.values()) {\n counts[tool.category] = (counts[tool.category] ?? 0) + 1\n }\n return counts\n }\n}\n\n// Convenience singleton — use this in application code.\nexport const fortemiManifest = new FortemiToolManifest()\n","import type { DatabaseClient } from '../storage-backend.js'\nimport type { TypedEventBus } from '../event-bus.js'\nimport { z } from 'zod'\nimport { NotesRepository } from '../repositories/notes-repository.js'\nimport type { NoteFull } from '../repositories/types.js'\n\nexport const GetNoteInputSchema = z.object({ note_id: z.string() })\nexport type GetNoteInput = z.infer<typeof GetNoteInputSchema>\n\nexport async function getNote(db: DatabaseClient, rawInput: unknown, events?: TypedEventBus): Promise<NoteFull> {\n const input = GetNoteInputSchema.parse(rawInput)\n const repo = new NotesRepository(db, events)\n return repo.get(input.note_id)\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport type { TypedEventBus } from '../event-bus.js'\nimport { z } from 'zod'\nimport { NotesRepository } from '../repositories/notes-repository.js'\nimport type { NoteSummary, PaginatedResult } from '../repositories/types.js'\n\nexport const ListNotesInputSchema = z.object({\n limit: z.number().int().min(1).max(100).default(50),\n offset: z.number().int().min(0).default(0),\n sort: z.enum(['created_at', 'updated_at', 'title']).default('created_at'),\n order: z.enum(['asc', 'desc']).default('desc'),\n is_starred: z.boolean().optional(),\n is_archived: z.boolean().optional(),\n tags: z.array(z.string()).optional(),\n collection_id: z.string().optional(),\n include_deleted: z.boolean().optional(),\n})\nexport type ListNotesInput = z.infer<typeof ListNotesInputSchema>\n\nexport async function listNotes(db: DatabaseClient, rawInput: unknown, events?: TypedEventBus): Promise<PaginatedResult<NoteSummary>> {\n const input = ListNotesInputSchema.parse(rawInput)\n const repo = new NotesRepository(db, events)\n return repo.list(input)\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { z } from 'zod'\nimport { TagsRepository } from '../repositories/tags-repository.js'\n\nexport const ManageTagsInputSchema = z.object({\n action: z.enum(['add', 'remove', 'list_for_note', 'list_all']),\n note_id: z.string().optional(),\n tag: z.string().optional(),\n})\nexport type ManageTagsInput = z.infer<typeof ManageTagsInputSchema>\n\nexport interface ManageTagsResult {\n action: string\n tags?: string[]\n all_tags?: Array<{ tag: string; count: number }>\n}\n\nexport async function manageTags(db: DatabaseClient, rawInput: unknown): Promise<ManageTagsResult> {\n const input = ManageTagsInputSchema.parse(rawInput)\n const repo = new TagsRepository(db)\n\n switch (input.action) {\n case 'add': {\n if (!input.note_id || !input.tag) throw new Error('note_id and tag required for add')\n await repo.addTag(input.note_id, input.tag)\n const tags = await repo.getTagsForNote(input.note_id)\n return { action: 'add', tags }\n }\n case 'remove': {\n if (!input.note_id || !input.tag) throw new Error('note_id and tag required for remove')\n await repo.removeTag(input.note_id, input.tag)\n const tags = await repo.getTagsForNote(input.note_id)\n return { action: 'remove', tags }\n }\n case 'list_for_note': {\n if (!input.note_id) throw new Error('note_id required for list_for_note')\n const tags = await repo.getTagsForNote(input.note_id)\n return { action: 'list_for_note', tags }\n }\n case 'list_all': {\n const all_tags = await repo.listAllTags()\n return { action: 'list_all', all_tags }\n }\n }\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { z } from 'zod'\nimport { CollectionsRepository } from '../repositories/collections-repository.js'\nimport type { CollectionRow } from '../repositories/collections-repository.js'\n\nexport const ManageCollectionsInputSchema = z.object({\n action: z.enum(['create', 'list', 'list_tree', 'assign', 'unassign', 'delete']),\n name: z.string().optional(),\n description: z.string().optional(),\n parent_id: z.string().optional(),\n collection_id: z.string().optional(),\n note_id: z.string().optional(),\n})\nexport type ManageCollectionsInput = z.infer<typeof ManageCollectionsInputSchema>\n\nexport interface ManageCollectionsResult {\n action: string\n collection?: CollectionRow\n collections?: CollectionRow[]\n tree?: Array<CollectionRow & { children: CollectionRow[] }>\n collection_id?: string\n note_id?: string\n}\n\nexport async function manageCollections(db: DatabaseClient, rawInput: unknown): Promise<ManageCollectionsResult> {\n const input = ManageCollectionsInputSchema.parse(rawInput)\n const repo = new CollectionsRepository(db)\n\n switch (input.action) {\n case 'create': {\n if (!input.name) throw new Error('name required for create')\n const collection = await repo.create({ name: input.name, description: input.description, parent_id: input.parent_id })\n return { action: 'create', collection }\n }\n case 'list': {\n const collections = await repo.list()\n return { action: 'list', collections }\n }\n case 'list_tree': {\n const tree = await repo.listTree()\n return { action: 'list_tree', tree }\n }\n case 'assign': {\n if (!input.collection_id || !input.note_id) throw new Error('collection_id and note_id required')\n await repo.assignNote(input.collection_id, input.note_id)\n return { action: 'assign', collection_id: input.collection_id, note_id: input.note_id }\n }\n case 'unassign': {\n if (!input.collection_id || !input.note_id) throw new Error('collection_id and note_id required')\n await repo.unassignNote(input.collection_id, input.note_id)\n return { action: 'unassign', collection_id: input.collection_id, note_id: input.note_id }\n }\n case 'delete': {\n if (!input.collection_id) throw new Error('collection_id required for delete')\n await repo.delete(input.collection_id)\n return { action: 'delete', collection_id: input.collection_id }\n }\n }\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { z } from 'zod'\nimport { LinksRepository } from '../repositories/links-repository.js'\nimport type { LinkRow } from '../repositories/links-repository.js'\n\nexport const ManageLinksInputSchema = z.object({\n action: z.enum(['create', 'list', 'backlinks', 'delete']),\n source_note_id: z.string().optional(),\n target_note_id: z.string().optional(),\n link_id: z.string().optional(),\n link_type: z.string().default('related'),\n note_id: z.string().optional(),\n})\nexport type ManageLinksInput = z.infer<typeof ManageLinksInputSchema>\n\nexport interface ManageLinksResult {\n action: string\n link?: LinkRow\n outbound?: LinkRow[]\n inbound?: LinkRow[]\n backlinks?: string[]\n link_id?: string\n}\n\nexport async function manageLinks(db: DatabaseClient, rawInput: unknown): Promise<ManageLinksResult> {\n const input = ManageLinksInputSchema.parse(rawInput)\n const repo = new LinksRepository(db)\n\n switch (input.action) {\n case 'create': {\n if (!input.source_note_id || !input.target_note_id) throw new Error('source_note_id and target_note_id required')\n const link = await repo.create(input.source_note_id, input.target_note_id, input.link_type)\n return { action: 'create', link }\n }\n case 'list': {\n if (!input.note_id) throw new Error('note_id required for list')\n const { outbound, inbound } = await repo.listForNote(input.note_id)\n return { action: 'list', outbound, inbound }\n }\n case 'backlinks': {\n if (!input.note_id) throw new Error('note_id required for backlinks')\n const backlinks = await repo.getBacklinks(input.note_id)\n return { action: 'backlinks', backlinks }\n }\n case 'delete': {\n if (!input.link_id) throw new Error('link_id required for delete')\n await repo.delete(input.link_id)\n return { action: 'delete', link_id: input.link_id }\n }\n }\n}\n","import { z } from 'zod'\nimport { ArchiveManager } from '../archive-manager.js'\nimport type { ArchiveInfo } from '../archive-manager.js'\n\nexport const ManageArchiveInputSchema = z.object({\n action: z.enum(['list', 'create', 'switch', 'delete']),\n name: z.string().optional(),\n})\nexport type ManageArchiveInput = z.infer<typeof ManageArchiveInputSchema>\n\nexport interface ManageArchiveResult {\n action: string\n archives?: ArchiveInfo[]\n current?: string\n name?: string\n}\n\nexport async function manageArchive(archiveManager: ArchiveManager, rawInput: unknown): Promise<ManageArchiveResult> {\n const input = ManageArchiveInputSchema.parse(rawInput)\n\n switch (input.action) {\n case 'list': {\n const archives = archiveManager.listArchives()\n return { action: 'list', archives, current: archiveManager.getCurrentArchiveName() }\n }\n case 'create': {\n if (!input.name) throw new Error('name required for create')\n await archiveManager.open(input.name)\n return { action: 'create', name: input.name, current: archiveManager.getCurrentArchiveName() }\n }\n case 'switch': {\n if (!input.name) throw new Error('name required for switch')\n await archiveManager.switchTo(input.name)\n return { action: 'switch', name: input.name, current: archiveManager.getCurrentArchiveName() }\n }\n case 'delete': {\n if (!input.name) throw new Error('name required for delete')\n await archiveManager.delete(input.name)\n return { action: 'delete', name: input.name }\n }\n }\n}\n","import { z } from 'zod'\nimport { CapabilityManager } from '../capability-manager.js'\nimport type { CapabilityName, CapabilityState } from '../capability-manager.js'\n\nexport const ManageCapabilitiesInputSchema = z.object({\n action: z.enum(['list', 'enable', 'disable', 'status']),\n capability: z.string().optional(),\n})\nexport type ManageCapabilitiesInput = z.infer<typeof ManageCapabilitiesInputSchema>\n\nexport interface CapabilityInfo {\n name: CapabilityName\n state: CapabilityState\n error?: string\n}\n\nexport interface ManageCapabilitiesResult {\n action: string\n capabilities?: Array<{ name: CapabilityName; state: CapabilityState }>\n capability?: CapabilityInfo\n}\n\nexport async function manageCapabilities(capabilityManager: CapabilityManager, rawInput: unknown): Promise<ManageCapabilitiesResult> {\n const input = ManageCapabilitiesInputSchema.parse(rawInput)\n\n switch (input.action) {\n case 'list': {\n return { action: 'list', capabilities: capabilityManager.listAll() }\n }\n case 'enable': {\n if (!input.capability) throw new Error('capability required for enable')\n const name = input.capability as CapabilityName\n await capabilityManager.enable(name)\n return {\n action: 'enable',\n capability: {\n name,\n state: capabilityManager.getState(name),\n error: capabilityManager.getError(name),\n },\n }\n }\n case 'disable': {\n if (!input.capability) throw new Error('capability required for disable')\n const name = input.capability as CapabilityName\n capabilityManager.disable(name)\n return {\n action: 'disable',\n capability: {\n name,\n state: capabilityManager.getState(name),\n error: capabilityManager.getError(name),\n },\n }\n }\n case 'status': {\n if (!input.capability) throw new Error('capability required for status')\n const name = input.capability as CapabilityName\n return {\n action: 'status',\n capability: {\n name,\n state: capabilityManager.getState(name),\n error: capabilityManager.getError(name),\n },\n }\n }\n }\n}\n","/**\n * AttachmentsRepository — attach and retrieve binary files linked to notes.\n *\n * Responsibilities:\n * - Content-addressed blob deduplication via SHA-256 hash\n * - Store blob metadata in DatabaseClient (attachment_blob table)\n * - Store binary data in a BlobStore implementation\n * - Create/soft-delete attachment records linked to notes\n * - List active attachments for a note\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport type { BlobStore } from '../blob-store.js'\nimport { generateId } from '../uuid.js'\nimport { computeHash } from '../hash.js'\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface AttachmentRow {\n id: string\n note_id: string\n blob_id: string\n document_type_id: string | null\n filename: string\n display_name: string | null\n position: number\n created_at: Date\n deleted_at: Date | null\n}\n\nexport interface AttachmentBlobRow {\n id: string\n content_hash: string\n size_bytes: number\n storage_path: string | null\n created_at: Date\n}\n\nexport interface AttachInput {\n noteId: string\n data: Uint8Array\n filename: string\n mimeType?: string\n displayName?: string\n}\n\n// ── Repository ────────────────────────────────────────────────────────────────\n\nexport class AttachmentsRepository {\n constructor(\n private db: DatabaseClient,\n private blobStore: BlobStore,\n ) {}\n\n /**\n * Attach a binary file to a note.\n *\n * If a blob with the same SHA-256 content hash already exists, the existing\n * blob row is reused (deduplication). Otherwise a new blob row is inserted\n * and the raw bytes are written to the BlobStore.\n *\n * Returns the newly created AttachmentRow.\n */\n async attach(input: AttachInput): Promise<AttachmentRow> {\n const contentHash = computeHash(input.data)\n const sizeBytes = input.data.length\n\n // ── blob deduplication ──────────────────────────────────────────────────\n let blobId: string\n const existing = await this.db.query<{ id: string }>(\n `SELECT id FROM attachment_blob WHERE content_hash = $1`,\n [contentHash],\n )\n\n if (existing.rows.length > 0) {\n blobId = existing.rows[0].id\n } else {\n blobId = generateId()\n await this.blobStore.write(contentHash, input.data)\n await this.db.query(\n `INSERT INTO attachment_blob (id, content_hash, size_bytes) VALUES ($1, $2, $3)`,\n [blobId, contentHash, sizeBytes],\n )\n }\n\n // ── attachment record ───────────────────────────────────────────────────\n const attachmentId = generateId()\n await this.db.query(\n `INSERT INTO attachment (id, note_id, blob_id, filename, display_name)\n VALUES ($1, $2, $3, $4, $5)`,\n [attachmentId, input.noteId, blobId, input.filename, input.displayName ?? null],\n )\n\n return this.get(attachmentId)\n }\n\n /**\n * Fetch an attachment row by its ID.\n * Throws when no row exists.\n */\n async get(id: string): Promise<AttachmentRow> {\n const result = await this.db.query<AttachmentRow>(\n `SELECT * FROM attachment WHERE id = $1`,\n [id],\n )\n if (result.rows.length === 0) throw new Error(`Attachment not found: ${id}`)\n return result.rows[0]\n }\n\n /**\n * Retrieve the raw binary data for an attachment.\n * Returns null if the blob cannot be found in the BlobStore.\n */\n async getBlob(attachmentId: string): Promise<Uint8Array | null> {\n const att = await this.get(attachmentId)\n const blob = await this.db.query<{ content_hash: string }>(\n `SELECT content_hash FROM attachment_blob WHERE id = $1`,\n [att.blob_id],\n )\n if (blob.rows.length === 0) return null\n return this.blobStore.read(blob.rows[0].content_hash)\n }\n\n /**\n * List active (non-deleted) attachments for a note.\n * Ordered by position ascending, then created_at ascending.\n */\n async list(noteId: string): Promise<AttachmentRow[]> {\n const result = await this.db.query<AttachmentRow>(\n `SELECT * FROM attachment\n WHERE note_id = $1 AND deleted_at IS NULL\n ORDER BY position ASC, created_at ASC`,\n [noteId],\n )\n return result.rows\n }\n\n /**\n * Soft-delete an attachment by setting deleted_at to the current timestamp.\n * The underlying blob row and BlobStore data are not removed.\n */\n async delete(id: string): Promise<void> {\n await this.db.query(\n `UPDATE attachment SET deleted_at = now() WHERE id = $1`,\n [id],\n )\n }\n}\n","import type { DatabaseClient } from '../storage-backend.js'\nimport { z } from 'zod'\nimport { AttachmentsRepository } from '../repositories/attachments-repository.js'\nimport type { AttachmentRow } from '../repositories/attachments-repository.js'\nimport type { BlobStore } from '../blob-store.js'\n\nexport const ManageAttachmentsInputSchema = z.object({\n action: z.enum(['attach', 'list', 'get', 'get_blob', 'delete']),\n note_id: z.string().optional(),\n attachment_id: z.string().optional(),\n /** Base64-encoded file data for the 'attach' action */\n data_base64: z.string().optional(),\n filename: z.string().optional(),\n mime_type: z.string().optional(),\n display_name: z.string().optional(),\n})\nexport type ManageAttachmentsInput = z.infer<typeof ManageAttachmentsInputSchema>\n\nexport interface ManageAttachmentsResult {\n action: string\n attachment?: AttachmentRow\n attachments?: AttachmentRow[]\n attachment_id?: string\n /** Base64-encoded blob data for 'get_blob' action */\n data_base64?: string\n size_bytes?: number\n}\n\nexport async function manageAttachments(\n db: DatabaseClient,\n blobStore: BlobStore,\n rawInput: unknown,\n): Promise<ManageAttachmentsResult> {\n const input = ManageAttachmentsInputSchema.parse(rawInput)\n const repo = new AttachmentsRepository(db, blobStore)\n\n switch (input.action) {\n case 'attach': {\n if (!input.note_id) throw new Error('note_id required for attach')\n if (!input.data_base64) throw new Error('data_base64 required for attach')\n if (!input.filename) throw new Error('filename required for attach')\n\n // Decode base64 to Uint8Array\n const binaryStr = atob(input.data_base64)\n const data = new Uint8Array(binaryStr.length)\n for (let i = 0; i < binaryStr.length; i++) data[i] = binaryStr.charCodeAt(i)\n\n const attachment = await repo.attach({\n noteId: input.note_id,\n data,\n filename: input.filename,\n mimeType: input.mime_type,\n displayName: input.display_name,\n })\n return { action: 'attach', attachment, size_bytes: data.length }\n }\n case 'list': {\n if (!input.note_id) throw new Error('note_id required for list')\n const attachments = await repo.list(input.note_id)\n return { action: 'list', attachments }\n }\n case 'get': {\n if (!input.attachment_id) throw new Error('attachment_id required for get')\n const attachment = await repo.get(input.attachment_id)\n return { action: 'get', attachment }\n }\n case 'get_blob': {\n if (!input.attachment_id) throw new Error('attachment_id required for get_blob')\n const blob = await repo.getBlob(input.attachment_id)\n if (!blob) throw new Error(`Blob not found for attachment ${input.attachment_id}`)\n\n // Encode Uint8Array to base64 for JSON transport\n let binary = ''\n for (let i = 0; i < blob.length; i++) binary += String.fromCharCode(blob[i])\n const data_base64 = btoa(binary)\n\n return { action: 'get_blob', attachment_id: input.attachment_id, data_base64, size_bytes: blob.length }\n }\n case 'delete': {\n if (!input.attachment_id) throw new Error('attachment_id required for delete')\n await repo.delete(input.attachment_id)\n return { action: 'delete', attachment_id: input.attachment_id }\n }\n }\n}\n","/**\n * GPU capability detection for WebGPU-based LLM inference.\n * Used to select appropriate model tier based on available GPU memory.\n *\n * @implements #61 GPU capability detection\n */\n\nexport interface GpuCapabilities {\n webgpuAvailable: boolean\n vendor: string\n architecture: string\n maxBufferSizeBytes: number\n supportsF16: boolean\n}\n\nexport type VramTier = 'low' | 'medium' | 'high' | 'unknown'\n\ntype AdapterLike = {\n info?: Record<string, string>\n limits?: Record<string, number>\n features?: { has(f: string): boolean }\n}\ntype GpuApi = { requestAdapter(options?: Record<string, string>): Promise<AdapterLike | null> }\n\nconst NO_GPU: GpuCapabilities = { webgpuAvailable: false, vendor: 'none', architecture: 'unknown', maxBufferSizeBytes: 0, supportsF16: false }\n\nfunction capsFromAdapter(adapter: AdapterLike, archSuffix = ''): GpuCapabilities {\n const info = adapter.info ?? {}\n const limits = adapter.limits ?? {}\n const f16 = adapter.features?.has('shader-f16') ?? false\n return {\n webgpuAvailable: true,\n vendor: info.vendor ?? 'unknown',\n architecture: (info.architecture ?? 'unknown') + archSuffix,\n maxBufferSizeBytes: limits.maxBufferSize ?? 0,\n supportsF16: f16,\n }\n}\n\nexport async function detectGpuCapabilities(): Promise<GpuCapabilities> {\n if (typeof navigator === 'undefined' || !('gpu' in navigator)) return NO_GPU\n\n try {\n const gpu = (navigator as unknown as { gpu: GpuApi }).gpu\n const preferences: Array<Record<string, string>> = [\n { powerPreference: 'high-performance' },\n { powerPreference: 'low-power' },\n {},\n ]\n\n let swiftshaderAdapter: AdapterLike | null = null\n\n for (const pref of preferences) {\n const adapter = await gpu.requestAdapter(pref)\n if (!adapter) continue\n\n const arch = (adapter.info?.architecture ?? '').toLowerCase()\n const vendor = (adapter.info?.vendor ?? '').toLowerCase()\n\n if (arch === 'swiftshader' || vendor === 'google') {\n if (!swiftshaderAdapter) swiftshaderAdapter = adapter\n continue\n }\n\n return capsFromAdapter(adapter)\n }\n\n if (swiftshaderAdapter) return capsFromAdapter(swiftshaderAdapter, ' (software)')\n return { ...NO_GPU, vendor: 'unavailable' }\n } catch {\n return { ...NO_GPU, vendor: 'error', architecture: 'error' }\n }\n}\n\nexport function estimateVramTier(caps: GpuCapabilities): VramTier {\n if (!caps.webgpuAvailable) return 'unknown'\n const mb = caps.maxBufferSizeBytes / (1024 * 1024)\n if (mb <= 256) return 'low'\n if (mb <= 2048) return 'medium'\n return 'high'\n}\n\n/**\n * Select an LLM model based on VRAM tier and f16 shader support.\n * Uses f32 quantization when f16 shaders aren't available (e.g., SwiftShader).\n */\nexport function selectLlmModel(tier: VramTier, supportsF16 = false): string {\n const q = supportsF16 ? 'q4f16_1' : 'q4f32_1'\n switch (tier) {\n case 'high':\n return `Hermes-3-Llama-3.2-3B-${q}-MLC`\n case 'medium':\n return `Qwen3-1.7B-${q}-MLC`\n case 'low':\n case 'unknown':\n return `Qwen3-0.6B-${q}-MLC`\n }\n}\n","/**\n * Enhanced inference capability detection.\n * Extends gpu-detect.ts with VRAM estimation, model fit, Chrome AI, and WebNN detection.\n *\n * @implements #115 hardware capability detection improvements\n */\n\nimport { detectGpuCapabilities, estimateVramTier, type GpuCapabilities, type VramTier } from './gpu-detect.js'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type RecommendedTier = 'high' | 'medium' | 'low' | 'cpu-only'\n\nexport interface InferenceCapabilities {\n webgpu: boolean\n wasm: boolean\n webnn: boolean\n sharedArrayBuffer: boolean\n chromeAI: boolean\n estimatedVramMB: number\n recommendedTier: RecommendedTier\n gpu: GpuCapabilities\n vramTier: VramTier\n}\n\nexport interface ModelFitResult {\n fits: boolean\n estimatedVramMB: number\n availableVramMB: number\n recommendation: string\n}\n\n// ---------------------------------------------------------------------------\n// Known GPU VRAM heuristics\n// ---------------------------------------------------------------------------\n\ninterface GpuVramHeuristic {\n pattern: RegExp\n vramMB: number\n}\n\nconst GPU_VRAM_HEURISTICS: GpuVramHeuristic[] = [\n // Apple M-series (unified memory, ~70% available for GPU)\n { pattern: /apple.*m4\\s*pro/i, vramMB: 16384 },\n { pattern: /apple.*m4\\s*max/i, vramMB: 25600 },\n { pattern: /apple.*m4/i, vramMB: 11264 },\n { pattern: /apple.*m3\\s*pro/i, vramMB: 12800 },\n { pattern: /apple.*m3\\s*max/i, vramMB: 25600 },\n { pattern: /apple.*m3/i, vramMB: 5632 },\n { pattern: /apple.*m2\\s*pro/i, vramMB: 12800 },\n { pattern: /apple.*m2\\s*max/i, vramMB: 21504 },\n { pattern: /apple.*m2/i, vramMB: 5632 },\n { pattern: /apple.*m1\\s*pro/i, vramMB: 11264 },\n { pattern: /apple.*m1\\s*max/i, vramMB: 21504 },\n { pattern: /apple.*m1/i, vramMB: 5632 },\n\n // NVIDIA (discrete VRAM)\n { pattern: /rtx\\s*40[89]0/i, vramMB: 16384 },\n { pattern: /rtx\\s*4070/i, vramMB: 12288 },\n { pattern: /rtx\\s*4060/i, vramMB: 8192 },\n { pattern: /rtx\\s*30[89]0/i, vramMB: 10240 },\n { pattern: /rtx\\s*3070/i, vramMB: 8192 },\n { pattern: /rtx\\s*3060/i, vramMB: 12288 },\n\n // AMD (discrete VRAM)\n { pattern: /rx\\s*7900/i, vramMB: 20480 },\n { pattern: /rx\\s*7800/i, vramMB: 16384 },\n { pattern: /rx\\s*7600/i, vramMB: 8192 },\n\n // Intel Arc\n { pattern: /arc\\s*a770/i, vramMB: 16384 },\n { pattern: /arc\\s*a750/i, vramMB: 8192 },\n { pattern: /arc\\s*a580/i, vramMB: 8192 },\n]\n\n/**\n * Estimate VRAM in MB using known GPU heuristics.\n * Falls back to maxBufferSize-based estimation if no match.\n */\nexport function estimateVramMB(gpu: GpuCapabilities): number {\n if (!gpu.webgpuAvailable) return 0\n\n // Try to match against known GPU architectures\n const combinedInfo = `${gpu.vendor} ${gpu.architecture}`.toLowerCase()\n for (const h of GPU_VRAM_HEURISTICS) {\n if (h.pattern.test(combinedInfo)) {\n return h.vramMB\n }\n }\n\n // Fallback: use maxBufferSize as a rough proxy\n // Most GPUs report maxBufferSize as ~25-50% of total VRAM\n const bufferMB = gpu.maxBufferSizeBytes / (1024 * 1024)\n if (bufferMB > 0) {\n return Math.round(bufferMB * 2.5)\n }\n\n return 0\n}\n\n/**\n * Estimate whether a model will fit in available VRAM.\n */\nexport function estimateModelFit(\n modelSizeMB: number,\n availableVramMB: number,\n): ModelFitResult {\n // Models need ~20% overhead for KV cache and runtime\n const requiredMB = Math.round(modelSizeMB * 1.2)\n const fits = availableVramMB >= requiredMB\n\n let recommendation: string\n if (fits) {\n const headroom = availableVramMB - requiredMB\n if (headroom > modelSizeMB * 0.5) {\n recommendation = `This model requires ~${requiredMB}MB VRAM. Your GPU has ~${availableVramMB}MB — plenty of headroom.`\n } else {\n recommendation = `This model requires ~${requiredMB}MB VRAM. Your GPU has ~${availableVramMB}MB — tight but should work.`\n }\n } else {\n recommendation = `This model requires ~${requiredMB}MB VRAM but your GPU only has ~${availableVramMB}MB. Consider a smaller model or use a remote provider.`\n }\n\n return {\n fits,\n estimatedVramMB: requiredMB,\n availableVramMB,\n recommendation,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Chrome Built-in AI detection\n// ---------------------------------------------------------------------------\n\n/**\n * Detect Chrome Built-in AI (Gemini Nano) availability.\n * This API is experimental and behind flags in Chrome 127+.\n */\nasync function detectChromeAI(): Promise<boolean> {\n try {\n if (typeof globalThis === 'undefined') return false\n // Chrome exposes ai.languageModel on the window object\n const ai = (globalThis as Record<string, unknown>).ai as\n | { languageModel?: { capabilities?: () => Promise<{ available: string }> } }\n | undefined\n if (!ai?.languageModel?.capabilities) return false\n const caps = await ai.languageModel.capabilities()\n return caps.available === 'readily' || caps.available === 'after-download'\n } catch {\n return false\n }\n}\n\n// ---------------------------------------------------------------------------\n// WebNN detection\n// ---------------------------------------------------------------------------\n\nfunction detectWebNN(): boolean {\n try {\n return typeof globalThis !== 'undefined' && 'ml' in (globalThis.navigator ?? {})\n } catch {\n return false\n }\n}\n\n// ---------------------------------------------------------------------------\n// SharedArrayBuffer detection\n// ---------------------------------------------------------------------------\n\nfunction detectSharedArrayBuffer(): boolean {\n try {\n return typeof SharedArrayBuffer !== 'undefined'\n } catch {\n return false\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main detection function\n// ---------------------------------------------------------------------------\n\nfunction deriveRecommendedTier(vramMB: number, gpu: GpuCapabilities): RecommendedTier {\n if (!gpu.webgpuAvailable) return 'cpu-only'\n if (vramMB >= 8192) return 'high'\n if (vramMB >= 2048) return 'medium'\n if (vramMB > 0) return 'low'\n return 'cpu-only'\n}\n\n/**\n * Comprehensive inference capability detection.\n * Superset of detectGpuCapabilities() — adds VRAM estimation, WebNN, Chrome AI, etc.\n */\nexport async function detectInferenceCapabilities(): Promise<InferenceCapabilities> {\n const [gpu, chromeAI] = await Promise.all([\n detectGpuCapabilities(),\n detectChromeAI(),\n ])\n\n const vramTier = estimateVramTier(gpu)\n const vramMB = estimateVramMB(gpu)\n const webnn = detectWebNN()\n const sharedArrayBuffer = detectSharedArrayBuffer()\n\n return {\n webgpu: gpu.webgpuAvailable,\n wasm: true, // Always available in modern browsers\n webnn,\n sharedArrayBuffer,\n chromeAI,\n estimatedVramMB: vramMB,\n recommendedTier: deriveRecommendedTier(vramMB, gpu),\n gpu,\n vramTier,\n }\n}\n","/**\n * Text chunking utility for embedding generation.\n * Splits long text into overlapping chunks suitable for embedding models.\n *\n * @implements #63 embedding pipeline prerequisite\n */\n\n/** Split text into overlapping chunks for embedding. */\nexport function chunkText(text: string, maxChars = 800, overlap = 100): string[] {\n if (text.length <= maxChars) return [text]\n const chunks: string[] = []\n let start = 0\n while (start < text.length) {\n chunks.push(text.slice(start, start + maxChars))\n start += maxChars - overlap\n }\n return chunks\n}\n","/**\n * Embedding generation job handler.\n * Generates and stores vector embeddings for note content.\n * Embed function is injected via setEmbedFunction — no WASM loaded by default.\n *\n * @implements #63 embedding generation\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { EmbeddingSetsRepository } from '../repositories/embedding-sets-repository.js'\nimport { chunkText } from './chunking.js'\n\n/** Type for the embed function — injected by the semantic capability module */\nexport type EmbedFunction = (texts: string[]) => Promise<number[][]>\n\nlet embedFn: EmbedFunction | null = null\n\nexport function setEmbedFunction(fn: EmbedFunction | null): void {\n embedFn = fn\n}\n\nexport function getEmbedFunction(): EmbedFunction | null {\n return embedFn\n}\n\n/**\n * Average multiple embeddings into a single vector.\n * Used to collapse chunk embeddings into one representative vector per note.\n */\nfunction averageEmbeddings(embeddings: number[][]): number[] {\n if (embeddings.length === 1) return embeddings[0]\n const dims = embeddings[0].length\n const avg = new Array<number>(dims).fill(0)\n for (const emb of embeddings) {\n for (let i = 0; i < dims; i++) {\n avg[i] += emb[i]\n }\n }\n for (let i = 0; i < dims; i++) {\n avg[i] /= embeddings.length\n }\n // Normalize\n const norm = Math.sqrt(avg.reduce((s, v) => s + v * v, 0))\n return norm > 0 ? avg.map(v => v / norm) : avg\n}\n\n/** Job handler for embedding generation. Registered in JobQueueWorker. */\nexport async function embeddingGenerationHandler(\n job: { note_id: string },\n db: DatabaseClient,\n): Promise<unknown> {\n const fn = embedFn\n if (!fn) return { skipped: true, reason: 'no embed function registered' }\n\n // Get note content\n const noteResult = await db.query<{ content: string }>(\n `SELECT content FROM note_revised_current WHERE note_id = $1`,\n [job.note_id],\n )\n if (noteResult.rows.length === 0) throw new Error(`No content for note ${job.note_id}`)\n\n const content = noteResult.rows[0].content\n const chunks = chunkText(content)\n\n // Generate embeddings for all chunks\n const embeddings = await fn(chunks)\n\n // Average all chunk embeddings into one vector for storage\n const vector = averageEmbeddings(embeddings)\n\n const embeddingSets = new EmbeddingSetsRepository(db)\n const set = await embeddingSets.ensureDefault()\n await embeddingSets.putEmbedding({\n note_id: job.note_id,\n embedding_set_id: set.id,\n vector,\n })\n\n return { chunks: chunks.length, embeddings: embeddings.length, setId: set.id }\n}\n","/**\n * Auto-tagging utility using embedding similarity.\n * Suggests tags based on cosine similarity between note and tag vocabulary embeddings.\n *\n * @implements #67 auto-tagging\n */\n\n/** Cosine similarity between two normalized vectors (dot product) */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n let sum = 0\n for (let i = 0; i < a.length; i++) sum += a[i] * b[i]\n return sum\n}\n\n/**\n * Suggest tags based on embedding similarity to tag vocabulary centroids.\n * Returns tags sorted by descending similarity score, filtered by threshold.\n */\nexport function suggestTags(\n noteEmbedding: number[],\n tagEmbeddings: Map<string, number[]>,\n threshold = 0.6,\n maxTags = 5,\n): string[] {\n return Array.from(tagEmbeddings.entries())\n .map(([tag, emb]) => ({ tag, score: cosineSimilarity(noteEmbedding, emb) }))\n .filter(({ score }) => score > threshold)\n .sort((a, b) => b.score - a.score)\n .slice(0, maxTags)\n .map(({ tag }) => tag)\n}\n","/**\n * Off-main-thread query-embedding transport for the semantic capability.\n *\n * The semantic capability consumes a single `EmbedFunction`\n * (`(texts: string[]) => Promise<number[][]>`). With `executionMode=\"worker\"`\n * (#146) the PGlite DB + HNSW query run off the main thread, but a\n * main-thread `EmbedFunction` closure still blocks the UI: model load janks\n * first paint of search, and every per-query embed blocks input.\n *\n * This module lets the host run the embed function inside a Worker (or behind\n * a MessagePort) so semantic search is off-thread end-to-end. Core posts\n * `{ texts }` to the port and awaits `number[][]`; the host owns the worker,\n * the model, and the model params (so build-time corpus embeddings stay an\n * exact match: `Xenova/all-MiniLM-L6-v2`, fp32, `{ pooling:'mean', normalize:true }`,\n * 384-d).\n *\n * Two halves:\n * - {@link createWorkerEmbedFunction} — main-thread side. Wraps a transport\n * into an `EmbedFunction` that round-trips each request to the worker.\n * - {@link handleEmbedRequests} — worker side. Wires a host-owned\n * `(texts) => Promise<number[][]>` to the message protocol.\n *\n * The existing main-thread `registerSemanticCapability(manager, embedFn)` path\n * is unchanged. This transport is additive and opt-in.\n *\n * @implements #180 off-main-thread / pluggable query-embedding transport\n */\n\nimport type { EmbedFunction } from './embedding-handler.js'\n\n/**\n * Minimal transport contract satisfied by both `Worker` and `MessagePort`.\n * Core only needs to post messages and listen for replies.\n */\nexport interface EmbedTransportPort {\n postMessage(message: unknown): void\n addEventListener(type: 'message', listener: (event: { data: unknown }) => void): void\n removeEventListener(type: 'message', listener: (event: { data: unknown }) => void): void\n /** MessagePort requires start() when using addEventListener; Worker does not. */\n start?(): void\n}\n\n/** Message discriminators for the embed protocol. */\nexport const EMBED_REQUEST_KIND = 'fortemi:embed:request' as const\nexport const EMBED_RESPONSE_KIND = 'fortemi:embed:response' as const\n\n/** Request posted by core (main thread) to the worker. */\nexport interface EmbedRequestMessage {\n kind: typeof EMBED_REQUEST_KIND\n id: number\n texts: string[]\n}\n\n/** Reply posted by the worker back to core. Exactly one of `vectors`/`error`. */\nexport interface EmbedResponseMessage {\n kind: typeof EMBED_RESPONSE_KIND\n id: number\n vectors?: number[][]\n error?: string\n}\n\n/** Options for the main-thread worker embed function. */\nexport interface EmbedWorkerOptions {\n /**\n * Per-request timeout in milliseconds. A request that receives no reply\n * within this window rejects with a timeout error. Set to `0` to disable.\n * Default: 30000 (30s).\n */\n timeoutMs?: number\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000\n\nfunction isEmbedResponse(data: unknown): data is EmbedResponseMessage {\n return (\n typeof data === 'object' &&\n data !== null &&\n (data as { kind?: unknown }).kind === EMBED_RESPONSE_KIND &&\n typeof (data as { id?: unknown }).id === 'number'\n )\n}\n\nfunction isEmbedRequest(data: unknown): data is EmbedRequestMessage {\n return (\n typeof data === 'object' &&\n data !== null &&\n (data as { kind?: unknown }).kind === EMBED_REQUEST_KIND &&\n typeof (data as { id?: unknown }).id === 'number' &&\n Array.isArray((data as { texts?: unknown }).texts)\n )\n}\n\ninterface PendingRequest {\n resolve: (vectors: number[][]) => void\n reject: (err: Error) => void\n timer: ReturnType<typeof setTimeout> | null\n}\n\n/**\n * Wrap a Worker/MessagePort transport into an `EmbedFunction` (main-thread side).\n *\n * Each `embed(texts)` call posts an {@link EmbedRequestMessage} with a unique id\n * and resolves when the matching {@link EmbedResponseMessage} arrives. The\n * message listener is attached immediately and removed by `dispose()`.\n *\n * @param port - A `Worker`, `MessagePort`, or any {@link EmbedTransportPort}.\n * @param options - Optional timeout configuration.\n * @returns The `embed` function and a `dispose` cleanup (removes the listener\n * and rejects any in-flight requests).\n *\n * @example\n * ```ts\n * const worker = new Worker(new URL('./queryEmbed.worker.ts', import.meta.url), { type: 'module' })\n * const { embed, dispose } = createWorkerEmbedFunction(worker)\n * setEmbedFunction(embed) // query + job embedding now run off-thread\n * // later: dispose(); worker.terminate()\n * ```\n */\nexport function createWorkerEmbedFunction(\n port: EmbedTransportPort,\n options?: EmbedWorkerOptions,\n): { embed: EmbedFunction; dispose: () => void } {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const pending = new Map<number, PendingRequest>()\n let nextId = 1\n let disposed = false\n\n const onMessage = (event: { data: unknown }): void => {\n const data = event.data\n if (!isEmbedResponse(data)) return\n const entry = pending.get(data.id)\n if (!entry) return\n pending.delete(data.id)\n if (entry.timer !== null) clearTimeout(entry.timer)\n if (data.error !== undefined) {\n entry.reject(new Error(data.error))\n } else if (Array.isArray(data.vectors)) {\n entry.resolve(data.vectors)\n } else {\n entry.reject(new Error('Embed worker returned a malformed response (no vectors, no error)'))\n }\n }\n\n port.addEventListener('message', onMessage)\n // MessagePort needs an explicit start() when using addEventListener.\n port.start?.()\n\n const embed: EmbedFunction = (texts: string[]): Promise<number[][]> => {\n if (disposed) {\n return Promise.reject(new Error('Embed worker transport has been disposed'))\n }\n return new Promise<number[][]>((resolve, reject) => {\n const id = nextId++\n let timer: ReturnType<typeof setTimeout> | null = null\n if (timeoutMs > 0) {\n timer = setTimeout(() => {\n if (pending.delete(id)) {\n reject(new Error(`Embed worker request timed out after ${timeoutMs}ms`))\n }\n }, timeoutMs)\n }\n pending.set(id, { resolve, reject, timer })\n try {\n const message: EmbedRequestMessage = { kind: EMBED_REQUEST_KIND, id, texts }\n port.postMessage(message)\n } catch (err) {\n pending.delete(id)\n if (timer !== null) clearTimeout(timer)\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n })\n }\n\n const dispose = (): void => {\n if (disposed) return\n disposed = true\n port.removeEventListener('message', onMessage)\n for (const [, entry] of pending) {\n if (entry.timer !== null) clearTimeout(entry.timer)\n entry.reject(new Error('Embed worker transport has been disposed'))\n }\n pending.clear()\n }\n\n return { embed, dispose }\n}\n\n/**\n * Wire a host-owned embed function to the message protocol (worker side).\n *\n * Call this inside the worker (or behind a MessagePort) with the function that\n * loads the model and runs inference. It answers each {@link EmbedRequestMessage}\n * with an {@link EmbedResponseMessage}.\n *\n * @param port - The worker scope (`self`) or a `MessagePort`.\n * @param embed - The host embed function `(texts) => Promise<number[][]>`.\n * @returns A disposer that removes the listener.\n *\n * @example\n * ```ts\n * // queryEmbed.worker.ts\n * import { handleEmbedRequests } from '@fortemi/core'\n * import { pipeline } from '@huggingface/transformers'\n *\n * const extractor = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2')\n * handleEmbedRequests(self as unknown as EmbedTransportPort, async (texts) => {\n * const out = await Promise.all(\n * texts.map(async (t) => {\n * const r = await extractor(t, { pooling: 'mean', normalize: true })\n * return Array.from(r.data as Float32Array)\n * }),\n * )\n * return out\n * })\n * ```\n */\nexport function handleEmbedRequests(\n port: EmbedTransportPort,\n embed: EmbedFunction,\n): () => void {\n const onMessage = (event: { data: unknown }): void => {\n const data = event.data\n if (!isEmbedRequest(data)) return\n const { id, texts } = data\n void Promise.resolve()\n .then(() => embed(texts))\n .then((vectors) => {\n const reply: EmbedResponseMessage = { kind: EMBED_RESPONSE_KIND, id, vectors }\n port.postMessage(reply)\n })\n .catch((err: unknown) => {\n const reply: EmbedResponseMessage = {\n kind: EMBED_RESPONSE_KIND,\n id,\n error: err instanceof Error ? err.message : String(err),\n }\n port.postMessage(reply)\n })\n }\n\n port.addEventListener('message', onMessage)\n port.start?.()\n\n return () => {\n port.removeEventListener('message', onMessage)\n }\n}\n","/**\n * Semantic capability loader — registers the embedding pipeline with CapabilityManager.\n *\n * In production (browser), this loads @huggingface/transformers in a Web Worker.\n * In tests, call registerSemanticCapability() with a mock embed function.\n *\n * Two registration paths, both additive:\n * - registerSemanticCapability(manager, embedFn) — main-thread embed closure.\n * - registerSemanticCapabilityWorker(manager, port) — off-main-thread embed\n * transport (#180), so semantic search runs off-thread end-to-end.\n *\n * @implements #62 semantic capability loader\n * @implements #180 off-main-thread / pluggable query-embedding transport\n */\n\nimport type { CapabilityManager } from '../capability-manager.js'\nimport { setEmbedFunction, type EmbedFunction } from './embedding-handler.js'\nimport {\n createWorkerEmbedFunction,\n type EmbedTransportPort,\n type EmbedWorkerOptions,\n} from './embed-worker-transport.js'\n\n/**\n * Cleanup for the currently-wired transport, if any. The worker path installs a\n * disposer (removes the message listener); the main-thread path leaves it null.\n * Tracked at module scope so unregisterSemanticCapability() can tear it down.\n */\nlet activeTransportDispose: (() => void) | null = null\n\nfunction clearActiveTransport(): void {\n if (activeTransportDispose) {\n activeTransportDispose()\n activeTransportDispose = null\n }\n}\n\n/**\n * Register the semantic capability with a CapabilityManager.\n * The loader will be called when capabilityManager.enable('semantic') is invoked.\n *\n * @param manager - The CapabilityManager instance\n * @param embedFn - The embedding function (from transformers.js worker or mock)\n * @param onProgress - Optional progress callback for model download\n */\nexport function registerSemanticCapability(\n manager: CapabilityManager,\n embedFn: EmbedFunction,\n onProgress?: (pct: number) => void,\n): void {\n manager.registerLoader('semantic', async () => {\n if (onProgress) onProgress(0)\n // Switching registration paths: drop any previously-wired transport.\n clearActiveTransport()\n // In real implementation: load transformers.js model here\n // For now, just wire the embed function\n setEmbedFunction(embedFn)\n if (onProgress) onProgress(100)\n })\n}\n\n/**\n * Register the semantic capability backed by an off-main-thread transport (#180).\n *\n * The embed function round-trips each request to a host-owned Worker/MessagePort,\n * so model load and per-query inference never touch the main thread. The host\n * owns the worker and the model params (build-time corpus match stays exact).\n *\n * The loader runs when `capabilityManager.enable('semantic')` is invoked; the\n * message listener is attached then and removed on\n * {@link unregisterSemanticCapability} (i.e. on `disable`).\n *\n * @param manager - The CapabilityManager instance.\n * @param port - A `Worker`, `MessagePort`, or any {@link EmbedTransportPort}.\n * @param options - Optional transport options (e.g. per-request timeout).\n *\n * @example\n * ```ts\n * const worker = new Worker(new URL('./queryEmbed.worker.ts', import.meta.url), { type: 'module' })\n * registerSemanticCapabilityWorker(capabilityManager, worker)\n * await capabilityManager.enable('semantic') // off-thread end-to-end\n * ```\n */\nexport function registerSemanticCapabilityWorker(\n manager: CapabilityManager,\n port: EmbedTransportPort,\n options?: EmbedWorkerOptions,\n): void {\n manager.registerLoader('semantic', async () => {\n // Re-enabling: tear down a prior transport before wiring a fresh one.\n clearActiveTransport()\n const { embed, dispose } = createWorkerEmbedFunction(port, options)\n activeTransportDispose = dispose\n setEmbedFunction(embed)\n })\n}\n\n/**\n * Unregister the semantic capability — clears the embed function and tears down\n * any active off-main-thread transport. Called when the capability is disabled.\n */\nexport function unregisterSemanticCapability(): void {\n setEmbedFunction(null)\n clearActiveTransport()\n}\n","/**\n * LLM capability loader — registers the local LLM with CapabilityManager.\n *\n * In production (browser), this loads @mlc-ai/web-llm in a Web Worker.\n * In tests, call registerLlmCapability() with a mock completion function.\n *\n * @implements #65 LLM capability loader\n */\n\nimport type { CapabilityManager } from '../capability-manager.js'\nimport { setLlmFunction, type LlmCompleteFn } from './llm-handler.js'\nimport { detectGpuCapabilities, estimateVramTier, selectLlmModel } from './gpu-detect.js'\n\nexport interface LlmCapabilityOptions {\n modelOverride?: string // Force specific model (bypass VRAM detection)\n onProgress?: (pct: number, text: string) => void\n}\n\n/**\n * Register the LLM capability with a CapabilityManager.\n * The loader checks WebGPU availability before loading.\n *\n * @param manager - The CapabilityManager instance\n * @param completeFn - The LLM completion function (from WebLLM worker or mock)\n * @param options - Optional model override and progress callback\n */\nexport function registerLlmCapability(\n manager: CapabilityManager,\n completeFn: LlmCompleteFn,\n options: LlmCapabilityOptions = {},\n): void {\n manager.registerLoader('llm', async () => {\n // Check GPU capabilities\n const gpuCaps = await detectGpuCapabilities()\n if (!gpuCaps.webgpuAvailable) {\n throw new Error(\n 'WebGPU is not available. Local LLM requires WebGPU support (Chrome 113+ or Firefox 141+).',\n )\n }\n\n const tier = estimateVramTier(gpuCaps)\n const model = options.modelOverride ?? selectLlmModel(tier)\n\n if (options.onProgress) {\n options.onProgress(0, `Loading ${model}...`)\n }\n\n // In real implementation: load WebLLM model here\n // For now, just wire the completion function\n setLlmFunction(completeFn)\n\n if (options.onProgress) {\n options.onProgress(100, `${model} ready`)\n }\n })\n}\n\n/**\n * Unregister the LLM capability — clears the completion function.\n */\nexport function unregisterLlmCapability(): void {\n setLlmFunction(null)\n}\n","/**\n * ProviderRegistry — manages InferenceProvider instances.\n * Supports add/remove/getActive/setActive and derives CapabilityManager state.\n *\n * @implements #112 provider registry\n */\n\nimport type { TypedEventBus } from '../event-bus.js'\nimport type {\n InferenceProvider,\n EmbedRequest,\n EmbedResponse,\n CompletionRequest,\n CompletionResponse,\n StreamChunk,\n} from './inference-provider.js'\nimport type { EmbedFunction } from './embedding-handler.js'\nimport type { LlmCompleteFn } from './llm-handler.js'\nimport { setEmbedFunction } from './embedding-handler.js'\nimport { setLlmFunction } from './llm-handler.js'\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nexport class ProviderRegistry {\n private providers = new Map<string, InferenceProvider>()\n private activeId: string | null = null\n\n constructor(private events?: TypedEventBus) {}\n\n /** Register a provider. First provider with embedding capability becomes active. */\n add(provider: InferenceProvider): void {\n if (this.providers.has(provider.id)) {\n throw new Error(`Provider '${provider.id}' already registered`)\n }\n this.providers.set(provider.id, provider)\n this.events?.emit('provider.added', { id: provider.id, name: provider.name })\n\n // Auto-activate first provider\n if (!this.activeId) {\n this.setActive(provider.id)\n }\n }\n\n /** Remove a provider by ID. If it was active, clears active. */\n remove(id: string): void {\n const provider = this.providers.get(id)\n if (!provider) return\n\n provider.dispose()\n this.providers.delete(id)\n\n if (this.activeId === id) {\n this.activeId = null\n this.syncLegacyFunctions()\n\n // Auto-activate next available provider\n const next = this.providers.values().next()\n if (!next.done) {\n this.setActive(next.value.id)\n }\n }\n\n this.events?.emit('provider.removed', { id })\n }\n\n /** Set the active provider by ID */\n setActive(id: string): void {\n const provider = this.providers.get(id)\n if (!provider) {\n throw new Error(`Provider '${id}' not found`)\n }\n this.activeId = id\n this.syncLegacyFunctions()\n this.events?.emit('provider.active', { id, name: provider.name })\n }\n\n /** Get the currently active provider */\n getActive(): InferenceProvider | null {\n if (!this.activeId) return null\n return this.providers.get(this.activeId) ?? null\n }\n\n /** Get a provider by ID */\n get(id: string): InferenceProvider | undefined {\n return this.providers.get(id)\n }\n\n /** List all registered providers */\n list(): InferenceProvider[] {\n return Array.from(this.providers.values())\n }\n\n /** Get provider count */\n get size(): number {\n return this.providers.size\n }\n\n /** Check if any provider supports embeddings */\n hasEmbeddings(): boolean {\n return this.list().some(p => p.capabilities.embeddings && p.embed)\n }\n\n /** Check if any provider supports chat */\n hasChat(): boolean {\n return this.list().some(p => p.capabilities.chat && p.complete)\n }\n\n /** Find first provider supporting a given capability */\n findByCapability(cap: keyof InferenceProvider['capabilities']): InferenceProvider | undefined {\n return this.list().find(p => p.capabilities[cap])\n }\n\n /** Convenience: embed using active provider */\n async embed(request: EmbedRequest): Promise<EmbedResponse> {\n const provider = this.getActive()\n if (!provider?.embed) {\n throw new Error('No active provider with embedding capability')\n }\n return provider.embed(request)\n }\n\n /** Convenience: complete using active provider */\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const provider = this.getActive()\n if (!provider?.complete) {\n throw new Error('No active provider with chat capability')\n }\n return provider.complete(request)\n }\n\n /** Convenience: stream using active provider */\n stream(request: CompletionRequest): AsyncIterable<StreamChunk> {\n const provider = this.getActive()\n if (!provider?.stream) {\n throw new Error('No active provider with streaming capability')\n }\n return provider.stream(request)\n }\n\n /** Dispose all providers */\n dispose(): void {\n for (const provider of this.providers.values()) {\n provider.dispose()\n }\n this.providers.clear()\n this.activeId = null\n this.syncLegacyFunctions()\n }\n\n // -------------------------------------------------------------------------\n // Legacy bridge — keeps setEmbedFunction/setLlmFunction in sync\n // -------------------------------------------------------------------------\n\n /**\n * Sync the legacy bare function slots with the active provider.\n * This maintains backward compatibility: job-queue-worker.ts and other\n * consumers that call getEmbedFunction() / getLlmFunction() still work.\n */\n private syncLegacyFunctions(): void {\n const active = this.getActive()\n\n if (active?.embed && active.capabilities.embeddings) {\n const embedBridge: EmbedFunction = (texts) =>\n active.embed!({ texts }).then(r => r.vectors)\n setEmbedFunction(embedBridge)\n } else {\n setEmbedFunction(null)\n }\n\n if (active?.complete && active.capabilities.chat) {\n const llmBridge: LlmCompleteFn = (prompt, options) =>\n active.complete!({\n prompt,\n maxTokens: options?.maxTokens,\n temperature: options?.temperature,\n }).then(r => r.text)\n setLlmFunction(llmBridge)\n } else {\n setLlmFunction(null)\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Legacy adapter — wraps bare functions as an InferenceProvider\n// ---------------------------------------------------------------------------\n\n/**\n * Create an InferenceProvider from legacy bare functions.\n * Used by setEmbedFunction/setLlmFunction backward compat layer.\n */\nexport function createLegacyProvider(options: {\n embedFn?: EmbedFunction | null\n llmFn?: LlmCompleteFn | null\n id?: string\n name?: string\n}): InferenceProvider {\n const { embedFn, llmFn, id = 'legacy', name = 'Legacy Provider' } = options\n\n return {\n id,\n name,\n tier: 'in-browser',\n capabilities: {\n embeddings: !!embedFn,\n chat: !!llmFn,\n streaming: false,\n vision: false,\n toolCalling: false,\n structuredOutput: false,\n },\n\n embed: embedFn\n ? async (request) => ({\n vectors: await embedFn(request.texts),\n model: 'legacy',\n })\n : undefined,\n\n complete: llmFn\n ? async (request) => ({\n text: await llmFn(request.prompt, {\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n }),\n model: 'legacy',\n })\n : undefined,\n\n async listModels() {\n const models = []\n if (embedFn) models.push({ id: 'legacy-embed', capabilities: { embeddings: true } })\n if (llmFn) models.push({ id: 'legacy-llm', capabilities: { chat: true } })\n return models\n },\n\n async probe() {\n return { status: 'ok' as const, latencyMs: 0, message: 'Legacy function injection' }\n },\n\n dispose() {\n // No-op for legacy functions\n },\n }\n}\n","/**\n * OpenAI-compatible inference provider.\n * Works with OpenAI, OpenRouter, Anthropic (via OpenRouter), Ollama, LM Studio,\n * llama.cpp, vLLM, Jan, and any OpenAI-compatible endpoint.\n *\n * No SDK dependencies — uses raw fetch() to keep @fortemi/core lightweight.\n *\n * @implements #113 remote provider support\n */\n\nimport type {\n InferenceProvider,\n ProviderCapabilities,\n ProviderTier,\n EmbedRequest,\n EmbedResponse,\n CompletionRequest,\n CompletionResponse,\n StreamChunk,\n ModelInfo,\n ProbeResult,\n} from './inference-provider.js'\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface OpenAIProviderConfig {\n id: string\n name: string\n baseURL: string\n apiKey?: string\n defaultModel?: string\n defaultEmbeddingModel?: string\n tier?: ProviderTier\n headers?: Record<string, string>\n timeoutMs?: number\n}\n\n// ---------------------------------------------------------------------------\n// OpenAI API response shapes (subset we need)\n// ---------------------------------------------------------------------------\n\ninterface OAIEmbeddingResponse {\n data: Array<{ embedding: number[]; index: number }>\n model: string\n usage?: { total_tokens: number }\n}\n\ninterface OAIChatResponse {\n choices: Array<{\n message: { content: string }\n finish_reason: string\n }>\n model: string\n usage?: { prompt_tokens: number; completion_tokens: number }\n}\n\ninterface OAIChatStreamChunk {\n choices: Array<{\n delta: { content?: string }\n finish_reason: string | null\n }>\n}\n\ninterface OAIModelsResponse {\n data: Array<{\n id: string\n owned_by?: string\n }>\n}\n\n// ---------------------------------------------------------------------------\n// Provider implementation\n// ---------------------------------------------------------------------------\n\nexport class OpenAICompatibleProvider implements InferenceProvider {\n readonly id: string\n readonly name: string\n readonly tier: ProviderTier\n readonly capabilities: ProviderCapabilities\n\n private baseURL: string\n private apiKey?: string\n private defaultModel: string\n private defaultEmbeddingModel: string\n private extraHeaders: Record<string, string>\n private timeoutMs: number\n private abortController: AbortController | null = null\n\n constructor(config: OpenAIProviderConfig) {\n this.id = config.id\n this.name = config.name\n this.baseURL = config.baseURL.replace(/\\/+$/, '') // strip trailing slashes\n this.apiKey = config.apiKey\n this.defaultModel = config.defaultModel ?? 'gpt-3.5-turbo'\n this.defaultEmbeddingModel = config.defaultEmbeddingModel ?? 'text-embedding-3-small'\n this.tier = config.tier ?? (this.isLocalURL() ? 'local-server' : 'remote')\n this.extraHeaders = config.headers ?? {}\n this.timeoutMs = config.timeoutMs ?? 30000\n\n this.capabilities = {\n embeddings: true,\n chat: true,\n streaming: true,\n vision: false,\n toolCalling: false,\n structuredOutput: false,\n }\n }\n\n // -------------------------------------------------------------------------\n // InferenceProvider interface\n // -------------------------------------------------------------------------\n\n async embed(request: EmbedRequest): Promise<EmbedResponse> {\n const model = request.model ?? this.defaultEmbeddingModel\n const body = {\n input: request.texts,\n model,\n }\n\n const response = await this.fetch('/embeddings', body)\n const data = response as OAIEmbeddingResponse\n\n // Sort by index to ensure correct order\n const sorted = [...data.data].sort((a, b) => a.index - b.index)\n\n return {\n vectors: sorted.map(d => d.embedding),\n model: data.model,\n usage: data.usage ? { totalTokens: data.usage.total_tokens } : undefined,\n }\n }\n\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const model = request.model ?? this.defaultModel\n const body: Record<string, unknown> = {\n model,\n messages: this.buildMessages(request),\n stream: false,\n }\n if (request.maxTokens) body.max_tokens = request.maxTokens\n if (request.temperature !== undefined) body.temperature = request.temperature\n if (request.stopSequences?.length) body.stop = request.stopSequences\n\n const response = await this.fetch('/chat/completions', body)\n const data = response as OAIChatResponse\n\n const choice = data.choices[0]\n return {\n text: choice?.message?.content ?? '',\n model: data.model,\n usage: data.usage\n ? { promptTokens: data.usage.prompt_tokens, completionTokens: data.usage.completion_tokens }\n : undefined,\n finishReason: this.mapFinishReason(choice?.finish_reason),\n }\n }\n\n async *stream(request: CompletionRequest): AsyncIterable<StreamChunk> {\n const model = request.model ?? this.defaultModel\n const body: Record<string, unknown> = {\n model,\n messages: this.buildMessages(request),\n stream: true,\n }\n if (request.maxTokens) body.max_tokens = request.maxTokens\n if (request.temperature !== undefined) body.temperature = request.temperature\n if (request.stopSequences?.length) body.stop = request.stopSequences\n\n const response = await this.rawFetch('/chat/completions', body)\n\n if (!response.body) {\n throw new Error('Streaming not supported: response body is null')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed || !trimmed.startsWith('data:')) continue\n const data = trimmed.slice(5).trim()\n if (data === '[DONE]') {\n yield { text: '', done: true }\n return\n }\n\n try {\n const parsed = JSON.parse(data) as OAIChatStreamChunk\n const delta = parsed.choices[0]?.delta\n const finishReason = parsed.choices[0]?.finish_reason\n if (delta?.content) {\n yield { text: delta.content, done: false }\n }\n if (finishReason) {\n yield { text: '', done: true }\n return\n }\n } catch {\n // Skip malformed SSE chunks\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const response = await this.fetch('/models', undefined, 'GET')\n const data = response as OAIModelsResponse\n return data.data.map(m => ({\n id: m.id,\n name: m.id,\n capabilities: {\n chat: !this.isEmbeddingModel(m.id),\n embeddings: this.isEmbeddingModel(m.id),\n },\n owned_by: m.owned_by,\n }))\n } catch {\n return []\n }\n }\n\n async probe(): Promise<ProbeResult> {\n const start = Date.now()\n try {\n await this.fetch('/models', undefined, 'GET')\n return {\n status: 'ok',\n latencyMs: Date.now() - start,\n }\n } catch (err) {\n return {\n status: 'down',\n latencyMs: Date.now() - start,\n message: err instanceof Error ? err.message : String(err),\n }\n }\n }\n\n dispose(): void {\n this.abortController?.abort()\n this.abortController = null\n }\n\n // -------------------------------------------------------------------------\n // Internal helpers\n // -------------------------------------------------------------------------\n\n private buildMessages(request: CompletionRequest): Array<{ role: string; content: string }> {\n const messages: Array<{ role: string; content: string }> = []\n if (request.systemPrompt) {\n messages.push({ role: 'system', content: request.systemPrompt })\n }\n messages.push({ role: 'user', content: request.prompt })\n return messages\n }\n\n private mapFinishReason(reason?: string): CompletionResponse['finishReason'] {\n switch (reason) {\n case 'stop': return 'stop'\n case 'length': return 'length'\n case 'content_filter': return 'content_filter'\n default: return undefined\n }\n }\n\n private isEmbeddingModel(id: string): boolean {\n const lower = id.toLowerCase()\n return lower.includes('embed') || lower.includes('e5-') || lower.includes('bge-') ||\n lower.includes('nomic-') || lower.includes('mxbai-') || lower.includes('all-minilm')\n }\n\n private isLocalURL(): boolean {\n try {\n const url = new URL(this.baseURL)\n return url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '0.0.0.0'\n } catch {\n return false\n }\n }\n\n private async fetch(\n path: string,\n body?: unknown,\n method: 'GET' | 'POST' = body ? 'POST' : 'GET',\n ): Promise<unknown> {\n const response = await this.rawFetch(path, body, method)\n if (!response.ok) {\n const text = await response.text().catch(() => '')\n throw new Error(`${this.name} API error ${response.status}: ${text}`)\n }\n return response.json()\n }\n\n private async rawFetch(\n path: string,\n body?: unknown,\n method: 'GET' | 'POST' = body ? 'POST' : 'GET',\n ): Promise<Response> {\n this.abortController = new AbortController()\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.extraHeaders,\n }\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n const url = `${this.baseURL}${path}`\n const response = await globalThis.fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (!response.ok && method !== 'GET') {\n const text = await response.text().catch(() => '')\n throw new Error(`${this.name} API error ${response.status}: ${text}`)\n }\n\n return response\n }\n}\n","/**\n * Local inference server auto-discovery.\n * Probes known local endpoints (Ollama, LM Studio, llama.cpp, vLLM, Jan, LocalAI)\n * and returns discovered providers ready for registration.\n *\n * @implements #116 local server auto-discovery\n */\n\nimport type { ModelInfo } from './inference-provider.js'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface LocalEndpoint {\n id: string\n name: string\n baseURL: string\n defaultPort: number\n}\n\nexport interface DiscoveredProvider {\n id: string\n name: string\n baseURL: string\n models: ModelInfo[]\n}\n\nexport interface DiscoveryOptions {\n /** Additional endpoints to probe beyond the defaults */\n extraEndpoints?: LocalEndpoint[]\n /** Probe timeout per endpoint in ms (default: 2000) */\n timeoutMs?: number\n /** Ports to skip (e.g., if you know a port is used for something else) */\n skipPorts?: number[]\n}\n\n// ---------------------------------------------------------------------------\n// Known local server endpoints\n// ---------------------------------------------------------------------------\n\nexport const LOCAL_ENDPOINTS: LocalEndpoint[] = [\n { id: 'ollama', name: 'Ollama', baseURL: 'http://localhost:11434/v1', defaultPort: 11434 },\n { id: 'lm-studio', name: 'LM Studio', baseURL: 'http://localhost:1234/v1', defaultPort: 1234 },\n { id: 'llama-cpp', name: 'llama.cpp', baseURL: 'http://localhost:8080/v1', defaultPort: 8080 },\n { id: 'vllm', name: 'vLLM', baseURL: 'http://localhost:8000/v1', defaultPort: 8000 },\n { id: 'jan', name: 'Jan', baseURL: 'http://localhost:1337/v1', defaultPort: 1337 },\n { id: 'localai', name: 'LocalAI', baseURL: 'http://localhost:8080/v1', defaultPort: 8080 },\n]\n\n// ---------------------------------------------------------------------------\n// Model capability heuristics\n// ---------------------------------------------------------------------------\n\nexport type ModelCategory = 'embedding' | 'vision' | 'chat'\n\n/**\n * Classify a model by its ID/name into embedding, vision, or chat.\n */\nexport function classifyModel(modelId: string): ModelCategory {\n const lower = modelId.toLowerCase()\n\n // Embedding models\n if (\n lower.includes('embed') || lower.includes('e5-') || lower.includes('bge-') ||\n lower.includes('nomic-') || lower.includes('mxbai-') || lower.includes('all-minilm') ||\n lower.includes('gte-')\n ) {\n return 'embedding'\n }\n\n // Vision models\n if (\n lower.includes('vision') || lower.includes('llava') || lower.includes('moondream') ||\n lower.includes('minicpm-v') || lower.includes('bakllava')\n ) {\n return 'vision'\n }\n\n // Default: chat\n return 'chat'\n}\n\n// ---------------------------------------------------------------------------\n// Discovery\n// ---------------------------------------------------------------------------\n\ninterface ModelsResponse {\n data?: Array<{ id: string; owned_by?: string }>\n models?: Array<{ name: string; model?: string }>\n}\n\n/**\n * Probe a single endpoint and return discovered provider info, or null if unreachable.\n */\nasync function probeEndpoint(\n endpoint: LocalEndpoint,\n timeoutMs: number,\n): Promise<DiscoveredProvider | null> {\n try {\n const response = await globalThis.fetch(`${endpoint.baseURL}/models`, {\n signal: AbortSignal.timeout(timeoutMs),\n })\n if (!response.ok) return null\n\n const data = (await response.json()) as ModelsResponse\n\n // OpenAI format: { data: [{ id: \"model-name\" }] }\n // Ollama format: { models: [{ name: \"model-name\" }] }\n let modelIds: string[]\n if (data.data && Array.isArray(data.data)) {\n modelIds = data.data.map(m => m.id)\n } else if (data.models && Array.isArray(data.models)) {\n modelIds = data.models.map(m => m.name ?? m.model ?? '')\n } else {\n modelIds = []\n }\n\n const models: ModelInfo[] = modelIds\n .filter(Boolean)\n .map(id => {\n const category = classifyModel(id)\n return {\n id,\n name: id,\n capabilities: {\n embeddings: category === 'embedding',\n chat: category === 'chat' || category === 'vision',\n vision: category === 'vision',\n },\n }\n })\n\n return {\n id: endpoint.id,\n name: endpoint.name,\n baseURL: endpoint.baseURL,\n models,\n }\n } catch {\n return null\n }\n}\n\n/**\n * Discover local inference servers by probing known endpoints.\n * Returns all reachable providers with their available models.\n */\nexport async function discoverLocalProviders(\n options: DiscoveryOptions = {},\n): Promise<DiscoveredProvider[]> {\n const { extraEndpoints = [], timeoutMs = 2000, skipPorts = [] } = options\n\n // Deduplicate endpoints by baseURL (llama.cpp and LocalAI share port 8080)\n const allEndpoints = [...LOCAL_ENDPOINTS, ...extraEndpoints]\n const seen = new Set<string>()\n const uniqueEndpoints = allEndpoints.filter(ep => {\n if (seen.has(ep.baseURL)) return false\n if (skipPorts.includes(ep.defaultPort)) return false\n seen.add(ep.baseURL)\n return true\n })\n\n const results = await Promise.allSettled(\n uniqueEndpoints.map(ep => probeEndpoint(ep, timeoutMs)),\n )\n\n return results\n .filter((r): r is PromiseFulfilledResult<DiscoveredProvider | null> =>\n r.status === 'fulfilled' && r.value !== null,\n )\n .map(r => r.value!)\n}\n","/**\n * FallbackRouter — wraps multiple InferenceProviders with automatic failover.\n * Routes requests to the highest-priority available provider, falling through\n * on errors. Failed providers enter cooldown before retry.\n *\n * @implements #114 provider fallback chains with cooldown\n */\n\nimport type { TypedEventBus } from '../event-bus.js'\nimport type {\n InferenceProvider,\n ProviderCapabilities,\n ProviderTier,\n EmbedRequest,\n EmbedResponse,\n CompletionRequest,\n CompletionResponse,\n StreamChunk,\n ModelInfo,\n ProbeResult,\n} from './inference-provider.js'\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface FallbackRouterConfig {\n /** Ordered list of providers (highest priority first) */\n providers: InferenceProvider[]\n /** Cooldown durations by error type in ms */\n cooldowns?: CooldownConfig\n /** Event bus for fallback notifications */\n events?: TypedEventBus\n}\n\nexport interface CooldownConfig {\n /** Cooldown for rate limit errors (HTTP 429) — default 30s */\n rateLimit?: number\n /** Cooldown for server errors (HTTP 5xx) — default 60s */\n serverError?: number\n /** Cooldown for connection failures — default 300s */\n connectionFailure?: number\n /** Cooldown for content policy errors — default 0 (immediate retry with next) */\n contentPolicy?: number\n}\n\nconst DEFAULT_COOLDOWNS: Required<CooldownConfig> = {\n rateLimit: 30_000,\n serverError: 60_000,\n connectionFailure: 300_000,\n contentPolicy: 0,\n}\n\n// ---------------------------------------------------------------------------\n// Error classification\n// ---------------------------------------------------------------------------\n\nexport type ErrorCategory = 'rate_limit' | 'server_error' | 'connection_failure' | 'content_policy' | 'context_window' | 'unknown'\n\nexport function classifyError(error: unknown): ErrorCategory {\n const msg = error instanceof Error ? error.message : String(error)\n const lower = msg.toLowerCase()\n\n if (lower.includes('429') || lower.includes('rate limit')) return 'rate_limit'\n if (lower.includes('500') || lower.includes('502') || lower.includes('503') || lower.includes('504')) return 'server_error'\n if (lower.includes('content') && (lower.includes('policy') || lower.includes('filter'))) return 'content_policy'\n if (lower.includes('context') && (lower.includes('window') || lower.includes('length') || lower.includes('too long'))) return 'context_window'\n if (lower.includes('fetch') || lower.includes('network') || lower.includes('connection') || lower.includes('econnrefused') || lower.includes('timeout')) return 'connection_failure'\n\n return 'unknown'\n}\n\n// ---------------------------------------------------------------------------\n// Fallback event types\n// ---------------------------------------------------------------------------\n\nexport interface FallbackEvent {\n fromProvider: string\n toProvider: string\n errorCategory: ErrorCategory\n error: string\n}\n\nexport interface CooldownEvent {\n providerId: string\n errorCategory: ErrorCategory\n cooldownMs: number\n expiresAt: number\n}\n\n// ---------------------------------------------------------------------------\n// Router implementation\n// ---------------------------------------------------------------------------\n\ninterface CooldownEntry {\n expiresAt: number\n category: ErrorCategory\n}\n\nexport class FallbackRouter implements InferenceProvider {\n readonly id = 'fallback-router'\n readonly name = 'Fallback Router'\n readonly tier: ProviderTier = 'remote'\n\n private providers: InferenceProvider[]\n private cooldowns: Required<CooldownConfig>\n private cooldownMap = new Map<string, CooldownEntry>()\n private events?: TypedEventBus\n\n get capabilities(): ProviderCapabilities {\n // Aggregate capabilities from all providers\n const available = this.getAvailableProviders()\n return {\n embeddings: available.some(p => p.capabilities.embeddings),\n chat: available.some(p => p.capabilities.chat),\n streaming: available.some(p => p.capabilities.streaming),\n vision: available.some(p => p.capabilities.vision),\n toolCalling: available.some(p => p.capabilities.toolCalling),\n structuredOutput: available.some(p => p.capabilities.structuredOutput),\n maxContextTokens: Math.max(\n ...available.map(p => p.capabilities.maxContextTokens ?? 0),\n 0,\n ),\n }\n }\n\n constructor(config: FallbackRouterConfig) {\n this.providers = [...config.providers]\n this.cooldowns = { ...DEFAULT_COOLDOWNS, ...config.cooldowns }\n this.events = config.events\n }\n\n // -------------------------------------------------------------------------\n // Provider management\n // -------------------------------------------------------------------------\n\n /** Get providers not currently in cooldown */\n getAvailableProviders(): InferenceProvider[] {\n const now = Date.now()\n return this.providers.filter(p => {\n const cd = this.cooldownMap.get(p.id)\n if (!cd) return true\n if (now >= cd.expiresAt) {\n this.cooldownMap.delete(p.id)\n return true\n }\n return false\n })\n }\n\n /** Get providers in cooldown with their expiry info */\n getCoolingDown(): Array<{ providerId: string; category: ErrorCategory; expiresAt: number }> {\n const now = Date.now()\n const result: Array<{ providerId: string; category: ErrorCategory; expiresAt: number }> = []\n for (const [id, entry] of this.cooldownMap) {\n if (now < entry.expiresAt) {\n result.push({ providerId: id, category: entry.category, expiresAt: entry.expiresAt })\n }\n }\n return result\n }\n\n /** Manually clear cooldown for a provider */\n clearCooldown(providerId: string): void {\n this.cooldownMap.delete(providerId)\n }\n\n /** Clear all cooldowns */\n clearAllCooldowns(): void {\n this.cooldownMap.clear()\n }\n\n /** Add a provider to the chain (appended at lowest priority) */\n addProvider(provider: InferenceProvider): void {\n this.providers.push(provider)\n }\n\n /** Remove a provider from the chain */\n removeProvider(id: string): void {\n this.providers = this.providers.filter(p => p.id !== id)\n this.cooldownMap.delete(id)\n }\n\n /** Reorder providers (new priority order) */\n setOrder(ids: string[]): void {\n const byId = new Map(this.providers.map(p => [p.id, p]))\n const reordered: InferenceProvider[] = []\n for (const id of ids) {\n const p = byId.get(id)\n if (p) reordered.push(p)\n }\n // Append any providers not in the new order list\n for (const p of this.providers) {\n if (!ids.includes(p.id)) reordered.push(p)\n }\n this.providers = reordered\n }\n\n // -------------------------------------------------------------------------\n // InferenceProvider interface — with fallback\n // -------------------------------------------------------------------------\n\n async embed(request: EmbedRequest): Promise<EmbedResponse> {\n return this.withFallback(\n p => p.capabilities.embeddings && !!p.embed,\n p => p.embed!(request),\n )\n }\n\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n return this.withFallback(\n p => p.capabilities.chat && !!p.complete,\n p => p.complete!(request),\n )\n }\n\n async *stream(request: CompletionRequest): AsyncIterable<StreamChunk> {\n const candidates = this.getAvailableProviders()\n .filter(p => p.capabilities.streaming && p.stream)\n\n if (candidates.length === 0) {\n throw new Error('No available providers with streaming capability')\n }\n\n // For streaming, we try the first candidate only (can't retry mid-stream)\n yield* candidates[0].stream!(request)\n }\n\n async listModels(): Promise<ModelInfo[]> {\n const available = this.getAvailableProviders()\n const results = await Promise.allSettled(\n available.map(p => p.listModels()),\n )\n const models: ModelInfo[] = []\n for (const r of results) {\n if (r.status === 'fulfilled') models.push(...r.value)\n }\n return models\n }\n\n async probe(): Promise<ProbeResult> {\n const available = this.getAvailableProviders()\n if (available.length === 0) {\n return { status: 'down', latencyMs: 0, message: 'All providers in cooldown' }\n }\n\n const start = Date.now()\n const results = await Promise.allSettled(\n available.map(p => p.probe()),\n )\n\n const okCount = results.filter(\n r => r.status === 'fulfilled' && r.value.status === 'ok',\n ).length\n\n return {\n status: okCount === available.length ? 'ok' : okCount > 0 ? 'degraded' : 'down',\n latencyMs: Date.now() - start,\n message: `${okCount}/${available.length} providers healthy`,\n }\n }\n\n dispose(): void {\n for (const p of this.providers) {\n p.dispose()\n }\n this.providers = []\n this.cooldownMap.clear()\n }\n\n // -------------------------------------------------------------------------\n // Core fallback logic\n // -------------------------------------------------------------------------\n\n private async withFallback<T>(\n filter: (p: InferenceProvider) => boolean,\n execute: (p: InferenceProvider) => Promise<T>,\n ): Promise<T> {\n const candidates = this.getAvailableProviders().filter(filter)\n\n if (candidates.length === 0) {\n throw new Error('No available providers for this request')\n }\n\n let lastError: Error | undefined\n\n for (const provider of candidates) {\n try {\n return await execute(provider)\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err))\n const category = classifyError(err)\n this.applyCooldown(provider.id, category)\n\n // Emit fallback event\n const nextCandidate = candidates[candidates.indexOf(provider) + 1]\n if (nextCandidate) {\n this.events?.emit('provider.fallback', {\n fromProvider: provider.id,\n toProvider: nextCandidate.id,\n errorCategory: category,\n error: lastError.message,\n })\n }\n }\n }\n\n throw lastError ?? new Error('All providers failed')\n }\n\n private applyCooldown(providerId: string, category: ErrorCategory): void {\n let cooldownMs: number\n switch (category) {\n case 'rate_limit':\n cooldownMs = this.cooldowns.rateLimit\n break\n case 'server_error':\n cooldownMs = this.cooldowns.serverError\n break\n case 'connection_failure':\n cooldownMs = this.cooldowns.connectionFailure\n break\n case 'content_policy':\n cooldownMs = this.cooldowns.contentPolicy\n break\n default:\n cooldownMs = this.cooldowns.serverError // default to server error cooldown\n }\n\n if (cooldownMs > 0) {\n const expiresAt = Date.now() + cooldownMs\n this.cooldownMap.set(providerId, { expiresAt, category })\n\n this.events?.emit('provider.cooldown', {\n providerId,\n errorCategory: category,\n cooldownMs,\n expiresAt,\n })\n }\n }\n}\n","import type {\n CompletionRequest,\n CompletionResponse,\n EmbedRequest,\n EmbedResponse,\n ProbeResult,\n StreamChunk,\n} from './capabilities/inference-provider.js'\n\nexport interface FortemiBridgeCapabilities {\n secureSecrets: boolean\n providerRouting: boolean\n localNetworkAccess: boolean\n auditLog: boolean\n}\n\nexport interface FortemiSecretStore {\n isAvailable(): boolean | Promise<boolean>\n getSecret(key: string): Promise<string | null>\n setSecret(key: string, value: string): Promise<void>\n deleteSecret(key: string): Promise<void>\n}\n\nexport interface BridgeProviderInfo {\n id: string\n name: string\n tier: 'remote' | 'local-server' | 'in-browser' | 'chrome-ai'\n requiresApiKey: boolean\n capabilities: {\n chat?: boolean\n embeddings?: boolean\n streaming?: boolean\n }\n}\n\nexport interface FortemiInferenceRouter {\n listProviders(): Promise<BridgeProviderInfo[]>\n probeProvider(providerId: string): Promise<ProbeResult>\n complete(providerId: string, request: CompletionRequest): Promise<CompletionResponse>\n embed(providerId: string, request: EmbedRequest): Promise<EmbedResponse>\n stream?(providerId: string, request: CompletionRequest): AsyncIterable<StreamChunk>\n}\n\nexport interface FortemiBridge {\n version: string\n capabilities(): Promise<FortemiBridgeCapabilities>\n secrets: FortemiSecretStore\n inference?: FortemiInferenceRouter\n}\n\nexport interface FortemiBridgeHost {\n fortemiBridge?: FortemiBridge\n fortemiSecureStorage?: FortemiSecretStore\n}\n\nexport function getFortemiBridge(host: FortemiBridgeHost | undefined = globalThis as FortemiBridgeHost): FortemiBridge | null {\n return host?.fortemiBridge ?? null\n}\n\nexport function getFortemiSecretStore(host: FortemiBridgeHost | undefined = globalThis as FortemiBridgeHost): FortemiSecretStore | null {\n return host?.fortemiBridge?.secrets ?? host?.fortemiSecureStorage ?? null\n}\n\nexport async function hasFortemiSecureSecrets(host: FortemiBridgeHost | undefined = globalThis as FortemiBridgeHost): Promise<boolean> {\n const bridge = getFortemiBridge(host)\n if (bridge) {\n try {\n const capabilities = await bridge.capabilities()\n if (!capabilities.secureSecrets) return false\n return Boolean(await bridge.secrets.isAvailable())\n } catch {\n return false\n }\n }\n\n const legacySecrets = host?.fortemiSecureStorage\n if (!legacySecrets) return false\n try {\n return Boolean(await legacySecrets.isAvailable())\n } catch {\n return false\n }\n}\n","\nexport type CspDirectiveName =\n | 'default-src'\n | 'base-uri'\n | 'object-src'\n | 'frame-ancestors'\n | 'img-src'\n | 'font-src'\n | 'style-src'\n | 'script-src'\n | 'connect-src'\n | 'worker-src'\n | 'manifest-src'\n | 'report-uri'\n\nexport type CspDirectives = Partial<Record<CspDirectiveName, string[]>>\n\nexport interface PluginCspOptions {\n scriptSrc?: string[]\n connectSrc?: string[]\n imgSrc?: string[]\n styleSrc?: string[]\n reportUri?: string\n extraDirectives?: CspDirectives\n}\n\nexport interface PluginScriptPolicy {\n allowedOrigins: string[]\n allowedUrls?: string[]\n requireSri?: boolean\n}\n\nexport interface PluginScriptDescriptor {\n url: string\n integrity?: string\n crossOrigin?: 'anonymous' | 'use-credentials'\n}\n\nexport interface LoadedPluginScript {\n url: string\n integrity: string\n bytes: Uint8Array\n text: string\n}\n\nexport interface CspViolationReport {\n documentUri?: string\n violatedDirective?: string\n effectiveDirective?: string\n blockedUri?: string\n originalPolicy?: string\n disposition?: string\n sourceFile?: string\n lineNumber?: number\n columnNumber?: number\n raw: unknown\n}\n\nconst DEFAULT_DIRECTIVES: CspDirectives = {\n 'default-src': [\"'self'\"],\n 'base-uri': [\"'self'\"],\n 'object-src': [\"'none'\"],\n 'frame-ancestors': [\"'self'\"],\n 'img-src': [\"'self'\", 'data:', 'blob:'],\n 'font-src': [\"'self'\", 'data:'],\n 'style-src': [\"'self'\", \"'unsafe-inline'\"],\n 'script-src': [\"'self'\", \"'strict-dynamic'\"],\n 'connect-src': [\"'self'\"],\n 'worker-src': [\"'self'\", 'blob:'],\n 'manifest-src': [\"'self'\"],\n}\n\nconst SUPPORTED_SRI_ALGORITHMS = new Set(['sha256', 'sha384', 'sha512'])\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values.filter(Boolean)))\n}\n\nfunction mergeDirective(base: string[] | undefined, additions: string[] | undefined): string[] | undefined {\n if (!base && !additions) return undefined\n return unique([...(base ?? []), ...(additions ?? [])])\n}\n\nexport function buildPluginCsp(options: PluginCspOptions = {}): string {\n const directives: CspDirectives = { ...DEFAULT_DIRECTIVES }\n directives['script-src'] = mergeDirective(directives['script-src'], options.scriptSrc)\n directives['connect-src'] = mergeDirective(directives['connect-src'], options.connectSrc)\n directives['img-src'] = mergeDirective(directives['img-src'], options.imgSrc)\n directives['style-src'] = mergeDirective(directives['style-src'], options.styleSrc)\n\n if (options.reportUri) {\n directives['report-uri'] = [options.reportUri]\n }\n\n for (const [name, values] of Object.entries(options.extraDirectives ?? {}) as Array<[CspDirectiveName, string[]]>) {\n directives[name] = mergeDirective(directives[name], values)\n }\n\n return Object.entries(directives)\n .filter((entry): entry is [string, string[]] => Array.isArray(entry[1]) && entry[1].length > 0)\n .map(([name, values]) => name + ' ' + values.join(' '))\n .join('; ')\n}\n\nfunction parseSriToken(integrity: string): { algorithm: string; digest: string } {\n const token = integrity.trim().split(/\\s+/)[0]\n const separator = token.indexOf('-')\n if (separator <= 0) throw new Error('Invalid SRI token')\n\n const algorithm = token.slice(0, separator).toLowerCase()\n const digest = token.slice(separator + 1)\n if (!SUPPORTED_SRI_ALGORITHMS.has(algorithm)) {\n throw new Error('Unsupported SRI algorithm: ' + algorithm)\n }\n if (!digest) throw new Error('Invalid SRI digest')\n return { algorithm, digest }\n}\n\nfunction toBase64(bytes: ArrayBuffer): string {\n const data = new Uint8Array(bytes)\n let binary = ''\n for (const byte of data) binary += String.fromCharCode(byte)\n return btoa(binary)\n}\n\nfunction toArrayBuffer(data: Uint8Array | ArrayBuffer): ArrayBuffer {\n if (data instanceof ArrayBuffer) return data\n return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer\n}\n\nexport async function computeSri(data: Uint8Array | ArrayBuffer, algorithm = 'sha384'): Promise<string> {\n const normalized = algorithm.toLowerCase()\n if (!SUPPORTED_SRI_ALGORITHMS.has(normalized)) {\n throw new Error('Unsupported SRI algorithm: ' + algorithm)\n }\n const digest = await crypto.subtle.digest(normalized.toUpperCase().replace('SHA', 'SHA-'), toArrayBuffer(data))\n return normalized + '-' + toBase64(digest)\n}\n\nexport async function verifySri(data: Uint8Array | ArrayBuffer, integrity: string): Promise<boolean> {\n const expected = parseSriToken(integrity)\n return (await computeSri(data, expected.algorithm)) === expected.algorithm + '-' + expected.digest\n}\n\nexport function isPluginScriptAllowed(url: string, policy: PluginScriptPolicy): boolean {\n let parsed: URL\n try {\n parsed = new URL(url, globalThis.location?.href)\n } catch {\n return false\n }\n\n const exactAllowed = policy.allowedUrls?.some(allowed => new URL(allowed, parsed.href).href === parsed.href) ?? false\n if (exactAllowed) return true\n\n return policy.allowedOrigins.some(origin => {\n if (origin === '*') return true\n return new URL(origin, parsed.href).origin === parsed.origin\n })\n}\n\nexport async function fetchPluginScript(\n descriptor: PluginScriptDescriptor,\n policy: PluginScriptPolicy,\n fetchFn: typeof fetch = fetch,\n): Promise<LoadedPluginScript> {\n if (!isPluginScriptAllowed(descriptor.url, policy)) {\n throw new Error('Plugin script origin is not allowlisted: ' + descriptor.url)\n }\n if (policy.requireSri !== false && !descriptor.integrity) {\n throw new Error('Plugin script requires an SRI integrity value: ' + descriptor.url)\n }\n\n const response = await fetchFn(descriptor.url, {\n credentials: descriptor.crossOrigin === 'use-credentials' ? 'include' : 'omit',\n })\n if (!response.ok) {\n throw new Error('Plugin script fetch failed with HTTP ' + response.status + ': ' + descriptor.url)\n }\n\n const bytes = new Uint8Array(await response.arrayBuffer())\n if (descriptor.integrity && !(await verifySri(bytes, descriptor.integrity))) {\n throw new Error('Plugin script failed SRI verification: ' + descriptor.url)\n }\n\n return {\n url: descriptor.url,\n integrity: descriptor.integrity ?? await computeSri(bytes),\n bytes,\n text: new TextDecoder().decode(bytes),\n }\n}\n\nexport async function appendPluginScript(\n descriptor: PluginScriptDescriptor,\n policy: PluginScriptPolicy,\n doc: Document = document,\n): Promise<HTMLScriptElement> {\n if (!isPluginScriptAllowed(descriptor.url, policy)) {\n throw new Error('Plugin script origin is not allowlisted: ' + descriptor.url)\n }\n if (policy.requireSri !== false && !descriptor.integrity) {\n throw new Error('Plugin script requires an SRI integrity value: ' + descriptor.url)\n }\n\n const script = doc.createElement('script')\n script.type = 'module'\n script.src = descriptor.url\n if (descriptor.integrity) script.integrity = descriptor.integrity\n script.crossOrigin = descriptor.crossOrigin ?? 'anonymous'\n\n await new Promise<void>((resolve, reject) => {\n script.addEventListener('load', () => resolve(), { once: true })\n script.addEventListener('error', () => reject(new Error('Plugin script failed to load: ' + descriptor.url)), { once: true })\n doc.head.appendChild(script)\n })\n\n return script\n}\n\nexport function parseCspReport(body: unknown): CspViolationReport {\n const report = typeof body === 'object' && body !== null && 'csp-report' in body\n ? (body as { 'csp-report': Record<string, unknown> })['csp-report']\n : typeof body === 'object' && body !== null && 'body' in body\n ? (body as { body: Record<string, unknown> }).body\n : body\n\n const r = report as Record<string, unknown>\n return {\n documentUri: typeof r['document-uri'] === 'string' ? r['document-uri'] : undefined,\n violatedDirective: typeof r['violated-directive'] === 'string' ? r['violated-directive'] : undefined,\n effectiveDirective: typeof r['effective-directive'] === 'string' ? r['effective-directive'] : undefined,\n blockedUri: typeof r['blocked-uri'] === 'string' ? r['blocked-uri'] : undefined,\n originalPolicy: typeof r['original-policy'] === 'string' ? r['original-policy'] : undefined,\n disposition: typeof r.disposition === 'string' ? r.disposition : undefined,\n sourceFile: typeof r['source-file'] === 'string' ? r['source-file'] : undefined,\n lineNumber: typeof r['line-number'] === 'number' ? r['line-number'] : undefined,\n columnNumber: typeof r['column-number'] === 'number' ? r['column-number'] : undefined,\n raw: body,\n }\n}\n\nexport function createCspReportHandler(\n onReport: (report: CspViolationReport) => void | Promise<void>,\n): (request: Request) => Promise<Response> {\n return async (request: Request) => {\n if (request.method !== 'POST') {\n return new Response(null, { status: 405, headers: { Allow: 'POST' } })\n }\n\n let json: unknown\n try {\n json = await request.json()\n } catch {\n return new Response(JSON.stringify({ error: 'Invalid CSP report JSON' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n await onReport(parseCspReport(json))\n return new Response(null, { status: 204 })\n }\n}\n","/**\n * Shard format types — matches the fortemi server matric-shard specification.\n *\n * A shard is a gzip-compressed tar archive (.shard) containing serialized\n * knowledge data with a manifest for integrity verification.\n */\n\nexport const CURRENT_SHARD_VERSION = '1.0.0'\nexport const SHARD_FORMAT = 'matric-shard'\n\n/** Components that can appear in a shard archive. */\nexport type ShardComponent =\n | 'notes'\n | 'collections'\n | 'tags'\n | 'links'\n | 'embedding_sets'\n | 'embedding_set_members'\n | 'embedding_configs'\n | 'embeddings'\n | 'skos_schemes'\n | 'skos_concepts'\n | 'skos_relations'\n | 'note_skos_tags'\n | 'provenance_edges'\n | 'community_assignments'\n | 'communities'\n | 'graph_edges'\n | 'graph_sources'\n\n/**\n * Reference to one cluster file of a component split across addressable files\n * (`notes/000.jsonl`, `notes/001.jsonl`, …). `offset`/`count` are the record\n * range within the component, so an in-place reader fetches only the clusters a\n * query needs — the shard analog of the AIWG chunk-manifest scan parts.\n */\nexport interface ShardClusterRef {\n href: string // path within the shard, relative to manifest base\n offset: number // index of the first record in this cluster\n count: number // records in this cluster\n}\n\n/**\n * Optional clustered layout (additive — absent on monolithic shards). When a\n * component is present here, its records live in the listed cluster files instead\n * of (or in addition to) the single `<component>.jsonl`. Both `importShard` and\n * the in-place reader consume it; a monolithic shard omits `layout` entirely.\n */\nexport interface ShardLayout {\n clusters?: Partial<Record<ShardComponent, ShardClusterRef[]>>\n}\n\n/** Manifest included in every shard as manifest.json. */\nexport interface ShardManifest {\n version: string\n matric_version: string\n format: typeof SHARD_FORMAT\n created_at: string // ISO 8601\n components: ShardComponent[]\n counts: Partial<Record<ShardComponent | 'community_sets', number>>\n checksums: Record<string, string> // filename → sha256 hex\n min_reader_version: string\n /** Clustered component layout for partial fetch (issue #189). Absent → monolithic. */\n layout?: ShardLayout\n}\n\n/** Options for shard export. */\nexport interface ExportOptions {\n includeEmbeddings?: boolean\n /** Filter to specific collection (export only notes in this collection). */\n collectionId?: string\n /** Filter to notes with this tag (e.g. 'app:research' for app-scoped export). */\n tag?: string\n /** Export only these embedding sets and their member/vector rows. */\n embeddingSetIds?: string[]\n /** Preserve virtual selector materialization metadata and virtual member rows. */\n includeMaterializedSelectors?: boolean\n /**\n * When set to a positive integer, emit notes as clustered files\n * (`notes/000.jsonl`, …) of this many records each, and record the layout in\n * the manifest, so an in-place reader can fetch only the clusters it needs\n * (issue #189). Absent → a single monolithic `notes.jsonl` (unchanged).\n */\n clusterNotesSize?: number\n}\n\n/** Conflict resolution strategy for shard import. */\nexport type ConflictStrategy = 'skip' | 'replace' | 'error'\n\n/** Options for shard import. */\nexport interface ImportOptions {\n conflictStrategy?: ConflictStrategy\n /** Rows processed between cooperative yields. Defaults to 250. */\n batchSize?: number\n /** Progress callback for long-running import phases. */\n onProgress?: (progress: ImportProgress) => void\n}\n\nexport type ImportProgressPhase =\n | 'unpack'\n | 'validate'\n | 'collections'\n | 'notes'\n | 'skos'\n | 'links'\n | 'provenance'\n | 'embedding_sets'\n | 'embeddings'\n | 'embedding_set_members'\n | 'graph'\n | 'communities'\n | 'index'\n\nexport interface ImportProgress {\n phase: ImportProgressPhase\n done: number\n total: number\n}\n\n/** Per-entity import counts. */\nexport interface ImportCounts {\n notes: number\n collections: number\n tags: number\n links: number\n embedding_sets: number\n embedding_set_members: number\n embeddings: number\n skos_schemes: number\n skos_concepts: number\n skos_relations: number\n note_skos_tags: number\n provenance_edges: number\n graph_sources: number\n graph_edges: number\n community_sets: number\n communities: number\n community_assignments: number\n}\n\n/** Result of a shard import operation. */\nexport interface ImportResult {\n success: boolean\n counts: ImportCounts\n skipped: Partial<ImportCounts>\n warnings: string[]\n errors: string[]\n duration_ms: number\n}\n\n// ── Shard-format entity shapes (server-compatible) ──────────────────────\n\n/** Note as serialized in the shard JSONL. */\nexport interface ShardNote {\n id: string\n title: string | null\n original_content: string\n revised_content: string | null\n format: string\n source: string\n starred: boolean\n archived: boolean\n tags: string[]\n created_at: string\n updated_at: string\n deleted_at: string | null\n}\n\n/** Collection as serialized in the shard JSON array. */\nexport interface ShardCollection {\n id: string\n name: string\n description: string | null\n parent_id: string | null\n created_at: string\n note_count?: number\n}\n\n/** Tag as serialized in the shard JSON array. */\nexport interface ShardTag {\n name: string\n created_at: string\n}\n\n/** Link as serialized in the shard JSONL. */\nexport interface ShardLink {\n id: string\n from_note_id: string\n to_note_id: string\n kind: string\n score: number | null\n created_at: string\n metadata?: Record<string, unknown>\n}\n\n/** Embedding set as serialized in the shard JSON array. */\nexport interface ShardEmbeddingSet {\n id: string\n name?: string\n purpose?: string | null\n model: string\n dimension: number\n kind?: 'physical' | 'filter' | 'virtual'\n mode?: 'auto' | 'manual' | 'mixed' | null\n truncate_dimension?: number | null\n criteria?: Record<string, unknown> | null\n source?: Record<string, unknown> | null\n compatibility?: Record<string, unknown> | null\n materialization?: Record<string, unknown> | null\n freshness?: ShardArtifactFreshness | null\n created_at: string\n updated_at?: string\n}\n\n/** Embedding set member as serialized in the shard JSONL. */\nexport interface ShardEmbeddingSetMember {\n embedding_set_id: string\n note_id: string\n embedding_id: string\n}\n\n/** Embedding as serialized in the shard JSONL. */\nexport interface ShardEmbedding {\n id: string\n note_id: string\n embedding_set_id: string\n vector: number[]\n created_at: string\n}\n\n\n/** SKOS scheme as serialized in the shard JSON array. */\nexport interface ShardSkosScheme {\n id: string\n title: string\n description: string | null\n created_at: string\n updated_at: string\n}\n\n/** SKOS concept as serialized in the shard JSON array. */\nexport interface ShardSkosConcept {\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[]\n definition: string | null\n created_at: string\n updated_at: string\n}\n\n/** SKOS concept relation as serialized in the shard JSONL. */\nexport interface ShardSkosRelation {\n id: string\n source_concept_id: string\n target_concept_id: string\n relation_type: 'broader' | 'narrower' | 'related'\n created_at: string\n}\n\n/** Note-to-SKOS-concept assignment as serialized in the shard JSONL. */\nexport interface ShardNoteSkosTag {\n id: string\n note_id: string\n concept_id: string\n created_at: string\n}\n\n/** Provenance edge as serialized in the shard JSONL. */\nexport interface ShardProvenanceEdge {\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: string\n ended_at: string | null\n attributes: Record<string, unknown> | null\n}\n\n\n// - Graph/community derived artifacts ---------------------------------------\n\nexport interface ShardArtifactFreshness {\n status: 'fresh' | 'stale' | 'unknown'\n checked_at?: string\n stale_reason?: string\n source_hashes?: {\n notes?: string\n links?: string\n embeddings?: string\n embedding_set_members?: string\n virtual_set_definition?: string\n parameters?: string\n }\n}\n\nexport interface ShardGraphSource {\n id: string\n name: string\n kind: 'link' | 'similarity' | 'search' | 'manual' | 'imported'\n source_table?: 'link' | 'embedding' | 'manual' | null\n embedding_set_id?: string | null\n virtual_set_id?: string | null\n model?: string | null\n dimension?: number | null\n truncate_dimension?: number | null\n metric?: 'cosine' | 'inner_product' | 'l2' | null\n algorithm?: string | null\n parameters?: Record<string, unknown>\n input_hash: string\n freshness: ShardArtifactFreshness\n created_at: string\n}\n\nexport interface ShardGraphEdge {\n graph_source_id: string\n from_note_id: string\n to_note_id: string\n weight: number\n kind: 'link' | 'similarity' | 'manual'\n rank?: number | null\n metadata?: Record<string, unknown>\n}\n\nexport interface ShardCommunitySet {\n id: string\n graph_source_id: string\n name: string\n source_type: 'precomputed' | 'dynamic-snapshot' | 'user-authored' | 'imported'\n algorithm?: string | null\n parameters?: Record<string, unknown>\n input_hash: string\n freshness: ShardArtifactFreshness\n communities: ShardCommunity[]\n created_at: string\n}\n\nexport interface ShardCommunity {\n id: string\n label?: string | null\n rank?: number | null\n size?: number | null\n confidence?: number | null\n representative_note_ids?: string[]\n metadata?: Record<string, unknown>\n}\n\nexport interface ShardCommunityAssignment {\n community_set_id: string\n community_id: string\n note_id: string\n confidence?: number | null\n source_type: 'precomputed' | 'dynamic-snapshot' | 'user-authored' | 'imported'\n metadata?: Record<string, unknown>\n}\n","/**\n * Minimal tar + gzip packing/unpacking for shard archives.\n *\n * Uses fflate for gzip compression and implements a lightweight POSIX tar\n * encoder/decoder (512-byte block headers, ustar format).\n */\n\nimport { gzipSync, gunzipSync } from 'fflate'\n\n// ── Tar constants ────────────────────────────────────────────────────────\n\nconst BLOCK_SIZE = 512\nconst USTAR_MAGIC = 'ustar\\x0000'\n\n// ── Tar encoder ──────────────────────────────────────────────────────────\n\nfunction writeString(buf: Uint8Array, offset: number, str: string, len: number) {\n for (let i = 0; i < Math.min(str.length, len); i++) {\n buf[offset + i] = str.charCodeAt(i)\n }\n}\n\nfunction writeOctal(buf: Uint8Array, offset: number, value: number, len: number) {\n const str = value.toString(8).padStart(len - 1, '0')\n writeString(buf, offset, str, len - 1)\n}\n\nfunction computeHeaderChecksum(header: Uint8Array): number {\n // For checksum computation, treat the checksum field (offset 148, 8 bytes) as spaces\n let sum = 0\n for (let i = 0; i < BLOCK_SIZE; i++) {\n sum += i >= 148 && i < 156 ? 32 : header[i]\n }\n return sum\n}\n\nfunction createTarHeader(filename: string, size: number): Uint8Array {\n const header = new Uint8Array(BLOCK_SIZE)\n\n // name (0, 100)\n writeString(header, 0, filename, 100)\n // mode (100, 8) — 0644\n writeOctal(header, 100, 0o644, 8)\n // uid (108, 8)\n writeOctal(header, 108, 0, 8)\n // gid (116, 8)\n writeOctal(header, 116, 0, 8)\n // size (124, 12)\n writeOctal(header, 124, size, 12)\n // mtime (136, 12)\n writeOctal(header, 136, Math.floor(Date.now() / 1000), 12)\n // typeflag (156) — '0' for regular file\n header[156] = 48 // ASCII '0'\n // magic (257, 8) — ustar\\000\n writeString(header, 257, USTAR_MAGIC, 8)\n\n // compute and write checksum (148, 8)\n const checksum = computeHeaderChecksum(header)\n const csStr = checksum.toString(8).padStart(6, '0')\n writeString(header, 148, csStr, 6)\n header[154] = 0 // null terminator\n header[155] = 32 // space\n\n return header\n}\n\nfunction encodeTar(files: Map<string, Uint8Array>): Uint8Array {\n const blocks: Uint8Array[] = []\n\n for (const [filename, data] of files) {\n blocks.push(createTarHeader(filename, data.byteLength))\n blocks.push(data)\n\n // Pad to 512-byte boundary\n const remainder = data.byteLength % BLOCK_SIZE\n if (remainder > 0) {\n blocks.push(new Uint8Array(BLOCK_SIZE - remainder))\n }\n }\n\n // Two zero blocks mark end of archive\n blocks.push(new Uint8Array(BLOCK_SIZE * 2))\n\n // Concatenate\n let totalLen = 0\n for (const b of blocks) totalLen += b.byteLength\n const result = new Uint8Array(totalLen)\n let offset = 0\n for (const b of blocks) {\n result.set(b, offset)\n offset += b.byteLength\n }\n return result\n}\n\n// ── Tar decoder ──────────────────────────────────────────────────────────\n\nfunction readString(buf: Uint8Array, offset: number, len: number): string {\n let end = offset\n const limit = offset + len\n while (end < limit && buf[end] !== 0) end++\n return String.fromCharCode(...buf.slice(offset, end))\n}\n\nfunction readOctal(buf: Uint8Array, offset: number, len: number): number {\n const str = readString(buf, offset, len).trim()\n return str.length > 0 ? parseInt(str, 8) : 0\n}\n\nfunction isZeroBlock(buf: Uint8Array, offset: number): boolean {\n for (let i = 0; i < BLOCK_SIZE; i++) {\n if (buf[offset + i] !== 0) return false\n }\n return true\n}\n\nfunction decodeTar(tarData: Uint8Array): Map<string, Uint8Array> {\n const files = new Map<string, Uint8Array>()\n let offset = 0\n\n while (offset + BLOCK_SIZE <= tarData.byteLength) {\n // Check for end-of-archive (two zero blocks)\n if (isZeroBlock(tarData, offset)) break\n\n const name = readString(tarData, offset, 100)\n const size = readOctal(tarData, offset + 124, 12)\n const typeflag = tarData[offset + 156]\n\n offset += BLOCK_SIZE // skip header\n\n // Only extract regular files (typeflag '0' or NUL)\n if (typeflag === 48 || typeflag === 0) {\n files.set(name, tarData.slice(offset, offset + size))\n }\n\n // Advance past data blocks (padded to 512-byte boundary)\n const dataBlocks = Math.ceil(size / BLOCK_SIZE)\n offset += dataBlocks * BLOCK_SIZE\n }\n\n return files\n}\n\n// ── Public API ───────────────────────────────────────────────────────────\n\n/**\n * Pack files into a gzip-compressed tar archive.\n *\n * @param files Map of filename → file contents\n * @returns Compressed archive bytes (suitable for .shard file)\n */\nexport function packTarGz(files: Map<string, Uint8Array>): Uint8Array {\n const tarData = encodeTar(files)\n return gzipSync(tarData)\n}\n\n/**\n * Unpack a gzip-compressed tar archive.\n *\n * @param data Compressed archive bytes\n * @returns Map of filename → file contents\n */\nexport function unpackTarGz(data: Uint8Array): Map<string, Uint8Array> {\n const tarData = gunzipSync(data)\n return decodeTar(tarData)\n}\n","/**\n * SHA-256 checksum utilities for shard integrity verification.\n * Uses the Web Crypto API (browser-native, no extra dependencies).\n */\n\n/**\n * Compute SHA-256 hex digest of a Uint8Array.\n * Returns lowercase hex string (64 characters).\n */\nexport async function sha256Hex(data: Uint8Array): Promise<string> {\n const buf = new ArrayBuffer(data.byteLength)\n new Uint8Array(buf).set(data)\n const hashBuffer = await crypto.subtle.digest('SHA-256', buf)\n const hashArray = new Uint8Array(hashBuffer)\n return Array.from(hashArray)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\n/**\n * Validate checksums listed in a shard manifest against actual file contents.\n *\n * @returns Object with `valid` flag and list of failed filenames.\n */\nexport async function validateChecksums(\n checksums: Record<string, string>,\n files: Map<string, Uint8Array>,\n): Promise<{ valid: boolean; failures: string[] }> {\n const failures: string[] = []\n\n for (const [filename, expectedHash] of Object.entries(checksums)) {\n const fileData = files.get(filename)\n if (!fileData) {\n failures.push(filename)\n continue\n }\n const actualHash = await sha256Hex(fileData)\n if (actualHash !== expectedHash) {\n failures.push(filename)\n }\n }\n\n return { valid: failures.length === 0, failures }\n}\n","/**\n * Field mapper — converts between browser schema and shard (server) schema.\n *\n * The browser uses different field names than the server shard format.\n * This module handles all rename transforms bidirectionally.\n */\n\nimport type {\n ShardNote,\n ShardLink,\n ShardTag,\n ShardCollection,\n ShardEmbeddingSet,\n ShardEmbeddingSetMember,\n ShardEmbedding,\n ShardSkosScheme,\n ShardSkosConcept,\n ShardSkosRelation,\n ShardNoteSkosTag,\n ShardProvenanceEdge,\n} from './types.js'\nimport type { LinkRow } from '../repositories/links-repository.js'\nimport type { CollectionRow } from '../repositories/collections-repository.js'\n\n// ── Notes ────────────────────────────────────────────────────────────────\n\n/** Browser-format note row from the export query (denormalized). */\nexport interface BrowserNoteExport {\n id: string\n title: string | null\n format: string\n source: string\n is_starred: boolean\n is_archived: boolean\n created_at: Date | string\n updated_at: Date | string\n deleted_at: Date | string | null\n original_content: string\n revised_content: string | null\n tags: string[]\n}\n\n/** Convert a browser note to shard format. */\nexport function noteToShard(note: BrowserNoteExport): ShardNote {\n return {\n id: note.id,\n title: note.title,\n original_content: note.original_content,\n revised_content: note.revised_content,\n format: note.format,\n source: note.source,\n starred: note.is_starred,\n archived: note.is_archived,\n tags: note.tags,\n created_at: toISOString(note.created_at),\n updated_at: toISOString(note.updated_at),\n deleted_at: note.deleted_at ? toISOString(note.deleted_at) : null,\n }\n}\n\n/** Convert a shard note back to browser-insertable format. */\nexport function noteFromShard(shard: ShardNote): BrowserNoteExport {\n return {\n id: shard.id,\n title: shard.title,\n format: shard.format,\n source: shard.source,\n is_starred: shard.starred,\n is_archived: shard.archived,\n original_content: shard.original_content,\n revised_content: shard.revised_content,\n tags: shard.tags,\n created_at: shard.created_at,\n updated_at: shard.updated_at,\n deleted_at: shard.deleted_at,\n }\n}\n\n// ── Links ────────────────────────────────────────────────────────────────\n\n/** Convert a browser link to shard format. */\nexport function linkToShard(link: LinkRow): ShardLink {\n return {\n id: link.id,\n from_note_id: link.source_note_id,\n to_note_id: link.target_note_id,\n kind: link.link_type,\n score: link.confidence,\n created_at: toISOString(link.created_at),\n }\n}\n\n/** Convert a shard link back to browser-insertable format. */\nexport function linkFromShard(shard: ShardLink): {\n id: string\n source_note_id: string\n target_note_id: string\n link_type: string\n confidence: number | null\n created_at: string\n} {\n return {\n id: shard.id,\n source_note_id: shard.from_note_id,\n target_note_id: shard.to_note_id,\n link_type: shard.kind,\n confidence: shard.score,\n created_at: shard.created_at,\n }\n}\n\n// ── Collections ──────────────────────────────────────────────────────────\n\n/** Convert a browser collection to shard format. */\nexport function collectionToShard(\n collection: CollectionRow,\n noteCount?: number,\n): ShardCollection {\n return {\n id: collection.id,\n name: collection.name,\n description: collection.description,\n parent_id: collection.parent_id,\n created_at: toISOString(collection.created_at),\n note_count: noteCount,\n }\n}\n\n/** Convert a shard collection back to browser-insertable format. */\nexport function collectionFromShard(shard: ShardCollection): {\n id: string\n name: string\n description: string | null\n parent_id: string | null\n created_at: string\n} {\n return {\n id: shard.id,\n name: shard.name,\n description: shard.description,\n parent_id: shard.parent_id,\n created_at: shard.created_at,\n }\n}\n\n// ── Tags ─────────────────────────────────────────────────────────────────\n\n/**\n * Convert SKOS concepts + note_tag associations into shard flat tag format.\n * Shard tags are simple string arrays — deduplicated across all notes.\n */\nexport function tagsToShard(\n allTags: Array<{ name: string; created_at: Date | string }>,\n): ShardTag[] {\n return allTags.map((t) => ({\n name: t.name,\n created_at: toISOString(t.created_at),\n }))\n}\n\n/**\n * Convert shard flat tags to browser format for insertion.\n * Returns unique tag names ready for note_tag association.\n */\nexport function tagsFromShard(shardTags: ShardTag[]): string[] {\n return [...new Set(shardTags.map((t) => t.name))]\n}\n\n// ── Embeddings ───────────────────────────────────────────────────────────\n\n/** Convert a browser embedding_set to shard format. */\nexport function embeddingSetToShard(set: {\n id: string\n name?: string\n purpose?: string | null\n model_name: string\n dimensions: number\n kind?: 'physical' | 'filter' | 'virtual'\n mode?: 'auto' | 'manual' | 'mixed' | null\n truncate_dimension?: number | null\n criteria_json?: unknown | null\n source_json?: unknown | null\n compatibility_json?: unknown | null\n materialization_json?: unknown | null\n freshness_json?: unknown | null\n created_at: Date | string\n updated_at?: Date | string\n}): ShardEmbeddingSet {\n return {\n id: set.id,\n name: set.name ?? set.model_name,\n purpose: set.purpose ?? null,\n model: set.model_name,\n dimension: set.dimensions,\n kind: set.kind ?? 'physical',\n mode: set.mode ?? null,\n truncate_dimension: set.truncate_dimension ?? null,\n criteria: jsonObject(set.criteria_json),\n source: jsonObject(set.source_json),\n compatibility: jsonObject(set.compatibility_json),\n materialization: jsonObject(set.materialization_json),\n freshness: jsonObject(set.freshness_json) as ShardEmbeddingSet['freshness'],\n created_at: toISOString(set.created_at),\n updated_at: set.updated_at ? toISOString(set.updated_at) : undefined,\n }\n}\n\n/** Convert a shard embedding set back to browser format. */\nexport function embeddingSetFromShard(shard: ShardEmbeddingSet): {\n id: string\n name: string\n purpose: string | null\n model_name: string\n dimensions: number\n kind: 'physical' | 'filter' | 'virtual'\n mode: 'auto' | 'manual' | 'mixed' | null\n truncate_dimension: number | null\n criteria_json: string | null\n source_json: string | null\n compatibility_json: string | null\n materialization_json: string | null\n freshness_json: string | null\n created_at: string\n updated_at: string | null\n} {\n return {\n id: shard.id,\n name: shard.name ?? shard.model,\n purpose: shard.purpose ?? null,\n model_name: shard.model,\n dimensions: shard.dimension,\n kind: shard.kind ?? 'physical',\n mode: shard.mode ?? null,\n truncate_dimension: shard.truncate_dimension ?? null,\n criteria_json: jsonString(shard.criteria),\n source_json: jsonString(shard.source),\n compatibility_json: jsonString(shard.compatibility),\n materialization_json: jsonString(shard.materialization),\n freshness_json: jsonString(shard.freshness),\n created_at: shard.created_at,\n updated_at: shard.updated_at ?? null,\n }\n}\n\n/** Convert a browser embedding_set_member to shard format. */\nexport function embeddingSetMemberToShard(member: {\n embedding_set_id: string\n note_id: string\n embedding_id: string\n}): ShardEmbeddingSetMember {\n return {\n embedding_set_id: member.embedding_set_id,\n note_id: member.note_id,\n embedding_id: member.embedding_id,\n }\n}\n\n/** Convert a browser embedding to shard format. */\nexport function embeddingToShard(emb: {\n id: string\n note_id: string\n embedding_set_id: string\n vector: string | number[]\n created_at: Date | string\n}): ShardEmbedding {\n return {\n id: emb.id,\n note_id: emb.note_id,\n embedding_set_id: emb.embedding_set_id,\n vector: typeof emb.vector === 'string' ? parseVector(emb.vector) : emb.vector,\n created_at: toISOString(emb.created_at),\n }\n}\n\n/** Convert a shard embedding back to browser format. */\nexport function embeddingFromShard(shard: ShardEmbedding): {\n id: string\n note_id: string\n embedding_set_id: string\n vector: string\n created_at: string\n} {\n return {\n id: shard.id,\n note_id: shard.note_id,\n embedding_set_id: shard.embedding_set_id,\n vector: `[${shard.vector.join(',')}]`,\n created_at: shard.created_at,\n }\n}\n\n\n// ── SKOS ─────────────────────────────────────────────────────────────────\n\nexport function skosSchemeToShard(scheme: {\n id: string\n title: string\n description: string | null\n created_at: Date | string\n updated_at: Date | string\n}): ShardSkosScheme {\n return {\n id: scheme.id,\n title: scheme.title,\n description: scheme.description,\n created_at: toISOString(scheme.created_at),\n updated_at: toISOString(scheme.updated_at),\n }\n}\n\nexport function skosConceptToShard(concept: {\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[] | string | null\n definition: string | null\n created_at: Date | string\n updated_at: Date | string\n}): ShardSkosConcept {\n return {\n id: concept.id,\n scheme_id: concept.scheme_id,\n pref_label: concept.pref_label,\n alt_labels: parseJsonArrayField(concept.alt_labels),\n definition: concept.definition,\n created_at: toISOString(concept.created_at),\n updated_at: toISOString(concept.updated_at),\n }\n}\n\nexport function skosRelationToShard(relation: {\n id: string\n source_concept_id: string\n target_concept_id: string\n relation_type: 'broader' | 'narrower' | 'related'\n created_at: Date | string\n}): ShardSkosRelation {\n return {\n id: relation.id,\n source_concept_id: relation.source_concept_id,\n target_concept_id: relation.target_concept_id,\n relation_type: relation.relation_type,\n created_at: toISOString(relation.created_at),\n }\n}\n\nexport function noteSkosTagToShard(tag: {\n id: string\n note_id: string\n concept_id: string\n created_at: Date | string\n}): ShardNoteSkosTag {\n return {\n id: tag.id,\n note_id: tag.note_id,\n concept_id: tag.concept_id,\n created_at: toISOString(tag.created_at),\n }\n}\n\n// ── Provenance ───────────────────────────────────────────────────────────\n\nexport function provenanceEdgeToShard(edge: {\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: Date | string\n ended_at: Date | string | null\n attributes: Record<string, unknown> | string | null\n}): ShardProvenanceEdge {\n return {\n id: edge.id,\n entity_type: edge.entity_type,\n entity_id: edge.entity_id,\n activity: edge.activity,\n agent: edge.agent,\n started_at: toISOString(edge.started_at),\n ended_at: edge.ended_at ? toISOString(edge.ended_at) : null,\n attributes: parseJsonObjectField(edge.attributes),\n }\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────\n\nfunction toISOString(date: Date | string): string {\n if (date instanceof Date) return date.toISOString()\n return date\n}\n\n/** Parse a PGlite vector string \"[0.1,0.2,...]\" into a number array. */\nfunction parseVector(vectorStr: string): number[] {\n const inner = vectorStr.replace(/^\\[/, '').replace(/\\]$/, '')\n return inner.split(',').map(Number)\n}\n\nfunction parseJsonArrayField(value: string[] | string | null): string[] {\n if (Array.isArray(value)) return value\n if (!value) return []\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? parsed.map(String) : []\n}\n\nfunction parseJsonObjectField(value: Record<string, unknown> | string | null): Record<string, unknown> | null {\n if (!value) return null\n if (typeof value !== 'string') return value\n const parsed = JSON.parse(value)\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as Record<string, unknown> : null\n}\n\nfunction jsonObject(value: unknown): Record<string, unknown> | null {\n if (value == null) return null\n if (typeof value === 'string') return JSON.parse(value) as Record<string, unknown>\n return value as Record<string, unknown>\n}\n\nfunction jsonString(value: unknown): string | null {\n return value == null ? null : JSON.stringify(value)\n}\n","/**\n * Shard export pipeline — query all entities, serialize, pack into .shard archive.\n *\n * Pipeline: query DB → field-map → serialize (JSONL/JSON) → compute checksums → build manifest → tar.gz\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { VERSION } from '../index.js'\nimport { packTarGz } from './shard-tar.js'\nimport { sha256Hex } from './checksum.js'\nimport {\n noteToShard,\n linkToShard,\n collectionToShard,\n tagsToShard,\n embeddingSetToShard,\n embeddingSetMemberToShard,\n embeddingToShard,\n skosSchemeToShard,\n skosConceptToShard,\n skosRelationToShard,\n noteSkosTagToShard,\n provenanceEdgeToShard,\n} from './field-mapper.js'\nimport type { BrowserNoteExport } from './field-mapper.js'\nimport type { LinkRow } from '../repositories/links-repository.js'\nimport type { CollectionRow } from '../repositories/collections-repository.js'\nimport {\n CURRENT_SHARD_VERSION,\n SHARD_FORMAT,\n} from './types.js'\nimport type {\n ExportOptions,\n ShardManifest,\n ShardComponent,\n ShardClusterRef,\n ShardLayout,\n} from './types.js'\n\nconst encoder = new TextEncoder()\n\nfunction jsonObject(value: unknown): Record<string, unknown> | undefined {\n if (value == null) return undefined\n if (typeof value === 'string') return JSON.parse(value) as Record<string, unknown>\n return value as Record<string, unknown>\n}\n\nfunction iso(value: Date | string): string {\n return value instanceof Date ? value.toISOString() : value\n}\n\n/**\n * Export knowledge data from the database as a .shard archive (Uint8Array).\n *\n * @param db DatabaseClient database instance\n * @param options Export options (includeEmbeddings, collectionId filter)\n * @returns Compressed shard archive bytes\n */\nexport async function exportShard(\n db: DatabaseClient,\n options?: ExportOptions,\n): Promise<Uint8Array> {\n const files = new Map<string, Uint8Array>()\n const components: ShardComponent[] = []\n const counts: ShardManifest['counts'] = {}\n\n // ── Query notes ─────────────────────────────────────────────────────\n let noteQuery: string\n let noteParams: unknown[]\n\n if (options?.collectionId) {\n noteQuery = `SELECT n.id, n.title, n.format, n.source, n.is_starred, n.is_archived,\n n.created_at, n.updated_at, n.deleted_at,\n o.content as original_content,\n c.content as revised_content\n FROM note n\n LEFT JOIN note_original o ON o.note_id = n.id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n JOIN collection_note cn ON cn.note_id = n.id\n WHERE n.deleted_at IS NULL AND cn.collection_id = $1\n ORDER BY n.created_at`\n noteParams = [options.collectionId]\n } else if (options?.tag) {\n noteQuery = `SELECT n.id, n.title, n.format, n.source, n.is_starred, n.is_archived,\n n.created_at, n.updated_at, n.deleted_at,\n o.content as original_content,\n c.content as revised_content\n FROM note n\n LEFT JOIN note_original o ON o.note_id = n.id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n JOIN note_tag nt ON nt.note_id = n.id AND nt.tag = $1\n WHERE n.deleted_at IS NULL\n ORDER BY n.created_at`\n noteParams = [options.tag]\n } else {\n noteQuery = `SELECT n.id, n.title, n.format, n.source, n.is_starred, n.is_archived,\n n.created_at, n.updated_at, n.deleted_at,\n o.content as original_content,\n c.content as revised_content\n FROM note n\n LEFT JOIN note_original o ON o.note_id = n.id\n LEFT JOIN note_revised_current c ON c.note_id = n.id\n WHERE n.deleted_at IS NULL\n ORDER BY n.created_at`\n noteParams = []\n }\n\n const noteRows = await db.query<{\n id: string\n title: string | null\n format: string\n source: string\n is_starred: boolean\n is_archived: boolean\n created_at: Date\n updated_at: Date\n deleted_at: Date | null\n original_content: string\n revised_content: string | null\n }>(noteQuery, noteParams)\n\n // Fetch tags per note\n const tagRows = await db.query<{ note_id: string; tag: string }>(\n `SELECT note_id, tag FROM note_tag ORDER BY note_id, tag`,\n )\n const tagsByNote = new Map<string, string[]>()\n for (const row of tagRows.rows) {\n const tags = tagsByNote.get(row.note_id) ?? []\n tags.push(row.tag)\n tagsByNote.set(row.note_id, tags)\n }\n\n const notes: BrowserNoteExport[] = noteRows.rows.map((row) => ({\n ...row,\n tags: tagsByNote.get(row.id) ?? [],\n }))\n\n // Collect exported note IDs for scoping related data\n const exportedNoteIds = new Set(notes.map((n) => n.id))\n\n const shardNotes = notes.map((n) => noteToShard(n))\n let layout: ShardLayout | undefined\n const clusterSize = options?.clusterNotesSize\n if (clusterSize && Number.isInteger(clusterSize) && clusterSize > 0 && shardNotes.length > 0) {\n // Clustered layout: one addressable file per `clusterSize` records (issue #189).\n const clusters: ShardClusterRef[] = []\n for (let offset = 0; offset < shardNotes.length; offset += clusterSize) {\n const slice = shardNotes.slice(offset, offset + clusterSize)\n const href = `notes/${String(offset).padStart(6, '0')}.jsonl`\n clusters.push({ href, offset, count: slice.length })\n files.set(href, encoder.encode(slice.map((n) => JSON.stringify(n)).join('\\n')))\n }\n layout = { clusters: { notes: clusters } }\n } else {\n files.set('notes.jsonl', encoder.encode(shardNotes.map((n) => JSON.stringify(n)).join('\\n')))\n }\n components.push('notes')\n counts.notes = notes.length\n\n // ── Query collections ───────────────────────────────────────────────\n const collectionRows = await db.query<CollectionRow>(\n `SELECT * FROM collection WHERE deleted_at IS NULL ORDER BY position, name`,\n )\n // Get note counts per collection\n const collNoteCountRows = await db.query<{ collection_id: string; cnt: string }>(\n `SELECT collection_id, COUNT(*) as cnt FROM collection_note GROUP BY collection_id`,\n )\n const noteCountMap = new Map<string, number>()\n for (const row of collNoteCountRows.rows) {\n noteCountMap.set(row.collection_id, parseInt(row.cnt, 10))\n }\n\n const shardCollections = collectionRows.rows.map((c) =>\n collectionToShard(c, noteCountMap.get(c.id) ?? 0),\n )\n files.set('collections.json', encoder.encode(JSON.stringify(shardCollections)))\n components.push('collections')\n counts.collections = shardCollections.length\n\n // ── Query tags (unique list, scoped to exported notes) ──────────────\n const allTagRows = await db.query<{ tag: string }>(\n `SELECT DISTINCT tag FROM note_tag ORDER BY tag`,\n )\n // When filtering, only include tags that appear on exported notes\n const isFiltered = !!(options?.tag || options?.collectionId)\n const relevantTags = isFiltered\n ? allTagRows.rows.filter((r) => {\n for (const note of notes) {\n if (note.tags.includes(r.tag)) return true\n }\n return false\n })\n : allTagRows.rows\n const shardTags = tagsToShard(\n relevantTags.map((r) => ({ name: r.tag, created_at: new Date() })),\n )\n files.set('tags.json', encoder.encode(JSON.stringify(shardTags)))\n components.push('tags')\n counts.tags = shardTags.length\n\n // ── Query links (scoped to exported notes) ──────────────────────────\n const linkRows = await db.query<LinkRow>(\n `SELECT * FROM link WHERE deleted_at IS NULL ORDER BY created_at`,\n )\n // When filtering, only include links where both endpoints are in the export\n const filteredLinks = (options?.tag || options?.collectionId)\n ? linkRows.rows.filter((l) => exportedNoteIds.has(l.source_note_id) && exportedNoteIds.has(l.target_note_id))\n : linkRows.rows\n const linksJsonl = filteredLinks.map((l) => JSON.stringify(linkToShard(l))).join('\\n')\n files.set('links.jsonl', encoder.encode(linksJsonl))\n components.push('links')\n counts.links = filteredLinks.length\n\n\n // ── Query SKOS (scoped to exported notes when filtered) ─────────────\n const allNoteSkosRows = await db.query<{\n id: string\n note_id: string\n concept_id: string\n created_at: Date\n }>(`SELECT * FROM note_skos_tag ORDER BY created_at`)\n const filteredNoteSkosRows = isFiltered\n ? allNoteSkosRows.rows.filter((row) => exportedNoteIds.has(row.note_id))\n : allNoteSkosRows.rows\n const referencedConceptIds = new Set(filteredNoteSkosRows.map((row) => row.concept_id))\n\n const allConceptRows = await db.query<{\n id: string\n scheme_id: string\n pref_label: string\n alt_labels: string[] | string | null\n definition: string | null\n created_at: Date\n updated_at: Date\n }>(`SELECT * FROM skos_concept WHERE deleted_at IS NULL ORDER BY pref_label`)\n const filteredConceptRows = isFiltered\n ? allConceptRows.rows.filter((row) => referencedConceptIds.has(row.id))\n : allConceptRows.rows\n const exportedConceptIds = new Set(filteredConceptRows.map((row) => row.id))\n const exportedSchemeIds = new Set(filteredConceptRows.map((row) => row.scheme_id))\n\n const allSchemeRows = await db.query<{\n id: string\n title: string\n description: string | null\n created_at: Date\n updated_at: Date\n }>(`SELECT * FROM skos_scheme WHERE deleted_at IS NULL ORDER BY title`)\n const filteredSchemeRows = isFiltered\n ? allSchemeRows.rows.filter((row) => exportedSchemeIds.has(row.id))\n : allSchemeRows.rows\n\n const allRelationRows = await db.query<{\n id: string\n source_concept_id: string\n target_concept_id: string\n relation_type: 'broader' | 'narrower' | 'related'\n created_at: Date\n }>(`SELECT * FROM skos_concept_relation ORDER BY created_at`)\n const filteredRelationRows = isFiltered\n ? allRelationRows.rows.filter((row) =>\n exportedConceptIds.has(row.source_concept_id) && exportedConceptIds.has(row.target_concept_id),\n )\n : allRelationRows.rows\n\n const shardSkosSchemes = filteredSchemeRows.map(skosSchemeToShard)\n files.set('skos_schemes.json', encoder.encode(JSON.stringify(shardSkosSchemes)))\n components.push('skos_schemes')\n counts.skos_schemes = shardSkosSchemes.length\n\n const shardSkosConcepts = filteredConceptRows.map(skosConceptToShard)\n files.set('skos_concepts.json', encoder.encode(JSON.stringify(shardSkosConcepts)))\n components.push('skos_concepts')\n counts.skos_concepts = shardSkosConcepts.length\n\n const skosRelationsJsonl = filteredRelationRows.map((row) => JSON.stringify(skosRelationToShard(row))).join('\\n')\n files.set('skos_relations.jsonl', encoder.encode(skosRelationsJsonl))\n components.push('skos_relations')\n counts.skos_relations = filteredRelationRows.length\n\n const noteSkosJsonl = filteredNoteSkosRows.map((row) => JSON.stringify(noteSkosTagToShard(row))).join('\\n')\n files.set('note_skos_tags.jsonl', encoder.encode(noteSkosJsonl))\n components.push('note_skos_tags')\n counts.note_skos_tags = filteredNoteSkosRows.length\n\n // ── Query provenance (scoped to exported notes when filtered) ───────\n const provenanceRows = await db.query<{\n id: string\n entity_type: string\n entity_id: string\n activity: string\n agent: string\n started_at: Date\n ended_at: Date | null\n attributes: Record<string, unknown> | string | null\n }>(`SELECT * FROM provenance_edge ORDER BY started_at`)\n const filteredProvenanceRows = isFiltered\n ? provenanceRows.rows.filter((row) => row.entity_type !== 'note' || exportedNoteIds.has(row.entity_id))\n : provenanceRows.rows\n const provenanceJsonl = filteredProvenanceRows.map((row) => JSON.stringify(provenanceEdgeToShard(row))).join('\\n')\n files.set('provenance_edges.jsonl', encoder.encode(provenanceJsonl))\n components.push('provenance_edges')\n counts.provenance_edges = filteredProvenanceRows.length\n\n // ── Query embeddings (optional) ─────────────────────────────────────\n if (options?.includeEmbeddings) {\n const embeddingSetIds = options.embeddingSetIds?.filter(Boolean) ?? []\n const setScoped = embeddingSetIds.length > 0\n const includeMaterializedSelectors = options.includeMaterializedSelectors === true\n const embSetRows = await db.query<{\n id: string\n name: string\n purpose: string | null\n model_name: string\n dimensions: number\n kind?: 'physical' | 'filter' | 'virtual'\n mode?: 'auto' | 'manual' | 'mixed' | null\n truncate_dimension?: number | null\n criteria_json?: unknown | null\n source_json?: unknown | null\n compatibility_json?: unknown | null\n materialization_json?: unknown | null\n freshness_json?: unknown | null\n created_at: Date\n updated_at?: Date\n }>(\n `SELECT * FROM embedding_set\n ${setScoped ? 'WHERE id = ANY($1)' : ''}\n ORDER BY created_at`,\n setScoped ? [embeddingSetIds] : [],\n )\n const exportedSetIds = new Set(embSetRows.rows.map((row) => row.id))\n const virtualSetIds = new Set(embSetRows.rows.filter((row) => row.kind === 'virtual').map((row) => row.id))\n\n const shardEmbSets = embSetRows.rows.map((row) => embeddingSetToShard(\n row.kind === 'virtual' && !includeMaterializedSelectors\n ? {\n ...row,\n materialization_json: undefined,\n freshness_json: { status: 'unknown' },\n }\n : row,\n ))\n files.set('embedding_sets.json', encoder.encode(JSON.stringify(shardEmbSets)))\n components.push('embedding_sets')\n counts.embedding_sets = shardEmbSets.length\n\n const embMemberRows = await db.query<{\n embedding_set_id: string\n note_id: string\n embedding_id: string\n }>(\n `SELECT * FROM embedding_set_member\n ${setScoped ? 'WHERE embedding_set_id = ANY($1)' : ''}`,\n setScoped ? [embeddingSetIds] : [],\n )\n const scopedEmbMemberRows = embMemberRows.rows.filter((member) =>\n exportedSetIds.has(member.embedding_set_id) &&\n exportedNoteIds.has(member.note_id) &&\n (includeMaterializedSelectors || !virtualSetIds.has(member.embedding_set_id)),\n )\n\n const membersJsonl = scopedEmbMemberRows\n .map((m) => JSON.stringify(embeddingSetMemberToShard(m)))\n .join('\\n')\n files.set('embedding_set_members.jsonl', encoder.encode(membersJsonl))\n components.push('embedding_set_members')\n counts.embedding_set_members = scopedEmbMemberRows.length\n\n const embRows = await db.query<{\n id: string\n note_id: string\n embedding_set_id: string\n vector: string\n created_at: Date\n }>(\n `SELECT * FROM embedding\n ${setScoped ? 'WHERE embedding_set_id = ANY($1)' : ''}\n ORDER BY created_at`,\n setScoped ? [embeddingSetIds] : [],\n )\n const memberEmbeddingIds = new Set(scopedEmbMemberRows.map((member) => member.embedding_id))\n const scopedEmbRows = embRows.rows.filter((embedding) =>\n exportedSetIds.has(embedding.embedding_set_id) &&\n exportedNoteIds.has(embedding.note_id) &&\n (memberEmbeddingIds.size === 0 || memberEmbeddingIds.has(embedding.id)),\n )\n\n const embJsonl = scopedEmbRows.map((e) => JSON.stringify(embeddingToShard(e))).join('\\n')\n files.set('embeddings.jsonl', encoder.encode(embJsonl))\n components.push('embeddings')\n counts.embeddings = scopedEmbRows.length\n }\n\n\n\n // -- Query graph/community artifacts (optional) ----------------------\n const graphSourceRows = await db.query<{\n id: string\n name: string\n kind: 'link' | 'similarity' | 'search' | 'manual' | 'imported'\n source_table: 'link' | 'embedding' | 'manual' | null\n embedding_set_id: string | null\n virtual_set_id: string | null\n model: string | null\n dimension: number | null\n truncate_dimension: number | null\n metric: 'cosine' | 'inner_product' | 'l2' | null\n algorithm: string | null\n parameters_json: unknown | null\n input_hash: string\n freshness_json: unknown\n created_at: Date\n }>(`SELECT * FROM graph_source ORDER BY created_at, id`)\n const graphScoped = !!options?.embeddingSetIds?.length\n const scopedGraphSourceRows = graphScoped\n ? graphSourceRows.rows.filter((row) => !row.embedding_set_id || options.embeddingSetIds?.includes(row.embedding_set_id))\n : graphSourceRows.rows\n const exportedGraphSourceIds = new Set(scopedGraphSourceRows.map((row) => row.id))\n if (scopedGraphSourceRows.length > 0) {\n const shardGraphSources = scopedGraphSourceRows.map((row) => ({\n id: row.id,\n name: row.name,\n kind: row.kind,\n source_table: row.source_table,\n embedding_set_id: row.embedding_set_id,\n virtual_set_id: row.virtual_set_id,\n model: row.model,\n dimension: row.dimension,\n truncate_dimension: row.truncate_dimension,\n metric: row.metric,\n algorithm: row.algorithm,\n parameters: jsonObject(row.parameters_json),\n input_hash: row.input_hash,\n freshness: jsonObject(row.freshness_json) ?? { status: 'unknown' },\n created_at: iso(row.created_at),\n }))\n files.set('graph_sources.json', encoder.encode(JSON.stringify(shardGraphSources)))\n components.push('graph_sources')\n counts.graph_sources = shardGraphSources.length\n }\n\n const graphEdgeRows = await db.query<{\n graph_source_id: string\n from_note_id: string\n to_note_id: string\n weight: number\n kind: 'link' | 'similarity' | 'manual'\n rank: number | null\n metadata_json: unknown | null\n }>(`SELECT * FROM graph_edge_artifact ORDER BY graph_source_id, from_note_id, to_note_id, kind`)\n const scopedGraphEdgeRows = graphScoped\n ? graphEdgeRows.rows.filter((row) => exportedGraphSourceIds.has(row.graph_source_id))\n : graphEdgeRows.rows\n if (scopedGraphEdgeRows.length > 0) {\n const graphEdgesJsonl = scopedGraphEdgeRows.map((row) => JSON.stringify({\n graph_source_id: row.graph_source_id,\n from_note_id: row.from_note_id,\n to_note_id: row.to_note_id,\n weight: row.weight,\n kind: row.kind,\n rank: row.rank,\n metadata: jsonObject(row.metadata_json),\n })).join('\\n')\n files.set('graph_edges.jsonl', encoder.encode(graphEdgesJsonl))\n components.push('graph_edges')\n counts.graph_edges = scopedGraphEdgeRows.length\n }\n\n const communitySetRows = await db.query<{\n id: string\n graph_source_id: string\n name: string\n source_type: 'precomputed' | 'dynamic-snapshot' | 'user-authored' | 'imported'\n algorithm: string | null\n parameters_json: unknown | null\n input_hash: string\n freshness_json: unknown\n created_at: Date\n }>(`SELECT * FROM community_set ORDER BY created_at, id`)\n const communityRows = await db.query<{\n id: string\n community_set_id: string\n label: string | null\n rank: number | null\n size: number | null\n confidence: number | null\n representative_note_ids: string[] | null\n metadata_json: unknown | null\n }>(`SELECT * FROM community ORDER BY community_set_id, rank NULLS LAST, id`)\n const scopedCommunitySetRows = graphScoped\n ? communitySetRows.rows.filter((row) => exportedGraphSourceIds.has(row.graph_source_id))\n : communitySetRows.rows\n const exportedCommunitySetIds = new Set(scopedCommunitySetRows.map((row) => row.id))\n const scopedCommunityRows = graphScoped\n ? communityRows.rows.filter((row) => exportedCommunitySetIds.has(row.community_set_id))\n : communityRows.rows\n if (scopedCommunitySetRows.length > 0) {\n const communitiesBySet = new Map<string, typeof communityRows.rows>()\n for (const row of scopedCommunityRows) {\n const rows = communitiesBySet.get(row.community_set_id) ?? []\n rows.push(row)\n communitiesBySet.set(row.community_set_id, rows)\n }\n const shardCommunitySets = scopedCommunitySetRows.map((row) => ({\n id: row.id,\n graph_source_id: row.graph_source_id,\n name: row.name,\n source_type: row.source_type,\n algorithm: row.algorithm,\n parameters: jsonObject(row.parameters_json),\n input_hash: row.input_hash,\n freshness: jsonObject(row.freshness_json) ?? { status: 'unknown' },\n communities: (communitiesBySet.get(row.id) ?? []).map((community) => ({\n id: community.id,\n label: community.label,\n rank: community.rank,\n size: community.size,\n confidence: community.confidence,\n representative_note_ids: community.representative_note_ids ?? [],\n metadata: jsonObject(community.metadata_json),\n })),\n created_at: iso(row.created_at),\n }))\n files.set('communities.json', encoder.encode(JSON.stringify(shardCommunitySets)))\n components.push('communities')\n counts.community_sets = shardCommunitySets.length\n counts.communities = scopedCommunityRows.length\n }\n\n const assignmentRows = await db.query<{\n community_set_id: string\n community_id: string\n note_id: string\n confidence: number | null\n source_type: 'precomputed' | 'dynamic-snapshot' | 'user-authored' | 'imported'\n metadata_json: unknown | null\n }>(`SELECT * FROM community_assignment ORDER BY community_set_id, community_id, note_id`)\n const scopedAssignmentRows = graphScoped\n ? assignmentRows.rows.filter((row) => exportedCommunitySetIds.has(row.community_set_id))\n : assignmentRows.rows\n if (scopedAssignmentRows.length > 0) {\n const assignmentsJsonl = scopedAssignmentRows.map((row) => JSON.stringify({\n community_set_id: row.community_set_id,\n community_id: row.community_id,\n note_id: row.note_id,\n confidence: row.confidence,\n source_type: row.source_type,\n metadata: jsonObject(row.metadata_json),\n })).join('\\n')\n files.set('community_assignments.jsonl', encoder.encode(assignmentsJsonl))\n components.push('community_assignments')\n counts.community_assignments = scopedAssignmentRows.length\n }\n\n // ── Compute checksums ───────────────────────────────────────────────\n const checksums: Record<string, string> = {}\n for (const [filename, data] of files) {\n checksums[filename] = await sha256Hex(data)\n }\n\n // ── Build manifest ──────────────────────────────────────────────────\n const manifest: ShardManifest = {\n version: CURRENT_SHARD_VERSION,\n matric_version: VERSION,\n format: SHARD_FORMAT,\n created_at: new Date().toISOString(),\n components,\n counts,\n checksums,\n min_reader_version: '1.0.0',\n ...(layout ? { layout } : {}),\n }\n files.set('manifest.json', encoder.encode(JSON.stringify(manifest, null, 2)))\n\n // ── Pack tar.gz ─────────────────────────────────────────────────────\n return packTarGz(files)\n}\n","/**\n * Shard import pipeline — unpack, validate, field-map, transactional insert.\n *\n * Pipeline: ArrayBuffer → gunzip → untar → parse manifest → validate checksums →\n * parse components → field-map → BEGIN transaction → INSERT all → COMMIT\n */\n\nimport type { DatabaseClient } from '../storage-backend.js'\nimport { unpackTarGz } from './shard-tar.js'\nimport { validateChecksums } from './checksum.js'\nimport {\n noteFromShard,\n linkFromShard,\n collectionFromShard,\n embeddingSetFromShard,\n embeddingFromShard,\n} from './field-mapper.js'\nimport { generateId } from '../uuid.js'\nimport { computeHash } from '../hash.js'\nimport { CURRENT_SHARD_VERSION } from './types.js'\nimport type {\n ShardManifest,\n ImportOptions,\n ImportResult,\n ImportCounts,\n ShardNote,\n ShardLink,\n ShardCollection,\n ShardTag,\n ShardEmbeddingSet,\n ShardEmbeddingSetMember,\n ShardEmbedding,\n ShardSkosScheme,\n ShardSkosConcept,\n ShardSkosRelation,\n ShardNoteSkosTag,\n ShardProvenanceEdge,\n ShardGraphSource,\n ShardGraphEdge,\n ShardCommunitySet,\n ShardCommunityAssignment,\n} from './types.js'\n\nconst decoder = new TextDecoder()\nconst DEFAULT_BATCH_SIZE = 250\n\nasync function yieldToEventLoop(): Promise<void> {\n const scheduler = (globalThis as unknown as { scheduler?: { yield?: () => Promise<void> } }).scheduler\n if (scheduler?.yield) {\n await scheduler.yield()\n return\n }\n await new Promise<void>((resolve) => setTimeout(resolve, 0))\n}\n\nasync function maybeYield(done: number, batchSize: number): Promise<void> {\n if (batchSize > 0 && done > 0 && done % batchSize === 0) {\n await yieldToEventLoop()\n }\n}\n\n/**\n * Import a .shard archive into the database.\n *\n * The entire import is wrapped in a single transaction — if anything fails,\n * all changes are rolled back.\n *\n * @param db DatabaseClient database instance\n * @param data Raw archive bytes (from File API or fetch)\n * @param options Import options (conflict strategy)\n * @returns Import result with counts, warnings, and errors\n */\nexport async function importShard(\n db: DatabaseClient,\n data: Uint8Array | ArrayBuffer,\n options?: ImportOptions,\n): Promise<ImportResult> {\n const start = performance.now()\n const strategy = options?.conflictStrategy ?? 'skip'\n const batchSize = options?.batchSize ?? DEFAULT_BATCH_SIZE\n const report = options?.onProgress\n const warnings: string[] = []\n const errors: string[] = []\n const counts: ImportCounts = {\n notes: 0,\n collections: 0,\n tags: 0,\n links: 0,\n embedding_sets: 0,\n embedding_set_members: 0,\n embeddings: 0,\n skos_schemes: 0,\n skos_concepts: 0,\n skos_relations: 0,\n note_skos_tags: 0,\n provenance_edges: 0,\n graph_sources: 0,\n graph_edges: 0,\n community_sets: 0,\n communities: 0,\n community_assignments: 0,\n }\n const skipped: Partial<ImportCounts> = {}\n\n const inputData = data instanceof ArrayBuffer ? new Uint8Array(data) : data\n\n // ── Step 1: Unpack tar.gz ─────────────────────────────────────────────\n report?.({ phase: 'unpack', done: 0, total: 1 })\n let files: Map<string, Uint8Array>\n try {\n files = unpackTarGz(inputData)\n report?.({ phase: 'unpack', done: 1, total: 1 })\n } catch (err) {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: [`Failed to decompress archive: ${err instanceof Error ? err.message : String(err)}`],\n duration_ms: performance.now() - start,\n }\n }\n\n // ── Step 2: Parse and validate manifest ───────────────────────────────\n const manifestData = files.get('manifest.json')\n if (!manifestData) {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: ['Missing manifest.json in shard archive'],\n duration_ms: performance.now() - start,\n }\n }\n\n let manifest: ShardManifest\n try {\n manifest = JSON.parse(decoder.decode(manifestData))\n } catch {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: ['Invalid manifest.json: failed to parse JSON'],\n duration_ms: performance.now() - start,\n }\n }\n\n // Version compatibility check\n if (manifest.min_reader_version && manifest.min_reader_version > CURRENT_SHARD_VERSION) {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: [\n `Shard requires reader version ${manifest.min_reader_version}, ` +\n `but this version supports up to ${CURRENT_SHARD_VERSION}`,\n ],\n duration_ms: performance.now() - start,\n }\n }\n\n // ── Step 3: Validate checksums ────────────────────────────────────────\n report?.({ phase: 'validate', done: 0, total: 1 })\n const checksumResult = await validateChecksums(manifest.checksums, files)\n if (!checksumResult.valid) {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: [`Checksum validation failed for: ${checksumResult.failures.join(', ')}`],\n duration_ms: performance.now() - start,\n }\n }\n report?.({ phase: 'validate', done: 1, total: 1 })\n\n // ── Step 4: Parse all components ──────────────────────────────────────\n // Notes may be clustered (notes/000.jsonl, …) per the manifest layout (#189);\n // a monolithic notes.jsonl is the default. Concatenate clusters in offset order.\n const noteClusters = manifest.layout?.clusters?.notes\n const parsedNotes = noteClusters && noteClusters.length > 0\n ? [...noteClusters]\n .sort((a, b) => a.offset - b.offset)\n .flatMap((ref) => parseJsonl<ShardNote>(files.get(ref.href)))\n : parseJsonl<ShardNote>(files.get('notes.jsonl'))\n const parsedCollections = parseJsonArray<ShardCollection>(files.get('collections.json'))\n // Tags are embedded in notes as arrays — the global tags.json is informational only\n parseJsonArray<ShardTag>(files.get('tags.json')) // parsed for validation, not used directly\n const parsedLinks = parseJsonl<ShardLink>(files.get('links.jsonl'))\n const parsedEmbSets = parseJsonArray<ShardEmbeddingSet>(files.get('embedding_sets.json'))\n const parsedEmbMembers = parseJsonl<ShardEmbeddingSetMember>(\n files.get('embedding_set_members.jsonl'),\n )\n const parsedEmbeddings = parseJsonl<ShardEmbedding>(files.get('embeddings.jsonl'))\n const parsedSkosSchemes = parseJsonArray<ShardSkosScheme>(files.get('skos_schemes.json'))\n const parsedSkosConcepts = parseJsonArray<ShardSkosConcept>(files.get('skos_concepts.json'))\n const parsedSkosRelations = parseJsonl<ShardSkosRelation>(files.get('skos_relations.jsonl'))\n const parsedNoteSkosTags = parseJsonl<ShardNoteSkosTag>(files.get('note_skos_tags.jsonl'))\n const parsedProvenanceEdges = parseJsonl<ShardProvenanceEdge>(files.get('provenance_edges.jsonl'))\n const parsedGraphSources = parseJsonArray<ShardGraphSource>(files.get('graph_sources.json'))\n const parsedGraphEdges = parseJsonl<ShardGraphEdge>(files.get('graph_edges.jsonl'))\n const parsedCommunitySets = parseJsonArray<ShardCommunitySet>(files.get('communities.json'))\n const parsedCommunityAssignments = parseJsonl<ShardCommunityAssignment>(files.get('community_assignments.jsonl'))\n\n // Warn about unknown components\n const knownFiles = new Set([\n 'manifest.json',\n 'notes.jsonl',\n 'collections.json',\n 'tags.json',\n 'links.jsonl',\n 'embedding_sets.json',\n 'embedding_set_members.jsonl',\n 'embedding_configs.json',\n 'embeddings.jsonl',\n 'templates.json',\n 'skos_schemes.json',\n 'skos_concepts.json',\n 'skos_relations.jsonl',\n 'note_skos_tags.jsonl',\n 'provenance_edges.jsonl',\n 'graph_sources.json',\n 'graph_edges.jsonl',\n 'communities.json',\n 'community_assignments.jsonl',\n ])\n for (const filename of files.keys()) {\n if (!knownFiles.has(filename)) {\n warnings.push(`Unknown component skipped: ${filename}`)\n }\n }\n if (files.has('templates.json')) {\n warnings.push('templates.json skipped (not supported in browser)')\n }\n\n // ── Step 5: Transactional insert ──────────────────────────────────────\n const conflictClause = strategy === 'skip' ? 'ON CONFLICT DO NOTHING' : ''\n\n try {\n await db.transaction(async (tx) => {\n // Import collections first (notes may reference them)\n report?.({ phase: 'collections', done: 0, total: parsedCollections.length })\n for (const [index, shardCol] of parsedCollections.entries()) {\n const col = collectionFromShard(shardCol)\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO collection (id, name, description, parent_id, created_at)\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (id) DO UPDATE SET name = $2, description = $3, parent_id = $4`,\n [col.id, col.name, col.description, col.parent_id, col.created_at],\n )\n } else {\n await tx.query(\n `INSERT INTO collection (id, name, description, parent_id, created_at)\n VALUES ($1, $2, $3, $4, $5) ${conflictClause}`,\n [col.id, col.name, col.description, col.parent_id, col.created_at],\n )\n }\n counts.collections++\n report?.({ phase: 'collections', done: index + 1, total: parsedCollections.length })\n await maybeYield(index + 1, batchSize)\n }\n\n // Import notes\n report?.({ phase: 'notes', done: 0, total: parsedNotes.length })\n for (const [index, shardNote] of parsedNotes.entries()) {\n const note = noteFromShard(shardNote)\n const contentHash = computeHash(new TextEncoder().encode(note.original_content))\n\n if (strategy === 'replace') {\n // Upsert note\n await tx.query(\n `INSERT INTO note (id, title, format, source, is_starred, is_archived, created_at, updated_at, deleted_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n ON CONFLICT (id) DO UPDATE SET title = $2, format = $3, source = $4,\n is_starred = $5, is_archived = $6, updated_at = $8, deleted_at = $9`,\n [\n note.id, note.title, note.format, note.source,\n note.is_starred, note.is_archived,\n note.created_at, note.updated_at, note.deleted_at,\n ],\n )\n // Upsert original — note_original has id PK, so check if one exists for this note_id\n const existingOrig = await tx.query(\n `SELECT id FROM note_original WHERE note_id = $1`,\n [note.id],\n )\n if (existingOrig.rows.length > 0) {\n await tx.query(\n `UPDATE note_original SET content = $1, content_hash = $2 WHERE note_id = $3`,\n [note.original_content, contentHash, note.id],\n )\n } else {\n await tx.query(\n `INSERT INTO note_original (id, note_id, content, content_hash) VALUES ($1, $2, $3, $4)`,\n [generateId(), note.id, note.original_content, contentHash],\n )\n }\n // Upsert current revision (note_id is PK)\n await tx.query(\n `INSERT INTO note_revised_current (note_id, content)\n VALUES ($1, $2)\n ON CONFLICT (note_id) DO UPDATE SET content = $2`,\n [note.id, note.revised_content ?? note.original_content],\n )\n } else {\n // Insert note\n await tx.query(\n `INSERT INTO note (id, title, format, source, is_starred, is_archived, created_at, updated_at, deleted_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ${conflictClause}`,\n [\n note.id, note.title, note.format, note.source,\n note.is_starred, note.is_archived,\n note.created_at, note.updated_at, note.deleted_at,\n ],\n )\n // Insert original (unique on note_id)\n await tx.query(\n `INSERT INTO note_original (id, note_id, content, content_hash)\n VALUES ($1, $2, $3, $4) ${conflictClause}`,\n [generateId(), note.id, note.original_content, contentHash],\n )\n // Insert current revision\n await tx.query(\n `INSERT INTO note_revised_current (note_id, content)\n VALUES ($1, $2) ${conflictClause}`,\n [note.id, note.revised_content ?? note.original_content],\n )\n }\n\n // Import note tags\n for (const tag of note.tags) {\n await tx.query(\n `INSERT INTO note_tag (id, note_id, tag) VALUES ($1, $2, $3)\n ON CONFLICT (note_id, tag) DO NOTHING`,\n [generateId(), note.id, tag],\n )\n }\n\n counts.notes++\n report?.({ phase: 'notes', done: index + 1, total: parsedNotes.length })\n await maybeYield(index + 1, batchSize)\n }\n\n // Import SKOS schemes and concepts before note concept assignments.\n const totalSkos = parsedSkosSchemes.length + parsedSkosConcepts.length + parsedSkosRelations.length + parsedNoteSkosTags.length\n let doneSkos = 0\n report?.({ phase: 'skos', done: doneSkos, total: totalSkos })\n for (const scheme of parsedSkosSchemes) {\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO skos_scheme (id, title, description, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (id) DO UPDATE SET title = $2, description = $3, updated_at = $5`,\n [scheme.id, scheme.title, scheme.description, scheme.created_at, scheme.updated_at],\n )\n } else {\n await tx.query(\n `INSERT INTO skos_scheme (id, title, description, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5) ${conflictClause}`,\n [scheme.id, scheme.title, scheme.description, scheme.created_at, scheme.updated_at],\n )\n }\n counts.skos_schemes++\n report?.({ phase: 'skos', done: ++doneSkos, total: totalSkos })\n await maybeYield(doneSkos, batchSize)\n }\n\n for (const concept of parsedSkosConcepts) {\n const altLabels = JSON.stringify(concept.alt_labels ?? [])\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO skos_concept (id, scheme_id, pref_label, alt_labels, definition, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n ON CONFLICT (id) DO UPDATE SET scheme_id = $2, pref_label = $3, alt_labels = $4, definition = $5, updated_at = $7`,\n [concept.id, concept.scheme_id, concept.pref_label, altLabels, concept.definition, concept.created_at, concept.updated_at],\n )\n } else {\n await tx.query(\n `INSERT INTO skos_concept (id, scheme_id, pref_label, alt_labels, definition, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7) ${conflictClause}`,\n [concept.id, concept.scheme_id, concept.pref_label, altLabels, concept.definition, concept.created_at, concept.updated_at],\n )\n }\n counts.skos_concepts++\n report?.({ phase: 'skos', done: ++doneSkos, total: totalSkos })\n await maybeYield(doneSkos, batchSize)\n }\n\n // Import links\n report?.({ phase: 'links', done: 0, total: parsedLinks.length })\n for (const [index, shardLink] of parsedLinks.entries()) {\n const link = linkFromShard(shardLink)\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO link (id, source_note_id, target_note_id, link_type, confidence, created_at)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (id) DO UPDATE SET link_type = $4, confidence = $5`,\n [link.id, link.source_note_id, link.target_note_id, link.link_type, link.confidence, link.created_at],\n )\n } else {\n await tx.query(\n `INSERT INTO link (id, source_note_id, target_note_id, link_type, confidence, created_at)\n VALUES ($1, $2, $3, $4, $5, $6) ${conflictClause}`,\n [link.id, link.source_note_id, link.target_note_id, link.link_type, link.confidence, link.created_at],\n )\n }\n counts.links++\n report?.({ phase: 'links', done: index + 1, total: parsedLinks.length })\n await maybeYield(index + 1, batchSize)\n }\n\n // Import SKOS relations and note assignments after concepts and notes.\n for (const relation of parsedSkosRelations) {\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO skos_concept_relation (id, source_concept_id, target_concept_id, relation_type, created_at)\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (id) DO UPDATE SET source_concept_id = $2, target_concept_id = $3, relation_type = $4`,\n [relation.id, relation.source_concept_id, relation.target_concept_id, relation.relation_type, relation.created_at],\n )\n } else {\n await tx.query(\n `INSERT INTO skos_concept_relation (id, source_concept_id, target_concept_id, relation_type, created_at)\n VALUES ($1, $2, $3, $4, $5) ${conflictClause}`,\n [relation.id, relation.source_concept_id, relation.target_concept_id, relation.relation_type, relation.created_at],\n )\n }\n counts.skos_relations++\n report?.({ phase: 'skos', done: ++doneSkos, total: totalSkos })\n await maybeYield(doneSkos, batchSize)\n }\n\n for (const tag of parsedNoteSkosTags) {\n await tx.query(\n `INSERT INTO note_skos_tag (id, note_id, concept_id, created_at)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (note_id, concept_id) DO NOTHING`,\n [tag.id, tag.note_id, tag.concept_id, tag.created_at],\n )\n counts.note_skos_tags++\n report?.({ phase: 'skos', done: ++doneSkos, total: totalSkos })\n await maybeYield(doneSkos, batchSize)\n }\n\n // Import provenance edges.\n report?.({ phase: 'provenance', done: 0, total: parsedProvenanceEdges.length })\n for (const [index, edge] of parsedProvenanceEdges.entries()) {\n const attributes = edge.attributes === null ? null : JSON.stringify(edge.attributes)\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO provenance_edge (id, entity_type, entity_id, activity, agent, started_at, ended_at, attributes)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8)\n ON CONFLICT (id) DO UPDATE SET entity_type = $2, entity_id = $3, activity = $4, agent = $5, started_at = $6, ended_at = $7, attributes = $8`,\n [edge.id, edge.entity_type, edge.entity_id, edge.activity, edge.agent, edge.started_at, edge.ended_at, attributes],\n )\n } else {\n await tx.query(\n `INSERT INTO provenance_edge (id, entity_type, entity_id, activity, agent, started_at, ended_at, attributes)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8) ${conflictClause}`,\n [edge.id, edge.entity_type, edge.entity_id, edge.activity, edge.agent, edge.started_at, edge.ended_at, attributes],\n )\n }\n counts.provenance_edges++\n report?.({ phase: 'provenance', done: index + 1, total: parsedProvenanceEdges.length })\n await maybeYield(index + 1, batchSize)\n }\n\n // Import embedding sets\n report?.({ phase: 'embedding_sets', done: 0, total: parsedEmbSets.length })\n for (const [index, shardSet] of parsedEmbSets.entries()) {\n const set = embeddingSetFromShard(shardSet)\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO embedding_set (\n id, name, purpose, model_name, dimensions, kind, mode, truncate_dimension,\n criteria_json, source_json, compatibility_json, materialization_json, freshness_json, created_at, updated_at\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::jsonb, $10::jsonb, $11::jsonb, $12::jsonb, $13::jsonb, $14, COALESCE($15::timestamptz, $14::timestamptz))\n ON CONFLICT (id) DO UPDATE SET name = $2, purpose = $3, model_name = $4, dimensions = $5,\n kind = $6, mode = $7, truncate_dimension = $8, criteria_json = $9::jsonb, source_json = $10::jsonb,\n compatibility_json = $11::jsonb, materialization_json = $12::jsonb, freshness_json = $13::jsonb, updated_at = COALESCE($15::timestamptz, $14::timestamptz)`,\n [set.id, set.name, set.purpose, set.model_name, set.dimensions, set.kind, set.mode, set.truncate_dimension, set.criteria_json, set.source_json, set.compatibility_json, set.materialization_json, set.freshness_json, set.created_at, set.updated_at],\n )\n } else {\n await tx.query(\n `INSERT INTO embedding_set (\n id, name, purpose, model_name, dimensions, kind, mode, truncate_dimension,\n criteria_json, source_json, compatibility_json, materialization_json, freshness_json, created_at, updated_at\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::jsonb, $10::jsonb, $11::jsonb, $12::jsonb, $13::jsonb, $14, COALESCE($15::timestamptz, $14::timestamptz)) ${conflictClause}`,\n [set.id, set.name, set.purpose, set.model_name, set.dimensions, set.kind, set.mode, set.truncate_dimension, set.criteria_json, set.source_json, set.compatibility_json, set.materialization_json, set.freshness_json, set.created_at, set.updated_at],\n )\n }\n counts.embedding_sets++\n report?.({ phase: 'embedding_sets', done: index + 1, total: parsedEmbSets.length })\n await maybeYield(index + 1, batchSize)\n }\n\n // Import embeddings\n report?.({ phase: 'embeddings', done: 0, total: parsedEmbeddings.length })\n for (const [index, shardEmb] of parsedEmbeddings.entries()) {\n const emb = embeddingFromShard(shardEmb)\n if (strategy === 'replace') {\n await tx.query(\n `INSERT INTO embedding (id, note_id, embedding_set_id, vector, created_at)\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (id) DO UPDATE SET vector = $4`,\n [emb.id, emb.note_id, emb.embedding_set_id, emb.vector, emb.created_at],\n )\n } else {\n await tx.query(\n `INSERT INTO embedding (id, note_id, embedding_set_id, vector, created_at)\n VALUES ($1, $2, $3, $4, $5) ${conflictClause}`,\n [emb.id, emb.note_id, emb.embedding_set_id, emb.vector, emb.created_at],\n )\n }\n counts.embeddings++\n report?.({ phase: 'embeddings', done: index + 1, total: parsedEmbeddings.length })\n await maybeYield(index + 1, batchSize)\n }\n\n\n\n // Import graph/community artifacts after primary graph inputs exist.\n const totalGraph = parsedGraphSources.length + parsedGraphEdges.length\n let doneGraph = 0\n report?.({ phase: 'graph', done: doneGraph, total: totalGraph })\n for (const source of parsedGraphSources) {\n const parameters = source.parameters == null ? null : JSON.stringify(source.parameters)\n const freshness = JSON.stringify({ ...(source.freshness ?? {}), status: 'unknown' })\n await tx.query(\n `INSERT INTO graph_source (\n id, name, kind, source_table, embedding_set_id, virtual_set_id, model, dimension,\n truncate_dimension, metric, algorithm, parameters_json, input_hash, freshness_json, created_at\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12::jsonb, $13, $14::jsonb, $15)\n ${strategy === 'replace'\n ? 'ON CONFLICT (id) DO UPDATE SET name = $2, kind = $3, source_table = $4, embedding_set_id = $5, virtual_set_id = $6, model = $7, dimension = $8, truncate_dimension = $9, metric = $10, algorithm = $11, parameters_json = $12::jsonb, input_hash = $13, freshness_json = $14::jsonb, created_at = $15'\n : conflictClause}`,\n [source.id, source.name, source.kind, source.source_table ?? null, source.embedding_set_id ?? null, source.virtual_set_id ?? null, source.model ?? null, source.dimension ?? null, source.truncate_dimension ?? null, source.metric ?? null, source.algorithm ?? null, parameters, source.input_hash, freshness, source.created_at],\n )\n counts.graph_sources++\n report?.({ phase: 'graph', done: ++doneGraph, total: totalGraph })\n await maybeYield(doneGraph, batchSize)\n }\n\n for (const edge of parsedGraphEdges) {\n const metadata = edge.metadata == null ? null : JSON.stringify(edge.metadata)\n await tx.query(\n `INSERT INTO graph_edge_artifact (graph_source_id, from_note_id, to_note_id, weight, kind, rank, metadata_json)\n VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb)\n ${strategy === 'replace'\n ? 'ON CONFLICT (graph_source_id, from_note_id, to_note_id, kind) DO UPDATE SET weight = $4, rank = $6, metadata_json = $7::jsonb'\n : conflictClause}`,\n [edge.graph_source_id, edge.from_note_id, edge.to_note_id, edge.weight, edge.kind, edge.rank ?? null, metadata],\n )\n counts.graph_edges++\n report?.({ phase: 'graph', done: ++doneGraph, total: totalGraph })\n await maybeYield(doneGraph, batchSize)\n }\n\n const totalCommunities = parsedCommunitySets.length + parsedCommunitySets.reduce((sum, set) => sum + (set.communities?.length ?? 0), 0) + parsedCommunityAssignments.length\n let doneCommunities = 0\n report?.({ phase: 'communities', done: doneCommunities, total: totalCommunities })\n for (const set of parsedCommunitySets) {\n const parameters = set.parameters == null ? null : JSON.stringify(set.parameters)\n const freshness = JSON.stringify({ ...(set.freshness ?? {}), status: 'unknown' })\n await tx.query(\n `INSERT INTO community_set (id, graph_source_id, name, source_type, algorithm, parameters_json, input_hash, freshness_json, created_at)\n VALUES ($1, $2, $3, $4, $5, $6::jsonb, $7, $8::jsonb, $9)\n ${strategy === 'replace'\n ? 'ON CONFLICT (id) DO UPDATE SET graph_source_id = $2, name = $3, source_type = $4, algorithm = $5, parameters_json = $6::jsonb, input_hash = $7, freshness_json = $8::jsonb, created_at = $9'\n : conflictClause}`,\n [set.id, set.graph_source_id, set.name, set.source_type, set.algorithm ?? null, parameters, set.input_hash, freshness, set.created_at],\n )\n counts.community_sets++\n report?.({ phase: 'communities', done: ++doneCommunities, total: totalCommunities })\n await maybeYield(doneCommunities, batchSize)\n\n for (const community of set.communities ?? []) {\n const metadata = community.metadata == null ? null : JSON.stringify(community.metadata)\n await tx.query(\n `INSERT INTO community (community_set_id, id, label, rank, size, confidence, representative_note_ids, metadata_json)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8::jsonb)\n ${strategy === 'replace'\n ? 'ON CONFLICT (community_set_id, id) DO UPDATE SET label = $3, rank = $4, size = $5, confidence = $6, representative_note_ids = $7, metadata_json = $8::jsonb'\n : conflictClause}`,\n [set.id, community.id, community.label ?? null, community.rank ?? null, community.size ?? null, community.confidence ?? null, community.representative_note_ids ?? [], metadata],\n )\n counts.communities++\n report?.({ phase: 'communities', done: ++doneCommunities, total: totalCommunities })\n await maybeYield(doneCommunities, batchSize)\n }\n }\n\n for (const assignment of parsedCommunityAssignments) {\n const metadata = assignment.metadata == null ? null : JSON.stringify(assignment.metadata)\n await tx.query(\n `INSERT INTO community_assignment (community_set_id, community_id, note_id, confidence, source_type, metadata_json)\n VALUES ($1, $2, $3, $4, $5, $6::jsonb)\n ${strategy === 'replace'\n ? 'ON CONFLICT (community_set_id, note_id) DO UPDATE SET community_id = $2, confidence = $4, source_type = $5, metadata_json = $6::jsonb'\n : conflictClause}`,\n [assignment.community_set_id, assignment.community_id, assignment.note_id, assignment.confidence ?? null, assignment.source_type, metadata],\n )\n counts.community_assignments++\n report?.({ phase: 'communities', done: ++doneCommunities, total: totalCommunities })\n await maybeYield(doneCommunities, batchSize)\n }\n\n // Import embedding set members\n report?.({ phase: 'embedding_set_members', done: 0, total: parsedEmbMembers.length })\n for (const [index, member] of parsedEmbMembers.entries()) {\n await tx.query(\n `INSERT INTO embedding_set_member (embedding_set_id, note_id, embedding_id)\n VALUES ($1, $2, $3) ON CONFLICT DO NOTHING`,\n [member.embedding_set_id, member.note_id, member.embedding_id],\n )\n counts.embedding_set_members++\n report?.({ phase: 'embedding_set_members', done: index + 1, total: parsedEmbMembers.length })\n await maybeYield(index + 1, batchSize)\n }\n })\n report?.({ phase: 'index', done: 1, total: 1 })\n } catch (err) {\n return {\n success: false,\n counts,\n skipped,\n warnings,\n errors: [`Transaction failed (rolled back): ${err instanceof Error ? err.message : String(err)}`],\n duration_ms: performance.now() - start,\n }\n }\n\n return {\n success: true,\n counts,\n skipped,\n warnings,\n errors,\n duration_ms: performance.now() - start,\n }\n}\n\n// ── Parsing helpers ───────────────────────────────────────────────────────\n\nfunction parseJsonl<T>(data: Uint8Array | undefined): T[] {\n if (!data || data.byteLength === 0) return []\n const text = decoder.decode(data)\n return text\n .split('\\n')\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as T)\n}\n\nfunction parseJsonArray<T>(data: Uint8Array | undefined): T[] {\n if (!data || data.byteLength === 0) return []\n return JSON.parse(decoder.decode(data)) as T[]\n}\n","/**\n * In-place Knowledge Shard reader (issue #189) — the static-file backend.\n *\n * A shard is already a self-describing bundle of formatted component files\n * (`notes.jsonl`, `links.jsonl`, `note_skos_tags.jsonl`, `skos_concepts.json`, …)\n * plus a `manifest.json`. `importShard` loads all of it into PGlite; this reader\n * is the *second* access mode of the SAME format: open the manifest and query the\n * component (or clustered) files directly, with NO PGlite — read-only, lightest.\n *\n * Capabilities (read-only): browse + get note, full-text + facet search, lazy\n * links/tags/concepts + full record. Semantic is opt-in via a pluggable provider\n * (none / brute-force cosine / prebuilt ANN snapshot) — see `StaticSemanticProvider`.\n */\n\nimport type {\n ShardClusterRef,\n ShardComponent,\n ShardLink,\n ShardManifest,\n ShardNote,\n ShardNoteSkosTag,\n ShardProvenanceEdge,\n ShardSkosConcept,\n ShardSkosRelation,\n} from './types.js'\nimport { CURRENT_SHARD_VERSION } from './types.js'\nimport { noteFromShard, type BrowserNoteExport } from './field-mapper.js'\nimport { unpackTarGz } from './shard-tar.js'\n\nconst decoder = new TextDecoder()\n\nfunction parseJsonlBytes<T>(data: Uint8Array | undefined): T[] {\n if (!data || data.byteLength === 0) return []\n return decoder.decode(data)\n .split('\\n')\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as T)\n}\n\nfunction parseJsonArrayBytes<T>(data: Uint8Array | undefined): T[] {\n if (!data || data.byteLength === 0) return []\n return JSON.parse(decoder.decode(data)) as T[]\n}\n\n/** The public note shape — the same browser-insertable record `importShard` produces. */\nexport type ShardReaderNote = BrowserNoteExport\n\nexport interface ShardSearchWeights {\n title: number\n content: number\n tag: number\n}\n\nconst DEFAULT_WEIGHTS: ShardSearchWeights = { title: 4, content: 1, tag: 2 }\n\nexport interface ShardListOptions {\n offset?: number\n limit?: number\n /** Include archived notes (default true). */\n includeArchived?: boolean\n /** Include soft-deleted notes (default false). */\n includeDeleted?: boolean\n}\n\nexport interface ShardSearchOptions extends ShardListOptions {\n /** AND-filter: note must carry every listed tag. */\n tags?: string[]\n /** OR-filter on note source. */\n source?: string[]\n rank?: boolean\n snippets?: boolean\n snippetLength?: number\n weights?: Partial<ShardSearchWeights>\n}\n\nexport interface ShardSearchRankedNote {\n note: ShardReaderNote\n rank: number\n snippet?: string\n}\n\nexport interface ShardSearchResult {\n items: ShardReaderNote[]\n total: number\n facets: { tags: Record<string, number>; source: Record<string, number> }\n rankedItems?: ShardSearchRankedNote[]\n /** Cluster files fetched to serve this query (0 when served from cache). */\n fetchedClusters: number\n}\n\nexport interface ShardNoteFull {\n note: ShardReaderNote\n links: ShardLink[]\n concepts: ShardSkosConcept[]\n provenance: ShardProvenanceEdge[]\n}\n\n/**\n * Opt-in semantic search over static files. The reader stays text/facets-only\n * unless a provider is supplied. Implementations span the tradeoff points:\n * brute-force cosine over a small static vector set, or a prebuilt ANN snapshot\n * for the full corpus. `prepare()` may lazily load whatever static asset it needs.\n */\nexport interface StaticSemanticProvider {\n prepare?(store: ShardComponentStore): Promise<void>\n search(query: string, k: number): Promise<Array<{ id: string; score: number }>>\n}\n\nexport interface OpenShardOptions {\n /** Static base URL when `source` is unpacked component files. */\n baseUrl?: string\n fetchImpl?: typeof fetch\n /** Optional semantic provider; absent → `semantic()` returns []. */\n semantic?: StaticSemanticProvider\n /** Bounds the cross-page search match cache (total cached note records). Default 5000. */\n maxCachedMatches?: number\n}\n\n/** Reads shard component/cluster files from a packed map or a static base URL. */\nexport interface ShardComponentStore {\n readonly manifest: ShardManifest\n read(filename: string): Promise<Uint8Array | undefined>\n}\n\nexport type ShardReaderSource = Uint8Array | Blob | { baseUrl: string; fetchImpl?: typeof fetch }\n\nasync function toBytes(blobOrBytes: Uint8Array | Blob): Promise<Uint8Array> {\n if (blobOrBytes instanceof Uint8Array) return blobOrBytes\n return new Uint8Array(await blobOrBytes.arrayBuffer())\n}\n\n/** A store backed by a fully-unpacked in-memory file map (packed tar.gz source). */\nclass PackedComponentStore implements ShardComponentStore {\n readonly manifest: ShardManifest\n private files: Map<string, Uint8Array>\n constructor(files: Map<string, Uint8Array>, manifest: ShardManifest) {\n this.files = files\n this.manifest = manifest\n }\n read(filename: string): Promise<Uint8Array | undefined> {\n return Promise.resolve(this.files.get(filename))\n }\n}\n\n/** A store that lazily fetches component/cluster files from a static base URL. */\nclass UrlComponentStore implements ShardComponentStore {\n readonly manifest: ShardManifest\n private baseUrl: string\n private fetchImpl: typeof fetch\n private cache = new Map<string, Uint8Array | undefined>()\n constructor(baseUrl: string, fetchImpl: typeof fetch, manifest: ShardManifest) {\n this.baseUrl = baseUrl.replace(/\\/$/, '')\n this.fetchImpl = fetchImpl\n this.manifest = manifest\n }\n async read(filename: string): Promise<Uint8Array | undefined> {\n if (this.cache.has(filename)) return this.cache.get(filename)\n const response = await this.fetchImpl(`${this.baseUrl}/${filename}`)\n if (!response.ok) {\n this.cache.set(filename, undefined)\n return undefined\n }\n const bytes = new Uint8Array(await response.arrayBuffer())\n this.cache.set(filename, bytes)\n return bytes\n }\n}\n\nasync function resolveStore(source: ShardReaderSource): Promise<ShardComponentStore> {\n if (typeof source === 'object' && 'baseUrl' in source) {\n const fetchImpl = source.fetchImpl ?? (globalThis.fetch as typeof fetch)\n const base = source.baseUrl.replace(/\\/$/, '')\n const manifestResponse = await fetchImpl(`${base}/manifest.json`)\n if (!manifestResponse.ok) {\n throw new Error(`Failed to fetch shard manifest (${manifestResponse.status}): ${base}/manifest.json`)\n }\n const manifest = (await manifestResponse.json()) as ShardManifest\n return new UrlComponentStore(base, fetchImpl, manifest)\n }\n const bytes = await toBytes(source)\n const files = unpackTarGz(bytes)\n const manifestBytes = files.get('manifest.json')\n if (!manifestBytes) throw new Error('Missing manifest.json in shard archive')\n const manifest = JSON.parse(decoder.decode(manifestBytes)) as ShardManifest\n return new PackedComponentStore(files, manifest)\n}\n\nfunction tokenize(query: string): string[] {\n return query.toLowerCase().split(/[^a-z0-9]+/i).filter((token) => token.length > 0)\n}\n\nfunction noteSearchText(note: ShardNote): string {\n return `${note.title ?? ''} ${note.original_content} ${note.revised_content ?? ''}`.toLowerCase()\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (!needle) return 0\n let count = 0\n let index = haystack.indexOf(needle)\n while (index !== -1) {\n count += 1\n index = haystack.indexOf(needle, index + needle.length)\n }\n return count\n}\n\nfunction noteMatchesTokens(note: ShardNote, tokens: string[]): boolean {\n if (tokens.length === 0) return true\n const text = noteSearchText(note)\n const tagText = note.tags.join(' ').toLowerCase()\n // AND semantics, matching Postgres plainto_tsquery (all lexemes required).\n return tokens.every((token) => text.includes(token) || tagText.includes(token))\n}\n\nfunction rankNote(note: ShardNote, tokens: string[], weights: ShardSearchWeights): number {\n if (tokens.length === 0) return 0\n const title = (note.title ?? '').toLowerCase()\n const content = `${note.original_content} ${note.revised_content ?? ''}`.toLowerCase()\n const tagText = note.tags.join(' ').toLowerCase()\n let score = 0\n for (const token of tokens) {\n score += countOccurrences(title, token) * weights.title\n score += countOccurrences(content, token) * weights.content\n if (tagText.includes(token)) score += weights.tag\n }\n return score\n}\n\nfunction makeSnippet(note: ShardNote, tokens: string[], length: number): string {\n const content = `${note.original_content} ${note.revised_content ?? ''}`.trim()\n if (tokens.length === 0) return content.slice(0, length)\n const lower = content.toLowerCase()\n const firstAt = tokens\n .map((token) => lower.indexOf(token))\n .filter((index) => index !== -1)\n .sort((a, b) => a - b)[0] ?? 0\n const start = Math.max(0, firstAt - Math.floor(length / 3))\n return (start > 0 ? '…' : '') + content.slice(start, start + length) + (start + length < content.length ? '…' : '')\n}\n\nfunction passesFilters(note: ShardNote, options: ShardSearchOptions): boolean {\n if (!options.includeDeleted && note.deleted_at) return false\n if (options.includeArchived === false && note.archived) return false\n if (options.tags && !options.tags.every((tag) => note.tags.includes(tag))) return false\n if (options.source && !options.source.includes(note.source)) return false\n return true\n}\n\nfunction facetCounts(notes: ShardNote[]): { tags: Record<string, number>; source: Record<string, number> } {\n const tags: Record<string, number> = {}\n const source: Record<string, number> = {}\n for (const note of notes) {\n for (const tag of note.tags) tags[tag] = (tags[tag] ?? 0) + 1\n source[note.source] = (source[note.source] ?? 0) + 1\n }\n return { tags, source }\n}\n\nexport interface ShardReader {\n readonly manifest: ShardManifest\n listNotes(options?: ShardListOptions): Promise<{ items: ShardReaderNote[]; total: number }>\n getNote(id: string): Promise<ShardReaderNote | null>\n search(query: string, options?: ShardSearchOptions): Promise<ShardSearchResult>\n linksOf(id: string): Promise<ShardLink[]>\n conceptsOf(id: string): Promise<ShardSkosConcept[]>\n relationsOf(conceptId: string): Promise<ShardSkosRelation[]>\n provenanceOf(id: string): Promise<ShardProvenanceEdge[]>\n getNoteFull(id: string): Promise<ShardNoteFull | null>\n semantic(query: string, k?: number): Promise<Array<{ note: ShardReaderNote; score: number }>>\n close(): void\n}\n\nclass ShardReaderImpl implements ShardReader {\n readonly manifest: ShardManifest\n private store: ShardComponentStore\n private options: OpenShardOptions\n private noteClusterCache = new Map<string, ShardNote[]>()\n private allNotes: ShardNote[] | null = null\n private links: ShardLink[] | null = null\n private noteSkos: ShardNoteSkosTag[] | null = null\n private concepts: Map<string, ShardSkosConcept> | null = null\n private relations: ShardSkosRelation[] | null = null\n private provenanceEdges: ShardProvenanceEdge[] | null = null\n private matchCache = new Map<string, ShardNote[]>()\n private maxCachedMatches: number\n private semanticPrepared = false\n\n constructor(store: ShardComponentStore, options: OpenShardOptions) {\n this.store = store\n this.manifest = store.manifest\n this.options = options\n this.maxCachedMatches = options.maxCachedMatches && options.maxCachedMatches > 0 ? options.maxCachedMatches : 5000\n }\n\n private noteClusters(): ShardClusterRef[] | null {\n return this.manifest.layout?.clusters?.notes ?? null\n }\n\n private async readCluster(ref: ShardClusterRef): Promise<{ notes: ShardNote[]; fetched: boolean }> {\n const cached = this.noteClusterCache.get(ref.href)\n if (cached) return { notes: cached, fetched: false }\n const notes = parseJsonlBytes<ShardNote>(await this.store.read(ref.href))\n this.noteClusterCache.set(ref.href, notes)\n return { notes, fetched: true }\n }\n\n /** Load every note (clustered or monolithic). Returns count of cluster files fetched. */\n private async loadAllNotes(): Promise<{ notes: ShardNote[]; fetched: number }> {\n const clusters = this.noteClusters()\n if (!clusters) {\n if (!this.allNotes) {\n this.allNotes = parseJsonlBytes<ShardNote>(await this.store.read('notes.jsonl'))\n return { notes: this.allNotes, fetched: 1 }\n }\n return { notes: this.allNotes, fetched: 0 }\n }\n const all: ShardNote[] = []\n let fetched = 0\n for (const ref of clusters) {\n const loaded = await this.readCluster(ref)\n if (loaded.fetched) fetched += 1\n all.push(...loaded.notes)\n }\n return { notes: all, fetched }\n }\n\n async listNotes(options: ShardListOptions = {}): Promise<{ items: ShardReaderNote[]; total: number }> {\n const offset = options.offset ?? 0\n const limit = options.limit ?? Number.MAX_SAFE_INTEGER\n // Browse needs a stable, filtered total, so it loads all notes (clustered or\n // monolithic). Per-record exclusion (deleted/archived) would make a pure\n // range-skip miscount, so range-limited cluster fetch is reserved for search's\n // match cache rather than applied here.\n const { notes } = await this.loadAllNotes()\n const filtered = notes.filter((note) => passesFilters(note, options))\n const page = filtered.slice(offset, offset + limit)\n return { items: page.map(noteFromShard), total: filtered.length }\n }\n\n async getNote(id: string): Promise<ShardReaderNote | null> {\n const { notes } = await this.loadAllNotes()\n const found = notes.find((note) => note.id === id)\n return found ? noteFromShard(found) : null\n }\n\n private matchKey(query: string, options: ShardSearchOptions): string {\n return JSON.stringify({\n q: query.trim().toLowerCase(),\n tags: options.tags ?? null,\n source: options.source ?? null,\n includeArchived: options.includeArchived ?? true,\n includeDeleted: options.includeDeleted ?? false,\n weights: { ...DEFAULT_WEIGHTS, ...options.weights },\n })\n }\n\n private cacheMatches(key: string, notes: ShardNote[]): void {\n this.matchCache.delete(key)\n this.matchCache.set(key, notes)\n let total = 0\n for (const set of this.matchCache.values()) total += set.length\n while (total > this.maxCachedMatches && this.matchCache.size > 1) {\n const oldest = this.matchCache.keys().next().value\n if (oldest === undefined || oldest === key) break\n total -= this.matchCache.get(oldest)?.length ?? 0\n this.matchCache.delete(oldest)\n }\n }\n\n async search(query: string, options: ShardSearchOptions = {}): Promise<ShardSearchResult> {\n const tokens = tokenize(query)\n const weights = { ...DEFAULT_WEIGHTS, ...options.weights }\n const offset = options.offset ?? 0\n const limit = options.limit ?? Number.MAX_SAFE_INTEGER\n const key = this.matchKey(query, options)\n\n let matched = this.matchCache.get(key)\n let fetchedClusters = 0\n if (matched) {\n this.matchCache.delete(key)\n this.matchCache.set(key, matched)\n } else {\n const { notes, fetched } = await this.loadAllNotes()\n fetchedClusters = fetched\n matched = notes.filter((note) => passesFilters(note, options) && noteMatchesTokens(note, tokens))\n if (tokens.length > 0 && options.rank !== false) {\n matched = [...matched].sort((a, b) => rankNote(b, tokens, weights) - rankNote(a, tokens, weights))\n }\n this.cacheMatches(key, matched)\n }\n\n const page = matched.slice(offset, offset + limit)\n const result: ShardSearchResult = {\n items: page.map(noteFromShard),\n total: matched.length,\n facets: facetCounts(matched),\n fetchedClusters,\n }\n if (options.rank || options.snippets) {\n const snippetLength = options.snippetLength ?? 160\n result.rankedItems = page.map((note) => ({\n note: noteFromShard(note),\n rank: rankNote(note, tokens, weights),\n ...(options.snippets ? { snippet: makeSnippet(note, tokens, snippetLength) } : {}),\n }))\n }\n return result\n }\n\n private async loadLinks(): Promise<ShardLink[]> {\n if (!this.links) this.links = parseJsonlBytes<ShardLink>(await this.store.read('links.jsonl'))\n return this.links\n }\n\n async linksOf(id: string): Promise<ShardLink[]> {\n const links = await this.loadLinks()\n return links.filter((link) => link.from_note_id === id || link.to_note_id === id)\n }\n\n private async loadConcepts(): Promise<{ noteSkos: ShardNoteSkosTag[]; concepts: Map<string, ShardSkosConcept> }> {\n if (!this.noteSkos) {\n this.noteSkos = parseJsonlBytes<ShardNoteSkosTag>(await this.store.read('note_skos_tags.jsonl'))\n }\n if (!this.concepts) {\n const list = parseJsonArrayBytes<ShardSkosConcept>(await this.store.read('skos_concepts.json'))\n this.concepts = new Map(list.map((concept) => [concept.id, concept]))\n }\n return { noteSkos: this.noteSkos, concepts: this.concepts }\n }\n\n async conceptsOf(id: string): Promise<ShardSkosConcept[]> {\n const { noteSkos, concepts } = await this.loadConcepts()\n const out: ShardSkosConcept[] = []\n for (const tag of noteSkos) {\n if (tag.note_id !== id) continue\n const concept = concepts.get(tag.concept_id)\n if (concept) out.push(concept)\n }\n return out\n }\n\n private async loadRelations(): Promise<ShardSkosRelation[]> {\n if (!this.relations) {\n this.relations = parseJsonlBytes<ShardSkosRelation>(await this.store.read('skos_relations.jsonl'))\n }\n return this.relations\n }\n\n async relationsOf(conceptId: string): Promise<ShardSkosRelation[]> {\n const relations = await this.loadRelations()\n return relations.filter(\n (relation) => relation.source_concept_id === conceptId || relation.target_concept_id === conceptId,\n )\n }\n\n private async loadProvenanceEdges(): Promise<ShardProvenanceEdge[]> {\n if (!this.provenanceEdges) {\n this.provenanceEdges = parseJsonlBytes<ShardProvenanceEdge>(await this.store.read('provenance_edges.jsonl'))\n }\n return this.provenanceEdges\n }\n\n async provenanceOf(id: string): Promise<ShardProvenanceEdge[]> {\n const edges = await this.loadProvenanceEdges()\n return edges\n .filter((edge) => edge.entity_type === 'note' && edge.entity_id === id)\n .sort((a, b) => a.started_at.localeCompare(b.started_at))\n }\n\n async getNoteFull(id: string): Promise<ShardNoteFull | null> {\n const note = await this.getNote(id)\n if (!note) return null\n const [links, concepts, provenance] = await Promise.all([\n this.linksOf(id),\n this.conceptsOf(id),\n this.provenanceOf(id),\n ])\n return { note, links, concepts, provenance }\n }\n\n async semantic(query: string, k = 10): Promise<Array<{ note: ShardReaderNote; score: number }>> {\n const provider = this.options.semantic\n if (!provider) return []\n if (!this.semanticPrepared) {\n await provider.prepare?.(this.store)\n this.semanticPrepared = true\n }\n const hits = await provider.search(query, k)\n const { notes } = await this.loadAllNotes()\n const byId = new Map(notes.map((note) => [note.id, note]))\n const out: Array<{ note: ShardReaderNote; score: number }> = []\n for (const hit of hits) {\n const note = byId.get(hit.id)\n if (note) out.push({ note: noteFromShard(note), score: hit.score })\n }\n return out\n }\n\n close(): void {\n this.noteClusterCache.clear()\n this.matchCache.clear()\n this.allNotes = null\n this.links = null\n this.noteSkos = null\n this.concepts = null\n this.relations = null\n this.provenanceEdges = null\n }\n}\n\n/**\n * Open a Knowledge Shard for in-place, read-only query — NO PGlite. `source` is a\n * packed tar.gz (`Uint8Array`/`Blob`) or a static base URL serving the unpacked\n * component/cluster files. Honors `min_reader_version`: a shard that needs a newer\n * reader than this build throws (the host should fall back to `importShard`).\n */\nexport async function openShard(\n source: ShardReaderSource,\n options: OpenShardOptions = {},\n): Promise<ShardReader> {\n const store = await resolveStore(source)\n if (store.manifest.min_reader_version && store.manifest.min_reader_version > CURRENT_SHARD_VERSION) {\n throw new Error(\n `Shard requires reader version ${store.manifest.min_reader_version}, ` +\n `but this build supports ${CURRENT_SHARD_VERSION}. Import the shard instead.`,\n )\n }\n return new ShardReaderImpl(store, options)\n}\n\nexport { type ShardComponent }\n","/**\n * Pluggable semantic providers for the in-place shard reader (issue #189).\n *\n * The static-file tier is text/facets-only by default. Semantic is opt-in via a\n * `StaticSemanticProvider`, with three tradeoff points the host chooses from:\n *\n * 1. none — don't configure a provider (text/facets only). Lightest.\n * 2. cosine-small — `createCosineSemanticProvider`: brute-force cosine over a\n * small static vectors file. Zero prebuild; small corpora only.\n * 3. ANN-full — implement `StaticSemanticProvider` yourself over a prebuilt\n * ANN snapshot (HNSW / flat-IVF served as a static asset),\n * loading it in `prepare()` and querying it in `search()`.\n * The interface is the extension point; no ANN engine is\n * bundled here.\n */\n\nimport type { ShardComponentStore, StaticSemanticProvider } from './shard-reader.js'\n\nconst decoder = new TextDecoder()\n\n/** A note id paired with its embedding vector, as stored in a static vectors file. */\nexport interface VectorEntry {\n id: string\n vector: number[]\n}\n\nexport interface CosineSemanticProviderOptions {\n /**\n * Embeds the query into the SAME space as the corpus vectors. Host-owned so it\n * matches the build-time embedding model exactly (sync or async).\n */\n embedQuery: (query: string) => Promise<number[]> | number[]\n /**\n * JSONL file (one `{ id, vector }` per line) mapping note id → vector, served\n * as a static asset alongside the shard. Default `vectors.jsonl`.\n */\n vectorsFile?: string\n /** Pre-supplied vectors — skips loading from the component store. */\n vectors?: VectorEntry[]\n}\n\nfunction cosine(a: number[], b: number[]): number {\n let dot = 0\n let normA = 0\n let normB = 0\n const len = Math.min(a.length, b.length)\n for (let i = 0; i < len; i++) {\n dot += a[i] * b[i]\n normA += a[i] * a[i]\n normB += b[i] * b[i]\n }\n if (normA === 0 || normB === 0) return 0\n return dot / (Math.sqrt(normA) * Math.sqrt(normB))\n}\n\n/**\n * Brute-force cosine semantic provider — the \"cosine-small\" tradeoff point. Loads\n * a static vectors file and scores the query embedding against every corpus\n * vector. Fine for small/demo corpora; for the full corpus, supply a prebuilt-ANN\n * `StaticSemanticProvider` instead.\n */\nexport function createCosineSemanticProvider(\n options: CosineSemanticProviderOptions,\n): StaticSemanticProvider {\n let vectors: VectorEntry[] = options.vectors ?? []\n return {\n async prepare(store: ShardComponentStore): Promise<void> {\n if (options.vectors) return\n const bytes = await store.read(options.vectorsFile ?? 'vectors.jsonl')\n if (!bytes || bytes.byteLength === 0) {\n vectors = []\n return\n }\n vectors = decoder.decode(bytes)\n .split('\\n')\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as VectorEntry)\n },\n async search(query: string, k: number): Promise<Array<{ id: string; score: number }>> {\n const queryVector = await options.embedQuery(query)\n return vectors\n .map((entry) => ({ id: entry.id, score: cosine(queryVector, entry.vector) }))\n .sort((a, b) => b.score - a.score)\n .slice(0, k)\n },\n }\n}\n","/**\n * Shard warm / prefetch API — pre-stage and (optionally) verify shard bytes\n * without building the index.\n *\n * Staged corpus loading (text-first, then opt-in summary vectors, then opt-in\n * full content) wants the operator's hard rule honored: **no blocking waits**.\n * The HNSW index build has to happen on the user's click (it is heavy and is\n * shown with progress — that is correct). The *download* of the shard bytes\n * does not: it can be warmed in the background on idle so the click is purely\n * the index build.\n *\n * fortemi-react is server-free and local-first — shards are **static assets**\n * (typically generated at build time and served as static files, or bundled\n * and handed in directly as bytes). `prefetchShard` warms those static bytes;\n * it does not assume any API/server. The eventual `importShard` reads the warm\n * bytes via {@link fromPrefetched}, so import is just the index build.\n *\n * Two-layer integrity:\n * - `prefetchShard(url, { expectedSha256 })` verifies the whole-archive SHA-256\n * against a build-time-known hash (emitted alongside the static shard).\n * - `importShard` still validates the per-file checksums inside the manifest\n * on import. Both layers share core's `sha256Hex`.\n *\n * @implements #181 prefetchShard / shard warm API\n */\n\nimport { sha256Hex } from './checksum.js'\n\n/** Options for {@link prefetchShard}. */\nexport interface PrefetchOptions {\n /**\n * Provide the shard bytes directly instead of fetching `url` — e.g. a\n * build-time-generated `.shard` imported as a bundled asset. The `url` is\n * still used as the warm-store key. When set, no network/disk fetch happens.\n */\n bytes?: ArrayBuffer | Uint8Array\n /**\n * Compute the SHA-256 of the warmed bytes (stored on the result and in the\n * warm store). Implied when `expectedSha256` is set.\n */\n verify?: boolean\n /**\n * Build-time-known SHA-256 (hex) of the whole shard archive. When set, the\n * warmed bytes are verified against it and a mismatch throws — nothing is\n * stored. Case-insensitive.\n */\n expectedSha256?: string\n /**\n * Fetch implementation to use. Defaults to `globalThis.fetch`. Inject for\n * tests or non-standard environments.\n */\n fetchImpl?: typeof fetch\n /**\n * Also persist the warmed bytes to the Cache Storage API so warmth survives\n * a reload. Feature-detected — a no-op when `caches` is unavailable (e.g.\n * Node, or a worker without Cache access).\n */\n useCacheStorage?: boolean\n /** Cache Storage cache name. Default: `'fortemi-shards'`. */\n cacheName?: string\n /** Abort signal forwarded to the fetch. */\n signal?: AbortSignal\n}\n\n/** Result of a {@link prefetchShard} call. */\nexport interface PrefetchResult {\n /** The warm-store key (the `url` passed to prefetchShard). */\n url: string\n /** The warmed shard bytes (also retrievable via {@link fromPrefetched}). */\n bytes: Uint8Array\n /** Convenience: `bytes.byteLength`. */\n byteLength: number\n /** SHA-256 hex of the warmed bytes when computed (`verify` or `expectedSha256`), else `undefined`. */\n sha256?: string\n /** True when the bytes came from the Cache Storage API rather than a fresh fetch. */\n fromCache: boolean\n}\n\ninterface WarmEntry {\n bytes: Uint8Array\n sha256?: string\n}\n\nconst DEFAULT_CACHE_NAME = 'fortemi-shards'\n\n/** In-memory warm store: url → bytes. Survives until cleared or page reload. */\nconst warmStore = new Map<string, WarmEntry>()\n/** In-flight prefetches keyed by url, so concurrent warms of the same url share one fetch. */\nconst inFlight = new Map<string, Promise<PrefetchResult>>()\n\nfunction toUint8(data: ArrayBuffer | Uint8Array): Uint8Array {\n return data instanceof Uint8Array ? data : new Uint8Array(data)\n}\n\nfunction getCacheStorage(): CacheStorage | undefined {\n return (globalThis as { caches?: CacheStorage }).caches\n}\n\nasync function readFromCacheStorage(url: string, cacheName: string): Promise<Uint8Array | null> {\n const caches = getCacheStorage()\n if (!caches) return null\n try {\n const cache = await caches.open(cacheName)\n const res = await cache.match(url)\n if (!res) return null\n return new Uint8Array(await res.arrayBuffer())\n } catch {\n return null\n }\n}\n\nasync function writeToCacheStorage(url: string, bytes: Uint8Array, cacheName: string): Promise<void> {\n const caches = getCacheStorage()\n if (!caches) return\n try {\n const cache = await caches.open(cacheName)\n // Copy into a standalone ArrayBuffer so the stored body is independent.\n const body = bytes.slice().buffer\n await cache.put(url, new Response(body))\n } catch {\n // Best-effort: a Cache write failure must not fail the prefetch.\n }\n}\n\nasync function maybeHash(\n bytes: Uint8Array,\n options: PrefetchOptions | undefined,\n): Promise<string | undefined> {\n const expected = options?.expectedSha256\n if (expected !== undefined) {\n const actual = await sha256Hex(bytes)\n if (actual.toLowerCase() !== expected.toLowerCase()) {\n throw new Error(\n `Shard SHA-256 mismatch: expected ${expected.toLowerCase()}, got ${actual}`,\n )\n }\n return actual\n }\n if (options?.verify) {\n return sha256Hex(bytes)\n }\n return undefined\n}\n\n/**\n * Pre-stage shard bytes into the warm store without building the index.\n *\n * Resolution order for the bytes:\n * 1. `options.bytes` (a directly-provided / bundled asset), else\n * 2. the Cache Storage API (when `useCacheStorage` and a prior write exists), else\n * 3. `fetch(url)` of the static asset.\n *\n * Concurrent calls for the same `url` (without `options.bytes`) share a single\n * fetch. On `expectedSha256` mismatch the call throws and nothing is stored.\n *\n * @param url - Static asset URL (also the warm-store key).\n * @param options - See {@link PrefetchOptions}.\n * @returns The warm result (bytes are also retrievable via {@link fromPrefetched}).\n *\n * @example\n * ```ts\n * // Warm on idle so the user's opt-in click is just the index build.\n * requestIdleCallback(() => {\n * void prefetchShard('/shards/research.shard', { expectedSha256: RESEARCH_SHARD_SHA256 })\n * })\n * // ...later, on click:\n * await importShard(db, fromPrefetched('/shards/research.shard'), { onProgress })\n * ```\n */\nexport function prefetchShard(url: string, options?: PrefetchOptions): Promise<PrefetchResult> {\n // Direct-bytes path: no fetch, no in-flight dedupe.\n if (options?.bytes !== undefined) {\n const bytes = toUint8(options.bytes)\n return (async () => {\n const sha256 = await maybeHash(bytes, options)\n warmStore.set(url, { bytes, sha256 })\n if (options.useCacheStorage) {\n await writeToCacheStorage(url, bytes, options.cacheName ?? DEFAULT_CACHE_NAME)\n }\n return { url, bytes, byteLength: bytes.byteLength, sha256, fromCache: false }\n })()\n }\n\n const existing = inFlight.get(url)\n if (existing) return existing\n\n const cacheName = options?.cacheName ?? DEFAULT_CACHE_NAME\n const fetchImpl = options?.fetchImpl ?? globalThis.fetch\n\n const work = (async (): Promise<PrefetchResult> => {\n let bytes: Uint8Array | null = null\n let fromCache = false\n\n if (options?.useCacheStorage) {\n bytes = await readFromCacheStorage(url, cacheName)\n fromCache = bytes !== null\n }\n\n if (!bytes) {\n if (typeof fetchImpl !== 'function') {\n throw new Error('prefetchShard: no fetch implementation available (pass options.fetchImpl)')\n }\n const res = await fetchImpl(url, options?.signal ? { signal: options.signal } : undefined)\n if (!res.ok) {\n throw new Error(`Failed to prefetch shard ${url}: HTTP ${res.status} ${res.statusText}`)\n }\n bytes = new Uint8Array(await res.arrayBuffer())\n }\n\n const sha256 = await maybeHash(bytes, options)\n warmStore.set(url, { bytes, sha256 })\n\n if (options?.useCacheStorage && !fromCache) {\n await writeToCacheStorage(url, bytes, cacheName)\n }\n\n return { url, bytes, byteLength: bytes.byteLength, sha256, fromCache }\n })()\n\n const tracked = work.finally(() => {\n inFlight.delete(url)\n })\n inFlight.set(url, tracked)\n return tracked\n}\n\n/**\n * Return previously-warmed shard bytes for `url`, ready to hand to `importShard`.\n *\n * @throws If the url was not prefetched (call {@link prefetchShard} first).\n *\n * @example\n * ```ts\n * await importShard(db, fromPrefetched('/shards/research.shard'), { onProgress })\n * ```\n */\nexport function fromPrefetched(url: string): Uint8Array {\n const entry = warmStore.get(url)\n if (!entry) {\n throw new Error(`Shard not prefetched: ${url}. Call prefetchShard(url) first.`)\n }\n return entry.bytes\n}\n\n/** Whether `url` has warm bytes in the in-memory store. */\nexport function isShardPrefetched(url: string): boolean {\n return warmStore.has(url)\n}\n\n/** The computed SHA-256 (hex) of a warmed shard, if it was verified/hashed. */\nexport function getPrefetchedSha256(url: string): string | undefined {\n return warmStore.get(url)?.sha256\n}\n\n/**\n * Evict warm bytes from the in-memory store. With no argument, clears all.\n *\n * Note: this does not delete Cache Storage entries — those persist by design\n * (that is the cross-reload warmth). Manage the Cache Storage cache directly if\n * you need to evict it.\n */\nexport function clearPrefetchedShard(url?: string): void {\n if (url === undefined) {\n warmStore.clear()\n return\n }\n warmStore.delete(url)\n}\n","export type AiwgFortemiKnownRecordType =\n | 'crm.contact'\n | 'crm.organization'\n | 'crm.event'\n | 'crm.interaction'\n | 'aiwg.artifact'\n | 'docs.page'\n\nexport type AiwgFortemiRecordType = AiwgFortemiKnownRecordType | `aiwg.${string}` | `research.${string}` | `docs.${string}` | string\n\nexport type AiwgPrivacyClassification = 'private' | 'sanitized' | 'public'\nexport type AiwgProvenanceConfidence = 'source' | 'candidate' | 'reviewed' | 'rejected'\nexport type AiwgReviewAction = 'accept' | 'reject' | 'defer'\n\nexport interface AiwgFortemiRecordSource {\n path: string\n repo_relative_path: string\n locator: string\n}\n\nexport interface AiwgFortemiRelationship {\n type: string\n target_id: string\n source_path?: string\n label?: string\n confidence?: number\n privacy?: AiwgPrivacyClassification\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiProvenance {\n field: string\n source: string\n path: string\n confidence: AiwgProvenanceConfidence\n privacy: AiwgPrivacyClassification\n}\n\nexport type AiwgFortemiSkosRelationType = 'broader' | 'narrower' | 'related' | string\n\nexport interface AiwgFortemiSkosConcept {\n id: string\n prefLabel: string\n definition?: string\n scheme?: string\n notation?: string\n uri?: string\n altLabels?: string[]\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiSkosRelation {\n type: AiwgFortemiSkosRelationType\n source_id: string\n target_id: string\n source_path?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiProvenanceEvent {\n id?: string\n activity: string\n agent?: string\n started_at?: string\n ended_at?: string\n source?: string\n path?: string\n confidence?: AiwgProvenanceConfidence\n privacy?: AiwgPrivacyClassification\n attributes?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiRecord {\n schema_version: 'aiwg.fortemi.index.record.v1'\n id: string\n type: AiwgFortemiRecordType\n source: AiwgFortemiRecordSource\n title: string\n text: string\n facets: Record<string, string[]>\n tags: string[]\n concepts: string[]\n relationships: AiwgFortemiRelationship[]\n provenance: AiwgFortemiProvenance[]\n /** Optional rich SKOS metadata for static consumers that need labels/definitions without opening a shard. */\n skos_concepts?: AiwgFortemiSkosConcept[]\n /** Optional SKOS relationship edges among concepts referenced by this record. */\n skos_relations?: AiwgFortemiSkosRelation[]\n /** Optional W3C PROV-style activity chain for this record. */\n provenance_events?: AiwgFortemiProvenanceEvent[]\n privacy: {\n classification: AiwgPrivacyClassification\n pii: boolean\n }\n updated_at: string\n}\n\nexport interface AiwgFortemiIndexExport {\n schema_version: 'aiwg.fortemi.index.export.v1'\n generated_at: string\n source: {\n repo: string\n privacy: AiwgPrivacyClassification\n }\n items: AiwgFortemiRecord[]\n}\n\nexport interface AiwgFortemiChunkPartRef {\n href: string\n offset: number\n count: number\n}\n\n// Fields a scan part must retain for query/browse/rank/facet to work. The rest\n// (source, provenance, relationships, updated_at) are detail-only and may be\n// dropped from scan parts via `projection`, then resolved on demand by id.\nexport const AIWG_SCAN_REQUIRED_FIELDS: Array<keyof AiwgFortemiRecord> = [\n 'schema_version',\n 'id',\n 'type',\n 'title',\n 'text',\n 'facets',\n 'tags',\n 'concepts',\n 'privacy',\n]\n\n// A record as it appears in a scan part. With no manifest `projection`, this is a\n// full AiwgFortemiRecord. With a projection, detail-only fields are absent — read\n// them via the controller's getRecord(). Typed as the full record for ergonomics;\n// query/browse code guards the projectable fields.\nexport type AiwgFortemiProjectedRecord =\n Pick<AiwgFortemiRecord, 'schema_version' | 'id' | 'type' | 'title' | 'text' | 'facets' | 'tags' | 'concepts' | 'privacy'>\n & Partial<AiwgFortemiRecord>\n\n// How a record id is encoded into a detail filename/path segment.\n// - 'base64url': path-safe, single segment, no '%' — works on every static host,\n// including ids containing '/' (default for new builds; see #177).\n// - 'uri': encodeURIComponent — legacy. Breaks for ids containing '/' on static\n// servers that reject %2F (path-traversal protection → 404).\nexport type AiwgDetailIdEncoding = 'uri' | 'base64url'\n\n// How the controller resolves a full record by id when scan parts are projected.\nexport interface AiwgFortemiChunkDetailRef {\n // href template containing `{id}`, relative to the manifest base — e.g.\n // \"detail/{id}.json\". The `{id}` is encoded per `encoding` at substitution.\n href: string\n // id→segment encoding. Absent is treated as 'uri' for backward compatibility\n // with manifests built before #177; new builds default to 'base64url'.\n encoding?: AiwgDetailIdEncoding\n}\n\nexport interface AiwgFortemiChunkManifest {\n schema_version: 'aiwg.fortemi.index.chunk-manifest.v1'\n generated_at: string\n source: AiwgFortemiIndexExport['source']\n total: number\n part_size: number\n facets?: Record<string, Record<string, number>>\n // Field names present in scan-part items. Absent → scan parts carry whole records.\n // When set, must include AIWG_SCAN_REQUIRED_FIELDS.\n projection?: Array<keyof AiwgFortemiRecord>\n // Resolver for full records by id (used with `projection` to lazy-load detail).\n detail?: AiwgFortemiChunkDetailRef\n parts: AiwgFortemiChunkPartRef[]\n}\n\nexport interface AiwgFortemiChunkPart {\n schema_version: 'aiwg.fortemi.index.chunk.v1'\n manifest_schema_version: 'aiwg.fortemi.index.chunk-manifest.v1'\n offset: number\n items: AiwgFortemiRecord[]\n}\n\nexport interface AiwgIndexValidationResult {\n valid: boolean\n errors: string[]\n counts: Partial<Record<string, number>>\n}\n\nexport interface AiwgChunkedIndexValidationResult {\n valid: boolean\n errors: string[]\n}\n\nexport interface AiwgIndexQueryOptions {\n types?: AiwgFortemiRecordType[]\n facets?: Record<string, string[]>\n tags?: string[]\n concepts?: string[]\n privacy?: AiwgPrivacyClassification[]\n relationshipTargetId?: string\n limit?: number\n offset?: number\n rank?: boolean\n snippets?: boolean\n snippetLength?: number\n weights?: Partial<AiwgIndexQueryWeights>\n includeMatches?: boolean\n searchProfile?: 'default' | 'aiwg-discovery'\n}\n\nexport interface AiwgIndexQueryWeights {\n title: number\n text: number\n tag: number\n concept: number\n facet: number\n id: number\n source: number\n}\n\nexport interface AiwgIndexQueryMatch {\n field: 'title' | 'text' | 'tag' | 'concept' | 'facet' | 'id' | 'source'\n value: string\n score?: number\n reason?: string\n}\n\nexport interface AiwgIndexQueryRankedItem {\n item: AiwgFortemiRecord\n rank: number\n snippet?: string\n matches?: AiwgIndexQueryMatch[]\n}\n\nexport interface AiwgIndexQueryResult {\n items: AiwgFortemiRecord[]\n total: number\n facets: Record<string, Record<string, number>>\n rankedItems?: AiwgIndexQueryRankedItem[]\n}\n\nexport type AiwgChunkedIndexLoader = (\n part: AiwgFortemiChunkPartRef,\n manifest: AiwgFortemiChunkManifest,\n) => Promise<unknown>\n\n// Resolves a full record by id (used with projected scan parts). Returns the\n// parsed record JSON; validated by the controller before use.\nexport type AiwgChunkedIndexDetailLoader = (\n id: string,\n manifest: AiwgFortemiChunkManifest,\n) => Promise<unknown>\n\nexport interface AiwgChunkedIndexLoadOptions {\n maxCachedParts?: number\n // Required to resolve detail for projected indexes via getRecord(); ignored otherwise.\n detailLoader?: AiwgChunkedIndexDetailLoader\n maxCachedDetails?: number\n // Bounds the filtered/ranked match-set cache used to page a query without\n // re-scanning every part. Counts total cached entries across all queries\n // (LRU-evicted). Defaults to 5000. The cache is keyed on query + filters +\n // weights, so paging the same query (varying only offset/limit/sort/snippets)\n // reuses the scan; see queryChunked.\n maxCachedMatches?: number\n}\n\nexport type AiwgChunkedIndexProgressPhase = 'part' | 'query'\n\nexport interface AiwgChunkedIndexProgress {\n phase: AiwgChunkedIndexProgressPhase\n done: number\n total: number\n href?: string\n}\n\nexport interface AiwgChunkedIndexQueryOptions extends AiwgIndexQueryOptions {\n onProgress?: (progress: AiwgChunkedIndexProgress) => void\n}\n\nexport interface AiwgChunkedIndexQueryResult extends AiwgIndexQueryResult {\n manifestTotal: number\n scannedParts: number\n fetchedParts: number\n complete: boolean\n}\n\nexport interface AiwgReviewDecision {\n item_id: string\n action: AiwgReviewAction\n reason?: string\n updated_at: string\n}\n\nexport interface AiwgReviewDecisionExport {\n schema_version: 'aiwg.fortemi.review-decisions.v1'\n generated_at: string\n source_export_schema_version: string\n decisions: AiwgReviewDecision[]\n}\n\nexport interface AiwgIndexGraphOptions {\n communityFacet?: string\n communityTagPrefix?: string\n relationshipWeights?: Record<string, number>\n includeDanglingRelationships?: boolean\n}\n\nexport type AiwgRelationshipDirection = 'in' | 'out' | 'both'\nexport type AiwgRelationshipSetOperation = 'intersection' | 'union' | 'difference'\n\nexport interface AiwgRelationshipTraversalOptions {\n direction?: AiwgRelationshipDirection\n relationshipType?: string\n limit?: number\n}\n\nexport interface AiwgRelationshipQueryOptions extends AiwgRelationshipTraversalOptions {\n sourceId?: string\n targetId?: string\n type?: string\n}\n\nexport interface AiwgRelationshipEdgeSummary {\n source_id: string\n target_id: string\n type: string\n source_path?: string\n}\n\nexport interface AiwgRelationshipNodeSummary {\n id: string\n type: AiwgFortemiRecordType\n title: string\n}\n\nexport interface AiwgRelationshipTraversalResult {\n nodes: AiwgRelationshipNodeSummary[]\n edges: AiwgRelationshipEdgeSummary[]\n complete: boolean\n scannedParts?: number\n fetchedParts?: number\n}\n\nexport interface AiwgRelationshipSetOptions extends AiwgRelationshipTraversalOptions {\n op: AiwgRelationshipSetOperation\n a: string\n b: string\n}\n\nexport interface AiwgRelationshipSetResult {\n ids: string[]\n op: AiwgRelationshipSetOperation\n}\n\nexport interface AiwgStaticEmbeddingRecord {\n record_id: string\n embedding: number[]\n embedding_id?: string\n granularity?: string\n input_hash: string\n source_path?: string\n}\n\nexport interface AiwgStaticEmbeddingSet {\n schema_version: 'aiwg.fortemi.embedding.set.v1'\n id: string\n model: string\n dimensions: number\n generated_at: string\n granularity: 'title-summary' | 'body' | 'chunked-body' | string\n metric?: 'cosine' | 'dot' | 'euclidean'\n input_hash_algorithm?: string\n embeddings: AiwgStaticEmbeddingRecord[]\n}\n\nexport interface AiwgStaticSemanticQueryOptions {\n limit?: number\n offset?: number\n minScore?: number\n}\n\nexport interface AiwgStaticSemanticResult {\n item: AiwgFortemiRecord\n score: number\n embedding?: AiwgStaticEmbeddingRecord\n}\n\nexport interface AiwgStaticHybridQueryOptions extends AiwgStaticSemanticQueryOptions, AiwgIndexQueryOptions {\n lexicalWeight?: number\n semanticWeight?: number\n}\n\nexport interface AiwgStaticDuplicatePair {\n left: AiwgFortemiRecord\n right: AiwgFortemiRecord\n score: number\n}\n\nexport interface AiwgReviewInput {\n item_id: string\n action: AiwgReviewAction\n reason?: string\n}\n\nexport interface AiwgIndexControllerSnapshot {\n index: AiwgFortemiIndexExport | null\n chunked: {\n manifest: AiwgFortemiChunkManifest\n cachedParts: number\n maxCachedParts: number\n } | null\n data: AiwgIndexQueryResult | null\n error: Error | null\n reviewDecisions: AiwgReviewDecision[]\n}\n\nexport type AiwgIndexControllerListener = (snapshot: AiwgIndexControllerSnapshot) => void\n\nexport interface AiwgIndexController {\n loadIndex(value: unknown): AiwgFortemiIndexExport\n loadChunkedIndex(\n manifest: unknown,\n loader: AiwgChunkedIndexLoader,\n options?: AiwgChunkedIndexLoadOptions,\n ): AiwgFortemiChunkManifest\n getIndex(): AiwgFortemiIndexExport | null\n getChunkedManifest(): AiwgFortemiChunkManifest | null\n getSnapshot(): AiwgIndexControllerSnapshot\n query(query?: string, options?: AiwgIndexQueryOptions): AiwgIndexQueryResult\n queryChunked(query?: string, options?: AiwgChunkedIndexQueryOptions): Promise<AiwgChunkedIndexQueryResult>\n // Resolve a full record by id. For a projected chunked index, fetches detail via\n // the detailLoader (bounded cache); for a whole-record index/parts, returns the\n // record from loaded data. Rejects if detail is unavailable.\n getRecord(id: string): Promise<AiwgFortemiRecord>\n neighbors(id: string, options?: AiwgRelationshipTraversalOptions): Promise<AiwgRelationshipTraversalResult>\n relationshipQuery(options?: AiwgRelationshipQueryOptions): Promise<AiwgRelationshipTraversalResult>\n relationshipSet(options: AiwgRelationshipSetOptions): Promise<AiwgRelationshipSetResult>\n clearChunkCache(): void\n toCommunityGraph(options?: AiwgIndexGraphOptions): ReturnType<typeof aiwgFortemiIndexToCommunityGraph>\n toCommunityGraphChunked(options?: AiwgIndexGraphOptions & { onProgress?: (progress: AiwgChunkedIndexProgress) => void }): Promise<ReturnType<typeof aiwgFortemiIndexToCommunityGraph>>\n setReviewDecision(input: AiwgReviewInput): AiwgReviewDecision\n clearReviewDecision(itemId: string): void\n createReviewDecisionExport(generatedAt?: string): AiwgReviewDecisionExport\n subscribe(listener: AiwgIndexControllerListener): () => void\n}\n\nconst REQUIRED_RECORD_FIELDS: Array<keyof AiwgFortemiRecord> = [\n 'schema_version',\n 'id',\n 'type',\n 'source',\n 'title',\n 'text',\n 'facets',\n 'tags',\n 'concepts',\n 'relationships',\n 'provenance',\n 'privacy',\n 'updated_at',\n]\n\nconst DEFAULT_QUERY_WEIGHTS: AiwgIndexQueryWeights = {\n title: 4,\n tag: 3,\n concept: 2,\n text: 1,\n facet: 2,\n id: 1,\n source: 0.25,\n}\n\nfunction hasString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0\n}\n\nfunction pushFacet(counts: Record<string, Record<string, number>>, name: string, value: string) {\n counts[name] ??= {}\n counts[name][value] = (counts[name][value] ?? 0) + 1\n}\n\nfunction hasNonNegativeInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === 'number' && value >= 0\n}\n\nfunction hasPositiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === 'number' && value > 0\n}\n\nfunction isFacetCounts(value: unknown): value is Record<string, Record<string, number>> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false\n return Object.values(value).every((counts) => (\n !!counts\n && typeof counts === 'object'\n && !Array.isArray(counts)\n && Object.values(counts).every((count) => hasNonNegativeInteger(count))\n ))\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isOptionalStringArray(value: unknown): boolean {\n return value === undefined || (Array.isArray(value) && value.every((item) => typeof item === 'string'))\n}\n\nfunction validateOptionalRichMetadata(item: Partial<AiwgFortemiRecord>, index: number, errors: string[]): void {\n if (item.skos_concepts !== undefined) {\n if (!Array.isArray(item.skos_concepts)) {\n errors.push('items[' + index + '].skos_concepts must be an array when present')\n } else {\n for (const [conceptIndex, concept] of item.skos_concepts.entries()) {\n if (!hasString(concept.id)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].id is required')\n if (!hasString(concept.prefLabel)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].prefLabel is required')\n if (!isOptionalStringArray(concept.altLabels)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].altLabels must be a string array')\n if (concept.metadata !== undefined && !isPlainRecord(concept.metadata)) {\n errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.skos_relations !== undefined) {\n if (!Array.isArray(item.skos_relations)) {\n errors.push('items[' + index + '].skos_relations must be an array when present')\n } else {\n for (const [relationIndex, relation] of item.skos_relations.entries()) {\n if (!hasString(relation.type)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].type is required')\n if (!hasString(relation.source_id)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].source_id is required')\n if (!hasString(relation.target_id)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].target_id is required')\n if (relation.metadata !== undefined && !isPlainRecord(relation.metadata)) {\n errors.push('items[' + index + '].skos_relations[' + relationIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.provenance_events !== undefined) {\n if (!Array.isArray(item.provenance_events)) {\n errors.push('items[' + index + '].provenance_events must be an array when present')\n } else {\n for (const [eventIndex, event] of item.provenance_events.entries()) {\n if (!hasString(event.activity)) errors.push('items[' + index + '].provenance_events[' + eventIndex + '].activity is required')\n if (event.attributes !== undefined && !isPlainRecord(event.attributes)) {\n errors.push('items[' + index + '].provenance_events[' + eventIndex + '].attributes must be an object')\n }\n }\n }\n }\n if (Array.isArray(item.relationships)) {\n for (const [relationshipIndex, relationship] of item.relationships.entries()) {\n if (relationship.metadata !== undefined && !isPlainRecord(relationship.metadata)) {\n errors.push('items[' + index + '].relationships[' + relationshipIndex + '].metadata must be an object')\n }\n }\n }\n}\n\nexport function validateAiwgFortemiIndexExport(value: unknown): AiwgIndexValidationResult {\n const errors: string[] = []\n const counts: Partial<Record<string, number>> = {}\n const data = value as Partial<AiwgFortemiIndexExport>\n\n if (data?.schema_version !== 'aiwg.fortemi.index.export.v1') {\n errors.push('schema_version must be aiwg.fortemi.index.export.v1')\n }\n if (!hasString(data?.generated_at)) errors.push('generated_at is required')\n if (!hasString(data?.source?.repo)) errors.push('source.repo is required')\n if (!hasString(data?.source?.privacy)) errors.push('source.privacy is required')\n if (!Array.isArray(data?.items)) errors.push('items must be an array')\n\n const ids = new Set<string>()\n let previousId = ''\n for (const [index, item] of (data.items ?? []).entries()) {\n for (const field of REQUIRED_RECORD_FIELDS) {\n if (!(field in item)) errors.push('items[' + index + '].' + field + ' is required')\n }\n if (item.schema_version !== 'aiwg.fortemi.index.record.v1') {\n errors.push('items[' + index + '].schema_version must be aiwg.fortemi.index.record.v1')\n }\n if (!hasString(item.id)) errors.push('items[' + index + '].id is required')\n if (hasString(item.id) && ids.has(item.id)) errors.push('duplicate id: ' + item.id)\n if (hasString(item.id)) ids.add(item.id)\n if (previousId && hasString(item.id) && previousId.localeCompare(item.id) > 0) {\n errors.push('items must be sorted by id: ' + previousId + ' before ' + item.id)\n }\n if (hasString(item.id)) previousId = item.id\n if (!hasString(item.type)) errors.push('items[' + index + '].type must be a non-empty string')\n else counts[item.type] = (counts[item.type] ?? 0) + 1\n if (!hasString(item.source?.path)) errors.push('items[' + index + '].source.path is required')\n if (!hasString(item.source?.repo_relative_path)) errors.push('items[' + index + '].source.repo_relative_path is required')\n if (!hasString(item.source?.locator)) errors.push('items[' + index + '].source.locator is required')\n if (!Array.isArray(item.tags)) errors.push('items[' + index + '].tags must be an array')\n if (!Array.isArray(item.concepts)) errors.push('items[' + index + '].concepts must be an array')\n if (!Array.isArray(item.relationships)) errors.push('items[' + index + '].relationships must be an array')\n if (!Array.isArray(item.provenance) || item.provenance.length === 0) {\n errors.push('items[' + index + '].provenance must be a non-empty array')\n }\n validateOptionalRichMetadata(item, index, errors)\n if (!item.privacy || typeof item.privacy.pii !== 'boolean' || !hasString(item.privacy.classification)) {\n errors.push('items[' + index + '].privacy requires classification and pii')\n }\n }\n\n return { valid: errors.length === 0, errors, counts }\n}\n\nexport function assertAiwgFortemiIndexExport(value: unknown): AiwgFortemiIndexExport {\n const result = validateAiwgFortemiIndexExport(value)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi index export:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiIndexExport\n}\n\nexport function validateAiwgFortemiChunkManifest(value: unknown): AiwgChunkedIndexValidationResult {\n const errors: string[] = []\n const data = value as Partial<AiwgFortemiChunkManifest>\n\n if (data?.schema_version !== 'aiwg.fortemi.index.chunk-manifest.v1') {\n errors.push('schema_version must be aiwg.fortemi.index.chunk-manifest.v1')\n }\n if (!hasString(data?.generated_at)) errors.push('generated_at is required')\n if (!hasString(data?.source?.repo)) errors.push('source.repo is required')\n if (!hasString(data?.source?.privacy)) errors.push('source.privacy is required')\n if (!hasNonNegativeInteger(data?.total)) errors.push('total must be a non-negative integer')\n if (!hasPositiveInteger(data?.part_size)) errors.push('part_size must be a positive integer')\n if (data.facets !== undefined && !isFacetCounts(data.facets)) {\n errors.push('facets must be a nested string-to-number count object')\n }\n if (data.projection !== undefined) {\n if (!Array.isArray(data.projection) || !data.projection.every((field) => typeof field === 'string')) {\n errors.push('projection must be an array of field names')\n } else {\n const present = new Set(data.projection)\n for (const field of AIWG_SCAN_REQUIRED_FIELDS) {\n if (!present.has(field)) errors.push('projection must include scan-required field ' + field)\n }\n }\n }\n if (data.detail !== undefined) {\n if (!hasString(data.detail.href)) errors.push('detail.href is required')\n else if (!data.detail.href.includes('{id}')) errors.push('detail.href must contain the {id} placeholder')\n if (\n data.detail.encoding !== undefined &&\n data.detail.encoding !== 'uri' &&\n data.detail.encoding !== 'base64url'\n ) {\n errors.push(\"detail.encoding must be 'uri' or 'base64url'\")\n }\n }\n if (!Array.isArray(data?.parts)) errors.push('parts must be an array')\n\n let expectedOffset = 0\n const parts = Array.isArray(data?.parts) ? data.parts : []\n for (const [index, part] of parts.entries()) {\n if (!hasString(part.href)) errors.push('parts[' + index + '].href is required')\n if (!hasNonNegativeInteger(part.offset)) errors.push('parts[' + index + '].offset must be a non-negative integer')\n if (!hasNonNegativeInteger(part.count)) errors.push('parts[' + index + '].count must be a non-negative integer')\n if (hasNonNegativeInteger(part.offset) && part.offset !== expectedOffset) {\n errors.push('parts[' + index + '].offset must be ' + expectedOffset)\n }\n if (hasNonNegativeInteger(part.count)) expectedOffset += part.count\n }\n if (hasNonNegativeInteger(data?.total) && expectedOffset !== data.total) {\n errors.push('parts counts must add up to total')\n }\n\n return { valid: errors.length === 0, errors }\n}\n\nexport function assertAiwgFortemiChunkManifest(value: unknown): AiwgFortemiChunkManifest {\n const result = validateAiwgFortemiChunkManifest(value)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi chunk manifest:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiChunkManifest\n}\n\n// Validate projected (slim) scan-part items: scan-required fields only, ids unique + sorted.\nfunction validateProjectedRecords(items: Array<Partial<AiwgFortemiRecord>>): string[] {\n const errors: string[] = []\n const ids = new Set<string>()\n let previousId = ''\n for (const [index, item] of items.entries()) {\n if (item.schema_version !== 'aiwg.fortemi.index.record.v1') {\n errors.push('items[' + index + '].schema_version must be aiwg.fortemi.index.record.v1')\n }\n if (!hasString(item.id)) errors.push('items[' + index + '].id is required')\n if (hasString(item.id) && ids.has(item.id)) errors.push('duplicate id: ' + item.id)\n if (hasString(item.id)) ids.add(item.id)\n if (previousId && hasString(item.id) && previousId.localeCompare(item.id) > 0) {\n errors.push('items must be sorted by id: ' + previousId + ' before ' + item.id)\n }\n if (hasString(item.id)) previousId = item.id\n if (!hasString(item.type)) errors.push('items[' + index + '].type must be a non-empty string')\n if (!hasString(item.title)) errors.push('items[' + index + '].title is required')\n if (typeof item.text !== 'string') errors.push('items[' + index + '].text is required')\n if (!item.facets || typeof item.facets !== 'object' || Array.isArray(item.facets)) {\n errors.push('items[' + index + '].facets must be an object')\n }\n if (!Array.isArray(item.tags)) errors.push('items[' + index + '].tags must be an array')\n if (!Array.isArray(item.concepts)) errors.push('items[' + index + '].concepts must be an array')\n if (!item.privacy || !hasString(item.privacy.classification)) {\n errors.push('items[' + index + '].privacy.classification is required')\n }\n }\n return errors\n}\n\nexport function validateAiwgFortemiChunkPart(\n value: unknown,\n partRef?: AiwgFortemiChunkPartRef,\n manifest?: AiwgFortemiChunkManifest,\n): AiwgChunkedIndexValidationResult {\n const errors: string[] = []\n const data = value as Partial<AiwgFortemiChunkPart>\n\n if (data?.schema_version !== 'aiwg.fortemi.index.chunk.v1') {\n errors.push('schema_version must be aiwg.fortemi.index.chunk.v1')\n }\n if (data?.manifest_schema_version !== 'aiwg.fortemi.index.chunk-manifest.v1') {\n errors.push('manifest_schema_version must be aiwg.fortemi.index.chunk-manifest.v1')\n }\n if (!hasNonNegativeInteger(data?.offset)) errors.push('offset must be a non-negative integer')\n if (!Array.isArray(data?.items)) errors.push('items must be an array')\n\n if (partRef && hasNonNegativeInteger(data?.offset) && data.offset !== partRef.offset) {\n errors.push('offset must match manifest part offset ' + partRef.offset)\n }\n if (partRef && Array.isArray(data?.items) && data.items.length !== partRef.count) {\n errors.push('items length must match manifest part count ' + partRef.count)\n }\n\n if (Array.isArray(data?.items)) {\n if (manifest?.projection) {\n errors.push(...validateProjectedRecords(data.items).map((error) => 'items.' + error))\n } else {\n const validation = validateAiwgFortemiIndexExport({\n schema_version: 'aiwg.fortemi.index.export.v1',\n generated_at: manifest?.generated_at ?? '1970-01-01T00:00:00.000Z',\n source: manifest?.source ?? { repo: 'chunk', privacy: 'public' },\n items: data.items,\n })\n errors.push(...validation.errors.map((error) => 'items.' + error))\n }\n }\n\n return { valid: errors.length === 0, errors }\n}\n\nexport function assertAiwgFortemiChunkPart(\n value: unknown,\n partRef?: AiwgFortemiChunkPartRef,\n manifest?: AiwgFortemiChunkManifest,\n): AiwgFortemiChunkPart {\n const result = validateAiwgFortemiChunkPart(value, partRef, manifest)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi chunk part:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiChunkPart\n}\n\nexport function createAiwgFetchChunkLoader(baseUrl?: string | URL): AiwgChunkedIndexLoader {\n return async (part) => {\n const href = baseUrl ? new URL(part.href, baseUrl).toString() : part.href\n const response = await fetch(href)\n if (!response.ok) throw new Error('Failed to fetch AIWG index chunk ' + href + ': ' + response.status)\n return response.json()\n }\n}\n\n// Encode a record id into a single, path-safe detail filename segment.\n// - 'base64url' (default): UTF-8 → base64url (no '+', '/', '=', '%'). Safe for ids\n// containing '/' on static hosts that reject %2F (#177).\n// - 'uri': encodeURIComponent (legacy).\nexport function encodeAiwgDetailId(id: string, encoding: AiwgDetailIdEncoding = 'base64url'): string {\n if (encoding === 'uri') return encodeURIComponent(id)\n const bytes = new TextEncoder().encode(id)\n let binary = ''\n for (const byte of bytes) binary += String.fromCharCode(byte)\n // btoa is available in browsers and Node ≥16.\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n// Resolve a manifest detail.href template for a given id, honoring detail.encoding\n// (absent → 'uri' for backward compatibility). The writer and the loader both go\n// through this so emitted filenames and fetched paths always agree.\nexport function aiwgDetailHrefForId(detail: AiwgFortemiChunkDetailRef, id: string): string {\n return detail.href.replace('{id}', encodeAiwgDetailId(id, detail.encoding ?? 'uri'))\n}\n\n// Detail loader for projected indexes: resolves the manifest's detail.href {id}\n// template (encoded per detail.encoding) against baseUrl and fetches the full record.\nexport function createAiwgFetchDetailLoader(baseUrl?: string | URL): AiwgChunkedIndexDetailLoader {\n return async (id, manifest) => {\n if (!manifest.detail?.href) throw new Error('Manifest has no detail.href for record resolution')\n const relative = aiwgDetailHrefForId(manifest.detail, id)\n const href = baseUrl ? new URL(relative, baseUrl).toString() : relative\n const response = await fetch(href)\n if (!response.ok) throw new Error('Failed to fetch AIWG index detail ' + href + ': ' + response.status)\n return response.json()\n }\n}\n\nexport function getAiwgFortemiFacets(items: AiwgFortemiRecord[]): Record<string, Record<string, number>> {\n const result: Record<string, Record<string, number>> = {}\n for (const item of items) {\n pushFacet(result, 'type', item.type)\n pushFacet(result, 'privacy', item.privacy.classification)\n for (const tag of item.tags) pushFacet(result, 'tag', tag)\n for (const concept of item.concepts) pushFacet(result, 'concept', concept)\n for (const [name, values] of Object.entries(item.facets)) {\n for (const value of values) pushFacet(result, name, value)\n }\n }\n return result\n}\n\nexport interface AiwgChunkedIndexBuildOptions {\n partSize?: number\n // When set, scan parts carry only these fields; full records go to `details`.\n projection?: Array<keyof AiwgFortemiRecord>\n // Detail href template (with {id}); defaults to \"detail/{id}.json\" when projecting.\n detailHref?: string\n // id→filename encoding for detail files; defaults to 'base64url' (path-safe,\n // works for ids containing '/'; see #177).\n idEncoding?: AiwgDetailIdEncoding\n generatedAt?: string\n}\n\nexport interface AiwgChunkedIndexBuildResult {\n manifest: AiwgFortemiChunkManifest\n parts: Array<{ href: string; part: AiwgFortemiChunkPart }>\n // Empty unless projecting. Each entry carries the full record plus the resolved,\n // encoding-correct `href` to host it at — write the record to that path so the\n // detail loader (which uses the same encoding) can fetch it back.\n details: Array<{ id: string; href: string; record: AiwgFortemiRecord }>\n}\n\n// Pure builder (no I/O): project an index export into the chunked manifest + parts\n// (+ detail records when projecting). The caller writes the returned objects to disk.\n// Manifest facets are computed from the full records, so global counts are exact even\n// when scan parts are slim.\nexport function buildAiwgChunkedIndex(\n index: AiwgFortemiIndexExport,\n options: AiwgChunkedIndexBuildOptions = {},\n): AiwgChunkedIndexBuildResult {\n const partSize = hasPositiveInteger(options.partSize) ? options.partSize : 500\n const projection = options.projection\n const idEncoding = options.idEncoding ?? 'base64url'\n const detailHref = options.detailHref ?? 'detail/{id}.json'\n const items = index.items\n const pad = (value: number): string => String(value).padStart(4, '0')\n const project = (record: AiwgFortemiRecord): AiwgFortemiRecord => {\n if (!projection) return record\n const slim: Record<string, unknown> = {}\n for (const field of projection) slim[field] = record[field]\n return slim as unknown as AiwgFortemiRecord\n }\n\n const parts: Array<{ href: string; part: AiwgFortemiChunkPart }> = []\n const partRefs: AiwgFortemiChunkPartRef[] = []\n for (let offset = 0, partIndex = 0; offset < items.length; offset += partSize, partIndex += 1) {\n const slice = items.slice(offset, offset + partSize)\n const href = 'part-' + pad(partIndex) + '.json'\n parts.push({\n href,\n part: {\n schema_version: 'aiwg.fortemi.index.chunk.v1',\n manifest_schema_version: 'aiwg.fortemi.index.chunk-manifest.v1',\n offset,\n items: slice.map(project),\n },\n })\n partRefs.push({ href, offset, count: slice.length })\n }\n\n const manifest: AiwgFortemiChunkManifest = {\n schema_version: 'aiwg.fortemi.index.chunk-manifest.v1',\n generated_at: options.generatedAt ?? index.generated_at,\n source: index.source,\n total: items.length,\n part_size: partSize,\n facets: getAiwgFortemiFacets(items),\n parts: partRefs,\n ...(projection ? { projection, detail: { href: detailHref, encoding: idEncoding } } : {}),\n }\n\n return {\n manifest,\n parts,\n details: projection\n ? items.map((record) => ({\n id: record.id,\n href: aiwgDetailHrefForId({ href: detailHref, encoding: idEncoding }, record.id),\n record,\n }))\n : [],\n }\n}\n\nfunction includesAll(actual: string[], expected: string[] | undefined): boolean {\n if (!expected || expected.length === 0) return true\n const actualSet = new Set(actual)\n return expected.every((value) => actualSet.has(value))\n}\n\nfunction matchesFacetFilters(item: AiwgFortemiRecord, filters: Record<string, string[]> | undefined): boolean {\n if (!filters) return true\n return Object.entries(filters).every(([name, expected]) => includesAll(item.facets[name] ?? [], expected))\n}\n\nfunction queryMatches(item: AiwgFortemiRecord, q: string): AiwgIndexQueryMatch[] {\n if (!q) return []\n const matches: AiwgIndexQueryMatch[] = []\n if (item.title.toLowerCase().includes(q)) matches.push({ field: 'title', value: item.title })\n if (item.text.toLowerCase().includes(q)) matches.push({ field: 'text', value: item.text })\n for (const tag of item.tags) {\n if (tag.toLowerCase().includes(q)) matches.push({ field: 'tag', value: tag })\n }\n for (const concept of item.concepts) {\n if (concept.toLowerCase().includes(q)) matches.push({ field: 'concept', value: concept })\n }\n return matches\n}\n\nconst DISCOVERY_STOPWORDS = new Set([\n 'a',\n 'an',\n 'and',\n 'are',\n 'as',\n 'for',\n 'from',\n 'how',\n 'i',\n 'in',\n 'is',\n 'me',\n 'of',\n 'on',\n 'or',\n 'please',\n 'the',\n 'to',\n 'use',\n 'with',\n])\n\nfunction normalizeDiscoveryText(value: string): string {\n return value.toLowerCase().replace(/[_/]+/g, ' ').replace(/[^a-z0-9.-]+/g, ' ').trim()\n}\n\nfunction canonicalDiscoveryName(value: string): string {\n return normalizeDiscoveryText(value).replace(/[\\s.-]+/g, '')\n}\n\nfunction discoveryTokens(value: string): string[] {\n return normalizeDiscoveryText(value)\n .split(/\\s+/)\n .filter((token) => token.length > 1 && !DISCOVERY_STOPWORDS.has(token))\n}\n\nfunction facetValues(item: AiwgFortemiRecord, names: string[]): string[] {\n return names.flatMap((name) => item.facets[name] ?? [])\n}\n\nfunction addDiscoveryMatch(matches: AiwgIndexQueryMatch[], match: AiwgIndexQueryMatch) {\n if (!matches.some((existing) => existing.field === match.field && existing.value === match.value && existing.reason === match.reason)) {\n matches.push(match)\n }\n}\n\nfunction tokenOverlapScore(tokens: string[], value: string): number {\n if (tokens.length === 0 || !value) return 0\n const normalized = normalizeDiscoveryText(value)\n const hits = tokens.filter((token) => normalized.includes(token)).length\n return hits / tokens.length\n}\n\nfunction discoveryMatches(item: AiwgFortemiRecord, query: string): AiwgIndexQueryMatch[] {\n if (!query) return []\n const matches: AiwgIndexQueryMatch[] = []\n const tokens = discoveryTokens(query)\n const canonicalQuery = canonicalDiscoveryName(query)\n const idParts = item.id.split(/[:/]/)\n const names = [\n item.id,\n item.title,\n ...idParts,\n ...facetValues(item, ['name', 'canonical_name', 'command', 'skill', 'agent', 'rule']),\n ].filter(Boolean)\n const triggers = facetValues(item, ['trigger', 'triggers', 'trigger_phrase', 'trigger_phrases'])\n const capabilities = [\n ...facetValues(item, ['capability', 'capabilities', 'summary', 'description']),\n ...item.concepts,\n ...item.tags,\n ]\n const sourceValues = [item.source?.path, item.source?.repo_relative_path, item.source?.locator].filter(Boolean)\n\n for (const name of names) {\n const canonicalName = canonicalDiscoveryName(name)\n if (!canonicalName) continue\n if (canonicalName === canonicalQuery) {\n addDiscoveryMatch(matches, { field: 'id', value: name, score: 80, reason: 'exact canonical name' })\n } else if (canonicalName.includes(canonicalQuery) || canonicalQuery.includes(canonicalName)) {\n addDiscoveryMatch(matches, { field: 'id', value: name, score: 48, reason: 'near canonical name' })\n }\n }\n\n const titleOverlap = tokenOverlapScore(tokens, item.title)\n if (titleOverlap > 0) addDiscoveryMatch(matches, { field: 'title', value: item.title, score: 18 * titleOverlap, reason: 'title token overlap' })\n\n for (const trigger of triggers) {\n const overlap = tokenOverlapScore(tokens, trigger)\n if (overlap > 0) addDiscoveryMatch(matches, { field: 'facet', value: trigger, score: 34 * overlap, reason: 'trigger phrase' })\n }\n\n for (const capability of capabilities) {\n const overlap = tokenOverlapScore(tokens, capability)\n if (overlap > 0) addDiscoveryMatch(matches, { field: 'concept', value: capability, score: 22 * overlap, reason: 'capability overlap' })\n }\n\n const textOverlap = tokenOverlapScore(tokens, item.text)\n if (textOverlap > 0) addDiscoveryMatch(matches, { field: 'text', value: item.text, score: 8 * textOverlap, reason: 'body token overlap' })\n\n for (const source of sourceValues) {\n const overlap = tokenOverlapScore(tokens, source)\n if (overlap > 0) addDiscoveryMatch(matches, { field: 'source', value: source, score: 2 * overlap, reason: 'path overlap' })\n }\n\n return matches\n}\n\nfunction rankMatches(matches: AiwgIndexQueryMatch[], weights: AiwgIndexQueryWeights): number {\n return matches.reduce((total, match) => total + (match.score ?? weights[match.field]), 0)\n}\n\nfunction clipSnippet(value: string, q: string, maxLength: number): string {\n const normalizedLength = Math.max(20, maxLength)\n if (!value) return ''\n if (!q) return value.length > normalizedLength ? `${value.slice(0, normalizedLength).trimEnd()}...` : value\n\n const lower = value.toLowerCase()\n const index = lower.indexOf(q)\n if (index < 0) return value.length > normalizedLength ? `${value.slice(0, normalizedLength).trimEnd()}...` : value\n\n const context = Math.max(0, Math.floor((normalizedLength - q.length) / 2))\n const start = Math.max(0, index - context)\n const end = Math.min(value.length, start + normalizedLength)\n const prefix = start > 0 ? '...' : ''\n const suffix = end < value.length ? '...' : ''\n return `${prefix}${value.slice(start, end).trim()}${suffix}`\n}\n\nfunction createSnippet(item: AiwgFortemiRecord, matches: AiwgIndexQueryMatch[], q: string, maxLength: number): string {\n const textMatch = matches.find((match) => match.field === 'text')\n const titleMatch = matches.find((match) => match.field === 'title')\n const firstMatch = textMatch ?? titleMatch ?? matches[0]\n return clipSnippet(firstMatch?.value ?? item.text, q, maxLength)\n}\n\ninterface AiwgRankedEntry {\n item: AiwgFortemiRecord\n ordinal: number\n rank: number\n matches: AiwgIndexQueryMatch[]\n}\n\nfunction createRankedEntries(\n items: AiwgFortemiRecord[],\n q: string,\n options: AiwgIndexQueryOptions,\n ordinalBase = 0,\n): AiwgRankedEntry[] {\n const weights = { ...DEFAULT_QUERY_WEIGHTS, ...options.weights }\n const profile = options.searchProfile ?? 'default'\n return items.map((item, ordinal) => ({\n item,\n ordinal: ordinalBase + ordinal,\n matches: profile === 'aiwg-discovery' ? discoveryMatches(item, q) : queryMatches(item, q),\n }))\n .filter(({ item, matches }) => {\n if (q && matches.length === 0) return false\n if (options.types && !options.types.includes(item.type)) return false\n if (options.privacy && !options.privacy.includes(item.privacy.classification)) return false\n if (!includesAll(item.tags, options.tags)) return false\n if (!includesAll(item.concepts, options.concepts)) return false\n if (!matchesFacetFilters(item, options.facets)) return false\n if (options.relationshipTargetId && !(item.relationships ?? []).some((rel) => rel.target_id === options.relationshipTargetId)) {\n return false\n }\n return true\n })\n .map(({ item, ordinal, matches }) => ({\n item,\n ordinal,\n rank: rankMatches(matches, weights),\n matches,\n }))\n}\n\nfunction sortRankedEntries(entries: AiwgRankedEntry[], rank?: boolean): AiwgRankedEntry[] {\n return [...entries].sort((left, right) => {\n if (rank) return right.rank - left.rank || left.ordinal - right.ordinal\n return left.ordinal - right.ordinal\n })\n}\n\nfunction createQueryResultFromRankedEntries(\n entries: AiwgRankedEntry[],\n query: string,\n options: AiwgIndexQueryOptions,\n): AiwgIndexQueryResult {\n const ranked = sortRankedEntries(entries, options.rank)\n const offset = options.offset ?? 0\n const limit = options.limit ?? ranked.length\n const page = ranked.slice(offset, offset + limit)\n const result: AiwgIndexQueryResult = {\n items: page.map((entry) => entry.item),\n total: ranked.length,\n facets: getAiwgFortemiFacets(ranked.map((entry) => entry.item)),\n }\n if (options.rank || options.snippets || options.includeMatches) {\n const snippetLength = options.snippetLength ?? 160\n result.rankedItems = page.map((entry) => ({\n item: entry.item,\n rank: entry.rank,\n ...(options.snippets ? { snippet: createSnippet(entry.item, entry.matches, query, snippetLength) } : {}),\n ...(options.includeMatches ? { matches: entry.matches } : {}),\n }))\n }\n return result\n}\n\nexport function queryAiwgFortemiIndex(\n index: AiwgFortemiIndexExport,\n query = '',\n options: AiwgIndexQueryOptions = {},\n): AiwgIndexQueryResult {\n const q = query.trim().toLowerCase()\n const entries = createRankedEntries(index.items, q, options)\n if (entries.length === 0 && q && options.searchProfile === 'aiwg-discovery') {\n const relaxed = discoveryTokens(q).join(' ')\n return createQueryResultFromRankedEntries(createRankedEntries(index.items, relaxed, options), relaxed, options)\n }\n return createQueryResultFromRankedEntries(entries, q, options)\n}\n\nfunction cosineSimilarity(left: number[], right: number[]): number {\n if (left.length !== right.length || left.length === 0) return 0\n let dot = 0\n let leftMag = 0\n let rightMag = 0\n for (let i = 0; i < left.length; i += 1) {\n const l = left[i]\n const r = right[i]\n dot += l * r\n leftMag += l * l\n rightMag += r * r\n }\n if (leftMag === 0 || rightMag === 0) return 0\n return dot / (Math.sqrt(leftMag) * Math.sqrt(rightMag))\n}\n\nexport function validateAiwgStaticEmbeddingSet(value: unknown): AiwgChunkedIndexValidationResult {\n const errors: string[] = []\n const data = value as Partial<AiwgStaticEmbeddingSet>\n if (data?.schema_version !== 'aiwg.fortemi.embedding.set.v1') errors.push('schema_version must be aiwg.fortemi.embedding.set.v1')\n if (!hasString(data?.id)) errors.push('id is required')\n if (!hasString(data?.model)) errors.push('model is required')\n if (!hasPositiveInteger(data?.dimensions)) errors.push('dimensions must be a positive integer')\n if (!hasString(data?.generated_at)) errors.push('generated_at is required')\n if (!hasString(data?.granularity)) errors.push('granularity is required')\n if (!Array.isArray(data?.embeddings)) errors.push('embeddings must be an array')\n for (const [index, embedding] of (data.embeddings ?? []).entries()) {\n if (!hasString(embedding.record_id)) errors.push('embeddings[' + index + '].record_id is required')\n if (!hasString(embedding.input_hash)) errors.push('embeddings[' + index + '].input_hash is required')\n if (!Array.isArray(embedding.embedding)) errors.push('embeddings[' + index + '].embedding must be an array')\n else if (hasPositiveInteger(data?.dimensions) && embedding.embedding.length !== data.dimensions) {\n errors.push('embeddings[' + index + '].embedding length must match dimensions')\n } else if (!embedding.embedding.every((number) => typeof number === 'number' && Number.isFinite(number))) {\n errors.push('embeddings[' + index + '].embedding must contain finite numbers')\n }\n }\n return { valid: errors.length === 0, errors }\n}\n\nexport function assertAiwgStaticEmbeddingSet(value: unknown): AiwgStaticEmbeddingSet {\n const result = validateAiwgStaticEmbeddingSet(value)\n if (!result.valid) throw new Error('Invalid AIWG Fortemi embedding set:\\n' + result.errors.join('\\n'))\n return value as AiwgStaticEmbeddingSet\n}\n\nexport function queryAiwgSemanticIndex(\n index: AiwgFortemiIndexExport,\n embeddingSet: AiwgStaticEmbeddingSet,\n queryEmbedding: number[],\n options: AiwgStaticSemanticQueryOptions = {},\n): AiwgStaticSemanticResult[] {\n assertAiwgStaticEmbeddingSet(embeddingSet)\n if (queryEmbedding.length !== embeddingSet.dimensions) throw new Error('query embedding length must match embedding set dimensions')\n const byId = new Map(index.items.map((item) => [item.id, item]))\n const offset = options.offset ?? 0\n const limit = options.limit ?? 20\n return embeddingSet.embeddings\n .map((embedding): AiwgStaticSemanticResult | null => {\n const item = byId.get(embedding.record_id)\n if (!item) return null\n return { item, embedding, score: cosineSimilarity(queryEmbedding, embedding.embedding) }\n })\n .filter((result): result is AiwgStaticSemanticResult => result !== null && result.score >= (options.minScore ?? -1))\n .sort((left, right) => right.score - left.score || left.item.id.localeCompare(right.item.id))\n .slice(offset, offset + limit)\n}\n\nexport function queryAiwgHybridIndex(\n index: AiwgFortemiIndexExport,\n embeddingSet: AiwgStaticEmbeddingSet,\n query: string,\n queryEmbedding: number[],\n options: AiwgStaticHybridQueryOptions = {},\n): AiwgStaticSemanticResult[] {\n const lexical = queryAiwgFortemiIndex(index, query, { ...options, rank: true })\n const semantic = queryAiwgSemanticIndex(index, embeddingSet, queryEmbedding, { limit: index.items.length })\n const lexicalWeight = options.lexicalWeight ?? 0.5\n const semanticWeight = options.semanticWeight ?? 0.5\n const lexicalScores = new Map(lexical.rankedItems?.map((entry) => [entry.item.id, entry.rank]) ?? [])\n const maxLexical = Math.max(1, ...lexicalScores.values())\n const embeddingById = new Map(semantic.flatMap((entry) => entry.embedding ? [[entry.item.id, entry.embedding] as const] : []))\n const semanticScores = new Map(semantic.map((entry) => [entry.item.id, entry.score]))\n const ids = new Set([...lexicalScores.keys(), ...semanticScores.keys()])\n const offset = options.offset ?? 0\n const limit = options.limit ?? 20\n return [...ids]\n .map((id) => {\n const item = index.items.find((candidate) => candidate.id === id)\n const embedding = embeddingById.get(id)\n if (!item) return null\n return {\n item,\n ...(embedding ? { embedding } : {}),\n score: ((lexicalScores.get(id) ?? 0) / maxLexical) * lexicalWeight + (semanticScores.get(id) ?? 0) * semanticWeight,\n }\n })\n .filter((result): result is AiwgStaticSemanticResult => result !== null && result.score >= (options.minScore ?? -1))\n .sort((left, right) => right.score - left.score || left.item.id.localeCompare(right.item.id))\n .slice(offset, offset + limit)\n}\n\nexport function findAiwgStaticDuplicatePairs(\n index: AiwgFortemiIndexExport,\n embeddingSet: AiwgStaticEmbeddingSet,\n threshold = 0.9,\n): AiwgStaticDuplicatePair[] {\n assertAiwgStaticEmbeddingSet(embeddingSet)\n const byId = new Map(index.items.map((item) => [item.id, item]))\n const pairs: AiwgStaticDuplicatePair[] = []\n for (let leftIndex = 0; leftIndex < embeddingSet.embeddings.length; leftIndex += 1) {\n for (let rightIndex = leftIndex + 1; rightIndex < embeddingSet.embeddings.length; rightIndex += 1) {\n const leftEmbedding = embeddingSet.embeddings[leftIndex]\n const rightEmbedding = embeddingSet.embeddings[rightIndex]\n const left = byId.get(leftEmbedding.record_id)\n const right = byId.get(rightEmbedding.record_id)\n if (!left || !right) continue\n const score = cosineSimilarity(leftEmbedding.embedding, rightEmbedding.embedding)\n if (score >= threshold) pairs.push({ left, right, score })\n }\n }\n return pairs.sort((left, right) => right.score - left.score || left.left.id.localeCompare(right.left.id))\n}\n\ninterface AiwgChunkedIndexRuntime {\n manifest: AiwgFortemiChunkManifest\n loader: AiwgChunkedIndexLoader\n maxCachedParts: number\n partCache: Map<string, AiwgFortemiChunkPart>\n detailLoader?: AiwgChunkedIndexDetailLoader\n maxCachedDetails: number\n detailCache: Map<string, AiwgFortemiRecord>\n maxCachedMatches: number\n // query+filter+weights key -> the full filtered/ranked entry set for that\n // query (offset/limit/sort/snippets independent). LRU-ordered; bounded by\n // maxCachedMatches (total entries). Lets pagination reuse a single scan.\n matchCache: Map<string, AiwgRankedEntry[]>\n}\n\nfunction chunkPartCacheKey(part: AiwgFortemiChunkPartRef): string {\n return `${part.offset}:${part.href}`\n}\n\nfunction clampMaxCachedParts(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 3\n return value\n}\n\nfunction clampMaxCachedDetails(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 32\n return value\n}\n\nfunction clampMaxCachedMatches(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 5000\n return value\n}\n\n// Stable key over the inputs that determine the filtered/ranked entry SET and\n// each entry's rank value — but not offset/limit/sort/snippets, which only shape\n// the page projected from a cached set. Caller-stable option objects (same field\n// order each page) hit the cache; a reordered object simply misses (still correct).\nfunction matchSetCacheKey(q: string, options: AiwgIndexQueryOptions): string {\n return JSON.stringify({\n q,\n types: options.types ?? null,\n facets: options.facets ?? null,\n tags: options.tags ?? null,\n concepts: options.concepts ?? null,\n privacy: options.privacy ?? null,\n rel: options.relationshipTargetId ?? null,\n weights: { ...DEFAULT_QUERY_WEIGHTS, ...options.weights },\n })\n}\n\nfunction cacheMatchEntries(runtime: AiwgChunkedIndexRuntime, key: string, entries: AiwgRankedEntry[]): void {\n runtime.matchCache.delete(key)\n runtime.matchCache.set(key, entries)\n let total = 0\n for (const set of runtime.matchCache.values()) total += set.length\n // Evict oldest sets until within budget, but always keep the just-inserted set\n // so paging a large result still benefits from the single scan.\n while (total > runtime.maxCachedMatches && runtime.matchCache.size > 1) {\n const oldest = runtime.matchCache.keys().next().value\n if (oldest === undefined || oldest === key) break\n total -= runtime.matchCache.get(oldest)?.length ?? 0\n runtime.matchCache.delete(oldest)\n }\n}\n\nfunction isDirectChunkBrowse(query: string, options: AiwgIndexQueryOptions): boolean {\n return query.trim() === ''\n && !options.rank\n && !options.snippets\n && !options.includeMatches\n && !options.types\n && !options.facets\n && !options.tags\n && !options.concepts\n && !options.privacy\n && !options.relationshipTargetId\n}\n\nfunction getPartsForRange(\n manifest: AiwgFortemiChunkManifest,\n offset: number,\n limit: number,\n): AiwgFortemiChunkPartRef[] {\n const end = offset + limit\n return manifest.parts.filter((part) => part.count > 0 && part.offset < end && part.offset + part.count > offset)\n}\n\nasync function loadChunkPart(\n runtime: AiwgChunkedIndexRuntime,\n part: AiwgFortemiChunkPartRef,\n): Promise<{ part: AiwgFortemiChunkPart; fetched: boolean }> {\n const key = chunkPartCacheKey(part)\n const cached = runtime.partCache.get(key)\n if (cached) {\n runtime.partCache.delete(key)\n runtime.partCache.set(key, cached)\n return { part: cached, fetched: false }\n }\n\n const parsed = assertAiwgFortemiChunkPart(await runtime.loader(part, runtime.manifest), part, runtime.manifest)\n runtime.partCache.set(key, parsed)\n while (runtime.partCache.size > runtime.maxCachedParts) {\n const oldest = runtime.partCache.keys().next().value\n if (oldest === undefined) break\n runtime.partCache.delete(oldest)\n }\n return { part: parsed, fetched: true }\n}\n\nasync function getChunkRecord(runtime: AiwgChunkedIndexRuntime, id: string): Promise<AiwgFortemiRecord> {\n const cached = runtime.detailCache.get(id)\n if (cached) {\n runtime.detailCache.delete(id)\n runtime.detailCache.set(id, cached)\n return cached\n }\n // Whole-record parts already in cache: serve without a detail fetch.\n if (!runtime.manifest.projection) {\n for (const part of runtime.partCache.values()) {\n const found = part.items.find((item) => item.id === id)\n if (found) return found\n }\n }\n if (!runtime.detailLoader) {\n throw new Error('No detailLoader configured to resolve record ' + id)\n }\n const raw = await runtime.detailLoader(id, runtime.manifest)\n const record = assertAiwgFortemiIndexExport({\n schema_version: 'aiwg.fortemi.index.export.v1',\n generated_at: runtime.manifest.generated_at,\n source: runtime.manifest.source,\n items: [raw],\n }).items[0]\n if (record.id !== id) {\n throw new Error('Detail record id mismatch: expected ' + id + ', got ' + record.id)\n }\n runtime.detailCache.set(id, record)\n while (runtime.detailCache.size > runtime.maxCachedDetails) {\n const oldest = runtime.detailCache.keys().next().value\n if (oldest === undefined) break\n runtime.detailCache.delete(oldest)\n }\n return record\n}\n\nfunction relationshipTypeFilter(options?: AiwgRelationshipQueryOptions): string | undefined {\n return options?.relationshipType ?? options?.type\n}\n\nfunction edgeFromRelationship(sourceId: string, relationship: AiwgFortemiRelationship): AiwgRelationshipEdgeSummary {\n return {\n source_id: sourceId,\n target_id: relationship.target_id,\n type: relationship.type,\n ...(relationship.source_path ? { source_path: relationship.source_path } : {}),\n }\n}\n\nfunction relationshipMatches(edge: AiwgRelationshipEdgeSummary, options: AiwgRelationshipQueryOptions = {}): boolean {\n const type = relationshipTypeFilter(options)\n const direction = options.direction ?? 'both'\n if (type && edge.type !== type) return false\n if (options.sourceId && edge.source_id !== options.sourceId) return false\n if (options.targetId && edge.target_id !== options.targetId) return false\n if (direction === 'out' && options.targetId && edge.target_id !== options.targetId) return false\n if (direction === 'in' && options.sourceId && edge.source_id !== options.sourceId) return false\n return true\n}\n\nfunction nodeSummary(item: AiwgFortemiProjectedRecord): AiwgRelationshipNodeSummary {\n return { id: item.id, type: item.type, title: item.title }\n}\n\nfunction addNode(nodes: Map<string, AiwgRelationshipNodeSummary>, item: AiwgFortemiProjectedRecord | undefined) {\n if (item) nodes.set(item.id, nodeSummary(item))\n}\n\nfunction relationshipResultFromRecords(\n records: AiwgFortemiProjectedRecord[],\n options: AiwgRelationshipQueryOptions = {},\n): AiwgRelationshipTraversalResult {\n const byId = new Map(records.map((record) => [record.id, record]))\n const edges: AiwgRelationshipEdgeSummary[] = []\n for (const record of records) {\n for (const relationship of record.relationships ?? []) {\n const edge = edgeFromRelationship(record.id, relationship)\n if (!relationshipMatches(edge, options)) continue\n edges.push(edge)\n }\n }\n const limitedEdges = (options.limit ? edges.slice(0, options.limit) : edges).sort((left, right) => (\n left.source_id.localeCompare(right.source_id)\n || left.target_id.localeCompare(right.target_id)\n || left.type.localeCompare(right.type)\n ))\n const nodes = new Map<string, AiwgRelationshipNodeSummary>()\n for (const edge of limitedEdges) {\n addNode(nodes, byId.get(edge.source_id))\n addNode(nodes, byId.get(edge.target_id))\n }\n return {\n nodes: [...nodes.values()].sort((left, right) => left.id.localeCompare(right.id)),\n edges: limitedEdges,\n complete: true,\n }\n}\n\nfunction neighborQueryOptions(id: string, options: AiwgRelationshipTraversalOptions = {}): AiwgRelationshipQueryOptions {\n const direction = options.direction ?? 'both'\n return {\n ...options,\n ...(direction === 'out' ? { sourceId: id } : {}),\n ...(direction === 'in' ? { targetId: id } : {}),\n }\n}\n\nfunction filterNeighborResult(id: string, result: AiwgRelationshipTraversalResult, options: AiwgRelationshipTraversalOptions = {}): AiwgRelationshipTraversalResult {\n const direction = options.direction ?? 'both'\n const edges = result.edges.filter((edge) => {\n if (direction === 'out') return edge.source_id === id\n if (direction === 'in') return edge.target_id === id\n return edge.source_id === id || edge.target_id === id\n })\n const ids = new Set<string>()\n for (const edge of edges) {\n ids.add(edge.source_id)\n ids.add(edge.target_id)\n }\n return {\n ...result,\n edges,\n nodes: result.nodes.filter((node) => ids.has(node.id)),\n }\n}\n\nasync function recordsFromChunkedRuntime(\n runtime: AiwgChunkedIndexRuntime,\n onProgress?: (progress: AiwgChunkedIndexProgress) => void,\n): Promise<{ records: AiwgFortemiRecord[]; scannedParts: number; fetchedParts: number }> {\n let scannedParts = 0\n let fetchedParts = 0\n const records: AiwgFortemiRecord[] = []\n for (const partRef of runtime.manifest.parts) {\n const loaded = await loadChunkPart(runtime, partRef)\n if (loaded.fetched) fetchedParts += 1\n scannedParts += 1\n onProgress?.({ phase: 'part', done: scannedParts, total: runtime.manifest.parts.length, href: partRef.href })\n for (const item of loaded.part.items) {\n records.push(item.relationships ? item : await getChunkRecord(runtime, item.id))\n }\n }\n return { records, scannedParts, fetchedParts }\n}\n\nasync function relationshipResultFromChunkedRuntime(\n runtime: AiwgChunkedIndexRuntime,\n options: AiwgRelationshipQueryOptions = {},\n): Promise<AiwgRelationshipTraversalResult> {\n const loaded = await recordsFromChunkedRuntime(runtime)\n return {\n ...relationshipResultFromRecords(loaded.records, options),\n scannedParts: loaded.scannedParts,\n fetchedParts: loaded.fetchedParts,\n }\n}\n\nasync function queryChunkedAiwgFortemiIndex(\n runtime: AiwgChunkedIndexRuntime,\n query = '',\n options: AiwgChunkedIndexQueryOptions = {},\n): Promise<AiwgChunkedIndexQueryResult> {\n const q = query.trim().toLowerCase()\n let scannedParts = 0\n let fetchedParts = 0\n\n if (isDirectChunkBrowse(query, options)) {\n const offset = options.offset ?? 0\n const limit = options.limit ?? runtime.manifest.total\n const parts = getPartsForRange(runtime.manifest, offset, limit)\n const items: AiwgFortemiRecord[] = []\n for (const partRef of parts) {\n const loaded = await loadChunkPart(runtime, partRef)\n if (loaded.fetched) fetchedParts += 1\n scannedParts += 1\n options.onProgress?.({ phase: 'part', done: scannedParts, total: parts.length, href: partRef.href })\n const start = Math.max(0, offset - partRef.offset)\n const end = Math.min(loaded.part.items.length, offset + limit - partRef.offset)\n items.push(...loaded.part.items.slice(start, end))\n }\n return {\n items,\n total: runtime.manifest.total,\n facets: runtime.manifest.facets ?? {},\n manifestTotal: runtime.manifest.total,\n scannedParts,\n fetchedParts,\n complete: true,\n }\n }\n\n // Reuse the filtered/ranked entry set across pages of the same query: the\n // expensive part scan is offset/limit/sort/snippet independent. A hit projects\n // a new page from cached entries without touching parts (scanned/fetched = 0).\n const matchKey = matchSetCacheKey(q, options)\n const cached = runtime.matchCache.get(matchKey)\n if (cached) {\n runtime.matchCache.delete(matchKey)\n runtime.matchCache.set(matchKey, cached)\n return {\n ...createQueryResultFromRankedEntries(cached, q, options),\n manifestTotal: runtime.manifest.total,\n scannedParts: 0,\n fetchedParts: 0,\n complete: true,\n }\n }\n\n const entries: AiwgRankedEntry[] = []\n for (const partRef of runtime.manifest.parts) {\n const loaded = await loadChunkPart(runtime, partRef)\n if (loaded.fetched) fetchedParts += 1\n scannedParts += 1\n options.onProgress?.({ phase: 'part', done: scannedParts, total: runtime.manifest.parts.length, href: partRef.href })\n entries.push(...createRankedEntries(loaded.part.items, q, options, partRef.offset))\n options.onProgress?.({ phase: 'query', done: scannedParts, total: runtime.manifest.parts.length, href: partRef.href })\n }\n cacheMatchEntries(runtime, matchKey, entries)\n\n return {\n ...createQueryResultFromRankedEntries(entries, q, options),\n manifestTotal: runtime.manifest.total,\n scannedParts,\n fetchedParts,\n complete: true,\n }\n}\n\nexport function createAiwgReviewDecisionExport(\n // Only the export schema_version is needed — so this works in chunked mode\n // (where no whole index is loaded) by passing a minimal source. See #178.\n source: Pick<AiwgFortemiIndexExport, 'schema_version'>,\n decisions: AiwgReviewDecision[],\n generatedAt = new Date().toISOString(),\n): AiwgReviewDecisionExport {\n return {\n schema_version: 'aiwg.fortemi.review-decisions.v1',\n generated_at: generatedAt,\n source_export_schema_version: source.schema_version,\n decisions: [...decisions].sort((left, right) => left.item_id.localeCompare(right.item_id)),\n }\n}\n\nexport function createAiwgIndexController(initialIndex?: AiwgFortemiIndexExport): AiwgIndexController {\n let index: AiwgFortemiIndexExport | null = initialIndex ?? null\n let chunked: AiwgChunkedIndexRuntime | null = null\n let data: AiwgIndexQueryResult | null = null\n let error: Error | null = null\n let reviewDecisions: AiwgReviewDecision[] = []\n const listeners = new Set<AiwgIndexControllerListener>()\n\n const snapshot = (): AiwgIndexControllerSnapshot => ({\n index,\n chunked: chunked\n ? {\n manifest: chunked.manifest,\n cachedParts: chunked.partCache.size,\n maxCachedParts: chunked.maxCachedParts,\n }\n : null,\n data,\n error,\n reviewDecisions: [...reviewDecisions],\n })\n const notify = () => {\n const current = snapshot()\n for (const listener of listeners) listener(current)\n }\n const requireIndex = (): AiwgFortemiIndexExport => {\n if (!index) throw new Error('No AIWG index export loaded')\n return index\n }\n\n return {\n loadIndex(value: unknown): AiwgFortemiIndexExport {\n try {\n const parsed = assertAiwgFortemiIndexExport(value)\n index = parsed\n chunked = null\n data = null\n reviewDecisions = []\n error = null\n notify()\n return parsed\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n loadChunkedIndex(\n manifest: unknown,\n loader: AiwgChunkedIndexLoader,\n options: AiwgChunkedIndexLoadOptions = {},\n ): AiwgFortemiChunkManifest {\n try {\n const parsed = assertAiwgFortemiChunkManifest(manifest)\n index = null\n chunked = {\n manifest: parsed,\n loader,\n maxCachedParts: clampMaxCachedParts(options.maxCachedParts),\n partCache: new Map(),\n detailLoader: options.detailLoader,\n maxCachedDetails: clampMaxCachedDetails(options.maxCachedDetails),\n detailCache: new Map(),\n maxCachedMatches: clampMaxCachedMatches(options.maxCachedMatches),\n matchCache: new Map(),\n }\n data = null\n reviewDecisions = []\n error = null\n notify()\n return parsed\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n getIndex(): AiwgFortemiIndexExport | null {\n return index\n },\n getChunkedManifest(): AiwgFortemiChunkManifest | null {\n return chunked?.manifest ?? null\n },\n getSnapshot(): AiwgIndexControllerSnapshot {\n return snapshot()\n },\n query(query = '', options?: AiwgIndexQueryOptions): AiwgIndexQueryResult {\n const result = queryAiwgFortemiIndex(requireIndex(), query, options)\n data = result\n error = null\n notify()\n return result\n },\n async queryChunked(query = '', options?: AiwgChunkedIndexQueryOptions): Promise<AiwgChunkedIndexQueryResult> {\n if (!chunked) throw new Error('No AIWG chunked index manifest loaded')\n try {\n const result = await queryChunkedAiwgFortemiIndex(chunked, query, options)\n data = result\n error = null\n notify()\n return result\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n async getRecord(id: string): Promise<AiwgFortemiRecord> {\n if (chunked) {\n try {\n return await getChunkRecord(chunked, id)\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n }\n const found = requireIndex().items.find((item) => item.id === id)\n if (!found) throw new Error('Record not found: ' + id)\n return found\n },\n async neighbors(id: string, options?: AiwgRelationshipTraversalOptions): Promise<AiwgRelationshipTraversalResult> {\n try {\n const queryOptions = neighborQueryOptions(id, options)\n const result = chunked\n ? await relationshipResultFromChunkedRuntime(chunked, queryOptions)\n : relationshipResultFromRecords(requireIndex().items, queryOptions)\n return filterNeighborResult(id, result, options)\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n async relationshipQuery(options?: AiwgRelationshipQueryOptions): Promise<AiwgRelationshipTraversalResult> {\n try {\n return chunked\n ? await relationshipResultFromChunkedRuntime(chunked, options)\n : relationshipResultFromRecords(requireIndex().items, options)\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n async relationshipSet(options: AiwgRelationshipSetOptions): Promise<AiwgRelationshipSetResult> {\n const [left, right] = await Promise.all([\n this.neighbors(options.a, options),\n this.neighbors(options.b, options),\n ])\n const leftIds = new Set(left.nodes.map((node) => node.id).filter((id) => id !== options.a))\n const rightIds = new Set(right.nodes.map((node) => node.id).filter((id) => id !== options.b))\n let ids: string[]\n if (options.op === 'intersection') ids = [...leftIds].filter((id) => rightIds.has(id))\n else if (options.op === 'difference') ids = [...leftIds].filter((id) => !rightIds.has(id))\n else ids = [...new Set([...leftIds, ...rightIds])]\n return { op: options.op, ids: ids.sort() }\n },\n clearChunkCache(): void {\n chunked?.partCache.clear()\n chunked?.detailCache.clear()\n chunked?.matchCache.clear()\n error = null\n notify()\n },\n toCommunityGraph(options?: AiwgIndexGraphOptions) {\n return aiwgFortemiIndexToCommunityGraph(requireIndex(), options)\n },\n async toCommunityGraphChunked(options?: AiwgIndexGraphOptions & { onProgress?: (progress: AiwgChunkedIndexProgress) => void }) {\n if (!chunked) return aiwgFortemiIndexToCommunityGraph(requireIndex(), options)\n const loaded = await recordsFromChunkedRuntime(chunked, options?.onProgress)\n return aiwgFortemiIndexToCommunityGraph({\n schema_version: 'aiwg.fortemi.index.export.v1',\n generated_at: chunked.manifest.generated_at,\n source: chunked.manifest.source,\n items: loaded.records,\n }, options)\n },\n setReviewDecision(input: AiwgReviewInput): AiwgReviewDecision {\n const decision: AiwgReviewDecision = {\n ...input,\n updated_at: new Date().toISOString(),\n }\n reviewDecisions = [\n ...reviewDecisions.filter((item) => item.item_id !== decision.item_id),\n decision,\n ].sort((left, right) => left.item_id.localeCompare(right.item_id))\n error = null\n notify()\n return decision\n },\n clearReviewDecision(itemId: string): void {\n reviewDecisions = reviewDecisions.filter((item) => item.item_id !== itemId)\n error = null\n notify()\n },\n createReviewDecisionExport(generatedAt?: string): AiwgReviewDecisionExport {\n // The review-decisions export only needs the export schema_version, not the\n // items — so it works in chunked mode by synthesizing a minimal source (#178).\n const source: Pick<AiwgFortemiIndexExport, 'schema_version'> | null =\n index ?? (chunked ? { schema_version: 'aiwg.fortemi.index.export.v1' } : null)\n if (!source) throw new Error('No AIWG index export or chunked manifest loaded')\n return createAiwgReviewDecisionExport(source, reviewDecisions, generatedAt)\n },\n subscribe(listener: AiwgIndexControllerListener): () => void {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n }\n}\n\nexport function aiwgFortemiIndexToCommunityGraph(\n index: AiwgFortemiIndexExport,\n options: AiwgIndexGraphOptions = {},\n) {\n const ids = new Set(index.items.map((item) => item.id))\n const relationshipWeights = options.relationshipWeights ?? {}\n const edgeCounts = new Map<string, { source: string; target: string; kind: string; weight: number }>()\n\n for (const item of index.items) {\n for (const relationship of item.relationships) {\n if (!ids.has(relationship.target_id) && !options.includeDanglingRelationships) continue\n const kind = relationship.type\n const baseWeight = relationshipWeights[kind] ?? 1\n const key = `${item.id}\\u0000${relationship.target_id}\\u0000${kind}`\n const existing = edgeCounts.get(key)\n if (existing) existing.weight += baseWeight\n else edgeCounts.set(key, { source: item.id, target: relationship.target_id, kind, weight: baseWeight })\n }\n }\n\n const communities = new Map<string, string[]>()\n for (const item of index.items) {\n const communityIds = communityIdsFor(item, options)\n for (const communityId of communityIds) {\n const nodes = communities.get(communityId) ?? []\n nodes.push(item.id)\n communities.set(communityId, nodes)\n }\n }\n\n return {\n nodes: index.items.map((item) => ({ id: item.id })),\n edges: Array.from(edgeCounts.values()).sort((left, right) => (\n left.source.localeCompare(right.source)\n || left.target.localeCompare(right.target)\n || left.kind.localeCompare(right.kind)\n )),\n communities: Array.from(communities.entries())\n .map(([id, nodes]) => ({ id, nodes: [...new Set(nodes)].sort() }))\n .sort((left, right) => left.id.localeCompare(right.id)),\n }\n}\n\nfunction communityIdsFor(item: AiwgFortemiRecord, options: AiwgIndexGraphOptions): string[] {\n if (options.communityFacet) {\n const values = item.facets[options.communityFacet] ?? []\n if (values.length > 0) return values.map((value) => `${options.communityFacet}:${value}`)\n }\n if (options.communityTagPrefix) {\n const prefix = options.communityTagPrefix\n const tags = item.tags.filter((tag) => tag.startsWith(prefix))\n if (tags.length > 0) return tags\n }\n if (item.concepts.length > 0) return item.concepts.map((concept) => `concept:${concept}`)\n return [`type:${item.type}`]\n}\n","export const VERSION = '2026.7.0'\n\nexport { generateId } from './uuid.js'\n\nexport { TypedEventBus } from './event-bus.js'\nexport type { EventMap, IDisposable } from './event-bus.js'\n\nexport { createPGliteInstance } from './db.js'\nexport type { PersistenceMode, CreatePGliteOptions } from './db.js'\n\nexport {\n dumpDbSnapshot,\n restoreDbSnapshot,\n verifyDbSnapshotMeta,\n DbSnapshotVersionError,\n DB_SNAPSHOT_SCHEMA_VERSION,\n SUPPORTED_PGLITE_VERSION,\n CURRENT_MIGRATION_HEAD,\n} from './data-archive.js'\nexport type {\n DbSnapshot,\n DbSnapshotMeta,\n DbSnapshotCompat,\n DbSnapshotExpectations,\n DbSnapshotSource,\n DbSnapshotCompression,\n DumpableDb,\n DumpDbSnapshotOptions,\n RestoreDbSnapshotOptions,\n} from './data-archive.js'\n\n// Backend seam (#191) — uniform tool-intent operation interface + negotiation\nexport {\n selectBackend,\n createPGliteBackend,\n createShardBackend,\n createRemoteBackend,\n} from './data-backend.js'\nexport type {\n DataBackend,\n BackendCapabilities,\n BackendSemanticTier,\n BackendStartupCost,\n BackendNote,\n BackendNoteFull,\n BackendLink,\n BackendConcept,\n BackendProvenanceEdge,\n BackendSearchHit,\n BackendSearchResult,\n BackendListOptions,\n BackendSearchQueryOptions,\n BackendRequest,\n BackendCandidate,\n BackendSelection,\n PGliteBackendOptions,\n ShardBackendOptions,\n RemoteBackendConfig,\n RemoteBackendPaths,\n} from './data-backend.js'\n\nexport {\n PGliteStorageBackend,\n PGliteStorageBackendFactory,\n PGliteWorkerStorageBackend,\n PGliteWorkerStorageBackendFactory,\n defaultStorageBackendFactory,\n} from './storage-backend.js'\nexport type {\n DatabaseClient,\n QueryExecutor,\n QueryResult,\n StorageBackend,\n StorageBackendFactory,\n StorageOpenRequest,\n StorageTopology,\n PGliteWorkerStorageBackendFactoryOptions,\n} from './storage-backend.js'\n\nexport { CapabilityManager } from './capability-manager.js'\nexport type { CapabilityName, CapabilityState } from './capability-manager.js'\n\nexport { MigrationRunner } from './migration-runner.js'\nexport type { Migration } from './migration-runner.js'\nexport { allMigrations } from './migrations/index.js'\n\nexport { ArchiveManager } from './archive-manager.js'\nexport type { ArchiveInfo } from './archive-manager.js'\n\nexport { createFortemi } from './create-fortemi.js'\nexport type { FortemiCore, FortemiConfig } from './create-fortemi.js'\n\nexport { computeHash } from './hash.js'\n\nexport { registerServiceWorker } from './service-worker/register.js'\nexport type { SWRegistrationResult } from './service-worker/register.js'\n\nexport { createRoutes, matchRoute } from './service-worker/routes.js'\nexport type { RouteHandler } from './service-worker/routes.js'\n\nexport { createBlobStore, MemoryBlobStore } from './blob-store.js'\nexport type { BlobStore } from './blob-store.js'\n\nexport type { WorkerRequest, WorkerResponse } from './worker/protocol.js'\nexport { PGliteWorkerClient, TransactionProxy } from './worker/worker-client.js'\n\nexport { NotesRepository } from './repositories/notes-repository.js'\nexport { SearchRepository } from './repositories/search-repository.js'\nexport { EmbeddingSetsRepository } from './repositories/embedding-sets-repository.js'\nexport { GraphRepository, detectCommunities } from './repositories/graph-repository.js'\nexport { CommunitiesRepository } from './repositories/communities-repository.js'\nexport { buildNoteConditions } from './repositories/condition-builder.js'\nexport type { ConditionResult } from './repositories/condition-builder.js'\nexport type {\n NoteSummary,\n NoteFull,\n NoteCreateInput,\n NoteUpdateInput,\n NoteListOptions,\n PaginatedResult,\n SearchResult,\n SearchResponse,\n SearchFacets,\n SearchOptions,\n NoteRevision,\n} from './repositories/types.js'\nexport type {\n EmbeddingSetRow,\n EmbeddingSetCreateInput,\n EmbeddingSetEmbeddingInput,\n EmbeddingSetKind,\n EmbeddingSetMode,\n EmbeddingSetCriteria,\n EmbeddingSetFreshness,\n EmbeddingCompatibilityPolicy,\n VirtualMaterializationPolicy,\n VirtualEmbeddingSetSource,\n VirtualEmbeddingSetDefinition,\n EmbeddingSetSelector,\n EmbeddingSetDescriptor,\n VirtualEmbeddingSetValidationError,\n ResolvedEmbeddingSet,\n ResolvedEmbeddingRow,\n} from './repositories/embedding-sets-repository.js'\nexport type { GraphNode, GraphEdge, GraphCommunity, CommunityGraph, SimilarityGraphOptions, SimilarityGraphRequest, SimilarityGraphCacheKey, SimilarityGraphResult, CommunityOptions } from './repositories/graph-repository.js'\nexport type { CommunitySourceType, CommunityFilterDefinition, CommunitySourceDescriptor, CommunityAssignmentView, CommunitySummary, CommunityCreateInput } from './repositories/communities-repository.js'\n\nexport {\n JobQueueWorker,\n titleGenerationHandler,\n aiRevisionHandler,\n conceptTaggingHandler,\n linkingHandler,\n enqueueJob,\n enqueueNoteCreationJobs,\n enqueueFullWorkflow,\n getJobQueueStatus,\n JOB_PRIORITIES,\n JOB_CAPABILITIES,\n} from './job-queue-worker.js'\nexport type { JobQueueOptions, JobType, EnqueueJobInput, JobStatus } from './job-queue-worker.js'\n\nexport { TagsRepository } from './repositories/tags-repository.js'\nexport { CollectionsRepository } from './repositories/collections-repository.js'\nexport type { CollectionRow, CollectionCreateInput } from './repositories/collections-repository.js'\nexport { LinksRepository } from './repositories/links-repository.js'\nexport type { LinkRow } from './repositories/links-repository.js'\nexport { SkosRepository } from './repositories/skos-repository.js'\nexport type { SkosScheme, SkosConcept, SkosRelation, NoteSkosTag } from './repositories/skos-repository.js'\nexport { ProvenanceRepository } from './repositories/provenance-repository.js'\nexport type { ProvenanceEdge, RecordProvenanceInput } from './repositories/provenance-repository.js'\n\nexport { captureKnowledge, manageNote, searchTool } from './tools/index.js'\nexport type { CaptureKnowledgeResult, ManageNoteResult } from './tools/index.js'\nexport {\n CaptureKnowledgeInputSchema,\n ManageNoteInputSchema,\n SearchInputSchema,\n} from './tools/index.js'\nexport type { CaptureKnowledgeInput, ManageNoteInput, SearchInput } from './tools/index.js'\nexport { FortemiToolManifest, fortemiManifest } from './tools/index.js'\nexport type { FortemiToolDefinition, BridgeCapability } from './tools/index.js'\n\nexport { getNote, GetNoteInputSchema } from './tools/index.js'\nexport type { GetNoteInput } from './tools/index.js'\nexport { listNotes, ListNotesInputSchema } from './tools/index.js'\nexport type { ListNotesInput } from './tools/index.js'\nexport { manageTags, ManageTagsInputSchema } from './tools/index.js'\nexport type { ManageTagsInput, ManageTagsResult } from './tools/index.js'\nexport { manageCollections, ManageCollectionsInputSchema } from './tools/index.js'\nexport type { ManageCollectionsInput, ManageCollectionsResult } from './tools/index.js'\nexport { manageLinks, ManageLinksInputSchema } from './tools/index.js'\nexport type { ManageLinksInput, ManageLinksResult } from './tools/index.js'\nexport { manageArchive, ManageArchiveInputSchema } from './tools/index.js'\nexport type { ManageArchiveInput, ManageArchiveResult } from './tools/index.js'\nexport { manageCapabilities, ManageCapabilitiesInputSchema } from './tools/index.js'\nexport type { ManageCapabilitiesInput, ManageCapabilitiesResult, CapabilityInfo } from './tools/index.js'\nexport { manageAttachments, ManageAttachmentsInputSchema } from './tools/index.js'\nexport type { ManageAttachmentsInput, ManageAttachmentsResult } from './tools/index.js'\n\nexport { detectGpuCapabilities, estimateVramTier, selectLlmModel } from './capabilities/gpu-detect.js'\nexport type { GpuCapabilities, VramTier } from './capabilities/gpu-detect.js'\n\nexport {\n detectInferenceCapabilities,\n estimateVramMB,\n estimateModelFit,\n} from './capabilities/inference-detect.js'\nexport type {\n InferenceCapabilities,\n RecommendedTier,\n ModelFitResult,\n} from './capabilities/inference-detect.js'\n\nexport { AttachmentsRepository } from './repositories/attachments-repository.js'\nexport type { AttachmentRow, AttachmentBlobRow, AttachInput } from './repositories/attachments-repository.js'\n\nexport { chunkText } from './capabilities/chunking.js'\nexport {\n setEmbedFunction,\n getEmbedFunction,\n embeddingGenerationHandler,\n} from './capabilities/embedding-handler.js'\nexport type { EmbedFunction } from './capabilities/embedding-handler.js'\n\nexport { setLlmFunction, getLlmFunction } from './capabilities/llm-handler.js'\nexport type { LlmCompleteFn } from './capabilities/llm-handler.js'\n\nexport { cosineSimilarity, suggestTags } from './capabilities/auto-tag.js'\n\nexport {\n registerSemanticCapability,\n registerSemanticCapabilityWorker,\n unregisterSemanticCapability,\n} from './capabilities/semantic-loader.js'\nexport {\n createWorkerEmbedFunction,\n handleEmbedRequests,\n EMBED_REQUEST_KIND,\n EMBED_RESPONSE_KIND,\n} from './capabilities/embed-worker-transport.js'\nexport type {\n EmbedTransportPort,\n EmbedWorkerOptions,\n EmbedRequestMessage,\n EmbedResponseMessage,\n} from './capabilities/embed-worker-transport.js'\nexport { registerLlmCapability, unregisterLlmCapability } from './capabilities/llm-loader.js'\nexport type { LlmCapabilityOptions } from './capabilities/llm-loader.js'\n\nexport { ProviderRegistry, createLegacyProvider } from './capabilities/provider-registry.js'\nexport { OpenAICompatibleProvider } from './capabilities/openai-provider.js'\nexport type { OpenAIProviderConfig } from './capabilities/openai-provider.js'\n\nexport {\n discoverLocalProviders,\n classifyModel,\n LOCAL_ENDPOINTS,\n} from './capabilities/local-discovery.js'\nexport { FallbackRouter, classifyError } from './capabilities/fallback-router.js'\nexport type {\n FallbackRouterConfig,\n CooldownConfig,\n ErrorCategory,\n FallbackEvent,\n CooldownEvent,\n} from './capabilities/fallback-router.js'\n\nexport type {\n DiscoveredProvider,\n DiscoveryOptions,\n LocalEndpoint,\n ModelCategory,\n} from './capabilities/local-discovery.js'\n\nexport {\n getFortemiBridge,\n getFortemiSecretStore,\n hasFortemiSecureSecrets,\n} from './fortemi-bridge.js'\nexport type {\n BridgeProviderInfo,\n FortemiBridge,\n FortemiBridgeCapabilities,\n FortemiBridgeHost,\n FortemiInferenceRouter,\n FortemiSecretStore,\n} from './fortemi-bridge.js'\n\nexport type {\n InferenceProvider,\n ProviderCapabilities,\n ProviderTier,\n EmbedRequest,\n EmbedResponse,\n CompletionRequest,\n CompletionResponse,\n StreamChunk,\n ModelInfo,\n ProbeResult,\n ProbeStatus,\n} from './capabilities/inference-provider.js'\n\nexport {\n buildPluginCsp,\n computeSri,\n verifySri,\n isPluginScriptAllowed,\n fetchPluginScript,\n appendPluginScript,\n parseCspReport,\n createCspReportHandler,\n} from './security/plugin-content.js'\nexport type {\n CspDirectiveName,\n CspDirectives,\n PluginCspOptions,\n PluginScriptPolicy,\n PluginScriptDescriptor,\n LoadedPluginScript,\n CspViolationReport,\n} from './security/plugin-content.js'\n\n// Shard import/export\nexport {\n CURRENT_SHARD_VERSION,\n SHARD_FORMAT,\n packTarGz,\n unpackTarGz,\n sha256Hex,\n validateChecksums,\n noteToShard,\n noteFromShard,\n linkToShard,\n linkFromShard,\n collectionToShard,\n collectionFromShard,\n tagsToShard,\n tagsFromShard,\n embeddingSetToShard,\n embeddingSetFromShard,\n embeddingSetMemberToShard,\n embeddingToShard,\n embeddingFromShard,\n skosSchemeToShard,\n skosConceptToShard,\n skosRelationToShard,\n noteSkosTagToShard,\n provenanceEdgeToShard,\n exportShard,\n importShard,\n openShard,\n createCosineSemanticProvider,\n prefetchShard,\n fromPrefetched,\n isShardPrefetched,\n getPrefetchedSha256,\n clearPrefetchedShard,\n} from './shard/index.js'\nexport type {\n ShardReader,\n ShardReaderSource,\n ShardReaderNote,\n OpenShardOptions,\n ShardListOptions,\n ShardSearchOptions,\n ShardSearchResult,\n ShardSearchRankedNote,\n ShardSearchWeights,\n ShardNoteFull,\n StaticSemanticProvider,\n ShardComponentStore,\n VectorEntry,\n CosineSemanticProviderOptions,\n ShardClusterRef,\n ShardLayout,\n PrefetchOptions,\n PrefetchResult,\n ShardManifest,\n ShardComponent,\n ExportOptions,\n ImportOptions,\n ImportProgress,\n ImportProgressPhase,\n ImportResult,\n ImportCounts,\n ConflictStrategy,\n ShardNote,\n ShardCollection,\n ShardTag,\n ShardLink,\n ShardEmbeddingSet,\n ShardEmbeddingSetMember,\n ShardEmbedding,\n ShardSkosScheme,\n ShardSkosConcept,\n ShardSkosRelation,\n ShardNoteSkosTag,\n ShardProvenanceEdge,\n BrowserNoteExport,\n} from './shard/index.js'\n\nexport {\n AIWG_SCAN_REQUIRED_FIELDS,\n assertAiwgFortemiIndexExport,\n assertAiwgFortemiChunkManifest,\n assertAiwgFortemiChunkPart,\n assertAiwgStaticEmbeddingSet,\n aiwgFortemiIndexToCommunityGraph,\n buildAiwgChunkedIndex,\n createAiwgFetchChunkLoader,\n createAiwgFetchDetailLoader,\n createAiwgIndexController,\n createAiwgReviewDecisionExport,\n findAiwgStaticDuplicatePairs,\n getAiwgFortemiFacets,\n queryAiwgFortemiIndex,\n queryAiwgHybridIndex,\n queryAiwgSemanticIndex,\n validateAiwgFortemiChunkManifest,\n validateAiwgFortemiChunkPart,\n validateAiwgFortemiIndexExport,\n validateAiwgStaticEmbeddingSet,\n} from './aiwg-index.js'\nexport type {\n AiwgChunkedIndexBuildOptions,\n AiwgChunkedIndexBuildResult,\n AiwgChunkedIndexDetailLoader,\n AiwgChunkedIndexLoadOptions,\n AiwgChunkedIndexLoader,\n AiwgChunkedIndexProgress,\n AiwgChunkedIndexProgressPhase,\n AiwgChunkedIndexQueryOptions,\n AiwgChunkedIndexQueryResult,\n AiwgChunkedIndexValidationResult,\n AiwgFortemiChunkDetailRef,\n AiwgFortemiChunkManifest,\n AiwgFortemiChunkPart,\n AiwgFortemiChunkPartRef,\n AiwgFortemiIndexExport,\n AiwgFortemiKnownRecordType,\n AiwgFortemiProjectedRecord,\n AiwgFortemiProvenance,\n AiwgFortemiProvenanceEvent,\n AiwgFortemiRecord,\n AiwgFortemiRecordSource,\n AiwgFortemiRecordType,\n AiwgFortemiRelationship,\n AiwgFortemiSkosConcept,\n AiwgFortemiSkosRelation,\n AiwgFortemiSkosRelationType,\n AiwgIndexController,\n AiwgIndexControllerListener,\n AiwgIndexControllerSnapshot,\n AiwgIndexGraphOptions,\n AiwgIndexQueryMatch,\n AiwgIndexQueryOptions,\n AiwgIndexQueryRankedItem,\n AiwgIndexQueryResult,\n AiwgIndexQueryWeights,\n AiwgIndexValidationResult,\n AiwgPrivacyClassification,\n AiwgProvenanceConfidence,\n AiwgRelationshipDirection,\n AiwgRelationshipEdgeSummary,\n AiwgRelationshipNodeSummary,\n AiwgRelationshipQueryOptions,\n AiwgRelationshipSetOperation,\n AiwgRelationshipSetOptions,\n AiwgRelationshipSetResult,\n AiwgRelationshipTraversalOptions,\n AiwgRelationshipTraversalResult,\n AiwgReviewAction,\n AiwgReviewDecision,\n AiwgReviewDecisionExport,\n AiwgReviewInput,\n AiwgStaticDuplicatePair,\n AiwgStaticEmbeddingRecord,\n AiwgStaticEmbeddingSet,\n AiwgStaticHybridQueryOptions,\n AiwgStaticSemanticQueryOptions,\n AiwgStaticSemanticResult,\n} from './aiwg-index.js'\n"]}