@equationalapplications/react-llm-wiki 2.6.0 → 3.0.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 +268 -19
- package/dist/index.d.mts +10 -2
- package/dist/index.d.ts +10 -2
- package/dist/index.js +42 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +42 -4
- package/dist/index.mjs.map +1 -1
- package/dist/js.d.mts +3 -3
- package/dist/js.d.ts +3 -3
- package/dist/js.js +2 -2
- package/dist/js.js.map +1 -1
- package/dist/js.mjs +2 -2
- package/dist/js.mjs.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
React hooks and web utilities for @equationalapplications/core-llm-wiki, designed for web and Expo.
|
|
4
4
|
|
|
5
|
+
> Inspired by [Andrej Karpathy's LLM Wiki memory spec](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f).
|
|
6
|
+
|
|
5
7
|
## Features
|
|
6
8
|
|
|
7
|
-
- **
|
|
8
|
-
- **
|
|
9
|
+
- **Semantic search** — Vector embeddings with optional `embed` function and MiniSearch fallback
|
|
10
|
+
- **Retrieval tuning** — Per-call overrides for hybrid scoring, pre-filtering, result limits
|
|
11
|
+
- **Reactive reads** — Auto-refetch on `entityId`, query, or `options` changes
|
|
12
|
+
- **Mutation hooks** — `useWikiWrite`, `useWikiIngest`, `useWikiForget`, `useWikiMaintenance`, etc.
|
|
9
13
|
- **Shared context** — Single `WikiProvider` per app, use anywhere
|
|
14
|
+
- **Full-featured memory** — Facts, tasks, events, maintenance jobs (librarian, heal, reembed, prune)
|
|
10
15
|
|
|
11
16
|
## Installation
|
|
12
17
|
|
|
@@ -14,13 +19,51 @@ React hooks and web utilities for @equationalapplications/core-llm-wiki, designe
|
|
|
14
19
|
npm install @equationalapplications/react-llm-wiki
|
|
15
20
|
```
|
|
16
21
|
|
|
22
|
+
## Semantic Search Setup
|
|
23
|
+
|
|
24
|
+
Enable vector-based retrieval by providing an `embed` function in `WikiOptions`:
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { WikiProvider, createWiki } from '@equationalapplications/react-llm-wiki';
|
|
28
|
+
|
|
29
|
+
const wiki = createWiki(adapter, {
|
|
30
|
+
config: {
|
|
31
|
+
preFilterLimit: 50, // Optimize for wikis with 500+ facts
|
|
32
|
+
hybridWeight: 0.7, // Blend semantic (70%) + keyword (30%)
|
|
33
|
+
},
|
|
34
|
+
llmProvider: {
|
|
35
|
+
generateText: async ({ systemPrompt, userPrompt }) => {
|
|
36
|
+
// Your LLM
|
|
37
|
+
return 'Model output';
|
|
38
|
+
},
|
|
39
|
+
embed: async (text: string) => {
|
|
40
|
+
// Your embedding service
|
|
41
|
+
const res = await fetch('https://your-app.example.com/api/embed', {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
body: JSON.stringify({ text })
|
|
44
|
+
});
|
|
45
|
+
const { embedding } = await res.json();
|
|
46
|
+
return embedding; // number[]
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
onRetrievalFallback: (error) => {
|
|
50
|
+
console.warn('Embeddings unavailable, using keyword search:', error);
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
await wiki.setup();
|
|
55
|
+
|
|
56
|
+
<WikiProvider wiki={wiki}>
|
|
57
|
+
<App />
|
|
58
|
+
</WikiProvider>
|
|
59
|
+
```
|
|
60
|
+
|
|
17
61
|
## Setup
|
|
18
62
|
|
|
19
63
|
**React** (with any `SQLiteAdapter`):
|
|
20
64
|
|
|
21
65
|
```typescript
|
|
22
|
-
import { WikiProvider } from '@equationalapplications/react-llm-wiki';
|
|
23
|
-
import { createWiki } from '@equationalapplications/react-llm-wiki';
|
|
66
|
+
import { WikiProvider, createWiki } from '@equationalapplications/react-llm-wiki';
|
|
24
67
|
|
|
25
68
|
// Create wiki instance and initialize tables
|
|
26
69
|
const wiki = createWiki(adapter, options);
|
|
@@ -47,63 +90,196 @@ await wiki.setup();
|
|
|
47
90
|
</WikiProvider>
|
|
48
91
|
```
|
|
49
92
|
|
|
93
|
+
## Configuration
|
|
94
|
+
|
|
95
|
+
All `WikiConfig` fields are optional:
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
const wiki = createWiki(adapter, {
|
|
99
|
+
llmProvider: { /* ... */ },
|
|
100
|
+
config: {
|
|
101
|
+
tablePrefix: 'llm_wiki_', // default: 'llm_wiki_'
|
|
102
|
+
maxResults: 10, // default: 10
|
|
103
|
+
autoLibrarianThreshold: 20, // default: 20 — events before librarian auto-runs
|
|
104
|
+
autoHealThreshold: 100, // default: 100 — events before heal auto-runs
|
|
105
|
+
maxChunkLength: 12000, // default: 12000 (char count per ingestDocument chunk)
|
|
106
|
+
chunkOverlap: 400, // default: 400 (overlap between chunks in characters)
|
|
107
|
+
chunkConcurrency: 1, // default: 1 (parallel LLM calls per ingestDocument)
|
|
108
|
+
pruneRetainSoftDeletedFor: 7, // default: 7 (days before hard-deleting soft-deleted facts)
|
|
109
|
+
pruneEventsAfter: 30, // default: 30 (days before hard-deleting old events)
|
|
110
|
+
orphanAfterDays: 30, // default: 30 (days before runHeal flags sourceless facts; null to disable)
|
|
111
|
+
staleInferredAfterDays: 60, // default: 60 (days before runHeal downgrades inferred facts; null to disable)
|
|
112
|
+
preFilterLimit: 50, // default: undefined — MiniSearch pre-filter before cosine scan; recommended for >500 facts
|
|
113
|
+
hybridWeight: 0.7, // default: undefined — blend semantic (1.0) ↔ keyword (0.0); pure semantic when unset
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Retrieval Tuning
|
|
119
|
+
|
|
120
|
+
Optimize `read()` performance and blend retrieval strategies:
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
const config = {
|
|
124
|
+
// Limit cosine similarity scoring to top-K MiniSearch keyword candidates
|
|
125
|
+
preFilterLimit: 50,
|
|
126
|
+
|
|
127
|
+
// Blend semantic and keyword scores (0.0 = pure keyword, 1.0 = pure semantic)
|
|
128
|
+
hybridWeight: 0.7,
|
|
129
|
+
|
|
130
|
+
// Max results returned per read
|
|
131
|
+
maxResults: 10,
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const wiki = createWiki(adapter, {
|
|
135
|
+
config,
|
|
136
|
+
llmProvider: { /* ... */ },
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Hybrid scoring blends:**
|
|
141
|
+
- `hybridWeight: 1.0` → pure semantic scoring among the candidates being scored; if `preFilterLimit` is set, semantic scoring is still limited to the top-K MiniSearch matches
|
|
142
|
+
- `hybridWeight: 0.5` → balanced semantic + keyword (50/50 blend)
|
|
143
|
+
- `hybridWeight: 0.0` → pure keyword ranking, skips `embed()` entirely (no LLM API cost)
|
|
144
|
+
|
|
145
|
+
**Per-call overrides:**
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
const { data } = useMemoryRead('user-123', 'preferences', {
|
|
149
|
+
maxResults: 5,
|
|
150
|
+
preFilterLimit: 20, // Tighter pre-filter for speed
|
|
151
|
+
hybridWeight: 0.5, // More keyword weight
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
50
155
|
## Hooks
|
|
51
156
|
|
|
52
|
-
### `useMemoryRead(entityId, query)`
|
|
157
|
+
### `useMemoryRead(entityId, query, options?)`
|
|
53
158
|
|
|
54
|
-
Fetch memory reactively.
|
|
159
|
+
Fetch memory reactively. Auto-refetches when `entityId`, `query`, `wiki`, or `options` change, including per-call overrides such as `maxResults`, `preFilterLimit`, and `hybridWeight`.
|
|
55
160
|
|
|
56
161
|
```typescript
|
|
57
162
|
const { data, isPending, error, refetch } = useMemoryRead('user-123', 'preferences');
|
|
163
|
+
|
|
164
|
+
if (isPending) return <div>Loading...</div>;
|
|
165
|
+
if (error) return <div>Error: {error.message}</div>;
|
|
166
|
+
|
|
167
|
+
return (
|
|
168
|
+
<div>
|
|
169
|
+
{data?.facts.map(fact => (
|
|
170
|
+
<div key={fact.id}>
|
|
171
|
+
<strong>{fact.title}</strong>: {fact.body}
|
|
172
|
+
</div>
|
|
173
|
+
))}
|
|
174
|
+
</div>
|
|
175
|
+
);
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**With tuning overrides:**
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
const { data } = useMemoryRead('user-123', 'preferences', {
|
|
182
|
+
maxResults: 5,
|
|
183
|
+
hybridWeight: 0.8,
|
|
184
|
+
});
|
|
58
185
|
```
|
|
59
186
|
|
|
60
187
|
### `useWikiWrite()`
|
|
61
188
|
|
|
62
|
-
|
|
189
|
+
Record observations and events. The librarian job extracts facts from accumulated events. This does not currently invalidate `useMemoryRead()` results automatically, so existing readers keep their previous `data` until their inputs change or `refetch()` is called.
|
|
63
190
|
|
|
64
191
|
```typescript
|
|
65
192
|
const { execute, isPending, error } = useWikiWrite();
|
|
66
|
-
|
|
193
|
+
|
|
194
|
+
const handleSave = async () => {
|
|
195
|
+
try {
|
|
196
|
+
await execute('user-123', {
|
|
197
|
+
event_type: 'observation',
|
|
198
|
+
summary: 'User prefers async/await'
|
|
199
|
+
});
|
|
200
|
+
} catch (e) {
|
|
201
|
+
console.error('Write failed:', e);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
return <button onClick={handleSave} disabled={isPending}>Save</button>;
|
|
67
206
|
```
|
|
68
207
|
|
|
69
208
|
### `useWikiIngest()`
|
|
70
209
|
|
|
71
|
-
Ingest documents.
|
|
210
|
+
Ingest documents into memory. Parses facts and tasks from document chunks.
|
|
72
211
|
|
|
73
212
|
```typescript
|
|
74
213
|
const { execute, isPending, error } = useWikiIngest();
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
sourceHash
|
|
78
|
-
|
|
79
|
-
|
|
214
|
+
|
|
215
|
+
const handleIngest = async (document: string) => {
|
|
216
|
+
const sourceHash = await calculateHash(document);
|
|
217
|
+
try {
|
|
218
|
+
await execute('user-123', {
|
|
219
|
+
sourceRef: 'doc-readme',
|
|
220
|
+
sourceHash,
|
|
221
|
+
documentChunk: document,
|
|
222
|
+
});
|
|
223
|
+
} catch (e) {
|
|
224
|
+
console.error('Ingest failed:', e);
|
|
225
|
+
}
|
|
226
|
+
};
|
|
80
227
|
```
|
|
81
228
|
|
|
82
229
|
### `useWikiForget()`
|
|
83
230
|
|
|
84
|
-
|
|
231
|
+
Delete entries from memory by ID.
|
|
85
232
|
|
|
86
233
|
```typescript
|
|
87
234
|
const { execute, isPending, error } = useWikiForget();
|
|
88
|
-
|
|
235
|
+
|
|
236
|
+
const handleDelete = async (factId: string) => {
|
|
237
|
+
try {
|
|
238
|
+
await execute('user-123', { entryId: factId });
|
|
239
|
+
} catch (e) {
|
|
240
|
+
console.error('Delete failed:', e);
|
|
241
|
+
}
|
|
242
|
+
};
|
|
89
243
|
```
|
|
90
244
|
|
|
91
245
|
### `useWikiMaintenance()`
|
|
92
246
|
|
|
93
|
-
Run background maintenance.
|
|
247
|
+
Run background maintenance jobs: librarian (deduplication/fact extraction), heal (LLM-driven fact review: removes orphaned facts, downgrades stale inferences, repairs incorrect facts), reembed (convert TEXT embeddings to BLOB / update after model change), prune (hard-delete soft-deleted entries/tasks after the retention window and prune old events).
|
|
94
248
|
|
|
95
249
|
```typescript
|
|
96
|
-
const { runLibrarian, runHeal, isPending, error } = useWikiMaintenance();
|
|
250
|
+
const { runLibrarian, runHeal, runReembed, runPrune, isPending, error, lastResult } = useWikiMaintenance();
|
|
251
|
+
|
|
252
|
+
// Deduplicate and consolidate facts from events
|
|
97
253
|
await runLibrarian('user-123');
|
|
254
|
+
|
|
255
|
+
// LLM-driven fact review: remove orphaned/stale facts, repair incorrect inferences
|
|
256
|
+
await runHeal('user-123');
|
|
257
|
+
|
|
258
|
+
// Re-embed all facts with the current provider (e.g. after switching models or
|
|
259
|
+
// enabling an embed provider for the first time — default always re-embeds all):
|
|
260
|
+
const { embedded, skipped, failed } = await runReembed('user-123');
|
|
261
|
+
// After a round-trip export/import on the same model, skip facts that already have vectors:
|
|
262
|
+
const { embedded: embeddedRoundtrip, skipped: skippedRoundtrip, failed: failedRoundtrip } = await runReembed('user-123', { skipExisting: true });
|
|
263
|
+
|
|
264
|
+
// Hard-delete soft-deleted entries/tasks after retention and prune old events
|
|
265
|
+
await runPrune('user-123');
|
|
98
266
|
```
|
|
99
267
|
|
|
268
|
+
> **`lastResult` note**: `runLibrarian`, `runHeal`, and `runPrune` each update `lastResult` on success. `runReembed` intentionally does not — it clears `lastResult` to null at start but leaves it null on completion. This avoids a source-breaking change to the `MaintenanceResult` type for consumers that exhaustively switch on `lastResult.operation`. Use the `Promise` return value to inspect reembed results.
|
|
269
|
+
|
|
100
270
|
### `useWikiHasChanged()`
|
|
101
271
|
|
|
102
272
|
Check if a source document has changed since last ingest.
|
|
103
273
|
|
|
104
274
|
```typescript
|
|
105
275
|
const { execute, lastResult, isPending, error } = useWikiHasChanged();
|
|
106
|
-
|
|
276
|
+
|
|
277
|
+
const handleCheckChanges = async (sourceRef: string, sourceHash: string) => {
|
|
278
|
+
const changed = await execute('user-123', sourceRef, sourceHash);
|
|
279
|
+
if (changed) {
|
|
280
|
+
console.log('Document has been updated, re-ingest recommended');
|
|
281
|
+
}
|
|
282
|
+
};
|
|
107
283
|
```
|
|
108
284
|
|
|
109
285
|
### `useWikiExport()`
|
|
@@ -116,6 +292,79 @@ await execute(['user-123']);
|
|
|
116
292
|
// lastResult: MemoryDump | null
|
|
117
293
|
```
|
|
118
294
|
|
|
295
|
+
## Component Lifecycle
|
|
296
|
+
|
|
297
|
+
```mermaid
|
|
298
|
+
flowchart TD
|
|
299
|
+
A["<WikiProvider wiki={wiki}>"] --> B["App Components"]
|
|
300
|
+
B --> C{"Use Hook?"}
|
|
301
|
+
C -->|"useMemoryRead(entityId, query, options?)"| D["[Read Memory]"]
|
|
302
|
+
C -->|"useWikiWrite()"| E["[Write Memory]"]
|
|
303
|
+
C -->|"useWikiIngest()"| F["[Ingest Document]"]
|
|
304
|
+
C -->|"useWikiForget()"| G["[Delete Memory]"]
|
|
305
|
+
C -->|"useWikiMaintenance()"| H["[Run Jobs]"]
|
|
306
|
+
D --> I{"entityId, query,<br/>ReadOptions, or wiki changed?"}
|
|
307
|
+
I -->|"Yes"| J["Auto-refetch"]
|
|
308
|
+
I -->|"No"| K["Return cached data"]
|
|
309
|
+
J --> L["Trigger read()"]
|
|
310
|
+
L --> M["Embed query<br/>if embed available"]
|
|
311
|
+
M --> N["Phase 1: Score facts<br/>Phase 2: Fetch winners"]
|
|
312
|
+
N --> O["Update component state"]
|
|
313
|
+
O --> P["Re-render with data"]
|
|
314
|
+
E --> Q["Execute write()"]
|
|
315
|
+
F --> Q
|
|
316
|
+
G --> Q
|
|
317
|
+
H --> Q
|
|
318
|
+
Q --> R["Write completes"]
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**Data flow:**
|
|
322
|
+
1. **Wrap app** with `<WikiProvider wiki={wiki}>` — provides wiki context
|
|
323
|
+
2. **Use hooks** in components — access memory reactively
|
|
324
|
+
3. **Read operations** auto-refetch when `entityId`, `query`, `wiki`, or `ReadOptions` values change; call `refetch()` to refresh manually
|
|
325
|
+
4. **Write operations** (write, ingest, forget, maintenance) do not automatically re-trigger `useMemoryRead`; call `refetch()` after a write to refresh read results
|
|
326
|
+
5. **Re-render** with new data flowing back to UI
|
|
327
|
+
|
|
328
|
+
## Retrieval Engine Internals
|
|
329
|
+
|
|
330
|
+
```mermaid
|
|
331
|
+
flowchart TD
|
|
332
|
+
A["read(entityId, query)"] --> B{hybridWeight = 0?}
|
|
333
|
+
B -->|Yes| C["MiniSearch only<br/>(skip embed)"]
|
|
334
|
+
B -->|No| D{embed available?}
|
|
335
|
+
D -->|No| C
|
|
336
|
+
D -->|Yes| F["Embed query"]
|
|
337
|
+
F -->|throws| E["onRetrievalFallback<br/>callback"]
|
|
338
|
+
E --> C
|
|
339
|
+
F -->|succeeds| G{preFilterLimit<br/>active?}
|
|
340
|
+
G -->|Yes| H["MiniSearch pre-filter<br/>top K candidates"]
|
|
341
|
+
H --> I["Phase 1: Cosine score<br/>top K candidates"]
|
|
342
|
+
G -->|No| J["Phase 1: Cosine score<br/>all facts"]
|
|
343
|
+
J --> K["Cache vectors<br/>in-memory<br/>(full scan only)"]
|
|
344
|
+
K --> L{hybridWeight = 1?}
|
|
345
|
+
I --> L
|
|
346
|
+
L -->|Yes| M["Pure semantic<br/>ranking"]
|
|
347
|
+
L -->|No| N["Hybrid blend:<br/>semantic + keyword<br/>via MiniSearch"]
|
|
348
|
+
M --> O["Phase 2: Fetch full rows<br/>top maxResults"]
|
|
349
|
+
N --> O
|
|
350
|
+
C --> P["MiniSearch ranking"]
|
|
351
|
+
P --> O
|
|
352
|
+
O --> R["Track access"]
|
|
353
|
+
R --> Q["Return MemoryBundle"]
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
The flowchart shows:
|
|
357
|
+
1. **Fast-path** when `hybridWeight = 0` (pure keyword, no embed cost)
|
|
358
|
+
2. **Fallback chain** when embed unavailable (MiniSearch silently) or throws (`onRetrievalFallback` callback, then MiniSearch)
|
|
359
|
+
3. **Pre-filtering** to limit cosine scoring to top-K keyword matches (O(N) → O(K))
|
|
360
|
+
4. **Two-phase SELECT**: phase 1 scores all/filtered facts with minimal columns, phase 2 fetches full rows for winners
|
|
361
|
+
5. **Hybrid scoring** to blend semantic and keyword rankings
|
|
362
|
+
6. **Vector caching** on full scans only; reads with `preFilterLimit` active skip cache population
|
|
363
|
+
|
|
119
364
|
## License
|
|
120
365
|
|
|
121
366
|
MIT
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
Made with ❤️ by Equational Applications LLC. [https://equationalapplications.com/](https://equationalapplications.com/)
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WikiMemory, MemoryBundle, WikiEvent, MemoryDump } from '@equationalapplications/core-llm-wiki';
|
|
1
|
+
import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent, MemoryDump } 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';
|
|
@@ -9,7 +9,7 @@ declare function WikiProvider({ wiki, children }: {
|
|
|
9
9
|
}): react_jsx_runtime.JSX.Element;
|
|
10
10
|
declare function useWiki(): WikiMemory;
|
|
11
11
|
|
|
12
|
-
declare function useMemoryRead(entityId: string, query: string): {
|
|
12
|
+
declare function useMemoryRead(entityId: string, query: string, options?: ReadOptions): {
|
|
13
13
|
data: MemoryBundle | null;
|
|
14
14
|
isPending: boolean;
|
|
15
15
|
error: Error | null;
|
|
@@ -47,6 +47,14 @@ declare function useWikiMaintenance(): {
|
|
|
47
47
|
tasks: number;
|
|
48
48
|
events: number;
|
|
49
49
|
}>;
|
|
50
|
+
runReembed: (entityId?: string, opts?: {
|
|
51
|
+
force?: boolean;
|
|
52
|
+
skipExisting?: boolean;
|
|
53
|
+
}) => Promise<{
|
|
54
|
+
embedded: number;
|
|
55
|
+
skipped: number;
|
|
56
|
+
failed: number;
|
|
57
|
+
}>;
|
|
50
58
|
lastResult: MaintenanceResult | null;
|
|
51
59
|
isPending: boolean;
|
|
52
60
|
error: Error | null;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WikiMemory, MemoryBundle, WikiEvent, MemoryDump } from '@equationalapplications/core-llm-wiki';
|
|
1
|
+
import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent, MemoryDump } 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';
|
|
@@ -9,7 +9,7 @@ declare function WikiProvider({ wiki, children }: {
|
|
|
9
9
|
}): react_jsx_runtime.JSX.Element;
|
|
10
10
|
declare function useWiki(): WikiMemory;
|
|
11
11
|
|
|
12
|
-
declare function useMemoryRead(entityId: string, query: string): {
|
|
12
|
+
declare function useMemoryRead(entityId: string, query: string, options?: ReadOptions): {
|
|
13
13
|
data: MemoryBundle | null;
|
|
14
14
|
isPending: boolean;
|
|
15
15
|
error: Error | null;
|
|
@@ -47,6 +47,14 @@ declare function useWikiMaintenance(): {
|
|
|
47
47
|
tasks: number;
|
|
48
48
|
events: number;
|
|
49
49
|
}>;
|
|
50
|
+
runReembed: (entityId?: string, opts?: {
|
|
51
|
+
force?: boolean;
|
|
52
|
+
skipExisting?: boolean;
|
|
53
|
+
}) => Promise<{
|
|
54
|
+
embedded: number;
|
|
55
|
+
skipped: number;
|
|
56
|
+
failed: number;
|
|
57
|
+
}>;
|
|
50
58
|
lastResult: MaintenanceResult | null;
|
|
51
59
|
isPending: boolean;
|
|
52
60
|
error: Error | null;
|
package/dist/index.js
CHANGED
|
@@ -49,13 +49,35 @@ function useWiki() {
|
|
|
49
49
|
|
|
50
50
|
// src/useMemoryRead.ts
|
|
51
51
|
var import_react2 = require("react");
|
|
52
|
-
function
|
|
52
|
+
function normalizeReadOptionsKey(opts) {
|
|
53
|
+
if (!opts) return "";
|
|
54
|
+
const normalized = {};
|
|
55
|
+
if (opts.maxResults !== void 0 && opts.maxResults !== null) {
|
|
56
|
+
normalized.maxResults = Number.isFinite(opts.maxResults) ? Math.max(0, Math.trunc(opts.maxResults)) : 10;
|
|
57
|
+
}
|
|
58
|
+
if (opts.preFilterLimit !== void 0) {
|
|
59
|
+
if (opts.preFilterLimit === null || !Number.isFinite(opts.preFilterLimit)) {
|
|
60
|
+
normalized.preFilterLimit = null;
|
|
61
|
+
} else {
|
|
62
|
+
normalized.preFilterLimit = Math.max(0, Math.trunc(opts.preFilterLimit));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (opts.hybridWeight !== void 0 && opts.hybridWeight !== null) {
|
|
66
|
+
normalized.hybridWeight = Number.isNaN(opts.hybridWeight) ? null : Math.max(0, Math.min(1, opts.hybridWeight));
|
|
67
|
+
}
|
|
68
|
+
const sortedKeys = Object.keys(normalized).sort();
|
|
69
|
+
return sortedKeys.length ? JSON.stringify(normalized, sortedKeys) : "";
|
|
70
|
+
}
|
|
71
|
+
function useMemoryRead(entityId, query, options) {
|
|
53
72
|
const wiki = useWiki();
|
|
54
73
|
const [data, setData] = (0, import_react2.useState)(null);
|
|
55
74
|
const [isPending, setIsPending] = (0, import_react2.useState)(false);
|
|
56
75
|
const [error, setError] = (0, import_react2.useState)(null);
|
|
57
76
|
const wikiRef = (0, import_react2.useRef)(wiki);
|
|
58
77
|
wikiRef.current = wiki;
|
|
78
|
+
const optionsRef = (0, import_react2.useRef)(options);
|
|
79
|
+
optionsRef.current = options;
|
|
80
|
+
const optionsStr = normalizeReadOptionsKey(options);
|
|
59
81
|
const fetchQueue = (0, import_react2.useRef)({ inFlight: false, pending: null });
|
|
60
82
|
const scheduleFetch = (0, import_react2.useRef)(function schedule(eid, q) {
|
|
61
83
|
const fq = fetchQueue.current;
|
|
@@ -65,7 +87,7 @@ function useMemoryRead(entityId, query) {
|
|
|
65
87
|
}
|
|
66
88
|
fq.inFlight = true;
|
|
67
89
|
setIsPending(true);
|
|
68
|
-
wikiRef.current.read(eid, q).then(
|
|
90
|
+
wikiRef.current.read(eid, q, optionsRef.current).then(
|
|
69
91
|
(result) => {
|
|
70
92
|
setData(result);
|
|
71
93
|
setError(null);
|
|
@@ -86,7 +108,7 @@ function useMemoryRead(entityId, query) {
|
|
|
86
108
|
});
|
|
87
109
|
(0, import_react2.useEffect)(() => {
|
|
88
110
|
scheduleFetch.current(entityId, query);
|
|
89
|
-
}, [entityId, query, wiki]);
|
|
111
|
+
}, [entityId, query, wiki, optionsStr]);
|
|
90
112
|
const refetch = (0, import_react2.useCallback)(() => {
|
|
91
113
|
scheduleFetch.current(entityId, query);
|
|
92
114
|
}, [entityId, query]);
|
|
@@ -185,7 +207,23 @@ function useWikiMaintenance() {
|
|
|
185
207
|
},
|
|
186
208
|
[]
|
|
187
209
|
);
|
|
188
|
-
|
|
210
|
+
const runReembed = (0, import_react4.useCallback)(async (entityId, opts) => {
|
|
211
|
+
setError(null);
|
|
212
|
+
pendingCount.current += 1;
|
|
213
|
+
setIsPending(true);
|
|
214
|
+
setLastResult(null);
|
|
215
|
+
try {
|
|
216
|
+
return await wikiRef.current.runReembed(entityId, opts);
|
|
217
|
+
} catch (e) {
|
|
218
|
+
const err = e instanceof Error ? e : new Error(String(e));
|
|
219
|
+
setError(err);
|
|
220
|
+
throw err;
|
|
221
|
+
} finally {
|
|
222
|
+
pendingCount.current -= 1;
|
|
223
|
+
if (pendingCount.current === 0) setIsPending(false);
|
|
224
|
+
}
|
|
225
|
+
}, []);
|
|
226
|
+
return { runLibrarian, runHeal, runPrune, runReembed, lastResult, isPending, error };
|
|
189
227
|
}
|
|
190
228
|
|
|
191
229
|
// src/useWikiIngest.ts
|
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"],"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';\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 } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\nexport function useMemoryRead(entityId: string, query: string) {\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 fetchQueue = useRef<{\n inFlight: boolean;\n pending: { entityId: 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, 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).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(entityId, query);\n }, [entityId, query, wiki]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityId, query);\n }, [entityId, 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): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await 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): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await 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 return { runLibrarian, runHeal, runPrune, 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}\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"],"mappings":"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","names":["import_react","import_react","error","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"],"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';\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 * - Keys are sorted so insertion-order differences never cause spurious refetches\n */\nfunction normalizeReadOptionsKey(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 const sortedKeys = Object.keys(normalized).sort();\n return sortedKeys.length ? JSON.stringify(normalized, sortedKeys) : '';\n}\n\nexport function useMemoryRead(entityId: 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 optionsRef = useRef(options);\n optionsRef.current = options;\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(options);\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: { entityId: 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, 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(entityId, query);\n }, [entityId, query, wiki, optionsStr]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityId, query);\n }, [entityId, 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): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await 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): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await 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}\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"],"mappings":"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","names":["import_react","import_react","error","import_react","import_react","import_react","import_react","import_react"]}
|
package/dist/index.mjs
CHANGED
|
@@ -16,13 +16,35 @@ function useWiki() {
|
|
|
16
16
|
|
|
17
17
|
// src/useMemoryRead.ts
|
|
18
18
|
import { useState, useEffect, useCallback, useRef } from "react";
|
|
19
|
-
function
|
|
19
|
+
function normalizeReadOptionsKey(opts) {
|
|
20
|
+
if (!opts) return "";
|
|
21
|
+
const normalized = {};
|
|
22
|
+
if (opts.maxResults !== void 0 && opts.maxResults !== null) {
|
|
23
|
+
normalized.maxResults = Number.isFinite(opts.maxResults) ? Math.max(0, Math.trunc(opts.maxResults)) : 10;
|
|
24
|
+
}
|
|
25
|
+
if (opts.preFilterLimit !== void 0) {
|
|
26
|
+
if (opts.preFilterLimit === null || !Number.isFinite(opts.preFilterLimit)) {
|
|
27
|
+
normalized.preFilterLimit = null;
|
|
28
|
+
} else {
|
|
29
|
+
normalized.preFilterLimit = Math.max(0, Math.trunc(opts.preFilterLimit));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (opts.hybridWeight !== void 0 && opts.hybridWeight !== null) {
|
|
33
|
+
normalized.hybridWeight = Number.isNaN(opts.hybridWeight) ? null : Math.max(0, Math.min(1, opts.hybridWeight));
|
|
34
|
+
}
|
|
35
|
+
const sortedKeys = Object.keys(normalized).sort();
|
|
36
|
+
return sortedKeys.length ? JSON.stringify(normalized, sortedKeys) : "";
|
|
37
|
+
}
|
|
38
|
+
function useMemoryRead(entityId, query, options) {
|
|
20
39
|
const wiki = useWiki();
|
|
21
40
|
const [data, setData] = useState(null);
|
|
22
41
|
const [isPending, setIsPending] = useState(false);
|
|
23
42
|
const [error, setError] = useState(null);
|
|
24
43
|
const wikiRef = useRef(wiki);
|
|
25
44
|
wikiRef.current = wiki;
|
|
45
|
+
const optionsRef = useRef(options);
|
|
46
|
+
optionsRef.current = options;
|
|
47
|
+
const optionsStr = normalizeReadOptionsKey(options);
|
|
26
48
|
const fetchQueue = useRef({ inFlight: false, pending: null });
|
|
27
49
|
const scheduleFetch = useRef(function schedule(eid, q) {
|
|
28
50
|
const fq = fetchQueue.current;
|
|
@@ -32,7 +54,7 @@ function useMemoryRead(entityId, query) {
|
|
|
32
54
|
}
|
|
33
55
|
fq.inFlight = true;
|
|
34
56
|
setIsPending(true);
|
|
35
|
-
wikiRef.current.read(eid, q).then(
|
|
57
|
+
wikiRef.current.read(eid, q, optionsRef.current).then(
|
|
36
58
|
(result) => {
|
|
37
59
|
setData(result);
|
|
38
60
|
setError(null);
|
|
@@ -53,7 +75,7 @@ function useMemoryRead(entityId, query) {
|
|
|
53
75
|
});
|
|
54
76
|
useEffect(() => {
|
|
55
77
|
scheduleFetch.current(entityId, query);
|
|
56
|
-
}, [entityId, query, wiki]);
|
|
78
|
+
}, [entityId, query, wiki, optionsStr]);
|
|
57
79
|
const refetch = useCallback(() => {
|
|
58
80
|
scheduleFetch.current(entityId, query);
|
|
59
81
|
}, [entityId, query]);
|
|
@@ -152,7 +174,23 @@ function useWikiMaintenance() {
|
|
|
152
174
|
},
|
|
153
175
|
[]
|
|
154
176
|
);
|
|
155
|
-
|
|
177
|
+
const runReembed = useCallback3(async (entityId, opts) => {
|
|
178
|
+
setError(null);
|
|
179
|
+
pendingCount.current += 1;
|
|
180
|
+
setIsPending(true);
|
|
181
|
+
setLastResult(null);
|
|
182
|
+
try {
|
|
183
|
+
return await wikiRef.current.runReembed(entityId, opts);
|
|
184
|
+
} catch (e) {
|
|
185
|
+
const err = e instanceof Error ? e : new Error(String(e));
|
|
186
|
+
setError(err);
|
|
187
|
+
throw err;
|
|
188
|
+
} finally {
|
|
189
|
+
pendingCount.current -= 1;
|
|
190
|
+
if (pendingCount.current === 0) setIsPending(false);
|
|
191
|
+
}
|
|
192
|
+
}, []);
|
|
193
|
+
return { runLibrarian, runHeal, runPrune, runReembed, lastResult, isPending, error };
|
|
156
194
|
}
|
|
157
195
|
|
|
158
196
|
// src/useWikiIngest.ts
|
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"],"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';\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 } from '@equationalapplications/core-llm-wiki';\nimport { useWiki } from './WikiContext';\n\nexport function useMemoryRead(entityId: string, query: string) {\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 fetchQueue = useRef<{\n inFlight: boolean;\n pending: { entityId: 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, 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).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(entityId, query);\n }, [entityId, query, wiki]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityId, query);\n }, [entityId, 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): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await 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): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await 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 return { runLibrarian, runHeal, runPrune, 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}\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"],"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"]}
|
|
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"],"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';\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 * - Keys are sorted so insertion-order differences never cause spurious refetches\n */\nfunction normalizeReadOptionsKey(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 const sortedKeys = Object.keys(normalized).sort();\n return sortedKeys.length ? JSON.stringify(normalized, sortedKeys) : '';\n}\n\nexport function useMemoryRead(entityId: 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 optionsRef = useRef(options);\n optionsRef.current = options;\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(options);\n\n const fetchQueue = useRef<{\n inFlight: boolean;\n pending: { entityId: 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, 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(entityId, query);\n }, [entityId, query, wiki, optionsStr]);\n\n const refetch = useCallback(() => {\n scheduleFetch.current(entityId, query);\n }, [entityId, 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): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await 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): Promise<void> => {\n setError(null);\n pendingCount.current += 1;\n setIsPending(true);\n setLastResult(null);\n try {\n await 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}\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"],"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"]}
|
package/dist/js.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WikiMemory, MemoryBundle, WikiEvent } from '@equationalapplications/core-llm-wiki';
|
|
1
|
+
import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent } from '@equationalapplications/core-llm-wiki';
|
|
2
2
|
export * from '@equationalapplications/core-llm-wiki';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -12,9 +12,9 @@ export * from '@equationalapplications/core-llm-wiki';
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
* Standalone read helper. Equivalent to `wiki.read(entityId, query)`.
|
|
15
|
+
* Standalone read helper. Equivalent to `wiki.read(entityId, query, options)`.
|
|
16
16
|
*/
|
|
17
|
-
declare function read(wiki: WikiMemory, entityId: string, query: string): Promise<MemoryBundle>;
|
|
17
|
+
declare function read(wiki: WikiMemory, entityId: string, query: string, options?: ReadOptions): Promise<MemoryBundle>;
|
|
18
18
|
/**
|
|
19
19
|
* Standalone write helper. Equivalent to `wiki.write(entityId, event)`.
|
|
20
20
|
*/
|
package/dist/js.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WikiMemory, MemoryBundle, WikiEvent } from '@equationalapplications/core-llm-wiki';
|
|
1
|
+
import { WikiMemory, ReadOptions, MemoryBundle, WikiEvent } from '@equationalapplications/core-llm-wiki';
|
|
2
2
|
export * from '@equationalapplications/core-llm-wiki';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -12,9 +12,9 @@ export * from '@equationalapplications/core-llm-wiki';
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
* Standalone read helper. Equivalent to `wiki.read(entityId, query)`.
|
|
15
|
+
* Standalone read helper. Equivalent to `wiki.read(entityId, query, options)`.
|
|
16
16
|
*/
|
|
17
|
-
declare function read(wiki: WikiMemory, entityId: string, query: string): Promise<MemoryBundle>;
|
|
17
|
+
declare function read(wiki: WikiMemory, entityId: string, query: string, options?: ReadOptions): Promise<MemoryBundle>;
|
|
18
18
|
/**
|
|
19
19
|
* Standalone write helper. Equivalent to `wiki.write(entityId, event)`.
|
|
20
20
|
*/
|
package/dist/js.js
CHANGED
|
@@ -26,8 +26,8 @@ __export(js_exports, {
|
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(js_exports);
|
|
28
28
|
__reExport(js_exports, require("@equationalapplications/core-llm-wiki"), module.exports);
|
|
29
|
-
function read(wiki, entityId, query) {
|
|
30
|
-
return wiki.read(entityId, query);
|
|
29
|
+
function read(wiki, entityId, query, options) {
|
|
30
|
+
return wiki.read(entityId, query, options);
|
|
31
31
|
}
|
|
32
32
|
function write(wiki, entityId, event) {
|
|
33
33
|
return wiki.write(entityId, event);
|
package/dist/js.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/js.ts"],"sourcesContent":["/**\n * Vanilla-JS entry for @equationalapplications/react-llm-wiki.\n * Import from '@equationalapplications/react-llm-wiki/js' to use WikiMemory\n * without bundling React or any hook code.\n *\n * Provides:\n * - All core exports (createWiki, WikiMemory, types, …)\n * - Standalone read() / write() helpers that wrap the WikiMemory instance methods\n */\nexport * from '@equationalapplications/core-llm-wiki';\n\nimport type { WikiMemory, MemoryBundle, WikiEvent } from '@equationalapplications/core-llm-wiki';\n\n/**\n * Standalone read helper. Equivalent to `wiki.read(entityId, query)`.\n */\nexport function read(\n wiki: WikiMemory,\n entityId: string,\n query: string,\n): Promise<MemoryBundle> {\n return wiki.read(entityId, query);\n}\n\n/**\n * Standalone write helper. Equivalent to `wiki.write(entityId, event)`.\n */\nexport function write(\n wiki: WikiMemory,\n entityId: string,\n event: Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>,\n): Promise<void> {\n return wiki.write(entityId, event);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,uBAAc,kDATd;AAgBO,SAAS,KACd,MACA,UACA,
|
|
1
|
+
{"version":3,"sources":["../src/js.ts"],"sourcesContent":["/**\n * Vanilla-JS entry for @equationalapplications/react-llm-wiki.\n * Import from '@equationalapplications/react-llm-wiki/js' to use WikiMemory\n * without bundling React or any hook code.\n *\n * Provides:\n * - All core exports (createWiki, WikiMemory, types, …)\n * - Standalone read() / write() helpers that wrap the WikiMemory instance methods\n */\nexport * from '@equationalapplications/core-llm-wiki';\n\nimport type { WikiMemory, MemoryBundle, WikiEvent, ReadOptions } from '@equationalapplications/core-llm-wiki';\n\n/**\n * Standalone read helper. Equivalent to `wiki.read(entityId, query, options)`.\n */\nexport function read(\n wiki: WikiMemory,\n entityId: string,\n query: string,\n options?: ReadOptions,\n): Promise<MemoryBundle> {\n return wiki.read(entityId, query, options);\n}\n\n/**\n * Standalone write helper. Equivalent to `wiki.write(entityId, event)`.\n */\nexport function write(\n wiki: WikiMemory,\n entityId: string,\n event: Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>,\n): Promise<void> {\n return wiki.write(entityId, event);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,uBAAc,kDATd;AAgBO,SAAS,KACd,MACA,UACA,OACA,SACuB;AACvB,SAAO,KAAK,KAAK,UAAU,OAAO,OAAO;AAC3C;AAKO,SAAS,MACd,MACA,UACA,OACe;AACf,SAAO,KAAK,MAAM,UAAU,KAAK;AACnC;","names":[]}
|
package/dist/js.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/js.ts
|
|
2
2
|
export * from "@equationalapplications/core-llm-wiki";
|
|
3
|
-
function read(wiki, entityId, query) {
|
|
4
|
-
return wiki.read(entityId, query);
|
|
3
|
+
function read(wiki, entityId, query, options) {
|
|
4
|
+
return wiki.read(entityId, query, options);
|
|
5
5
|
}
|
|
6
6
|
function write(wiki, entityId, event) {
|
|
7
7
|
return wiki.write(entityId, event);
|
package/dist/js.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/js.ts"],"sourcesContent":["/**\n * Vanilla-JS entry for @equationalapplications/react-llm-wiki.\n * Import from '@equationalapplications/react-llm-wiki/js' to use WikiMemory\n * without bundling React or any hook code.\n *\n * Provides:\n * - All core exports (createWiki, WikiMemory, types, …)\n * - Standalone read() / write() helpers that wrap the WikiMemory instance methods\n */\nexport * from '@equationalapplications/core-llm-wiki';\n\nimport type { WikiMemory, MemoryBundle, WikiEvent } from '@equationalapplications/core-llm-wiki';\n\n/**\n * Standalone read helper. Equivalent to `wiki.read(entityId, query)`.\n */\nexport function read(\n wiki: WikiMemory,\n entityId: string,\n query: string,\n): Promise<MemoryBundle> {\n return wiki.read(entityId, query);\n}\n\n/**\n * Standalone write helper. Equivalent to `wiki.write(entityId, event)`.\n */\nexport function write(\n wiki: WikiMemory,\n entityId: string,\n event: Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>,\n): Promise<void> {\n return wiki.write(entityId, event);\n}\n"],"mappings":";AASA,cAAc;AAOP,SAAS,KACd,MACA,UACA,
|
|
1
|
+
{"version":3,"sources":["../src/js.ts"],"sourcesContent":["/**\n * Vanilla-JS entry for @equationalapplications/react-llm-wiki.\n * Import from '@equationalapplications/react-llm-wiki/js' to use WikiMemory\n * without bundling React or any hook code.\n *\n * Provides:\n * - All core exports (createWiki, WikiMemory, types, …)\n * - Standalone read() / write() helpers that wrap the WikiMemory instance methods\n */\nexport * from '@equationalapplications/core-llm-wiki';\n\nimport type { WikiMemory, MemoryBundle, WikiEvent, ReadOptions } from '@equationalapplications/core-llm-wiki';\n\n/**\n * Standalone read helper. Equivalent to `wiki.read(entityId, query, options)`.\n */\nexport function read(\n wiki: WikiMemory,\n entityId: string,\n query: string,\n options?: ReadOptions,\n): Promise<MemoryBundle> {\n return wiki.read(entityId, query, options);\n}\n\n/**\n * Standalone write helper. Equivalent to `wiki.write(entityId, event)`.\n */\nexport function write(\n wiki: WikiMemory,\n entityId: string,\n event: Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>,\n): Promise<void> {\n return wiki.write(entityId, event);\n}\n"],"mappings":";AASA,cAAc;AAOP,SAAS,KACd,MACA,UACA,OACA,SACuB;AACvB,SAAO,KAAK,KAAK,UAAU,OAAO,OAAO;AAC3C;AAKO,SAAS,MACd,MACA,UACA,OACe;AACf,SAAO,KAAK,MAAM,UAAU,KAAK;AACnC;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@equationalapplications/react-llm-wiki",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "React hooks and web utilities for LLM Wiki Memory.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"registry": "https://registry.npmjs.org"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@equationalapplications/core-llm-wiki": "
|
|
31
|
+
"@equationalapplications/core-llm-wiki": "3.0.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"react": ">=17"
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"build": "tsup",
|
|
50
50
|
"dev": "tsup --watch",
|
|
51
51
|
"typecheck": "tsc --noEmit",
|
|
52
|
-
"test": "
|
|
52
|
+
"test": "vitest run",
|
|
53
53
|
"test:watch": "vitest"
|
|
54
54
|
}
|
|
55
55
|
}
|