@equationalapplications/react-llm-wiki 4.15.3 → 4.16.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 +61 -3
- package/dist/index.d.mts +35 -2
- package/dist/index.d.ts +35 -2
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +84 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -16,8 +16,9 @@ In-browser LLM memory for React web apps. Bring your own SQLite adapter (e.g., [
|
|
|
16
16
|
- **Retrieval tuning** — Per-call overrides for hybrid scoring, pre-filtering, result limits, and tier weights
|
|
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
|
+
- **Seeded ontologies** — Enforce strict taxonomies or allow emergent graph relationship extraction (`useOntologyManifest`, `useSetOntologyManifest`; Strict, Emergent, or Off; defaults to Off).
|
|
19
20
|
- **Reactive reads** — Auto-refetch on `entityId`, query, or `options` changes
|
|
20
|
-
- **Mutation hooks** — `useWikiWrite`, `useWikiIngest`, `useWikiForget`, `useWikiMaintenance`, etc.
|
|
21
|
+
- **Mutation hooks** — `useWikiWrite`, `useWikiIngest`, `useWikiForget`, `useWikiMaintenance`, `useSetOntologyManifest`, etc.
|
|
21
22
|
- **Shared context** — Single `WikiProvider` per app, use anywhere
|
|
22
23
|
- **Full-featured memory** — Facts, tasks, events, maintenance jobs (librarian, heal, reembed, prune)
|
|
23
24
|
- **Interoperability:** Supports [Open Knowledge Format (OKF) v0.1](https://github.com/GoogleCloudPlatform/knowledge-catalog/tree/main/okf) import and export.
|
|
@@ -354,6 +355,52 @@ if (ingesting || librarian || heal) {
|
|
|
354
355
|
}
|
|
355
356
|
```
|
|
356
357
|
|
|
358
|
+
### `useOntologyManifest(entityId)`
|
|
359
|
+
|
|
360
|
+
Reactive read — fetches on mount and when `entityId` or `wiki` changes:
|
|
361
|
+
|
|
362
|
+
```typescript
|
|
363
|
+
import { useOntologyManifest } from '@equationalapplications/react-llm-wiki';
|
|
364
|
+
|
|
365
|
+
const { manifest, mode, isPending, error, refetch } = useOntologyManifest('user-123');
|
|
366
|
+
// manifest: OntologyManifest | null
|
|
367
|
+
// mode: OntologyMode | null ('strict' | 'emergent' | 'off' when present)
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
Note: `manifest` and `mode` are `null` when the entity has no persisted or seeded manifest (`getOntologyManifest` returned `null`). Call `refetch()` after mutations to refresh.
|
|
371
|
+
|
|
372
|
+
### `useSetOntologyManifest()`
|
|
373
|
+
|
|
374
|
+
Mutation — same `{ execute, isPending, error, lastResult }` contract as `useWikiWrite`:
|
|
375
|
+
|
|
376
|
+
```typescript
|
|
377
|
+
import { useOntologyManifest, useSetOntologyManifest } from '@equationalapplications/react-llm-wiki';
|
|
378
|
+
|
|
379
|
+
export function OntologySettings({ entityId }: { entityId: string }) {
|
|
380
|
+
const { manifest, mode, refetch } = useOntologyManifest(entityId);
|
|
381
|
+
const { execute, isPending, error } = useSetOntologyManifest();
|
|
382
|
+
|
|
383
|
+
const handleSave = async () => {
|
|
384
|
+
await execute(entityId, {
|
|
385
|
+
node_types: [{ type: 'person', description: 'An individual.' }],
|
|
386
|
+
edge_types: [{
|
|
387
|
+
type: 'reports_to',
|
|
388
|
+
source_type: 'person',
|
|
389
|
+
target_type: 'person',
|
|
390
|
+
description: 'Reporting hierarchy.',
|
|
391
|
+
}],
|
|
392
|
+
}, { mode: 'strict' });
|
|
393
|
+
refetch();
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
// render manifest/mode; wire handleSave to a save button
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
Global defaults and `seedManifests` bootstrap are configured at construction time via `createWiki(..., { config: { ontology: ... } })`. See the [core package README § Per-Entity Seeded Ontology](https://github.com/equationalapplications/expo-llm-wiki/blob/main/packages/core/README.md#per-entity-seeded-ontology) for mode semantics and manifest schema.
|
|
401
|
+
|
|
402
|
+
`useSetOntologyManifest` does not automatically refresh `useOntologyManifest` — call `refetch()` after a successful `execute()`, same as `useWikiWrite` + `useMemoryRead`.
|
|
403
|
+
|
|
357
404
|
## Multi-Entity Reads
|
|
358
405
|
|
|
359
406
|
`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:
|
|
@@ -391,6 +438,8 @@ flowchart TD
|
|
|
391
438
|
C -->|"useWikiIngest()"| F["[Ingest Document]"]
|
|
392
439
|
C -->|"useWikiForget()"| G["[Delete Memory]"]
|
|
393
440
|
C -->|"useWikiMaintenance()"| H["[Run Jobs]"]
|
|
441
|
+
C -->|"useOntologyManifest(entityId)"| S["[Read Ontology]"]
|
|
442
|
+
C -->|"useSetOntologyManifest()"| T["[Update Ontology]"]
|
|
394
443
|
D --> I{"entityId, query,<br/>ReadOptions, or wiki changed?"}
|
|
395
444
|
I -->|"Yes"| J["Auto-refetch"]
|
|
396
445
|
I -->|"No"| K["Return cached data"]
|
|
@@ -399,10 +448,17 @@ flowchart TD
|
|
|
399
448
|
M --> N["Phase 1: Score facts<br/>Phase 2: Fetch winners"]
|
|
400
449
|
N --> O["Update component state"]
|
|
401
450
|
O --> P["Re-render with data"]
|
|
451
|
+
S --> I2{"entityId or wiki changed?"}
|
|
452
|
+
I2 -->|"Yes"| J2["Auto-refetch"]
|
|
453
|
+
I2 -->|"No"| K2["Return cached manifest/mode"]
|
|
454
|
+
J2 --> L2["Trigger getOntologyManifest()"]
|
|
455
|
+
L2 --> O2["Update component state"]
|
|
456
|
+
O2 --> P2["Re-render with manifest/mode"]
|
|
402
457
|
E --> Q["Execute write()"]
|
|
403
458
|
F --> Q
|
|
404
459
|
G --> Q
|
|
405
460
|
H --> Q
|
|
461
|
+
T --> Q
|
|
406
462
|
Q --> R["Write completes"]
|
|
407
463
|
```
|
|
408
464
|
|
|
@@ -410,8 +466,10 @@ flowchart TD
|
|
|
410
466
|
1. **Wrap app** with `<WikiProvider wiki={wiki}>` — provides wiki context
|
|
411
467
|
2. **Use hooks** in components — access memory reactively
|
|
412
468
|
3. **Read operations** auto-refetch when `entityId`, `query`, `wiki`, or `ReadOptions` values change; call `refetch()` to refresh manually
|
|
413
|
-
4. **
|
|
414
|
-
5. **
|
|
469
|
+
4. **Ontology reads** auto-refetch when `entityId` or `wiki` changes; call `refetch()` manually after ontology mutations
|
|
470
|
+
5. **Write operations** (write, ingest, forget, maintenance) do not automatically re-trigger `useMemoryRead`; call `refetch()` after a write to refresh read results
|
|
471
|
+
6. **Ontology writes** (`useSetOntologyManifest`) do not automatically re-trigger `useOntologyManifest` in the same component unless `refetch()` is called after `execute()` succeeds
|
|
472
|
+
7. **Re-render** with new data flowing back to UI
|
|
415
473
|
|
|
416
474
|
## Retrieval Engine Internals
|
|
417
475
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent, MemoryDump, EntityStatus } from '@equationalapplications/core-llm-wiki';
|
|
1
|
+
import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent, MemoryDump, EntityStatus, OntologyManifest, OntologyMode } 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';
|
|
@@ -118,4 +118,37 @@ declare function useWikiHasChanged(): {
|
|
|
118
118
|
|
|
119
119
|
declare function useEntityStatus(entityId: string): EntityStatus;
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
/**
|
|
122
|
+
* Reactive state returned by {@link useOntologyManifest}.
|
|
123
|
+
*/
|
|
124
|
+
interface OntologyManifestState {
|
|
125
|
+
/** Resolved manifest, or `null` when `getOntologyManifest` returns `null`. */
|
|
126
|
+
manifest: OntologyManifest | null;
|
|
127
|
+
/** Resolved mode, or `null` when no manifest row/seed applies. */
|
|
128
|
+
mode: OntologyMode | null;
|
|
129
|
+
isPending: boolean;
|
|
130
|
+
error: Error | null;
|
|
131
|
+
refetch: () => void;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Reactive read hook for an entity's ontology manifest and mode.
|
|
135
|
+
* Fetches on mount and whenever `entityId` or `wiki` changes.
|
|
136
|
+
* Call `refetch()` after mutations (e.g. {@link useSetOntologyManifest}) to refresh.
|
|
137
|
+
*/
|
|
138
|
+
declare function useOntologyManifest(entityId: string): OntologyManifestState;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Mutation hook for seeding or replacing an entity's ontology manifest.
|
|
142
|
+
* Mirrors the `{ execute, isPending, error, lastResult }` contract of {@link useWikiWrite}.
|
|
143
|
+
* Does not auto-refresh {@link useOntologyManifest} — call `refetch()` after a successful `execute()`.
|
|
144
|
+
*/
|
|
145
|
+
declare function useSetOntologyManifest(): {
|
|
146
|
+
execute: (entityId: string, manifest: OntologyManifest, options?: {
|
|
147
|
+
mode?: OntologyMode;
|
|
148
|
+
}) => Promise<void>;
|
|
149
|
+
lastResult: void | null;
|
|
150
|
+
isPending: boolean;
|
|
151
|
+
error: Error | null;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export { type MaintenanceResult, type OntologyManifestState, WikiProvider, useEntityStatus, useMemoryRead, useOntologyManifest, useSetOntologyManifest, useWiki, useWikiExport, useWikiForget, useWikiHasChanged, useWikiIngest, useWikiMaintenance, useWikiWrite };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent, MemoryDump, EntityStatus } from '@equationalapplications/core-llm-wiki';
|
|
1
|
+
import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent, MemoryDump, EntityStatus, OntologyManifest, OntologyMode } 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';
|
|
@@ -118,4 +118,37 @@ declare function useWikiHasChanged(): {
|
|
|
118
118
|
|
|
119
119
|
declare function useEntityStatus(entityId: string): EntityStatus;
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
/**
|
|
122
|
+
* Reactive state returned by {@link useOntologyManifest}.
|
|
123
|
+
*/
|
|
124
|
+
interface OntologyManifestState {
|
|
125
|
+
/** Resolved manifest, or `null` when `getOntologyManifest` returns `null`. */
|
|
126
|
+
manifest: OntologyManifest | null;
|
|
127
|
+
/** Resolved mode, or `null` when no manifest row/seed applies. */
|
|
128
|
+
mode: OntologyMode | null;
|
|
129
|
+
isPending: boolean;
|
|
130
|
+
error: Error | null;
|
|
131
|
+
refetch: () => void;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Reactive read hook for an entity's ontology manifest and mode.
|
|
135
|
+
* Fetches on mount and whenever `entityId` or `wiki` changes.
|
|
136
|
+
* Call `refetch()` after mutations (e.g. {@link useSetOntologyManifest}) to refresh.
|
|
137
|
+
*/
|
|
138
|
+
declare function useOntologyManifest(entityId: string): OntologyManifestState;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Mutation hook for seeding or replacing an entity's ontology manifest.
|
|
142
|
+
* Mirrors the `{ execute, isPending, error, lastResult }` contract of {@link useWikiWrite}.
|
|
143
|
+
* Does not auto-refresh {@link useOntologyManifest} — call `refetch()` after a successful `execute()`.
|
|
144
|
+
*/
|
|
145
|
+
declare function useSetOntologyManifest(): {
|
|
146
|
+
execute: (entityId: string, manifest: OntologyManifest, options?: {
|
|
147
|
+
mode?: OntologyMode;
|
|
148
|
+
}) => Promise<void>;
|
|
149
|
+
lastResult: void | null;
|
|
150
|
+
isPending: boolean;
|
|
151
|
+
error: Error | null;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export { type MaintenanceResult, type OntologyManifestState, WikiProvider, useEntityStatus, useMemoryRead, useOntologyManifest, useSetOntologyManifest, useWiki, useWikiExport, useWikiForget, useWikiHasChanged, useWikiIngest, useWikiMaintenance, useWikiWrite };
|
package/dist/index.js
CHANGED
|
@@ -24,6 +24,8 @@ __export(index_exports, {
|
|
|
24
24
|
WikiProvider: () => WikiProvider,
|
|
25
25
|
useEntityStatus: () => useEntityStatus,
|
|
26
26
|
useMemoryRead: () => useMemoryRead,
|
|
27
|
+
useOntologyManifest: () => useOntologyManifest,
|
|
28
|
+
useSetOntologyManifest: () => useSetOntologyManifest,
|
|
27
29
|
useWiki: () => useWiki,
|
|
28
30
|
useWikiExport: () => useWikiExport,
|
|
29
31
|
useWikiForget: () => useWikiForget,
|
|
@@ -381,11 +383,95 @@ function useEntityStatus(entityId) {
|
|
|
381
383
|
}, [wiki, entityId]);
|
|
382
384
|
return snapshot.wiki === wiki && snapshot.entityId === entityId ? snapshot.status : wiki.getEntityStatus(entityId);
|
|
383
385
|
}
|
|
386
|
+
|
|
387
|
+
// src/useOntologyManifest.ts
|
|
388
|
+
var import_react10 = require("react");
|
|
389
|
+
function useOntologyManifest(entityId) {
|
|
390
|
+
const wiki = useWiki();
|
|
391
|
+
const [manifest, setManifest] = (0, import_react10.useState)(null);
|
|
392
|
+
const [mode, setMode] = (0, import_react10.useState)(null);
|
|
393
|
+
const [isPending, setIsPending] = (0, import_react10.useState)(true);
|
|
394
|
+
const [error, setError] = (0, import_react10.useState)(null);
|
|
395
|
+
const wikiRef = (0, import_react10.useRef)(wiki);
|
|
396
|
+
wikiRef.current = wiki;
|
|
397
|
+
const entityIdRef = (0, import_react10.useRef)(entityId);
|
|
398
|
+
entityIdRef.current = entityId;
|
|
399
|
+
const fetchQueue = (0, import_react10.useRef)({ inFlight: false, pending: null });
|
|
400
|
+
const scheduleFetch = (0, import_react10.useRef)(function schedule(eid) {
|
|
401
|
+
const fq = fetchQueue.current;
|
|
402
|
+
if (fq.inFlight) {
|
|
403
|
+
fq.pending = eid;
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
fq.inFlight = true;
|
|
407
|
+
setIsPending(true);
|
|
408
|
+
wikiRef.current.getOntologyManifest(eid).then(
|
|
409
|
+
(result) => {
|
|
410
|
+
if (result) {
|
|
411
|
+
setManifest(result.manifest);
|
|
412
|
+
setMode(result.mode);
|
|
413
|
+
} else {
|
|
414
|
+
setManifest(null);
|
|
415
|
+
setMode(null);
|
|
416
|
+
}
|
|
417
|
+
setError(null);
|
|
418
|
+
},
|
|
419
|
+
(e) => {
|
|
420
|
+
setError(e instanceof Error ? e : new Error(String(e)));
|
|
421
|
+
}
|
|
422
|
+
).finally(() => {
|
|
423
|
+
fq.inFlight = false;
|
|
424
|
+
const next = fq.pending;
|
|
425
|
+
fq.pending = null;
|
|
426
|
+
if (next !== null) {
|
|
427
|
+
scheduleFetch.current(next);
|
|
428
|
+
} else {
|
|
429
|
+
setIsPending(false);
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
});
|
|
433
|
+
(0, import_react10.useEffect)(() => {
|
|
434
|
+
scheduleFetch.current(entityIdRef.current);
|
|
435
|
+
}, [entityId, wiki]);
|
|
436
|
+
const refetch = (0, import_react10.useCallback)(() => {
|
|
437
|
+
scheduleFetch.current(entityIdRef.current);
|
|
438
|
+
}, [entityId]);
|
|
439
|
+
return { manifest, mode, isPending, error, refetch };
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// src/useSetOntologyManifest.ts
|
|
443
|
+
var import_react11 = require("react");
|
|
444
|
+
function useSetOntologyManifest() {
|
|
445
|
+
const wiki = useWiki();
|
|
446
|
+
const wikiRef = (0, import_react11.useRef)(wiki);
|
|
447
|
+
wikiRef.current = wiki;
|
|
448
|
+
const [isPending, setIsPending] = (0, import_react11.useState)(false);
|
|
449
|
+
const [error, setError] = (0, import_react11.useState)(null);
|
|
450
|
+
const [lastResult, setLastResult] = (0, import_react11.useState)(null);
|
|
451
|
+
const execute = (0, import_react11.useCallback)(async (entityId, manifest, options) => {
|
|
452
|
+
setError(null);
|
|
453
|
+
setIsPending(true);
|
|
454
|
+
setLastResult(null);
|
|
455
|
+
try {
|
|
456
|
+
await wikiRef.current.setOntologyManifest(entityId, manifest, options);
|
|
457
|
+
setLastResult(void 0);
|
|
458
|
+
} catch (e) {
|
|
459
|
+
const error2 = e instanceof Error ? e : new Error(String(e));
|
|
460
|
+
setError(error2);
|
|
461
|
+
throw error2;
|
|
462
|
+
} finally {
|
|
463
|
+
setIsPending(false);
|
|
464
|
+
}
|
|
465
|
+
}, []);
|
|
466
|
+
return { execute, lastResult, isPending, error };
|
|
467
|
+
}
|
|
384
468
|
// Annotate the CommonJS export names for ESM import in node:
|
|
385
469
|
0 && (module.exports = {
|
|
386
470
|
WikiProvider,
|
|
387
471
|
useEntityStatus,
|
|
388
472
|
useMemoryRead,
|
|
473
|
+
useOntologyManifest,
|
|
474
|
+
useSetOntologyManifest,
|
|
389
475
|
useWiki,
|
|
390
476
|
useWikiExport,
|
|
391
477
|
useWikiForget,
|
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"],"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';\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"],"mappings":"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","names":["import_react","import_react","error","import_react","import_react","import_react","import_react","import_react","import_react"]}
|
|
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":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAc,kDAAd;;;ACAA,mBAAiE;AAMxD;AAHT,IAAM,kBAAc,4BAAiC,IAAI;AAElD,SAAS,aAAa,EAAE,MAAM,SAAS,GAA8C;AAC1F,SAAO,4CAAC,YAAY,UAAZ,EAAqB,OAAO,MAAO,UAAS;AACtD;AAEO,SAAS,UAAsB;AACpC,QAAM,WAAO,yBAAW,WAAW;AACnC,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,0CAA0C;AACrE,SAAO;AACT;;;ACbA,IAAAA,gBAAyD;AAwBzD,SAAS,wBAAwB,UAA6B,MAA4B;AACxF,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,aAAsC,CAAC;AAK7C,MAAI,KAAK,eAAe,UAAa,KAAK,eAAe,MAAM;AAC7D,eAAW,aAAa,OAAO,SAAS,KAAK,UAAU,IACnD,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,UAAU,CAAC,IACvC;AAAA,EACN;AAKA,MAAI,KAAK,mBAAmB,QAAW;AACrC,QAAI,KAAK,mBAAmB,QAAQ,CAAC,OAAO,SAAS,KAAK,cAAc,GAAG;AACzE,iBAAW,iBAAiB;AAAA,IAC9B,OAAO;AACL,iBAAW,iBAAiB,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,cAAc,CAAC;AAAA,IACzE;AAAA,EACF;AAKA,MAAI,KAAK,iBAAiB,UAAa,KAAK,iBAAiB,MAAM;AACjE,eAAW,eAAe,OAAO,MAAM,KAAK,YAAY,IACpD,OACA,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,YAAY,CAAC;AAAA,EAChD;AAWA,MAAI,KAAK,gBAAgB,QAAW;AAClC,UAAM,YAAY,IAAI,IAAI,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC;AACzE,UAAM,KAAK,KAAK;AAChB,UAAM,SAAS,OAAO,KAAK,EAAE,EAAE,OAAO,OAAK,UAAU,IAAI,CAAC,CAAC,EAAE,KAAK;AAClE,QAAI,OAAO,QAAQ;AACjB,YAAM,YAAY,uBAAO,OAAO,IAAI;AACpC,iBAAW,KAAK,QAAQ;AACtB,cAAM,IAAI,GAAG,CAAC;AACd,kBAAU,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,IAAI,IAAM,KAAK,IAAI,GAAG,CAAC;AAAA,MAC1D;AAEA,YAAM,iBAAiB,OAAO,OAAO,OAAK,UAAU,CAAC,MAAM,CAAG;AAC9D,UAAI,eAAe,QAAQ;AACzB,mBAAW,cAAc,KAAK,UAAU,WAAW,cAAc;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAKA,MAAI,KAAK,8BAA8B,MAAM;AAC3C,eAAW,4BAA4B;AAAA,EACzC;AAEA,QAAM,aAAa,OAAO,KAAK,UAAU,EAAE,KAAK;AAChD,SAAO,WAAW,SAAS,KAAK,UAAU,YAAY,UAAU,IAAI;AACtE;AAEO,SAAS,cAAc,UAA6B,OAAe,SAAuB;AAC/F,QAAM,OAAO,QAAQ;AACrB,QAAM,CAAC,MAAM,OAAO,QAAI,wBAA8B,IAAI;AAC1D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,cAAU,sBAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,kBAAc,sBAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,QAAM,iBAAa,sBAAO,OAAO;AACjC,aAAW,UAAU;AAKrB,QAAM,cAAc,MAAM,QAAQ,QAAQ,IACtC,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,IACvC;AAOJ,QAAM,aAAa,wBAAwB,UAAU,OAAO;AAE5D,QAAM,iBAAa,sBAGhB,EAAE,UAAU,OAAO,SAAS,KAAK,CAAC;AAKrC,QAAM,oBAAgB,sBAAO,SAAS,SAAS,KAAwB,GAAW;AAChF,UAAM,KAAK,WAAW;AACtB,QAAI,GAAG,UAAU;AACf,SAAG,UAAU,EAAE,UAAU,KAAK,OAAO,EAAE;AACvC;AAAA,IACF;AACA,OAAG,WAAW;AACd,iBAAa,IAAI;AAEjB,YAAQ,QAAQ,KAAK,KAAK,GAAG,WAAW,OAAO,EAAE;AAAA,MAC/C,CAAC,WAAW;AAAE,gBAAQ,MAAM;AAAG,iBAAS,IAAI;AAAA,MAAG;AAAA,MAC/C,CAAC,MAAe;AAAE,iBAAS,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;AAAA,MAAG;AAAA,IAC7E,EAAE,QAAQ,MAAM;AACd,SAAG,WAAW;AACd,YAAM,OAAO,GAAG;AAChB,SAAG,UAAU;AACb,UAAI,MAAM;AACR,sBAAc,QAAQ,KAAK,UAAU,KAAK,KAAK;AAAA,MACjD,OAAO;AACL,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,+BAAU,MAAM;AACd,kBAAc,QAAQ,YAAY,SAAS,KAAK;AAAA,EAClD,GAAG,CAAC,aAAa,OAAO,MAAM,UAAU,CAAC;AAEzC,QAAM,cAAU,2BAAY,MAAM;AAChC,kBAAc,QAAQ,YAAY,SAAS,KAAK;AAAA,EAClD,GAAG,CAAC,aAAa,KAAK,CAAC;AAEvB,SAAO,EAAE,MAAM,WAAW,OAAO,QAAQ;AAC3C;;;ACrKA,IAAAC,gBAA8C;AAMvC,SAAS,eAAe;AAC7B,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAU,sBAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AACrD,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAsB,IAAI;AAE9D,QAAM,cAAU,2BAAY,OAAO,UAAkB,UAAqC;AACxF,aAAS,IAAI;AACb,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,QAAQ,QAAQ,MAAM,UAAU,KAAK;AAC3C,oBAAc,MAAS;AAAA,IACzB,SAAS,GAAG;AACV,YAAMC,SAAQ,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AAC1D,eAASA,MAAK;AACd,YAAMA;AAAA,IACR,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,SAAS,YAAY,WAAW,MAAM;AACjD;;;AChCA,IAAAC,gBAA8C;AAOvC,SAAS,qBAAqB;AACnC,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAU,sBAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AACrD,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAmC,IAAI;AAE3E,QAAM,mBAAe,sBAAO,CAAC;AAE7B,QAAM,mBAAe,2BAAY,OAAO,UAAkB,YAAyD;AACjH,aAAS,IAAI;AACb,iBAAa,WAAW;AACxB,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAClB,QAAI;AACF,aAAO,UAAU,QAAQ,QAAQ,aAAa,UAAU,OAAO,IAAI,QAAQ,QAAQ,aAAa,QAAQ;AACxG,oBAAc,EAAE,WAAW,aAAa,QAAQ,OAAU,CAAC;AAAA,IAC7D,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AACxD,eAAS,GAAG;AACZ,YAAM;AAAA,IACR,UAAE;AACA,mBAAa,WAAW;AACxB,UAAI,aAAa,YAAY,EAAG,cAAa,KAAK;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,cAAU,2BAAY,OAAO,UAAkB,YAAyD;AAC5G,aAAS,IAAI;AACb,iBAAa,WAAW;AACxB,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAClB,QAAI;AACF,aAAO,UAAU,QAAQ,QAAQ,QAAQ,UAAU,OAAO,IAAI,QAAQ,QAAQ,QAAQ,QAAQ;AAC9F,oBAAc,EAAE,WAAW,QAAQ,QAAQ,OAAU,CAAC;AAAA,IACxD,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AACxD,eAAS,GAAG;AACZ,YAAM;AAAA,IACR,UAAE;AACA,mBAAa,WAAW;AACxB,UAAI,aAAa,YAAY,EAAG,cAAa,KAAK;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,eAAW;AAAA,IACf,OACE,UACA,YAKgE;AAChE,eAAS,IAAI;AACb,mBAAa,WAAW;AACxB,mBAAa,IAAI;AACjB,oBAAc,IAAI;AAClB,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ,QAAQ,SAAS,UAAU,OAAO;AAC/D,sBAAc,EAAE,WAAW,SAAS,OAAO,CAAC;AAC5C,eAAO;AAAA,MACT,SAAS,GAAG;AACV,cAAM,MAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AACxD,iBAAS,GAAG;AACZ,cAAM;AAAA,MACR,UAAE;AACA,qBAAa,WAAW;AACxB,YAAI,aAAa,YAAY,EAAG,cAAa,KAAK;AAAA,MACpD;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,iBAAa,2BAAY,OAAO,UAAmB,SAAuH;AAC9K,aAAS,IAAI;AACb,iBAAa,WAAW;AACxB,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAClB,QAAI;AAMF,aAAO,MAAM,QAAQ,QAAQ,WAAW,UAAU,IAAI;AAAA,IACxD,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AACxD,eAAS,GAAG;AACZ,YAAM;AAAA,IACR,UAAE;AACA,mBAAa,WAAW;AACxB,UAAI,aAAa,YAAY,EAAG,cAAa,KAAK;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,cAAc,SAAS,UAAU,YAAY,YAAY,WAAW,MAAM;AACrF;;;AC1GA,IAAAC,gBAA8C;AAavC,SAAS,gBAAgB;AAC9B,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAU,sBAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AACrD,QAAM,CAAC,YAAY,aAAa,QAAI,wBAA8B,IAAI;AAEtE,QAAM,cAAU,2BAAY,OAAO,UAAkB,WAAgD;AACnG,aAAS,IAAI;AACb,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,QAAQ,eAAe,UAAU,MAAM;AACpE,oBAAc,MAAM;AACpB,aAAO;AAAA,IACT,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AACxD,eAAS,GAAG;AACZ,YAAM;AAAA,IACR,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,SAAS,YAAY,WAAW,MAAM;AACjD;;;ACxCA,IAAAC,gBAA8C;AAavC,SAAS,gBAAgB;AAC9B,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAU,sBAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AACrD,QAAM,CAAC,YAAY,aAAa,QAAI,wBAA8B,IAAI;AAEtE,QAAM,cAAU,2BAAY,OAAO,UAAkB,WAAgD;AACnG,aAAS,IAAI;AACb,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO,UAAU,MAAM;AAC5D,oBAAc,MAAM;AACpB,aAAO;AAAA,IACT,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AACxD,eAAS,GAAG;AACZ,YAAM;AAAA,IACR,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,SAAS,YAAY,WAAW,MAAM;AACjD;;;ACxCA,IAAAC,gBAA8C;AAIvC,SAAS,gBAAgB;AAC9B,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAU,sBAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AACrD,QAAM,CAAC,YAAY,aAAa,QAAI,wBAA4B,IAAI;AAEpE,QAAM,cAAU,2BAAY,OAAO,cAA8C;AAC/E,aAAS,IAAI;AACb,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,QAAQ,WAAW,SAAS;AACzD,oBAAc,MAAM;AACpB,aAAO;AAAA,IACT,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AACxD,eAAS,GAAG;AACZ,YAAM;AAAA,IACR,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,SAAS,YAAY,WAAW,MAAM;AACjD;;;AC/BA,IAAAC,gBAA8C;AAGvC,SAAS,oBAAoB;AAClC,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAU,sBAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AACrD,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAyB,IAAI;AAEjE,QAAM,cAAU;AAAA,IACd,OAAO,UAAkB,WAAmB,eAAyC;AACnF,eAAS,IAAI;AACb,mBAAa,IAAI;AACjB,oBAAc,IAAI;AAClB,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ,QAAQ,WAAW,UAAU,WAAW,UAAU;AAC/E,sBAAc,MAAM;AACpB,eAAO;AAAA,MACT,SAAS,GAAG;AACV,cAAM,MAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AACxD,iBAAS,GAAG;AACZ,cAAM;AAAA,MACR,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,SAAS,YAAY,WAAW,MAAM;AACjD;;;ACjCA,IAAAC,gBAAoC;AAI7B,SAAS,gBAAgB,UAAgC;AAC9D,QAAM,OAAO,QAAQ;AACrB,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,OAAO;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,QAAQ,KAAK,gBAAgB,QAAQ;AAAA,EACvC,EAAE;AAEF,+BAAU,MAAM;AACd,gBAAY,EAAE,MAAM,UAAU,QAAQ,KAAK,gBAAgB,QAAQ,EAAE,CAAC;AACtE,WAAO,KAAK,sBAAsB,UAAU,CAAC,WAAW;AACtD,kBAAY,EAAE,MAAM,UAAU,OAAO,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,SAAO,SAAS,SAAS,QAAQ,SAAS,aAAa,WACnD,SAAS,SACT,KAAK,gBAAgB,QAAQ;AACnC;;;ACtBA,IAAAC,iBAAyD;AAsBlD,SAAS,oBAAoB,UAAyC;AAC3E,QAAM,OAAO,QAAQ;AACrB,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAkC,IAAI;AACtE,QAAM,CAAC,MAAM,OAAO,QAAI,yBAA8B,IAAI;AAC1D,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAuB,IAAI;AAErD,QAAM,cAAU,uBAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,kBAAc,uBAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,QAAM,iBAAa,uBAGhB,EAAE,UAAU,OAAO,SAAS,KAAK,CAAC;AAErC,QAAM,oBAAgB,uBAAO,SAAS,SAAS,KAAa;AAC1D,UAAM,KAAK,WAAW;AACtB,QAAI,GAAG,UAAU;AACf,SAAG,UAAU;AACb;AAAA,IACF;AACA,OAAG,WAAW;AACd,iBAAa,IAAI;AAEjB,YAAQ,QAAQ,oBAAoB,GAAG,EAAE;AAAA,MACvC,CAAC,WAAW;AACV,YAAI,QAAQ;AACV,sBAAY,OAAO,QAAQ;AAC3B,kBAAQ,OAAO,IAAI;AAAA,QACrB,OAAO;AACL,sBAAY,IAAI;AAChB,kBAAQ,IAAI;AAAA,QACd;AACA,iBAAS,IAAI;AAAA,MACf;AAAA,MACA,CAAC,MAAe;AACd,iBAAS,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;AAAA,MACxD;AAAA,IACF,EAAE,QAAQ,MAAM;AACd,SAAG,WAAW;AACd,YAAM,OAAO,GAAG;AAChB,SAAG,UAAU;AACb,UAAI,SAAS,MAAM;AACjB,sBAAc,QAAQ,IAAI;AAAA,MAC5B,OAAO;AACL,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,gCAAU,MAAM;AACd,kBAAc,QAAQ,YAAY,OAAO;AAAA,EAC3C,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,QAAM,cAAU,4BAAY,MAAM;AAChC,kBAAc,QAAQ,YAAY,OAAO;AAAA,EAC3C,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO,EAAE,UAAU,MAAM,WAAW,OAAO,QAAQ;AACrD;;;ACpFA,IAAAC,iBAA8C;AASvC,SAAS,yBAAyB;AACvC,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAU,uBAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAuB,IAAI;AACrD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAsB,IAAI;AAE9D,QAAM,cAAU,4BAAY,OAC1B,UACA,UACA,YACkB;AAClB,aAAS,IAAI;AACb,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,QAAQ,QAAQ,oBAAoB,UAAU,UAAU,OAAO;AACrE,oBAAc,MAAS;AAAA,IACzB,SAAS,GAAG;AACV,YAAMC,SAAQ,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AAC1D,eAASA,MAAK;AACd,YAAMA;AAAA,IACR,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,SAAS,YAAY,WAAW,MAAM;AACjD;","names":["import_react","import_react","error","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","error"]}
|
package/dist/index.mjs
CHANGED
|
@@ -347,10 +347,94 @@ function useEntityStatus(entityId) {
|
|
|
347
347
|
}, [wiki, entityId]);
|
|
348
348
|
return snapshot.wiki === wiki && snapshot.entityId === entityId ? snapshot.status : wiki.getEntityStatus(entityId);
|
|
349
349
|
}
|
|
350
|
+
|
|
351
|
+
// src/useOntologyManifest.ts
|
|
352
|
+
import { useState as useState9, useEffect as useEffect3, useCallback as useCallback8, useRef as useRef8 } from "react";
|
|
353
|
+
function useOntologyManifest(entityId) {
|
|
354
|
+
const wiki = useWiki();
|
|
355
|
+
const [manifest, setManifest] = useState9(null);
|
|
356
|
+
const [mode, setMode] = useState9(null);
|
|
357
|
+
const [isPending, setIsPending] = useState9(true);
|
|
358
|
+
const [error, setError] = useState9(null);
|
|
359
|
+
const wikiRef = useRef8(wiki);
|
|
360
|
+
wikiRef.current = wiki;
|
|
361
|
+
const entityIdRef = useRef8(entityId);
|
|
362
|
+
entityIdRef.current = entityId;
|
|
363
|
+
const fetchQueue = useRef8({ inFlight: false, pending: null });
|
|
364
|
+
const scheduleFetch = useRef8(function schedule(eid) {
|
|
365
|
+
const fq = fetchQueue.current;
|
|
366
|
+
if (fq.inFlight) {
|
|
367
|
+
fq.pending = eid;
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
fq.inFlight = true;
|
|
371
|
+
setIsPending(true);
|
|
372
|
+
wikiRef.current.getOntologyManifest(eid).then(
|
|
373
|
+
(result) => {
|
|
374
|
+
if (result) {
|
|
375
|
+
setManifest(result.manifest);
|
|
376
|
+
setMode(result.mode);
|
|
377
|
+
} else {
|
|
378
|
+
setManifest(null);
|
|
379
|
+
setMode(null);
|
|
380
|
+
}
|
|
381
|
+
setError(null);
|
|
382
|
+
},
|
|
383
|
+
(e) => {
|
|
384
|
+
setError(e instanceof Error ? e : new Error(String(e)));
|
|
385
|
+
}
|
|
386
|
+
).finally(() => {
|
|
387
|
+
fq.inFlight = false;
|
|
388
|
+
const next = fq.pending;
|
|
389
|
+
fq.pending = null;
|
|
390
|
+
if (next !== null) {
|
|
391
|
+
scheduleFetch.current(next);
|
|
392
|
+
} else {
|
|
393
|
+
setIsPending(false);
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
useEffect3(() => {
|
|
398
|
+
scheduleFetch.current(entityIdRef.current);
|
|
399
|
+
}, [entityId, wiki]);
|
|
400
|
+
const refetch = useCallback8(() => {
|
|
401
|
+
scheduleFetch.current(entityIdRef.current);
|
|
402
|
+
}, [entityId]);
|
|
403
|
+
return { manifest, mode, isPending, error, refetch };
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// src/useSetOntologyManifest.ts
|
|
407
|
+
import { useState as useState10, useCallback as useCallback9, useRef as useRef9 } from "react";
|
|
408
|
+
function useSetOntologyManifest() {
|
|
409
|
+
const wiki = useWiki();
|
|
410
|
+
const wikiRef = useRef9(wiki);
|
|
411
|
+
wikiRef.current = wiki;
|
|
412
|
+
const [isPending, setIsPending] = useState10(false);
|
|
413
|
+
const [error, setError] = useState10(null);
|
|
414
|
+
const [lastResult, setLastResult] = useState10(null);
|
|
415
|
+
const execute = useCallback9(async (entityId, manifest, options) => {
|
|
416
|
+
setError(null);
|
|
417
|
+
setIsPending(true);
|
|
418
|
+
setLastResult(null);
|
|
419
|
+
try {
|
|
420
|
+
await wikiRef.current.setOntologyManifest(entityId, manifest, options);
|
|
421
|
+
setLastResult(void 0);
|
|
422
|
+
} catch (e) {
|
|
423
|
+
const error2 = e instanceof Error ? e : new Error(String(e));
|
|
424
|
+
setError(error2);
|
|
425
|
+
throw error2;
|
|
426
|
+
} finally {
|
|
427
|
+
setIsPending(false);
|
|
428
|
+
}
|
|
429
|
+
}, []);
|
|
430
|
+
return { execute, lastResult, isPending, error };
|
|
431
|
+
}
|
|
350
432
|
export {
|
|
351
433
|
WikiProvider,
|
|
352
434
|
useEntityStatus,
|
|
353
435
|
useMemoryRead,
|
|
436
|
+
useOntologyManifest,
|
|
437
|
+
useSetOntologyManifest,
|
|
354
438
|
useWiki,
|
|
355
439
|
useWikiExport,
|
|
356
440
|
useWikiForget,
|
package/dist/index.mjs.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"],"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';\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"],"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"]}
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@equationalapplications/react-llm-wiki",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.16.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.
|
|
59
|
+
"@equationalapplications/core-llm-wiki": "4.16.0"
|
|
60
60
|
},
|
|
61
61
|
"engines": {
|
|
62
62
|
"node": ">=20"
|