{"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 *      · excludeDrafts: keyed whenever set, as a boolean — core resolves it call → config →\n *        false, so an explicit false overrides a config-level true and differs from undefined\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  // excludeDrafts: core resolves `options.excludeDrafts ?? config.excludeDrafts ?? false`,\n  // so undefined/null defer to config while an explicit false overrides it. Key both\n  // booleans so every toggle refetches.\n  if (opts.excludeDrafts !== undefined && opts.excludeDrafts !== null) {\n    normalized.excludeDrafts = opts.excludeDrafts === 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';\nimport type { HealResult, ReembedResult } from '@equationalapplications/core-llm-wiki';\n\nexport type MaintenanceResult =\n  | { operation: 'librarian'; result: undefined }\n  | { operation: 'heal'; result: HealResult }\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 (\n    entityId: string,\n    options?: { promptOverride?: string; batchSize?: number },\n  ): Promise<HealResult> => {\n    setError(null);\n    pendingCount.current += 1;\n    setIsPending(true);\n    setLastResult(null);\n    try {\n      const result = await (options\n        ? wikiRef.current.runHeal(entityId, options)\n        : wikiRef.current.runHeal(entityId));\n      setLastResult({ operation: 'heal', 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  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<ReembedResult> => {\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';\nimport type { ChunkFailure } from '@equationalapplications/core-llm-wiki';\n\ninterface IngestParams {\n  sourceRef: string;\n  sourceHash: string;\n  documentChunk: string;\n  maxChunkLength?: number;\n  promptOverride?: string;\n}\n\n/**\n * Mirrors the widened `IngestDocumentResult` contract: `ingestDocument` no\n * longer throws when a SUBSET of chunks fails — it returns successfully with\n * `failedChunks > 0` and `parseFailures` describing each failed chunk.\n * Consumers of this hook should check `failedChunks`/`parseFailures` on the\n * resolved value; `error` remains reserved for total failure\n * (`WikiIngestEmptyError`) and systemic throws.\n */\ntype IngestResult = {\n  truncated: boolean;\n  chunks: number;\n  ingestedChunks: number;\n  failedChunks: number;\n  duplicateOf?: string;\n  parseFailures?: ChunkFailure[];\n};\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  // Keyed whenever set: core resolves call → config → false, so an explicit false\n  // overrides a config-level true and must not collapse into undefined.\n  if (options.excludeDrafts !== undefined && options.excludeDrafts !== null) {\n    normalized.excludeDrafts = options.excludeDrafts === true;\n  }\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"]}