@equationalapplications/react-llm-wiki 4.16.0 → 4.17.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/README.md CHANGED
@@ -17,6 +17,7 @@ In-browser LLM memory for React web apps. Bring your own SQLite adapter (e.g., [
17
17
  - **Multi-entity reads** — Search across multiple `entity_id` namespaces in one pass with `tierWeights` and optional `includeZeroWeightEntities`
18
18
  - **Source provenance** — `WikiFact.source_type` distinguishes immutable document facts (`immutable_document`) from mutable derived/user facts (`librarian_inferred`, `user_stated`, `user_confirmed`). Immutable document facts are preserved from librarian/heal rewriting and only removed by `forget()` or by re-ingesting the source.
19
19
  - **Seeded ontologies** — Enforce strict taxonomies or allow emergent graph relationship extraction (`useOntologyManifest`, `useSetOntologyManifest`; Strict, Emergent, or Off; defaults to Off).
20
+ - **Graph traversal** — Walk the knowledge graph N hops from a fact and format the result for LLM prompts (`useWikiTraversal`, `formatGraphContext`).
20
21
  - **Reactive reads** — Auto-refetch on `entityId`, query, or `options` changes
21
22
  - **Mutation hooks** — `useWikiWrite`, `useWikiIngest`, `useWikiForget`, `useWikiMaintenance`, `useSetOntologyManifest`, etc.
22
23
  - **Shared context** — Single `WikiProvider` per app, use anywhere
@@ -401,6 +402,27 @@ Global defaults and `seedManifests` bootstrap are configured at construction tim
401
402
 
402
403
  `useSetOntologyManifest` does not automatically refresh `useOntologyManifest` — call `refetch()` after a successful `execute()`, same as `useWikiWrite` + `useMemoryRead`.
403
404
 
405
+ ### `useWikiTraversal(entityId, options)`
406
+
407
+ Reactive read — fetches on mount and whenever `entityId` or `options` change. Walks the knowledge graph N hops outward from a fact (`options.sourceId`) using edges written by `runLibrarian()`/`ingestDocument()`'s Seeded Ontology extraction pass:
408
+
409
+ ```typescript
410
+ import { useWikiTraversal, formatGraphContext } from '@equationalapplications/react-llm-wiki';
411
+
412
+ const { nodes, edges, isPending, error, refetch } = useWikiTraversal('user-123', {
413
+ sourceId: 'fact_42',
414
+ maxDepth: 2,
415
+ direction: 'both',
416
+ });
417
+
418
+ const promptContext = formatGraphContext({ nodes, edges });
419
+ ```
420
+
421
+ - `maxDepth` is clamped to `[1, 3]` regardless of input.
422
+ - `edgeTypes: []` (explicit empty array) matches nothing; omitting it matches all edge types.
423
+ - Defaults (`maxTraversalNodes`, `minTraversalConfidence`, `traversalDirection`, `excludeSourceTypes`) can be set globally via `createWiki(..., { config: { maxTraversalNodes: 20, ... } })` and overridden per-call.
424
+ - `formatGraphContext()` is a pure function — call it with the hook's `{ nodes, edges }` to get a dense text block suitable for prompt injection.
425
+
404
426
  ## Multi-Entity Reads
405
427
 
406
428
  `useMemoryRead` accepts a single entity ID or an array to search across namespaces in one pass. Pass `tierWeights` to apply per-entity score multipliers before the global top-K slice:
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent, MemoryDump, EntityStatus, OntologyManifest, OntologyMode } from '@equationalapplications/core-llm-wiki';
1
+ import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent, MemoryDump, EntityStatus, OntologyManifest, OntologyMode, WikiFact, WikiEdge, GraphTraversalOptions } from '@equationalapplications/core-llm-wiki';
2
2
  export * from '@equationalapplications/core-llm-wiki';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { ReactNode } from 'react';
@@ -151,4 +151,18 @@ declare function useSetOntologyManifest(): {
151
151
  error: Error | null;
152
152
  };
153
153
 
154
- export { type MaintenanceResult, type OntologyManifestState, WikiProvider, useEntityStatus, useMemoryRead, useOntologyManifest, useSetOntologyManifest, useWiki, useWikiExport, useWikiForget, useWikiHasChanged, useWikiIngest, useWikiMaintenance, useWikiWrite };
154
+ interface WikiTraversalState {
155
+ nodes: WikiFact[];
156
+ edges: WikiEdge[];
157
+ isPending: boolean;
158
+ error: Error | null;
159
+ refetch: () => void;
160
+ }
161
+ /**
162
+ * Reactive read hook for graph traversal. Fetches on mount and whenever
163
+ * `entityId` or a stable serialization of `options` changes.
164
+ * Call `refetch()` after mutations that change the underlying edges (e.g. runLibrarian).
165
+ */
166
+ declare function useWikiTraversal(entityId: string, options: GraphTraversalOptions): WikiTraversalState;
167
+
168
+ export { type MaintenanceResult, type OntologyManifestState, WikiProvider, type WikiTraversalState, useEntityStatus, useMemoryRead, useOntologyManifest, useSetOntologyManifest, useWiki, useWikiExport, useWikiForget, useWikiHasChanged, useWikiIngest, useWikiMaintenance, useWikiTraversal, useWikiWrite };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent, MemoryDump, EntityStatus, OntologyManifest, OntologyMode } from '@equationalapplications/core-llm-wiki';
1
+ import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent, MemoryDump, EntityStatus, OntologyManifest, OntologyMode, WikiFact, WikiEdge, GraphTraversalOptions } from '@equationalapplications/core-llm-wiki';
2
2
  export * from '@equationalapplications/core-llm-wiki';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { ReactNode } from 'react';
@@ -151,4 +151,18 @@ declare function useSetOntologyManifest(): {
151
151
  error: Error | null;
152
152
  };
153
153
 
154
- export { type MaintenanceResult, type OntologyManifestState, WikiProvider, useEntityStatus, useMemoryRead, useOntologyManifest, useSetOntologyManifest, useWiki, useWikiExport, useWikiForget, useWikiHasChanged, useWikiIngest, useWikiMaintenance, useWikiWrite };
154
+ interface WikiTraversalState {
155
+ nodes: WikiFact[];
156
+ edges: WikiEdge[];
157
+ isPending: boolean;
158
+ error: Error | null;
159
+ refetch: () => void;
160
+ }
161
+ /**
162
+ * Reactive read hook for graph traversal. Fetches on mount and whenever
163
+ * `entityId` or a stable serialization of `options` changes.
164
+ * Call `refetch()` after mutations that change the underlying edges (e.g. runLibrarian).
165
+ */
166
+ declare function useWikiTraversal(entityId: string, options: GraphTraversalOptions): WikiTraversalState;
167
+
168
+ export { type MaintenanceResult, type OntologyManifestState, WikiProvider, type WikiTraversalState, useEntityStatus, useMemoryRead, useOntologyManifest, useSetOntologyManifest, useWiki, useWikiExport, useWikiForget, useWikiHasChanged, useWikiIngest, useWikiMaintenance, useWikiTraversal, useWikiWrite };
package/dist/index.js CHANGED
@@ -32,6 +32,7 @@ __export(index_exports, {
32
32
  useWikiHasChanged: () => useWikiHasChanged,
33
33
  useWikiIngest: () => useWikiIngest,
34
34
  useWikiMaintenance: () => useWikiMaintenance,
35
+ useWikiTraversal: () => useWikiTraversal,
35
36
  useWikiWrite: () => useWikiWrite
36
37
  });
37
38
  module.exports = __toCommonJS(index_exports);
@@ -465,6 +466,76 @@ function useSetOntologyManifest() {
465
466
  }, []);
466
467
  return { execute, lastResult, isPending, error };
467
468
  }
469
+
470
+ // src/useWikiTraversal.ts
471
+ var import_react12 = require("react");
472
+ function normalizeTraversalOptionsKey(options) {
473
+ const normalized = { sourceId: options.sourceId };
474
+ if (options.maxDepth !== void 0) normalized.maxDepth = options.maxDepth;
475
+ if (options.direction !== void 0) normalized.direction = options.direction;
476
+ if (options.edgeTypes !== void 0) normalized.edgeTypes = [...options.edgeTypes].sort();
477
+ if (options.maxTraversalNodes !== void 0) normalized.maxTraversalNodes = options.maxTraversalNodes;
478
+ if (options.minTraversalConfidence !== void 0) normalized.minTraversalConfidence = options.minTraversalConfidence;
479
+ if (options.excludeSourceTypes !== void 0) normalized.excludeSourceTypes = [...options.excludeSourceTypes].sort();
480
+ const sortedKeys = Object.keys(normalized).sort();
481
+ const sorted = {};
482
+ for (const k of sortedKeys) {
483
+ sorted[k] = normalized[k];
484
+ }
485
+ return JSON.stringify(sorted);
486
+ }
487
+ function useWikiTraversal(entityId, options) {
488
+ const wiki = useWiki();
489
+ const [nodes, setNodes] = (0, import_react12.useState)([]);
490
+ const [edges, setEdges] = (0, import_react12.useState)([]);
491
+ const [isPending, setIsPending] = (0, import_react12.useState)(true);
492
+ const [error, setError] = (0, import_react12.useState)(null);
493
+ const wikiRef = (0, import_react12.useRef)(wiki);
494
+ wikiRef.current = wiki;
495
+ const entityIdRef = (0, import_react12.useRef)(entityId);
496
+ entityIdRef.current = entityId;
497
+ const optionsRef = (0, import_react12.useRef)(options);
498
+ optionsRef.current = options;
499
+ const optionsKey = normalizeTraversalOptionsKey(options);
500
+ const fetchQueue = (0, import_react12.useRef)({ inFlight: false, pending: null });
501
+ const scheduleFetch = (0, import_react12.useRef)(function schedule(eid, opts) {
502
+ const fq = fetchQueue.current;
503
+ if (fq.inFlight) {
504
+ fq.pending = { entityId: eid, options: opts };
505
+ return;
506
+ }
507
+ fq.inFlight = true;
508
+ setIsPending(true);
509
+ wikiRef.current.traverseGraph(eid, opts).then(
510
+ (result) => {
511
+ setNodes(result.nodes);
512
+ setEdges(result.edges);
513
+ setError(null);
514
+ },
515
+ (e) => {
516
+ setNodes([]);
517
+ setEdges([]);
518
+ setError(e instanceof Error ? e : new Error(String(e)));
519
+ }
520
+ ).finally(() => {
521
+ fq.inFlight = false;
522
+ const next = fq.pending;
523
+ fq.pending = null;
524
+ if (next) {
525
+ scheduleFetch.current(next.entityId, next.options);
526
+ } else {
527
+ setIsPending(false);
528
+ }
529
+ });
530
+ });
531
+ (0, import_react12.useEffect)(() => {
532
+ scheduleFetch.current(entityIdRef.current, optionsRef.current);
533
+ }, [entityId, optionsKey, wiki]);
534
+ const refetch = (0, import_react12.useCallback)(() => {
535
+ scheduleFetch.current(entityIdRef.current, optionsRef.current);
536
+ }, [entityId, optionsKey]);
537
+ return { nodes, edges, isPending, error, refetch };
538
+ }
468
539
  // Annotate the CommonJS export names for ESM import in node:
469
540
  0 && (module.exports = {
470
541
  WikiProvider,
@@ -478,6 +549,7 @@ function useSetOntologyManifest() {
478
549
  useWikiHasChanged,
479
550
  useWikiIngest,
480
551
  useWikiMaintenance,
552
+ useWikiTraversal,
481
553
  useWikiWrite,
482
554
  ...require("@equationalapplications/core-llm-wiki")
483
555
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/WikiContext.tsx","../src/useMemoryRead.ts","../src/useWikiWrite.ts","../src/useWikiMaintenance.ts","../src/useWikiIngest.ts","../src/useWikiForget.ts","../src/useWikiExport.ts","../src/useWikiHasChanged.ts","../src/useEntityStatus.ts","../src/useOntologyManifest.ts","../src/useSetOntologyManifest.ts"],"sourcesContent":["export * from '@equationalapplications/core-llm-wiki';\nexport { WikiProvider, useWiki } from './WikiContext';\nexport { useMemoryRead } from './useMemoryRead';\nexport { useWikiWrite } from './useWikiWrite';\nexport { useWikiMaintenance } from './useWikiMaintenance';\nexport type { MaintenanceResult } from './useWikiMaintenance';\nexport { useWikiIngest } from './useWikiIngest';\nexport { useWikiForget } from './useWikiForget';\nexport { useWikiExport } from './useWikiExport';\nexport { useWikiHasChanged } from './useWikiHasChanged';\nexport { useEntityStatus } from './useEntityStatus';\nexport { useOntologyManifest } from './useOntologyManifest';\nexport type { OntologyManifestState } from './useOntologyManifest';\nexport { useSetOntologyManifest } from './useSetOntologyManifest';\n","import React, { createContext, useContext, type ReactNode } from 'react';\nimport { WikiMemory } from '@equationalapplications/core-llm-wiki';\n\nconst WikiContext = createContext<WikiMemory | null>(null);\n\nexport function WikiProvider({ wiki, children }: { wiki: WikiMemory; children: ReactNode }) {\n return <WikiContext.Provider value={wiki}>{children}</WikiContext.Provider>;\n}\n\nexport function useWiki(): WikiMemory {\n const wiki = useContext(WikiContext);\n if (!wiki) throw new Error('useWiki must be used within WikiProvider');\n return wiki;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { MemoryBundle, ReadOptions } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Normalize a ReadOptions object to a canonical string suitable for use as a\n * React effect dependency key. Normalization ensures:\n * - `undefined` and `{}` produce the same empty string (no spurious refetch)\n * - Non-serializable numbers are coerced to their effective values before\n * stringifying, matching how WikiMemory.read() resolves them:\n * · maxResults: NaN/±Infinity → 10 (read()'s hardcoded fallback, overrides config)\n * · preFilterLimit: NaN/±Infinity → null (disables config-level limit, same as null)\n * · hybridWeight: NaN → null (explicitly disables config-level weight; distinct from\n * undefined which defers to config); ±Infinity → clamped to 0/1\n * · tierWeights values: non-finite → 1.0, negative → 0 (mirrors core sanitization)\n * · tierWeights keys: projected onto the active entityId set (mirrors core's\n * sanitizeTierWeights which ignores weights for entities not in the request)\n * · tierWeights keys at default weight (1.0) are dropped — spec says missing\n * weights default to 1.0, so explicit 1.0 is behaviorally identical to omission\n * · tierWeights: {} or fully-filtered/all-default result is omitted (same as undefined)\n * · includeZeroWeightEntities: false/undefined are equivalent (both skip zero-weight\n * entities); only true is keyed, matching core's default behavior\n * - Keys are sorted so insertion-order differences never cause spurious refetches\n */\nfunction normalizeReadOptionsKey(entityId: string | string[], opts?: ReadOptions): string {\n if (!opts) return '';\n const normalized: Record<string, unknown> = {};\n\n // maxResults: undefined or null → omit (defer to config/default via ??);\n // non-finite (NaN/±Infinity) → 10 (read()'s hardcoded fallback, bypasses config);\n // finite → clamp to non-negative integer.\n if (opts.maxResults !== undefined && opts.maxResults !== null) {\n normalized.maxResults = Number.isFinite(opts.maxResults)\n ? Math.max(0, Math.trunc(opts.maxResults))\n : 10;\n }\n\n // preFilterLimit: undefined → omit (defer to config);\n // null or non-finite → null (disables config-level limit);\n // finite → clamp to non-negative integer.\n if (opts.preFilterLimit !== undefined) {\n if (opts.preFilterLimit === null || !Number.isFinite(opts.preFilterLimit)) {\n normalized.preFilterLimit = null;\n } else {\n normalized.preFilterLimit = Math.max(0, Math.trunc(opts.preFilterLimit));\n }\n }\n\n // hybridWeight: undefined or null → omit (defer to config via ??);\n // NaN → null (explicitly disables config hybrid weight; distinct from omitting);\n // ±Infinity and out-of-range finite → clamp to [0, 1].\n if (opts.hybridWeight !== undefined && opts.hybridWeight !== null) {\n normalized.hybridWeight = Number.isNaN(opts.hybridWeight)\n ? null\n : Math.max(0, Math.min(1, opts.hybridWeight));\n }\n\n // tierWeights: project onto the active entity set (core's sanitizeTierWeights only\n // considers weights for the requested entityIds, so unrelated keys have no behavioral\n // effect and should not contribute to the dep key). Sanitize values (non-finite → 1.0,\n // negative → 0) and sort keys to avoid spurious refetches from insertion-order or\n // logically-equivalent value differences. Drop entries at the default weight (1.0)\n // because missing weights also default to 1.0 per spec — explicit 1.0 is behaviorally\n // identical to omission. Use Object.create(null) to match core's sanitizeTierWeights\n // and avoid prototype-key edge cases (e.g. entityIds like __proto__). Omit entirely\n // when the projected+filtered result is empty (same as undefined).\n if (opts.tierWeights !== undefined) {\n const activeIds = new Set(Array.isArray(entityId) ? entityId : [entityId]);\n const tw = opts.tierWeights;\n const twKeys = Object.keys(tw).filter(k => activeIds.has(k)).sort();\n if (twKeys.length) {\n const sanitized = Object.create(null) as Record<string, number>;\n for (const k of twKeys) {\n const w = tw[k];\n sanitized[k] = !Number.isFinite(w) ? 1.0 : Math.max(0, w);\n }\n // Drop default-weight entries (1.0) — spec says missing weights default to 1.0\n const nonDefaultKeys = twKeys.filter(k => sanitized[k] !== 1.0);\n if (nonDefaultKeys.length) {\n normalized.tierWeights = JSON.stringify(sanitized, nonDefaultKeys);\n }\n }\n }\n\n // includeZeroWeightEntities: false and undefined are equivalent in core (both exclude\n // zero-weight entities from scored retrieval). Only key when true so toggling\n // undefined → false does not cause a spurious refetch.\n if (opts.includeZeroWeightEntities === true) {\n normalized.includeZeroWeightEntities = true;\n }\n\n const sortedKeys = Object.keys(normalized).sort();\n return sortedKeys.length ? JSON.stringify(normalized, sortedKeys) : '';\n}\n\nexport function useMemoryRead(entityId: string | string[], query: string, options?: ReadOptions) {\n const wiki = useWiki();\n const [data, setData] = useState<MemoryBundle | null>(null);\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const entityIdRef = useRef(entityId);\n entityIdRef.current = entityId;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n // Stable dep key for entityId: sort+dedup so inline array literals (new reference\n // each render) don't cause spurious refetches. The same set of entity IDs always\n // produces the same key regardless of reference identity or insertion order.\n const entityIdKey = Array.isArray(entityId)\n ? [...new Set(entityId)].sort().join('\\0')\n : entityId;\n\n // Serialize a normalized form of options so:\n // - `undefined` and `{}` map to the same string (no spurious refetch)\n // - non-finite hybridWeight (±Infinity, NaN) is coerced to its effective value before\n // stringifying (JSON.stringify turns Infinity/NaN to `null`, losing type information)\n // - keys are sorted so insertion-order differences don't cause spurious refetches\n const optionsStr = normalizeReadOptionsKey(entityId, options);\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: { entityId: string | string[]; query: string } | null;\n }>({ inFlight: false, pending: null });\n\n // Stable scheduler: refs keep it from going stale across renders.\n // In-flight results are never discarded — spec requires them to land before\n // starting the next fetch with latest args.\n const scheduleFetch = useRef(function schedule(eid: string | string[], q: string) {\n const fq = fetchQueue.current;\n if (fq.inFlight) {\n fq.pending = { entityId: eid, query: q };\n return;\n }\n fq.inFlight = true;\n setIsPending(true);\n\n wikiRef.current.read(eid, q, optionsRef.current).then(\n (result) => { setData(result); setError(null); },\n (e: unknown) => { setError(e instanceof Error ? e : new Error(String(e))); }\n ).finally(() => {\n fq.inFlight = false;\n const next = fq.pending;\n fq.pending = null;\n if (next) {\n scheduleFetch.current(next.entityId, next.query);\n } else {\n setIsPending(false);\n }\n });\n });\n\n useEffect(() => {\n scheduleFetch.current(entityIdRef.current, query);\n }, [entityIdKey, query, wiki, optionsStr]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityIdRef.current, query);\n }, [entityIdKey, query]);\n\n return { data, isPending, error, refetch };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { WikiEvent } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\ntype WriteEvent = Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>;\n\nexport function useWikiWrite() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<void | null>(null);\n\n const execute = useCallback(async (entityId: string, event: WriteEvent): Promise<void> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n await wikiRef.current.write(entityId, event);\n setLastResult(undefined);\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n setError(error);\n throw error;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\nexport type MaintenanceResult =\n | { operation: 'librarian' | 'heal'; result: undefined }\n | { operation: 'prune'; result: { entries: number; tasks: number; events: number } };\n\nexport function useWikiMaintenance() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<MaintenanceResult | null>(null);\n // Counter so any overlapping maintenance operation keeps isPending=true until all complete\n const pendingCount = useRef(0);\n\n const runLibrarian = useCallback(async (entityId: string, options?: { promptOverride?: string }): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await (options ? wikiRef.current.runLibrarian(entityId, options) : wikiRef.current.runLibrarian(entityId));\n setLastResult({ operation: 'librarian', result: undefined });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n const runHeal = useCallback(async (entityId: string, options?: { promptOverride?: string }): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await (options ? wikiRef.current.runHeal(entityId, options) : wikiRef.current.runHeal(entityId));\n setLastResult({ operation: 'heal', result: undefined });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n const runPrune = useCallback(\n async (\n entityId: string,\n options?: {\n retainSoftDeletedFor?: number | null;\n retainEventsFor?: number | null;\n vacuum?: boolean;\n }\n ): Promise<{ entries: number; tasks: number; events: number }> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.runPrune(entityId, options);\n setLastResult({ operation: 'prune', result });\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n },\n []\n );\n\n const runReembed = useCallback(async (entityId?: string, opts?: { force?: boolean; skipExisting?: boolean }): Promise<{ embedded: number; skipped: number; failed: number }> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n // runReembed returns its result directly; it does not update the shared\n // MaintenanceResult/lastResult field (which only tracks librarian, heal, prune).\n // Using the return value directly avoids widening the MaintenanceResult union\n // in a way that would break existing consumers that exhaustively switch on\n // lastResult.operation.\n return await wikiRef.current.runReembed(entityId, opts);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n return { runLibrarian, runHeal, runPrune, runReembed, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\ninterface IngestParams {\n sourceRef: string;\n sourceHash: string;\n documentChunk: string;\n maxChunkLength?: number;\n promptOverride?: string;\n}\n\ntype IngestResult = { truncated: boolean; chunks: number };\n\nexport function useWikiIngest() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<IngestResult | null>(null);\n\n const execute = useCallback(async (entityId: string, params: IngestParams): Promise<IngestResult> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.ingestDocument(entityId, params);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\ninterface ForgetParams {\n entryId?: string;\n taskId?: string;\n sourceRef?: string;\n sourceHash?: string;\n clearAll?: boolean;\n}\n\ntype ForgetResult = { deleted: { entries: number; tasks: number } };\n\nexport function useWikiForget() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<ForgetResult | null>(null);\n\n const execute = useCallback(async (entityId: string, params: ForgetParams): Promise<ForgetResult> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.forget(entityId, params);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\nimport type { MemoryDump } from '@equationalapplications/core-llm-wiki';\n\nexport function useWikiExport() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<MemoryDump | null>(null);\n\n const execute = useCallback(async (entityIds?: string[]): Promise<MemoryDump> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.exportDump(entityIds);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\nexport function useWikiHasChanged() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<boolean | null>(null);\n\n const execute = useCallback(\n async (entityId: string, sourceRef: string, sourceHash: string): Promise<boolean> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.hasChanged(entityId, sourceRef, sourceHash);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n },\n []\n );\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useEffect } from 'react';\nimport { useWiki } from './WikiContext';\nimport type { EntityStatus } from '@equationalapplications/core-llm-wiki';\n\nexport function useEntityStatus(entityId: string): EntityStatus {\n const wiki = useWiki();\n const [snapshot, setSnapshot] = useState(() => ({\n wiki,\n entityId,\n status: wiki.getEntityStatus(entityId),\n }));\n\n useEffect(() => {\n setSnapshot({ wiki, entityId, status: wiki.getEntityStatus(entityId) });\n return wiki.subscribeEntityStatus(entityId, (status) => {\n setSnapshot({ wiki, entityId, status });\n });\n }, [wiki, entityId]);\n\n return snapshot.wiki === wiki && snapshot.entityId === entityId\n ? snapshot.status\n : wiki.getEntityStatus(entityId);\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { OntologyManifest, OntologyMode } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Reactive state returned by {@link useOntologyManifest}.\n */\nexport interface OntologyManifestState {\n /** Resolved manifest, or `null` when `getOntologyManifest` returns `null`. */\n manifest: OntologyManifest | null;\n /** Resolved mode, or `null` when no manifest row/seed applies. */\n mode: OntologyMode | null;\n isPending: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n/**\n * Reactive read hook for an entity's ontology manifest and mode.\n * Fetches on mount and whenever `entityId` or `wiki` changes.\n * Call `refetch()` after mutations (e.g. {@link useSetOntologyManifest}) to refresh.\n */\nexport function useOntologyManifest(entityId: string): OntologyManifestState {\n const wiki = useWiki();\n const [manifest, setManifest] = useState<OntologyManifest | null>(null);\n const [mode, setMode] = useState<OntologyMode | null>(null);\n const [isPending, setIsPending] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const entityIdRef = useRef(entityId);\n entityIdRef.current = entityId;\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: string | null;\n }>({ inFlight: false, pending: null });\n\n const scheduleFetch = useRef(function schedule(eid: string) {\n const fq = fetchQueue.current;\n if (fq.inFlight) {\n fq.pending = eid;\n return;\n }\n fq.inFlight = true;\n setIsPending(true);\n\n wikiRef.current.getOntologyManifest(eid).then(\n (result) => {\n if (result) {\n setManifest(result.manifest);\n setMode(result.mode);\n } else {\n setManifest(null);\n setMode(null);\n }\n setError(null);\n },\n (e: unknown) => {\n setError(e instanceof Error ? e : new Error(String(e)));\n },\n ).finally(() => {\n fq.inFlight = false;\n const next = fq.pending;\n fq.pending = null;\n if (next !== null) {\n scheduleFetch.current(next);\n } else {\n setIsPending(false);\n }\n });\n });\n\n useEffect(() => {\n scheduleFetch.current(entityIdRef.current);\n }, [entityId, wiki]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityIdRef.current);\n }, [entityId]);\n\n return { manifest, mode, isPending, error, refetch };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { OntologyManifest, OntologyMode } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Mutation hook for seeding or replacing an entity's ontology manifest.\n * Mirrors the `{ execute, isPending, error, lastResult }` contract of {@link useWikiWrite}.\n * Does not auto-refresh {@link useOntologyManifest} — call `refetch()` after a successful `execute()`.\n */\nexport function useSetOntologyManifest() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<void | null>(null);\n\n const execute = useCallback(async (\n entityId: string,\n manifest: OntologyManifest,\n options?: { mode?: OntologyMode },\n ): Promise<void> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n await wikiRef.current.setOntologyManifest(entityId, manifest, options);\n setLastResult(undefined);\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n setError(error);\n throw error;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n"],"mappings":"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","names":["import_react","import_react","error","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","error"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/WikiContext.tsx","../src/useMemoryRead.ts","../src/useWikiWrite.ts","../src/useWikiMaintenance.ts","../src/useWikiIngest.ts","../src/useWikiForget.ts","../src/useWikiExport.ts","../src/useWikiHasChanged.ts","../src/useEntityStatus.ts","../src/useOntologyManifest.ts","../src/useSetOntologyManifest.ts","../src/useWikiTraversal.ts"],"sourcesContent":["export * from '@equationalapplications/core-llm-wiki';\nexport { WikiProvider, useWiki } from './WikiContext';\nexport { useMemoryRead } from './useMemoryRead';\nexport { useWikiWrite } from './useWikiWrite';\nexport { useWikiMaintenance } from './useWikiMaintenance';\nexport type { MaintenanceResult } from './useWikiMaintenance';\nexport { useWikiIngest } from './useWikiIngest';\nexport { useWikiForget } from './useWikiForget';\nexport { useWikiExport } from './useWikiExport';\nexport { useWikiHasChanged } from './useWikiHasChanged';\nexport { useEntityStatus } from './useEntityStatus';\nexport { useOntologyManifest } from './useOntologyManifest';\nexport type { OntologyManifestState } from './useOntologyManifest';\nexport { useSetOntologyManifest } from './useSetOntologyManifest';\nexport { useWikiTraversal } from './useWikiTraversal';\nexport type { WikiTraversalState } from './useWikiTraversal';\n","import React, { createContext, useContext, type ReactNode } from 'react';\nimport { WikiMemory } from '@equationalapplications/core-llm-wiki';\n\nconst WikiContext = createContext<WikiMemory | null>(null);\n\nexport function WikiProvider({ wiki, children }: { wiki: WikiMemory; children: ReactNode }) {\n return <WikiContext.Provider value={wiki}>{children}</WikiContext.Provider>;\n}\n\nexport function useWiki(): WikiMemory {\n const wiki = useContext(WikiContext);\n if (!wiki) throw new Error('useWiki must be used within WikiProvider');\n return wiki;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { MemoryBundle, ReadOptions } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Normalize a ReadOptions object to a canonical string suitable for use as a\n * React effect dependency key. Normalization ensures:\n * - `undefined` and `{}` produce the same empty string (no spurious refetch)\n * - Non-serializable numbers are coerced to their effective values before\n * stringifying, matching how WikiMemory.read() resolves them:\n * · maxResults: NaN/±Infinity → 10 (read()'s hardcoded fallback, overrides config)\n * · preFilterLimit: NaN/±Infinity → null (disables config-level limit, same as null)\n * · hybridWeight: NaN → null (explicitly disables config-level weight; distinct from\n * undefined which defers to config); ±Infinity → clamped to 0/1\n * · tierWeights values: non-finite → 1.0, negative → 0 (mirrors core sanitization)\n * · tierWeights keys: projected onto the active entityId set (mirrors core's\n * sanitizeTierWeights which ignores weights for entities not in the request)\n * · tierWeights keys at default weight (1.0) are dropped — spec says missing\n * weights default to 1.0, so explicit 1.0 is behaviorally identical to omission\n * · tierWeights: {} or fully-filtered/all-default result is omitted (same as undefined)\n * · includeZeroWeightEntities: false/undefined are equivalent (both skip zero-weight\n * entities); only true is keyed, matching core's default behavior\n * - Keys are sorted so insertion-order differences never cause spurious refetches\n */\nfunction normalizeReadOptionsKey(entityId: string | string[], opts?: ReadOptions): string {\n if (!opts) return '';\n const normalized: Record<string, unknown> = {};\n\n // maxResults: undefined or null → omit (defer to config/default via ??);\n // non-finite (NaN/±Infinity) → 10 (read()'s hardcoded fallback, bypasses config);\n // finite → clamp to non-negative integer.\n if (opts.maxResults !== undefined && opts.maxResults !== null) {\n normalized.maxResults = Number.isFinite(opts.maxResults)\n ? Math.max(0, Math.trunc(opts.maxResults))\n : 10;\n }\n\n // preFilterLimit: undefined → omit (defer to config);\n // null or non-finite → null (disables config-level limit);\n // finite → clamp to non-negative integer.\n if (opts.preFilterLimit !== undefined) {\n if (opts.preFilterLimit === null || !Number.isFinite(opts.preFilterLimit)) {\n normalized.preFilterLimit = null;\n } else {\n normalized.preFilterLimit = Math.max(0, Math.trunc(opts.preFilterLimit));\n }\n }\n\n // hybridWeight: undefined or null → omit (defer to config via ??);\n // NaN → null (explicitly disables config hybrid weight; distinct from omitting);\n // ±Infinity and out-of-range finite → clamp to [0, 1].\n if (opts.hybridWeight !== undefined && opts.hybridWeight !== null) {\n normalized.hybridWeight = Number.isNaN(opts.hybridWeight)\n ? null\n : Math.max(0, Math.min(1, opts.hybridWeight));\n }\n\n // tierWeights: project onto the active entity set (core's sanitizeTierWeights only\n // considers weights for the requested entityIds, so unrelated keys have no behavioral\n // effect and should not contribute to the dep key). Sanitize values (non-finite → 1.0,\n // negative → 0) and sort keys to avoid spurious refetches from insertion-order or\n // logically-equivalent value differences. Drop entries at the default weight (1.0)\n // because missing weights also default to 1.0 per spec — explicit 1.0 is behaviorally\n // identical to omission. Use Object.create(null) to match core's sanitizeTierWeights\n // and avoid prototype-key edge cases (e.g. entityIds like __proto__). Omit entirely\n // when the projected+filtered result is empty (same as undefined).\n if (opts.tierWeights !== undefined) {\n const activeIds = new Set(Array.isArray(entityId) ? entityId : [entityId]);\n const tw = opts.tierWeights;\n const twKeys = Object.keys(tw).filter(k => activeIds.has(k)).sort();\n if (twKeys.length) {\n const sanitized = Object.create(null) as Record<string, number>;\n for (const k of twKeys) {\n const w = tw[k];\n sanitized[k] = !Number.isFinite(w) ? 1.0 : Math.max(0, w);\n }\n // Drop default-weight entries (1.0) — spec says missing weights default to 1.0\n const nonDefaultKeys = twKeys.filter(k => sanitized[k] !== 1.0);\n if (nonDefaultKeys.length) {\n normalized.tierWeights = JSON.stringify(sanitized, nonDefaultKeys);\n }\n }\n }\n\n // includeZeroWeightEntities: false and undefined are equivalent in core (both exclude\n // zero-weight entities from scored retrieval). Only key when true so toggling\n // undefined → false does not cause a spurious refetch.\n if (opts.includeZeroWeightEntities === true) {\n normalized.includeZeroWeightEntities = true;\n }\n\n const sortedKeys = Object.keys(normalized).sort();\n return sortedKeys.length ? JSON.stringify(normalized, sortedKeys) : '';\n}\n\nexport function useMemoryRead(entityId: string | string[], query: string, options?: ReadOptions) {\n const wiki = useWiki();\n const [data, setData] = useState<MemoryBundle | null>(null);\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const entityIdRef = useRef(entityId);\n entityIdRef.current = entityId;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n // Stable dep key for entityId: sort+dedup so inline array literals (new reference\n // each render) don't cause spurious refetches. The same set of entity IDs always\n // produces the same key regardless of reference identity or insertion order.\n const entityIdKey = Array.isArray(entityId)\n ? [...new Set(entityId)].sort().join('\\0')\n : entityId;\n\n // Serialize a normalized form of options so:\n // - `undefined` and `{}` map to the same string (no spurious refetch)\n // - non-finite hybridWeight (±Infinity, NaN) is coerced to its effective value before\n // stringifying (JSON.stringify turns Infinity/NaN to `null`, losing type information)\n // - keys are sorted so insertion-order differences don't cause spurious refetches\n const optionsStr = normalizeReadOptionsKey(entityId, options);\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: { entityId: string | string[]; query: string } | null;\n }>({ inFlight: false, pending: null });\n\n // Stable scheduler: refs keep it from going stale across renders.\n // In-flight results are never discarded — spec requires them to land before\n // starting the next fetch with latest args.\n const scheduleFetch = useRef(function schedule(eid: string | string[], q: string) {\n const fq = fetchQueue.current;\n if (fq.inFlight) {\n fq.pending = { entityId: eid, query: q };\n return;\n }\n fq.inFlight = true;\n setIsPending(true);\n\n wikiRef.current.read(eid, q, optionsRef.current).then(\n (result) => { setData(result); setError(null); },\n (e: unknown) => { setError(e instanceof Error ? e : new Error(String(e))); }\n ).finally(() => {\n fq.inFlight = false;\n const next = fq.pending;\n fq.pending = null;\n if (next) {\n scheduleFetch.current(next.entityId, next.query);\n } else {\n setIsPending(false);\n }\n });\n });\n\n useEffect(() => {\n scheduleFetch.current(entityIdRef.current, query);\n }, [entityIdKey, query, wiki, optionsStr]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityIdRef.current, query);\n }, [entityIdKey, query]);\n\n return { data, isPending, error, refetch };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { WikiEvent } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\ntype WriteEvent = Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>;\n\nexport function useWikiWrite() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<void | null>(null);\n\n const execute = useCallback(async (entityId: string, event: WriteEvent): Promise<void> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n await wikiRef.current.write(entityId, event);\n setLastResult(undefined);\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n setError(error);\n throw error;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\nexport type MaintenanceResult =\n | { operation: 'librarian' | 'heal'; result: undefined }\n | { operation: 'prune'; result: { entries: number; tasks: number; events: number } };\n\nexport function useWikiMaintenance() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<MaintenanceResult | null>(null);\n // Counter so any overlapping maintenance operation keeps isPending=true until all complete\n const pendingCount = useRef(0);\n\n const runLibrarian = useCallback(async (entityId: string, options?: { promptOverride?: string }): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await (options ? wikiRef.current.runLibrarian(entityId, options) : wikiRef.current.runLibrarian(entityId));\n setLastResult({ operation: 'librarian', result: undefined });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n const runHeal = useCallback(async (entityId: string, options?: { promptOverride?: string }): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await (options ? wikiRef.current.runHeal(entityId, options) : wikiRef.current.runHeal(entityId));\n setLastResult({ operation: 'heal', result: undefined });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n const runPrune = useCallback(\n async (\n entityId: string,\n options?: {\n retainSoftDeletedFor?: number | null;\n retainEventsFor?: number | null;\n vacuum?: boolean;\n }\n ): Promise<{ entries: number; tasks: number; events: number }> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.runPrune(entityId, options);\n setLastResult({ operation: 'prune', result });\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n },\n []\n );\n\n const runReembed = useCallback(async (entityId?: string, opts?: { force?: boolean; skipExisting?: boolean }): Promise<{ embedded: number; skipped: number; failed: number }> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n // runReembed returns its result directly; it does not update the shared\n // MaintenanceResult/lastResult field (which only tracks librarian, heal, prune).\n // Using the return value directly avoids widening the MaintenanceResult union\n // in a way that would break existing consumers that exhaustively switch on\n // lastResult.operation.\n return await wikiRef.current.runReembed(entityId, opts);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n return { runLibrarian, runHeal, runPrune, runReembed, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\ninterface IngestParams {\n sourceRef: string;\n sourceHash: string;\n documentChunk: string;\n maxChunkLength?: number;\n promptOverride?: string;\n}\n\ntype IngestResult = { truncated: boolean; chunks: number };\n\nexport function useWikiIngest() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<IngestResult | null>(null);\n\n const execute = useCallback(async (entityId: string, params: IngestParams): Promise<IngestResult> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.ingestDocument(entityId, params);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\ninterface ForgetParams {\n entryId?: string;\n taskId?: string;\n sourceRef?: string;\n sourceHash?: string;\n clearAll?: boolean;\n}\n\ntype ForgetResult = { deleted: { entries: number; tasks: number } };\n\nexport function useWikiForget() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<ForgetResult | null>(null);\n\n const execute = useCallback(async (entityId: string, params: ForgetParams): Promise<ForgetResult> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.forget(entityId, params);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\nimport type { MemoryDump } from '@equationalapplications/core-llm-wiki';\n\nexport function useWikiExport() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<MemoryDump | null>(null);\n\n const execute = useCallback(async (entityIds?: string[]): Promise<MemoryDump> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.exportDump(entityIds);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\nexport function useWikiHasChanged() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<boolean | null>(null);\n\n const execute = useCallback(\n async (entityId: string, sourceRef: string, sourceHash: string): Promise<boolean> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.hasChanged(entityId, sourceRef, sourceHash);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n },\n []\n );\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useEffect } from 'react';\nimport { useWiki } from './WikiContext';\nimport type { EntityStatus } from '@equationalapplications/core-llm-wiki';\n\nexport function useEntityStatus(entityId: string): EntityStatus {\n const wiki = useWiki();\n const [snapshot, setSnapshot] = useState(() => ({\n wiki,\n entityId,\n status: wiki.getEntityStatus(entityId),\n }));\n\n useEffect(() => {\n setSnapshot({ wiki, entityId, status: wiki.getEntityStatus(entityId) });\n return wiki.subscribeEntityStatus(entityId, (status) => {\n setSnapshot({ wiki, entityId, status });\n });\n }, [wiki, entityId]);\n\n return snapshot.wiki === wiki && snapshot.entityId === entityId\n ? snapshot.status\n : wiki.getEntityStatus(entityId);\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { OntologyManifest, OntologyMode } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Reactive state returned by {@link useOntologyManifest}.\n */\nexport interface OntologyManifestState {\n /** Resolved manifest, or `null` when `getOntologyManifest` returns `null`. */\n manifest: OntologyManifest | null;\n /** Resolved mode, or `null` when no manifest row/seed applies. */\n mode: OntologyMode | null;\n isPending: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n/**\n * Reactive read hook for an entity's ontology manifest and mode.\n * Fetches on mount and whenever `entityId` or `wiki` changes.\n * Call `refetch()` after mutations (e.g. {@link useSetOntologyManifest}) to refresh.\n */\nexport function useOntologyManifest(entityId: string): OntologyManifestState {\n const wiki = useWiki();\n const [manifest, setManifest] = useState<OntologyManifest | null>(null);\n const [mode, setMode] = useState<OntologyMode | null>(null);\n const [isPending, setIsPending] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const entityIdRef = useRef(entityId);\n entityIdRef.current = entityId;\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: string | null;\n }>({ inFlight: false, pending: null });\n\n const scheduleFetch = useRef(function schedule(eid: string) {\n const fq = fetchQueue.current;\n if (fq.inFlight) {\n fq.pending = eid;\n return;\n }\n fq.inFlight = true;\n setIsPending(true);\n\n wikiRef.current.getOntologyManifest(eid).then(\n (result) => {\n if (result) {\n setManifest(result.manifest);\n setMode(result.mode);\n } else {\n setManifest(null);\n setMode(null);\n }\n setError(null);\n },\n (e: unknown) => {\n setError(e instanceof Error ? e : new Error(String(e)));\n },\n ).finally(() => {\n fq.inFlight = false;\n const next = fq.pending;\n fq.pending = null;\n if (next !== null) {\n scheduleFetch.current(next);\n } else {\n setIsPending(false);\n }\n });\n });\n\n useEffect(() => {\n scheduleFetch.current(entityIdRef.current);\n }, [entityId, wiki]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityIdRef.current);\n }, [entityId]);\n\n return { manifest, mode, isPending, error, refetch };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { OntologyManifest, OntologyMode } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Mutation hook for seeding or replacing an entity's ontology manifest.\n * Mirrors the `{ execute, isPending, error, lastResult }` contract of {@link useWikiWrite}.\n * Does not auto-refresh {@link useOntologyManifest} — call `refetch()` after a successful `execute()`.\n */\nexport function useSetOntologyManifest() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<void | null>(null);\n\n const execute = useCallback(async (\n entityId: string,\n manifest: OntologyManifest,\n options?: { mode?: OntologyMode },\n ): Promise<void> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n await wikiRef.current.setOntologyManifest(entityId, manifest, options);\n setLastResult(undefined);\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n setError(error);\n throw error;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { GraphTraversalOptions, WikiFact, WikiEdge } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\nexport interface WikiTraversalState {\n nodes: WikiFact[];\n edges: WikiEdge[];\n isPending: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n/**\n * Stable dep key for a GraphTraversalOptions object so inline object literals\n * (new reference each render) don't cause spurious refetches. Sorted-key\n * JSON.stringify, mirroring normalizeReadOptionsKey in useMemoryRead.ts.\n */\nfunction normalizeTraversalOptionsKey(options: GraphTraversalOptions): string {\n const normalized: Record<string, unknown> = { sourceId: options.sourceId };\n\n if (options.maxDepth !== undefined) normalized.maxDepth = options.maxDepth;\n if (options.direction !== undefined) normalized.direction = options.direction;\n if (options.edgeTypes !== undefined) normalized.edgeTypes = [...options.edgeTypes].sort();\n if (options.maxTraversalNodes !== undefined) normalized.maxTraversalNodes = options.maxTraversalNodes;\n if (options.minTraversalConfidence !== undefined) normalized.minTraversalConfidence = options.minTraversalConfidence;\n if (options.excludeSourceTypes !== undefined) normalized.excludeSourceTypes = [...options.excludeSourceTypes].sort();\n\n const sortedKeys = Object.keys(normalized).sort();\n const sorted: Record<string, unknown> = {};\n for (const k of sortedKeys) {\n sorted[k] = normalized[k];\n }\n // Do not pass sortedKeys as a JSON.stringify replacer — array values would lose\n // their elements because replacer keys must be object property names, not indices.\n return JSON.stringify(sorted);\n}\n\n/**\n * Reactive read hook for graph traversal. Fetches on mount and whenever\n * `entityId` or a stable serialization of `options` changes.\n * Call `refetch()` after mutations that change the underlying edges (e.g. runLibrarian).\n */\nexport function useWikiTraversal(entityId: string, options: GraphTraversalOptions): WikiTraversalState {\n const wiki = useWiki();\n const [nodes, setNodes] = useState<WikiFact[]>([]);\n const [edges, setEdges] = useState<WikiEdge[]>([]);\n const [isPending, setIsPending] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const entityIdRef = useRef(entityId);\n entityIdRef.current = entityId;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const optionsKey = normalizeTraversalOptionsKey(options);\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: { entityId: string; options: GraphTraversalOptions } | null;\n }>({ inFlight: false, pending: null });\n\n // Stable scheduler: refs keep it from going stale across renders.\n // In-flight results are never discarded.\n const scheduleFetch = useRef(function schedule(eid: string, opts: GraphTraversalOptions) {\n const fq = fetchQueue.current;\n if (fq.inFlight) {\n fq.pending = { entityId: eid, options: opts };\n return;\n }\n fq.inFlight = true;\n setIsPending(true);\n\n wikiRef.current.traverseGraph(eid, opts).then(\n (result) => {\n setNodes(result.nodes);\n setEdges(result.edges);\n setError(null);\n },\n (e: unknown) => {\n setNodes([]);\n setEdges([]);\n setError(e instanceof Error ? e : new Error(String(e)));\n },\n ).finally(() => {\n fq.inFlight = false;\n const next = fq.pending;\n fq.pending = null;\n if (next) {\n scheduleFetch.current(next.entityId, next.options);\n } else {\n setIsPending(false);\n }\n });\n });\n\n useEffect(() => {\n scheduleFetch.current(entityIdRef.current, optionsRef.current);\n }, [entityId, optionsKey, wiki]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityIdRef.current, optionsRef.current);\n }, [entityId, optionsKey]);\n\n return { nodes, edges, isPending, error, refetch };\n}\n"],"mappings":"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","names":["import_react","import_react","error","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","error","import_react"]}
package/dist/index.mjs CHANGED
@@ -429,6 +429,76 @@ function useSetOntologyManifest() {
429
429
  }, []);
430
430
  return { execute, lastResult, isPending, error };
431
431
  }
432
+
433
+ // src/useWikiTraversal.ts
434
+ import { useState as useState11, useEffect as useEffect4, useCallback as useCallback10, useRef as useRef10 } from "react";
435
+ function normalizeTraversalOptionsKey(options) {
436
+ const normalized = { sourceId: options.sourceId };
437
+ if (options.maxDepth !== void 0) normalized.maxDepth = options.maxDepth;
438
+ if (options.direction !== void 0) normalized.direction = options.direction;
439
+ if (options.edgeTypes !== void 0) normalized.edgeTypes = [...options.edgeTypes].sort();
440
+ if (options.maxTraversalNodes !== void 0) normalized.maxTraversalNodes = options.maxTraversalNodes;
441
+ if (options.minTraversalConfidence !== void 0) normalized.minTraversalConfidence = options.minTraversalConfidence;
442
+ if (options.excludeSourceTypes !== void 0) normalized.excludeSourceTypes = [...options.excludeSourceTypes].sort();
443
+ const sortedKeys = Object.keys(normalized).sort();
444
+ const sorted = {};
445
+ for (const k of sortedKeys) {
446
+ sorted[k] = normalized[k];
447
+ }
448
+ return JSON.stringify(sorted);
449
+ }
450
+ function useWikiTraversal(entityId, options) {
451
+ const wiki = useWiki();
452
+ const [nodes, setNodes] = useState11([]);
453
+ const [edges, setEdges] = useState11([]);
454
+ const [isPending, setIsPending] = useState11(true);
455
+ const [error, setError] = useState11(null);
456
+ const wikiRef = useRef10(wiki);
457
+ wikiRef.current = wiki;
458
+ const entityIdRef = useRef10(entityId);
459
+ entityIdRef.current = entityId;
460
+ const optionsRef = useRef10(options);
461
+ optionsRef.current = options;
462
+ const optionsKey = normalizeTraversalOptionsKey(options);
463
+ const fetchQueue = useRef10({ inFlight: false, pending: null });
464
+ const scheduleFetch = useRef10(function schedule(eid, opts) {
465
+ const fq = fetchQueue.current;
466
+ if (fq.inFlight) {
467
+ fq.pending = { entityId: eid, options: opts };
468
+ return;
469
+ }
470
+ fq.inFlight = true;
471
+ setIsPending(true);
472
+ wikiRef.current.traverseGraph(eid, opts).then(
473
+ (result) => {
474
+ setNodes(result.nodes);
475
+ setEdges(result.edges);
476
+ setError(null);
477
+ },
478
+ (e) => {
479
+ setNodes([]);
480
+ setEdges([]);
481
+ setError(e instanceof Error ? e : new Error(String(e)));
482
+ }
483
+ ).finally(() => {
484
+ fq.inFlight = false;
485
+ const next = fq.pending;
486
+ fq.pending = null;
487
+ if (next) {
488
+ scheduleFetch.current(next.entityId, next.options);
489
+ } else {
490
+ setIsPending(false);
491
+ }
492
+ });
493
+ });
494
+ useEffect4(() => {
495
+ scheduleFetch.current(entityIdRef.current, optionsRef.current);
496
+ }, [entityId, optionsKey, wiki]);
497
+ const refetch = useCallback10(() => {
498
+ scheduleFetch.current(entityIdRef.current, optionsRef.current);
499
+ }, [entityId, optionsKey]);
500
+ return { nodes, edges, isPending, error, refetch };
501
+ }
432
502
  export {
433
503
  WikiProvider,
434
504
  useEntityStatus,
@@ -441,6 +511,7 @@ export {
441
511
  useWikiHasChanged,
442
512
  useWikiIngest,
443
513
  useWikiMaintenance,
514
+ useWikiTraversal,
444
515
  useWikiWrite
445
516
  };
446
517
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/WikiContext.tsx","../src/useMemoryRead.ts","../src/useWikiWrite.ts","../src/useWikiMaintenance.ts","../src/useWikiIngest.ts","../src/useWikiForget.ts","../src/useWikiExport.ts","../src/useWikiHasChanged.ts","../src/useEntityStatus.ts","../src/useOntologyManifest.ts","../src/useSetOntologyManifest.ts"],"sourcesContent":["export * from '@equationalapplications/core-llm-wiki';\nexport { WikiProvider, useWiki } from './WikiContext';\nexport { useMemoryRead } from './useMemoryRead';\nexport { useWikiWrite } from './useWikiWrite';\nexport { useWikiMaintenance } from './useWikiMaintenance';\nexport type { MaintenanceResult } from './useWikiMaintenance';\nexport { useWikiIngest } from './useWikiIngest';\nexport { useWikiForget } from './useWikiForget';\nexport { useWikiExport } from './useWikiExport';\nexport { useWikiHasChanged } from './useWikiHasChanged';\nexport { useEntityStatus } from './useEntityStatus';\nexport { useOntologyManifest } from './useOntologyManifest';\nexport type { OntologyManifestState } from './useOntologyManifest';\nexport { useSetOntologyManifest } from './useSetOntologyManifest';\n","import React, { createContext, useContext, type ReactNode } from 'react';\nimport { WikiMemory } from '@equationalapplications/core-llm-wiki';\n\nconst WikiContext = createContext<WikiMemory | null>(null);\n\nexport function WikiProvider({ wiki, children }: { wiki: WikiMemory; children: ReactNode }) {\n return <WikiContext.Provider value={wiki}>{children}</WikiContext.Provider>;\n}\n\nexport function useWiki(): WikiMemory {\n const wiki = useContext(WikiContext);\n if (!wiki) throw new Error('useWiki must be used within WikiProvider');\n return wiki;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { MemoryBundle, ReadOptions } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Normalize a ReadOptions object to a canonical string suitable for use as a\n * React effect dependency key. Normalization ensures:\n * - `undefined` and `{}` produce the same empty string (no spurious refetch)\n * - Non-serializable numbers are coerced to their effective values before\n * stringifying, matching how WikiMemory.read() resolves them:\n * · maxResults: NaN/±Infinity → 10 (read()'s hardcoded fallback, overrides config)\n * · preFilterLimit: NaN/±Infinity → null (disables config-level limit, same as null)\n * · hybridWeight: NaN → null (explicitly disables config-level weight; distinct from\n * undefined which defers to config); ±Infinity → clamped to 0/1\n * · tierWeights values: non-finite → 1.0, negative → 0 (mirrors core sanitization)\n * · tierWeights keys: projected onto the active entityId set (mirrors core's\n * sanitizeTierWeights which ignores weights for entities not in the request)\n * · tierWeights keys at default weight (1.0) are dropped — spec says missing\n * weights default to 1.0, so explicit 1.0 is behaviorally identical to omission\n * · tierWeights: {} or fully-filtered/all-default result is omitted (same as undefined)\n * · includeZeroWeightEntities: false/undefined are equivalent (both skip zero-weight\n * entities); only true is keyed, matching core's default behavior\n * - Keys are sorted so insertion-order differences never cause spurious refetches\n */\nfunction normalizeReadOptionsKey(entityId: string | string[], opts?: ReadOptions): string {\n if (!opts) return '';\n const normalized: Record<string, unknown> = {};\n\n // maxResults: undefined or null → omit (defer to config/default via ??);\n // non-finite (NaN/±Infinity) → 10 (read()'s hardcoded fallback, bypasses config);\n // finite → clamp to non-negative integer.\n if (opts.maxResults !== undefined && opts.maxResults !== null) {\n normalized.maxResults = Number.isFinite(opts.maxResults)\n ? Math.max(0, Math.trunc(opts.maxResults))\n : 10;\n }\n\n // preFilterLimit: undefined → omit (defer to config);\n // null or non-finite → null (disables config-level limit);\n // finite → clamp to non-negative integer.\n if (opts.preFilterLimit !== undefined) {\n if (opts.preFilterLimit === null || !Number.isFinite(opts.preFilterLimit)) {\n normalized.preFilterLimit = null;\n } else {\n normalized.preFilterLimit = Math.max(0, Math.trunc(opts.preFilterLimit));\n }\n }\n\n // hybridWeight: undefined or null → omit (defer to config via ??);\n // NaN → null (explicitly disables config hybrid weight; distinct from omitting);\n // ±Infinity and out-of-range finite → clamp to [0, 1].\n if (opts.hybridWeight !== undefined && opts.hybridWeight !== null) {\n normalized.hybridWeight = Number.isNaN(opts.hybridWeight)\n ? null\n : Math.max(0, Math.min(1, opts.hybridWeight));\n }\n\n // tierWeights: project onto the active entity set (core's sanitizeTierWeights only\n // considers weights for the requested entityIds, so unrelated keys have no behavioral\n // effect and should not contribute to the dep key). Sanitize values (non-finite → 1.0,\n // negative → 0) and sort keys to avoid spurious refetches from insertion-order or\n // logically-equivalent value differences. Drop entries at the default weight (1.0)\n // because missing weights also default to 1.0 per spec — explicit 1.0 is behaviorally\n // identical to omission. Use Object.create(null) to match core's sanitizeTierWeights\n // and avoid prototype-key edge cases (e.g. entityIds like __proto__). Omit entirely\n // when the projected+filtered result is empty (same as undefined).\n if (opts.tierWeights !== undefined) {\n const activeIds = new Set(Array.isArray(entityId) ? entityId : [entityId]);\n const tw = opts.tierWeights;\n const twKeys = Object.keys(tw).filter(k => activeIds.has(k)).sort();\n if (twKeys.length) {\n const sanitized = Object.create(null) as Record<string, number>;\n for (const k of twKeys) {\n const w = tw[k];\n sanitized[k] = !Number.isFinite(w) ? 1.0 : Math.max(0, w);\n }\n // Drop default-weight entries (1.0) — spec says missing weights default to 1.0\n const nonDefaultKeys = twKeys.filter(k => sanitized[k] !== 1.0);\n if (nonDefaultKeys.length) {\n normalized.tierWeights = JSON.stringify(sanitized, nonDefaultKeys);\n }\n }\n }\n\n // includeZeroWeightEntities: false and undefined are equivalent in core (both exclude\n // zero-weight entities from scored retrieval). Only key when true so toggling\n // undefined → false does not cause a spurious refetch.\n if (opts.includeZeroWeightEntities === true) {\n normalized.includeZeroWeightEntities = true;\n }\n\n const sortedKeys = Object.keys(normalized).sort();\n return sortedKeys.length ? JSON.stringify(normalized, sortedKeys) : '';\n}\n\nexport function useMemoryRead(entityId: string | string[], query: string, options?: ReadOptions) {\n const wiki = useWiki();\n const [data, setData] = useState<MemoryBundle | null>(null);\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const entityIdRef = useRef(entityId);\n entityIdRef.current = entityId;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n // Stable dep key for entityId: sort+dedup so inline array literals (new reference\n // each render) don't cause spurious refetches. The same set of entity IDs always\n // produces the same key regardless of reference identity or insertion order.\n const entityIdKey = Array.isArray(entityId)\n ? [...new Set(entityId)].sort().join('\\0')\n : entityId;\n\n // Serialize a normalized form of options so:\n // - `undefined` and `{}` map to the same string (no spurious refetch)\n // - non-finite hybridWeight (±Infinity, NaN) is coerced to its effective value before\n // stringifying (JSON.stringify turns Infinity/NaN to `null`, losing type information)\n // - keys are sorted so insertion-order differences don't cause spurious refetches\n const optionsStr = normalizeReadOptionsKey(entityId, options);\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: { entityId: string | string[]; query: string } | null;\n }>({ inFlight: false, pending: null });\n\n // Stable scheduler: refs keep it from going stale across renders.\n // In-flight results are never discarded — spec requires them to land before\n // starting the next fetch with latest args.\n const scheduleFetch = useRef(function schedule(eid: string | string[], q: string) {\n const fq = fetchQueue.current;\n if (fq.inFlight) {\n fq.pending = { entityId: eid, query: q };\n return;\n }\n fq.inFlight = true;\n setIsPending(true);\n\n wikiRef.current.read(eid, q, optionsRef.current).then(\n (result) => { setData(result); setError(null); },\n (e: unknown) => { setError(e instanceof Error ? e : new Error(String(e))); }\n ).finally(() => {\n fq.inFlight = false;\n const next = fq.pending;\n fq.pending = null;\n if (next) {\n scheduleFetch.current(next.entityId, next.query);\n } else {\n setIsPending(false);\n }\n });\n });\n\n useEffect(() => {\n scheduleFetch.current(entityIdRef.current, query);\n }, [entityIdKey, query, wiki, optionsStr]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityIdRef.current, query);\n }, [entityIdKey, query]);\n\n return { data, isPending, error, refetch };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { WikiEvent } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\ntype WriteEvent = Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>;\n\nexport function useWikiWrite() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<void | null>(null);\n\n const execute = useCallback(async (entityId: string, event: WriteEvent): Promise<void> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n await wikiRef.current.write(entityId, event);\n setLastResult(undefined);\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n setError(error);\n throw error;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\nexport type MaintenanceResult =\n | { operation: 'librarian' | 'heal'; result: undefined }\n | { operation: 'prune'; result: { entries: number; tasks: number; events: number } };\n\nexport function useWikiMaintenance() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<MaintenanceResult | null>(null);\n // Counter so any overlapping maintenance operation keeps isPending=true until all complete\n const pendingCount = useRef(0);\n\n const runLibrarian = useCallback(async (entityId: string, options?: { promptOverride?: string }): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await (options ? wikiRef.current.runLibrarian(entityId, options) : wikiRef.current.runLibrarian(entityId));\n setLastResult({ operation: 'librarian', result: undefined });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n const runHeal = useCallback(async (entityId: string, options?: { promptOverride?: string }): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await (options ? wikiRef.current.runHeal(entityId, options) : wikiRef.current.runHeal(entityId));\n setLastResult({ operation: 'heal', result: undefined });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n const runPrune = useCallback(\n async (\n entityId: string,\n options?: {\n retainSoftDeletedFor?: number | null;\n retainEventsFor?: number | null;\n vacuum?: boolean;\n }\n ): Promise<{ entries: number; tasks: number; events: number }> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.runPrune(entityId, options);\n setLastResult({ operation: 'prune', result });\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n },\n []\n );\n\n const runReembed = useCallback(async (entityId?: string, opts?: { force?: boolean; skipExisting?: boolean }): Promise<{ embedded: number; skipped: number; failed: number }> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n // runReembed returns its result directly; it does not update the shared\n // MaintenanceResult/lastResult field (which only tracks librarian, heal, prune).\n // Using the return value directly avoids widening the MaintenanceResult union\n // in a way that would break existing consumers that exhaustively switch on\n // lastResult.operation.\n return await wikiRef.current.runReembed(entityId, opts);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n return { runLibrarian, runHeal, runPrune, runReembed, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\ninterface IngestParams {\n sourceRef: string;\n sourceHash: string;\n documentChunk: string;\n maxChunkLength?: number;\n promptOverride?: string;\n}\n\ntype IngestResult = { truncated: boolean; chunks: number };\n\nexport function useWikiIngest() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<IngestResult | null>(null);\n\n const execute = useCallback(async (entityId: string, params: IngestParams): Promise<IngestResult> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.ingestDocument(entityId, params);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\ninterface ForgetParams {\n entryId?: string;\n taskId?: string;\n sourceRef?: string;\n sourceHash?: string;\n clearAll?: boolean;\n}\n\ntype ForgetResult = { deleted: { entries: number; tasks: number } };\n\nexport function useWikiForget() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<ForgetResult | null>(null);\n\n const execute = useCallback(async (entityId: string, params: ForgetParams): Promise<ForgetResult> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.forget(entityId, params);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\nimport type { MemoryDump } from '@equationalapplications/core-llm-wiki';\n\nexport function useWikiExport() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<MemoryDump | null>(null);\n\n const execute = useCallback(async (entityIds?: string[]): Promise<MemoryDump> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.exportDump(entityIds);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\nexport function useWikiHasChanged() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<boolean | null>(null);\n\n const execute = useCallback(\n async (entityId: string, sourceRef: string, sourceHash: string): Promise<boolean> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.hasChanged(entityId, sourceRef, sourceHash);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n },\n []\n );\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useEffect } from 'react';\nimport { useWiki } from './WikiContext';\nimport type { EntityStatus } from '@equationalapplications/core-llm-wiki';\n\nexport function useEntityStatus(entityId: string): EntityStatus {\n const wiki = useWiki();\n const [snapshot, setSnapshot] = useState(() => ({\n wiki,\n entityId,\n status: wiki.getEntityStatus(entityId),\n }));\n\n useEffect(() => {\n setSnapshot({ wiki, entityId, status: wiki.getEntityStatus(entityId) });\n return wiki.subscribeEntityStatus(entityId, (status) => {\n setSnapshot({ wiki, entityId, status });\n });\n }, [wiki, entityId]);\n\n return snapshot.wiki === wiki && snapshot.entityId === entityId\n ? snapshot.status\n : wiki.getEntityStatus(entityId);\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { OntologyManifest, OntologyMode } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Reactive state returned by {@link useOntologyManifest}.\n */\nexport interface OntologyManifestState {\n /** Resolved manifest, or `null` when `getOntologyManifest` returns `null`. */\n manifest: OntologyManifest | null;\n /** Resolved mode, or `null` when no manifest row/seed applies. */\n mode: OntologyMode | null;\n isPending: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n/**\n * Reactive read hook for an entity's ontology manifest and mode.\n * Fetches on mount and whenever `entityId` or `wiki` changes.\n * Call `refetch()` after mutations (e.g. {@link useSetOntologyManifest}) to refresh.\n */\nexport function useOntologyManifest(entityId: string): OntologyManifestState {\n const wiki = useWiki();\n const [manifest, setManifest] = useState<OntologyManifest | null>(null);\n const [mode, setMode] = useState<OntologyMode | null>(null);\n const [isPending, setIsPending] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const entityIdRef = useRef(entityId);\n entityIdRef.current = entityId;\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: string | null;\n }>({ inFlight: false, pending: null });\n\n const scheduleFetch = useRef(function schedule(eid: string) {\n const fq = fetchQueue.current;\n if (fq.inFlight) {\n fq.pending = eid;\n return;\n }\n fq.inFlight = true;\n setIsPending(true);\n\n wikiRef.current.getOntologyManifest(eid).then(\n (result) => {\n if (result) {\n setManifest(result.manifest);\n setMode(result.mode);\n } else {\n setManifest(null);\n setMode(null);\n }\n setError(null);\n },\n (e: unknown) => {\n setError(e instanceof Error ? e : new Error(String(e)));\n },\n ).finally(() => {\n fq.inFlight = false;\n const next = fq.pending;\n fq.pending = null;\n if (next !== null) {\n scheduleFetch.current(next);\n } else {\n setIsPending(false);\n }\n });\n });\n\n useEffect(() => {\n scheduleFetch.current(entityIdRef.current);\n }, [entityId, wiki]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityIdRef.current);\n }, [entityId]);\n\n return { manifest, mode, isPending, error, refetch };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { OntologyManifest, OntologyMode } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Mutation hook for seeding or replacing an entity's ontology manifest.\n * Mirrors the `{ execute, isPending, error, lastResult }` contract of {@link useWikiWrite}.\n * Does not auto-refresh {@link useOntologyManifest} — call `refetch()` after a successful `execute()`.\n */\nexport function useSetOntologyManifest() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<void | null>(null);\n\n const execute = useCallback(async (\n entityId: string,\n manifest: OntologyManifest,\n options?: { mode?: OntologyMode },\n ): Promise<void> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n await wikiRef.current.setOntologyManifest(entityId, manifest, options);\n setLastResult(undefined);\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n setError(error);\n throw error;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n"],"mappings":"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","names":["useState","useCallback","useRef","useRef","useState","useCallback","error","useState","useCallback","useRef","useRef","useState","useCallback","useState","useCallback","useRef","useRef","useState","useCallback","useState","useCallback","useRef","useRef","useState","useCallback","useState","useCallback","useRef","useRef","useState","useCallback","useState","useCallback","useRef","useRef","useState","useCallback","useState","useEffect","useState","useEffect","useState","useEffect","useCallback","useRef","useState","useRef","useEffect","useCallback","useState","useCallback","useRef","useRef","useState","useCallback","error"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/WikiContext.tsx","../src/useMemoryRead.ts","../src/useWikiWrite.ts","../src/useWikiMaintenance.ts","../src/useWikiIngest.ts","../src/useWikiForget.ts","../src/useWikiExport.ts","../src/useWikiHasChanged.ts","../src/useEntityStatus.ts","../src/useOntologyManifest.ts","../src/useSetOntologyManifest.ts","../src/useWikiTraversal.ts"],"sourcesContent":["export * from '@equationalapplications/core-llm-wiki';\nexport { WikiProvider, useWiki } from './WikiContext';\nexport { useMemoryRead } from './useMemoryRead';\nexport { useWikiWrite } from './useWikiWrite';\nexport { useWikiMaintenance } from './useWikiMaintenance';\nexport type { MaintenanceResult } from './useWikiMaintenance';\nexport { useWikiIngest } from './useWikiIngest';\nexport { useWikiForget } from './useWikiForget';\nexport { useWikiExport } from './useWikiExport';\nexport { useWikiHasChanged } from './useWikiHasChanged';\nexport { useEntityStatus } from './useEntityStatus';\nexport { useOntologyManifest } from './useOntologyManifest';\nexport type { OntologyManifestState } from './useOntologyManifest';\nexport { useSetOntologyManifest } from './useSetOntologyManifest';\nexport { useWikiTraversal } from './useWikiTraversal';\nexport type { WikiTraversalState } from './useWikiTraversal';\n","import React, { createContext, useContext, type ReactNode } from 'react';\nimport { WikiMemory } from '@equationalapplications/core-llm-wiki';\n\nconst WikiContext = createContext<WikiMemory | null>(null);\n\nexport function WikiProvider({ wiki, children }: { wiki: WikiMemory; children: ReactNode }) {\n return <WikiContext.Provider value={wiki}>{children}</WikiContext.Provider>;\n}\n\nexport function useWiki(): WikiMemory {\n const wiki = useContext(WikiContext);\n if (!wiki) throw new Error('useWiki must be used within WikiProvider');\n return wiki;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { MemoryBundle, ReadOptions } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Normalize a ReadOptions object to a canonical string suitable for use as a\n * React effect dependency key. Normalization ensures:\n * - `undefined` and `{}` produce the same empty string (no spurious refetch)\n * - Non-serializable numbers are coerced to their effective values before\n * stringifying, matching how WikiMemory.read() resolves them:\n * · maxResults: NaN/±Infinity → 10 (read()'s hardcoded fallback, overrides config)\n * · preFilterLimit: NaN/±Infinity → null (disables config-level limit, same as null)\n * · hybridWeight: NaN → null (explicitly disables config-level weight; distinct from\n * undefined which defers to config); ±Infinity → clamped to 0/1\n * · tierWeights values: non-finite → 1.0, negative → 0 (mirrors core sanitization)\n * · tierWeights keys: projected onto the active entityId set (mirrors core's\n * sanitizeTierWeights which ignores weights for entities not in the request)\n * · tierWeights keys at default weight (1.0) are dropped — spec says missing\n * weights default to 1.0, so explicit 1.0 is behaviorally identical to omission\n * · tierWeights: {} or fully-filtered/all-default result is omitted (same as undefined)\n * · includeZeroWeightEntities: false/undefined are equivalent (both skip zero-weight\n * entities); only true is keyed, matching core's default behavior\n * - Keys are sorted so insertion-order differences never cause spurious refetches\n */\nfunction normalizeReadOptionsKey(entityId: string | string[], opts?: ReadOptions): string {\n if (!opts) return '';\n const normalized: Record<string, unknown> = {};\n\n // maxResults: undefined or null → omit (defer to config/default via ??);\n // non-finite (NaN/±Infinity) → 10 (read()'s hardcoded fallback, bypasses config);\n // finite → clamp to non-negative integer.\n if (opts.maxResults !== undefined && opts.maxResults !== null) {\n normalized.maxResults = Number.isFinite(opts.maxResults)\n ? Math.max(0, Math.trunc(opts.maxResults))\n : 10;\n }\n\n // preFilterLimit: undefined → omit (defer to config);\n // null or non-finite → null (disables config-level limit);\n // finite → clamp to non-negative integer.\n if (opts.preFilterLimit !== undefined) {\n if (opts.preFilterLimit === null || !Number.isFinite(opts.preFilterLimit)) {\n normalized.preFilterLimit = null;\n } else {\n normalized.preFilterLimit = Math.max(0, Math.trunc(opts.preFilterLimit));\n }\n }\n\n // hybridWeight: undefined or null → omit (defer to config via ??);\n // NaN → null (explicitly disables config hybrid weight; distinct from omitting);\n // ±Infinity and out-of-range finite → clamp to [0, 1].\n if (opts.hybridWeight !== undefined && opts.hybridWeight !== null) {\n normalized.hybridWeight = Number.isNaN(opts.hybridWeight)\n ? null\n : Math.max(0, Math.min(1, opts.hybridWeight));\n }\n\n // tierWeights: project onto the active entity set (core's sanitizeTierWeights only\n // considers weights for the requested entityIds, so unrelated keys have no behavioral\n // effect and should not contribute to the dep key). Sanitize values (non-finite → 1.0,\n // negative → 0) and sort keys to avoid spurious refetches from insertion-order or\n // logically-equivalent value differences. Drop entries at the default weight (1.0)\n // because missing weights also default to 1.0 per spec — explicit 1.0 is behaviorally\n // identical to omission. Use Object.create(null) to match core's sanitizeTierWeights\n // and avoid prototype-key edge cases (e.g. entityIds like __proto__). Omit entirely\n // when the projected+filtered result is empty (same as undefined).\n if (opts.tierWeights !== undefined) {\n const activeIds = new Set(Array.isArray(entityId) ? entityId : [entityId]);\n const tw = opts.tierWeights;\n const twKeys = Object.keys(tw).filter(k => activeIds.has(k)).sort();\n if (twKeys.length) {\n const sanitized = Object.create(null) as Record<string, number>;\n for (const k of twKeys) {\n const w = tw[k];\n sanitized[k] = !Number.isFinite(w) ? 1.0 : Math.max(0, w);\n }\n // Drop default-weight entries (1.0) — spec says missing weights default to 1.0\n const nonDefaultKeys = twKeys.filter(k => sanitized[k] !== 1.0);\n if (nonDefaultKeys.length) {\n normalized.tierWeights = JSON.stringify(sanitized, nonDefaultKeys);\n }\n }\n }\n\n // includeZeroWeightEntities: false and undefined are equivalent in core (both exclude\n // zero-weight entities from scored retrieval). Only key when true so toggling\n // undefined → false does not cause a spurious refetch.\n if (opts.includeZeroWeightEntities === true) {\n normalized.includeZeroWeightEntities = true;\n }\n\n const sortedKeys = Object.keys(normalized).sort();\n return sortedKeys.length ? JSON.stringify(normalized, sortedKeys) : '';\n}\n\nexport function useMemoryRead(entityId: string | string[], query: string, options?: ReadOptions) {\n const wiki = useWiki();\n const [data, setData] = useState<MemoryBundle | null>(null);\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const entityIdRef = useRef(entityId);\n entityIdRef.current = entityId;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n // Stable dep key for entityId: sort+dedup so inline array literals (new reference\n // each render) don't cause spurious refetches. The same set of entity IDs always\n // produces the same key regardless of reference identity or insertion order.\n const entityIdKey = Array.isArray(entityId)\n ? [...new Set(entityId)].sort().join('\\0')\n : entityId;\n\n // Serialize a normalized form of options so:\n // - `undefined` and `{}` map to the same string (no spurious refetch)\n // - non-finite hybridWeight (±Infinity, NaN) is coerced to its effective value before\n // stringifying (JSON.stringify turns Infinity/NaN to `null`, losing type information)\n // - keys are sorted so insertion-order differences don't cause spurious refetches\n const optionsStr = normalizeReadOptionsKey(entityId, options);\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: { entityId: string | string[]; query: string } | null;\n }>({ inFlight: false, pending: null });\n\n // Stable scheduler: refs keep it from going stale across renders.\n // In-flight results are never discarded — spec requires them to land before\n // starting the next fetch with latest args.\n const scheduleFetch = useRef(function schedule(eid: string | string[], q: string) {\n const fq = fetchQueue.current;\n if (fq.inFlight) {\n fq.pending = { entityId: eid, query: q };\n return;\n }\n fq.inFlight = true;\n setIsPending(true);\n\n wikiRef.current.read(eid, q, optionsRef.current).then(\n (result) => { setData(result); setError(null); },\n (e: unknown) => { setError(e instanceof Error ? e : new Error(String(e))); }\n ).finally(() => {\n fq.inFlight = false;\n const next = fq.pending;\n fq.pending = null;\n if (next) {\n scheduleFetch.current(next.entityId, next.query);\n } else {\n setIsPending(false);\n }\n });\n });\n\n useEffect(() => {\n scheduleFetch.current(entityIdRef.current, query);\n }, [entityIdKey, query, wiki, optionsStr]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityIdRef.current, query);\n }, [entityIdKey, query]);\n\n return { data, isPending, error, refetch };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { WikiEvent } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\ntype WriteEvent = Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>;\n\nexport function useWikiWrite() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<void | null>(null);\n\n const execute = useCallback(async (entityId: string, event: WriteEvent): Promise<void> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n await wikiRef.current.write(entityId, event);\n setLastResult(undefined);\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n setError(error);\n throw error;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\nexport type MaintenanceResult =\n | { operation: 'librarian' | 'heal'; result: undefined }\n | { operation: 'prune'; result: { entries: number; tasks: number; events: number } };\n\nexport function useWikiMaintenance() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<MaintenanceResult | null>(null);\n // Counter so any overlapping maintenance operation keeps isPending=true until all complete\n const pendingCount = useRef(0);\n\n const runLibrarian = useCallback(async (entityId: string, options?: { promptOverride?: string }): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await (options ? wikiRef.current.runLibrarian(entityId, options) : wikiRef.current.runLibrarian(entityId));\n setLastResult({ operation: 'librarian', result: undefined });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n const runHeal = useCallback(async (entityId: string, options?: { promptOverride?: string }): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await (options ? wikiRef.current.runHeal(entityId, options) : wikiRef.current.runHeal(entityId));\n setLastResult({ operation: 'heal', result: undefined });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n const runPrune = useCallback(\n async (\n entityId: string,\n options?: {\n retainSoftDeletedFor?: number | null;\n retainEventsFor?: number | null;\n vacuum?: boolean;\n }\n ): Promise<{ entries: number; tasks: number; events: number }> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.runPrune(entityId, options);\n setLastResult({ operation: 'prune', result });\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n },\n []\n );\n\n const runReembed = useCallback(async (entityId?: string, opts?: { force?: boolean; skipExisting?: boolean }): Promise<{ embedded: number; skipped: number; failed: number }> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n // runReembed returns its result directly; it does not update the shared\n // MaintenanceResult/lastResult field (which only tracks librarian, heal, prune).\n // Using the return value directly avoids widening the MaintenanceResult union\n // in a way that would break existing consumers that exhaustively switch on\n // lastResult.operation.\n return await wikiRef.current.runReembed(entityId, opts);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n pendingCount.current -= 1;\n if (pendingCount.current === 0) setIsPending(false);\n }\n }, []);\n\n return { runLibrarian, runHeal, runPrune, runReembed, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\ninterface IngestParams {\n sourceRef: string;\n sourceHash: string;\n documentChunk: string;\n maxChunkLength?: number;\n promptOverride?: string;\n}\n\ntype IngestResult = { truncated: boolean; chunks: number };\n\nexport function useWikiIngest() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<IngestResult | null>(null);\n\n const execute = useCallback(async (entityId: string, params: IngestParams): Promise<IngestResult> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.ingestDocument(entityId, params);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\ninterface ForgetParams {\n entryId?: string;\n taskId?: string;\n sourceRef?: string;\n sourceHash?: string;\n clearAll?: boolean;\n}\n\ntype ForgetResult = { deleted: { entries: number; tasks: number } };\n\nexport function useWikiForget() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<ForgetResult | null>(null);\n\n const execute = useCallback(async (entityId: string, params: ForgetParams): Promise<ForgetResult> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.forget(entityId, params);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\nimport type { MemoryDump } from '@equationalapplications/core-llm-wiki';\n\nexport function useWikiExport() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<MemoryDump | null>(null);\n\n const execute = useCallback(async (entityIds?: string[]): Promise<MemoryDump> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.exportDump(entityIds);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useWiki } from './WikiContext';\n\nexport function useWikiHasChanged() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<boolean | null>(null);\n\n const execute = useCallback(\n async (entityId: string, sourceRef: string, sourceHash: string): Promise<boolean> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n const result = await wikiRef.current.hasChanged(entityId, sourceRef, sourceHash);\n setLastResult(result);\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n },\n []\n );\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useEffect } from 'react';\nimport { useWiki } from './WikiContext';\nimport type { EntityStatus } from '@equationalapplications/core-llm-wiki';\n\nexport function useEntityStatus(entityId: string): EntityStatus {\n const wiki = useWiki();\n const [snapshot, setSnapshot] = useState(() => ({\n wiki,\n entityId,\n status: wiki.getEntityStatus(entityId),\n }));\n\n useEffect(() => {\n setSnapshot({ wiki, entityId, status: wiki.getEntityStatus(entityId) });\n return wiki.subscribeEntityStatus(entityId, (status) => {\n setSnapshot({ wiki, entityId, status });\n });\n }, [wiki, entityId]);\n\n return snapshot.wiki === wiki && snapshot.entityId === entityId\n ? snapshot.status\n : wiki.getEntityStatus(entityId);\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { OntologyManifest, OntologyMode } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Reactive state returned by {@link useOntologyManifest}.\n */\nexport interface OntologyManifestState {\n /** Resolved manifest, or `null` when `getOntologyManifest` returns `null`. */\n manifest: OntologyManifest | null;\n /** Resolved mode, or `null` when no manifest row/seed applies. */\n mode: OntologyMode | null;\n isPending: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n/**\n * Reactive read hook for an entity's ontology manifest and mode.\n * Fetches on mount and whenever `entityId` or `wiki` changes.\n * Call `refetch()` after mutations (e.g. {@link useSetOntologyManifest}) to refresh.\n */\nexport function useOntologyManifest(entityId: string): OntologyManifestState {\n const wiki = useWiki();\n const [manifest, setManifest] = useState<OntologyManifest | null>(null);\n const [mode, setMode] = useState<OntologyMode | null>(null);\n const [isPending, setIsPending] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const entityIdRef = useRef(entityId);\n entityIdRef.current = entityId;\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: string | null;\n }>({ inFlight: false, pending: null });\n\n const scheduleFetch = useRef(function schedule(eid: string) {\n const fq = fetchQueue.current;\n if (fq.inFlight) {\n fq.pending = eid;\n return;\n }\n fq.inFlight = true;\n setIsPending(true);\n\n wikiRef.current.getOntologyManifest(eid).then(\n (result) => {\n if (result) {\n setManifest(result.manifest);\n setMode(result.mode);\n } else {\n setManifest(null);\n setMode(null);\n }\n setError(null);\n },\n (e: unknown) => {\n setError(e instanceof Error ? e : new Error(String(e)));\n },\n ).finally(() => {\n fq.inFlight = false;\n const next = fq.pending;\n fq.pending = null;\n if (next !== null) {\n scheduleFetch.current(next);\n } else {\n setIsPending(false);\n }\n });\n });\n\n useEffect(() => {\n scheduleFetch.current(entityIdRef.current);\n }, [entityId, wiki]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityIdRef.current);\n }, [entityId]);\n\n return { manifest, mode, isPending, error, refetch };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { OntologyManifest, OntologyMode } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\n/**\n * Mutation hook for seeding or replacing an entity's ontology manifest.\n * Mirrors the `{ execute, isPending, error, lastResult }` contract of {@link useWikiWrite}.\n * Does not auto-refresh {@link useOntologyManifest} — call `refetch()` after a successful `execute()`.\n */\nexport function useSetOntologyManifest() {\n const wiki = useWiki();\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastResult, setLastResult] = useState<void | null>(null);\n\n const execute = useCallback(async (\n entityId: string,\n manifest: OntologyManifest,\n options?: { mode?: OntologyMode },\n ): Promise<void> => {\n setError(null);\n setIsPending(true);\n setLastResult(null);\n try {\n await wikiRef.current.setOntologyManifest(entityId, manifest, options);\n setLastResult(undefined);\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n setError(error);\n throw error;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n return { execute, lastResult, isPending, error };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { GraphTraversalOptions, WikiFact, WikiEdge } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\nexport interface WikiTraversalState {\n nodes: WikiFact[];\n edges: WikiEdge[];\n isPending: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n/**\n * Stable dep key for a GraphTraversalOptions object so inline object literals\n * (new reference each render) don't cause spurious refetches. Sorted-key\n * JSON.stringify, mirroring normalizeReadOptionsKey in useMemoryRead.ts.\n */\nfunction normalizeTraversalOptionsKey(options: GraphTraversalOptions): string {\n const normalized: Record<string, unknown> = { sourceId: options.sourceId };\n\n if (options.maxDepth !== undefined) normalized.maxDepth = options.maxDepth;\n if (options.direction !== undefined) normalized.direction = options.direction;\n if (options.edgeTypes !== undefined) normalized.edgeTypes = [...options.edgeTypes].sort();\n if (options.maxTraversalNodes !== undefined) normalized.maxTraversalNodes = options.maxTraversalNodes;\n if (options.minTraversalConfidence !== undefined) normalized.minTraversalConfidence = options.minTraversalConfidence;\n if (options.excludeSourceTypes !== undefined) normalized.excludeSourceTypes = [...options.excludeSourceTypes].sort();\n\n const sortedKeys = Object.keys(normalized).sort();\n const sorted: Record<string, unknown> = {};\n for (const k of sortedKeys) {\n sorted[k] = normalized[k];\n }\n // Do not pass sortedKeys as a JSON.stringify replacer — array values would lose\n // their elements because replacer keys must be object property names, not indices.\n return JSON.stringify(sorted);\n}\n\n/**\n * Reactive read hook for graph traversal. Fetches on mount and whenever\n * `entityId` or a stable serialization of `options` changes.\n * Call `refetch()` after mutations that change the underlying edges (e.g. runLibrarian).\n */\nexport function useWikiTraversal(entityId: string, options: GraphTraversalOptions): WikiTraversalState {\n const wiki = useWiki();\n const [nodes, setNodes] = useState<WikiFact[]>([]);\n const [edges, setEdges] = useState<WikiEdge[]>([]);\n const [isPending, setIsPending] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const wikiRef = useRef(wiki);\n wikiRef.current = wiki;\n\n const entityIdRef = useRef(entityId);\n entityIdRef.current = entityId;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const optionsKey = normalizeTraversalOptionsKey(options);\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: { entityId: string; options: GraphTraversalOptions } | null;\n }>({ inFlight: false, pending: null });\n\n // Stable scheduler: refs keep it from going stale across renders.\n // In-flight results are never discarded.\n const scheduleFetch = useRef(function schedule(eid: string, opts: GraphTraversalOptions) {\n const fq = fetchQueue.current;\n if (fq.inFlight) {\n fq.pending = { entityId: eid, options: opts };\n return;\n }\n fq.inFlight = true;\n setIsPending(true);\n\n wikiRef.current.traverseGraph(eid, opts).then(\n (result) => {\n setNodes(result.nodes);\n setEdges(result.edges);\n setError(null);\n },\n (e: unknown) => {\n setNodes([]);\n setEdges([]);\n setError(e instanceof Error ? e : new Error(String(e)));\n },\n ).finally(() => {\n fq.inFlight = false;\n const next = fq.pending;\n fq.pending = null;\n if (next) {\n scheduleFetch.current(next.entityId, next.options);\n } else {\n setIsPending(false);\n }\n });\n });\n\n useEffect(() => {\n scheduleFetch.current(entityIdRef.current, optionsRef.current);\n }, [entityId, optionsKey, wiki]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityIdRef.current, optionsRef.current);\n }, [entityId, optionsKey]);\n\n return { nodes, edges, isPending, error, refetch };\n}\n"],"mappings":"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","names":["useState","useCallback","useRef","useRef","useState","useCallback","error","useState","useCallback","useRef","useRef","useState","useCallback","useState","useCallback","useRef","useRef","useState","useCallback","useState","useCallback","useRef","useRef","useState","useCallback","useState","useCallback","useRef","useRef","useState","useCallback","useState","useCallback","useRef","useRef","useState","useCallback","useState","useEffect","useState","useEffect","useState","useEffect","useCallback","useRef","useState","useRef","useEffect","useCallback","useState","useCallback","useRef","useRef","useState","useCallback","error","useState","useEffect","useCallback","useRef","useState","useRef","useEffect","useCallback"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@equationalapplications/react-llm-wiki",
3
- "version": "4.16.0",
3
+ "version": "4.17.0",
4
4
  "description": "In-browser LLM memory for React web apps. Bring your own SQLite adapter (e.g., sql.js WebAssembly) for a complete, zero-server RAG experience.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -56,7 +56,7 @@
56
56
  "registry": "https://registry.npmjs.org"
57
57
  },
58
58
  "dependencies": {
59
- "@equationalapplications/core-llm-wiki": "4.16.0"
59
+ "@equationalapplications/core-llm-wiki": "4.17.0"
60
60
  },
61
61
  "engines": {
62
62
  "node": ">=20"