@trustgraph/react-state 0.2.0 → 0.3.1
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 +6 -372
- package/dist/index.cjs +39 -1386
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +22 -1369
- package/dist/index.esm.js.map +1 -1
- package/dist/state/collections.d.ts.map +1 -1
- package/dist/state/inference.d.ts.map +1 -1
- package/dist/state/processing.d.ts +2 -2
- package/dist/state/vector-search.d.ts.map +1 -1
- package/package.json +13 -24
package/README.md
CHANGED
|
@@ -17,150 +17,6 @@ React state management hooks for TrustGraph applications. Provides TanStack Quer
|
|
|
17
17
|
npm install @trustgraph/react-state @trustgraph/react-provider @trustgraph/client
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
## Building from Scratch
|
|
21
|
-
|
|
22
|
-
New to TrustGraph? Here's how to build your first app from a blank slate.
|
|
23
|
-
|
|
24
|
-
### 1. Create a new React + TypeScript project
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
# Create a new Vite project with React + TypeScript
|
|
28
|
-
npm create vite@latest my-trustgraph-app -- --template react-ts
|
|
29
|
-
cd my-trustgraph-app
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### 2. Install TrustGraph dependencies
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
# Vite scaffolds with React 19, but TrustGraph currently uses React 18
|
|
36
|
-
npm install react@^18.0.0 react-dom@^18.0.0
|
|
37
|
-
|
|
38
|
-
# Install TrustGraph packages
|
|
39
|
-
npm install @trustgraph/react-state @trustgraph/react-provider @trustgraph/client
|
|
40
|
-
|
|
41
|
-
# Install required peer dependencies
|
|
42
|
-
npm install @tanstack/react-query zustand
|
|
43
|
-
|
|
44
|
-
# Install a toast/notification library (optional, we'll use console for this example)
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### 3. Configure WebSocket proxy
|
|
48
|
-
|
|
49
|
-
The TrustGraph client connects to `ws://HOSTNAME:PORT/api/socket` in your application's address space. You need to proxy this to the TrustGraph API gateway (typically port 8088, path `/api/v1/socket`).
|
|
50
|
-
|
|
51
|
-
For Vite, create or update `vite.config.ts`:
|
|
52
|
-
|
|
53
|
-
```typescript
|
|
54
|
-
import { defineConfig } from "vite";
|
|
55
|
-
import react from "@vitejs/plugin-react";
|
|
56
|
-
|
|
57
|
-
export default defineConfig({
|
|
58
|
-
plugins: [react()],
|
|
59
|
-
server: {
|
|
60
|
-
proxy: {
|
|
61
|
-
"/api/socket": {
|
|
62
|
-
target: "ws://localhost:8088",
|
|
63
|
-
ws: true,
|
|
64
|
-
rewrite: (path) => path.replace(/^\/api\/socket/, "/api/v1/socket"),
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**For production deployments**, configure your web server (nginx, Apache, etc.) to proxy `/api/socket` to your TrustGraph API gateway:
|
|
72
|
-
|
|
73
|
-
```nginx
|
|
74
|
-
# nginx example
|
|
75
|
-
location /api/socket {
|
|
76
|
-
proxy_pass http://trustgraph-api:8088/api/v1/socket;
|
|
77
|
-
proxy_http_version 1.1;
|
|
78
|
-
proxy_set_header Upgrade $http_upgrade;
|
|
79
|
-
proxy_set_header Connection "upgrade";
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### 4. Set up the provider wrapper
|
|
84
|
-
|
|
85
|
-
Create or update `src/App.tsx`:
|
|
86
|
-
|
|
87
|
-
```typescript
|
|
88
|
-
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
89
|
-
import { SocketProvider } from "@trustgraph/react-provider";
|
|
90
|
-
import { NotificationProvider, NotificationHandler } from "@trustgraph/react-state";
|
|
91
|
-
import MyFirstComponent from "./MyFirstComponent";
|
|
92
|
-
|
|
93
|
-
// Simple console-based notification handler for development
|
|
94
|
-
const notificationHandler: NotificationHandler = {
|
|
95
|
-
success: (msg) => console.log("✓", msg),
|
|
96
|
-
error: (msg) => console.error("✗", msg),
|
|
97
|
-
warning: (msg) => console.warn("⚠", msg),
|
|
98
|
-
info: (msg) => console.info("ℹ", msg),
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
const queryClient = new QueryClient();
|
|
102
|
-
|
|
103
|
-
function App() {
|
|
104
|
-
return (
|
|
105
|
-
<QueryClientProvider client={queryClient}>
|
|
106
|
-
<NotificationProvider handler={notificationHandler}>
|
|
107
|
-
<SocketProvider user="my-user" apiKey="">
|
|
108
|
-
<MyFirstComponent />
|
|
109
|
-
</SocketProvider>
|
|
110
|
-
</NotificationProvider>
|
|
111
|
-
</QueryClientProvider>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export default App;
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
### 5. Create your first component
|
|
119
|
-
|
|
120
|
-
Create `src/MyFirstComponent.tsx`:
|
|
121
|
-
|
|
122
|
-
```typescript
|
|
123
|
-
import { useFlows, useSettings } from "@trustgraph/react-state";
|
|
124
|
-
|
|
125
|
-
function MyFirstComponent() {
|
|
126
|
-
const { flows, isLoading } = useFlows();
|
|
127
|
-
const { settings } = useSettings();
|
|
128
|
-
|
|
129
|
-
if (isLoading) return <div>Loading flows...</div>;
|
|
130
|
-
|
|
131
|
-
return (
|
|
132
|
-
<div>
|
|
133
|
-
<h1>My TrustGraph App</h1>
|
|
134
|
-
<p>User: {settings.user}</p>
|
|
135
|
-
<p>Collection: {settings.collection}</p>
|
|
136
|
-
<h2>Available Flows:</h2>
|
|
137
|
-
<ul>
|
|
138
|
-
{flows?.map((flow) => (
|
|
139
|
-
<li key={flow.id}>{flow.id}</li>
|
|
140
|
-
))}
|
|
141
|
-
</ul>
|
|
142
|
-
</div>
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
export default MyFirstComponent;
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
### 6. Run your app
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
npm run dev
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
Open http://localhost:5173 and you should see your flows!
|
|
156
|
-
|
|
157
|
-
### 7. Next Steps
|
|
158
|
-
|
|
159
|
-
- Add a chat interface with `useConversation` and `useChatSession`
|
|
160
|
-
- Query knowledge graphs with `useEntityDetail` and `useGraphSubgraph`
|
|
161
|
-
- Upload documents with `useLibrary`
|
|
162
|
-
- Perform vector searches with `useVectorSearch`
|
|
163
|
-
|
|
164
20
|
## Quick Start
|
|
165
21
|
|
|
166
22
|
### 1. Set up providers
|
|
@@ -295,11 +151,10 @@ const handler: NotificationHandler = {
|
|
|
295
151
|
- `useCollections()` - Manage document collections
|
|
296
152
|
- `useKnowledgeCores()` - Manage knowledge cores
|
|
297
153
|
|
|
298
|
-
####
|
|
154
|
+
#### Query & Chat
|
|
299
155
|
|
|
300
|
-
- `
|
|
301
|
-
- `
|
|
302
|
-
- `useChatSession()` / `useChat()` - High-level chat session management
|
|
156
|
+
- `useChat()` - Chat interface operations
|
|
157
|
+
- `useChatQuery()` - Chat query management
|
|
303
158
|
- `useStructuredQuery()` - Structured query operations
|
|
304
159
|
- `useObjectsQuery()` - Object queries
|
|
305
160
|
- `useNlpQuery()` - Natural language processing queries
|
|
@@ -326,10 +181,9 @@ const handler: NotificationHandler = {
|
|
|
326
181
|
|
|
327
182
|
- `useProgressStateStore()` - Activity indicators and error state
|
|
328
183
|
- `useSessionStore()` - Session and flow state
|
|
329
|
-
- `
|
|
184
|
+
- `useChatStateStore()` - Chat message history
|
|
330
185
|
- `useWorkbenchStateStore()` - Workbench UI state (selected entity, tool, etc.)
|
|
331
186
|
- `useLoadStateStore()` - Document loading state
|
|
332
|
-
- `useSearchStateStore()` - Search results state
|
|
333
187
|
|
|
334
188
|
### Utility Hooks
|
|
335
189
|
|
|
@@ -341,10 +195,9 @@ const handler: NotificationHandler = {
|
|
|
341
195
|
### Managing Documents
|
|
342
196
|
|
|
343
197
|
```typescript
|
|
344
|
-
import { useLibrary
|
|
198
|
+
import { useLibrary } from "@trustgraph/react-state";
|
|
345
199
|
|
|
346
200
|
function DocumentManager() {
|
|
347
|
-
const { settings } = useSettings();
|
|
348
201
|
const {
|
|
349
202
|
documents,
|
|
350
203
|
isLoading,
|
|
@@ -365,17 +218,7 @@ function DocumentManager() {
|
|
|
365
218
|
files,
|
|
366
219
|
params: { title: "My Document", keywords: [] },
|
|
367
220
|
mimeType: "application/pdf",
|
|
368
|
-
|
|
369
|
-
});
|
|
370
|
-
};
|
|
371
|
-
|
|
372
|
-
const handleSubmit = (ids: string[]) => {
|
|
373
|
-
submitDocuments({
|
|
374
|
-
ids,
|
|
375
|
-
flow: "my-flow",
|
|
376
|
-
tags: ["important"],
|
|
377
|
-
collection: settings.collection,
|
|
378
|
-
onSuccess: () => console.log("Submitted for processing"),
|
|
221
|
+
user: "current-user",
|
|
379
222
|
});
|
|
380
223
|
};
|
|
381
224
|
|
|
@@ -417,95 +260,6 @@ function SettingsPanel() {
|
|
|
417
260
|
}
|
|
418
261
|
```
|
|
419
262
|
|
|
420
|
-
### Chat Interface (3-Hook Architecture)
|
|
421
|
-
|
|
422
|
-
The chat system is split into three composable hooks:
|
|
423
|
-
|
|
424
|
-
```typescript
|
|
425
|
-
import { useConversation, useInference, useChatSession, useSettings } from "@trustgraph/react-state";
|
|
426
|
-
|
|
427
|
-
// Option 1: High-level chat (easiest)
|
|
428
|
-
function SimpleChatUI() {
|
|
429
|
-
const messages = useConversation((state) => state.messages);
|
|
430
|
-
const input = useConversation((state) => state.input);
|
|
431
|
-
const setInput = useConversation((state) => state.setInput);
|
|
432
|
-
const { submitMessage, isSubmitting } = useChatSession();
|
|
433
|
-
|
|
434
|
-
return (
|
|
435
|
-
<div>
|
|
436
|
-
{messages.map((msg, i) => (
|
|
437
|
-
<div key={i}>{msg.role}: {msg.text}</div>
|
|
438
|
-
))}
|
|
439
|
-
<input value={input} onChange={(e) => setInput(e.target.value)} />
|
|
440
|
-
<button onClick={() => submitMessage({ input })} disabled={isSubmitting}>
|
|
441
|
-
Send
|
|
442
|
-
</button>
|
|
443
|
-
</div>
|
|
444
|
-
);
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
// Option 2: Low-level inference (for custom UIs)
|
|
448
|
-
function CustomInferenceUI() {
|
|
449
|
-
const { settings } = useSettings();
|
|
450
|
-
const inference = useInference();
|
|
451
|
-
const [result, setResult] = useState("");
|
|
452
|
-
|
|
453
|
-
const handleQuery = async () => {
|
|
454
|
-
const response = await inference.graphRag({
|
|
455
|
-
input: "What is TrustGraph?",
|
|
456
|
-
options: {
|
|
457
|
-
entityLimit: 10,
|
|
458
|
-
tripleLimit: 10,
|
|
459
|
-
},
|
|
460
|
-
collection: settings.collection,
|
|
461
|
-
});
|
|
462
|
-
setResult(response.response);
|
|
463
|
-
};
|
|
464
|
-
|
|
465
|
-
return (
|
|
466
|
-
<div>
|
|
467
|
-
<button onClick={handleQuery}>Query</button>
|
|
468
|
-
<div>{result}</div>
|
|
469
|
-
</div>
|
|
470
|
-
);
|
|
471
|
-
}
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
### Multi-Collection Apps
|
|
475
|
-
|
|
476
|
-
Query multiple collections side-by-side:
|
|
477
|
-
|
|
478
|
-
```typescript
|
|
479
|
-
import { useEntityDetail, useSessionStore, useSettings } from "@trustgraph/react-state";
|
|
480
|
-
|
|
481
|
-
function MultiCollectionView({ entityUri }: { entityUri: string }) {
|
|
482
|
-
const flowId = useSessionStore((state) => state.flowId);
|
|
483
|
-
const { settings } = useSettings();
|
|
484
|
-
|
|
485
|
-
// Query same entity from different collections
|
|
486
|
-
const prodData = useEntityDetail(entityUri, flowId, "production");
|
|
487
|
-
const stagingData = useEntityDetail(entityUri, flowId, "staging");
|
|
488
|
-
const defaultData = useEntityDetail(entityUri, flowId, settings.collection);
|
|
489
|
-
|
|
490
|
-
return (
|
|
491
|
-
<div>
|
|
492
|
-
<div>
|
|
493
|
-
<h3>Production</h3>
|
|
494
|
-
{prodData.detail?.triples.length} triples
|
|
495
|
-
</div>
|
|
496
|
-
<div>
|
|
497
|
-
<h3>Staging</h3>
|
|
498
|
-
{stagingData.detail?.triples.length} triples
|
|
499
|
-
</div>
|
|
500
|
-
<div>
|
|
501
|
-
<h3>Default ({settings.collection})</h3>
|
|
502
|
-
{defaultData.detail?.triples.length} triples
|
|
503
|
-
</div>
|
|
504
|
-
</div>
|
|
505
|
-
);
|
|
506
|
-
}
|
|
507
|
-
```
|
|
508
|
-
|
|
509
263
|
### Using Progress Indicators
|
|
510
264
|
|
|
511
265
|
```typescript
|
|
@@ -530,126 +284,6 @@ function MyComponent() {
|
|
|
530
284
|
}
|
|
531
285
|
```
|
|
532
286
|
|
|
533
|
-
## Common Patterns
|
|
534
|
-
|
|
535
|
-
### Handling Settings Loading State
|
|
536
|
-
|
|
537
|
-
Settings are loaded asynchronously. Always check `isLoaded` before accessing settings values:
|
|
538
|
-
|
|
539
|
-
```typescript
|
|
540
|
-
import { useSettings, useEntityDetail } from "@trustgraph/react-state";
|
|
541
|
-
|
|
542
|
-
function EntityView({ entityUri }: { entityUri: string }) {
|
|
543
|
-
const { settings, isLoaded } = useSettings();
|
|
544
|
-
const flowId = useSessionStore((state) => state.flowId);
|
|
545
|
-
|
|
546
|
-
// Wait for settings to load before querying
|
|
547
|
-
const { detail } = useEntityDetail(
|
|
548
|
-
entityUri,
|
|
549
|
-
flowId,
|
|
550
|
-
settings?.collection || "default"
|
|
551
|
-
);
|
|
552
|
-
|
|
553
|
-
if (!isLoaded) {
|
|
554
|
-
return <div>Loading settings...</div>;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
return <div>{detail?.triples.length} triples</div>;
|
|
558
|
-
}
|
|
559
|
-
```
|
|
560
|
-
|
|
561
|
-
### Using Default Collection from Settings
|
|
562
|
-
|
|
563
|
-
Most hooks require an explicit `collection` parameter. Use settings as the default source:
|
|
564
|
-
|
|
565
|
-
```typescript
|
|
566
|
-
import { useSettings, useLibrary } from "@trustgraph/react-state";
|
|
567
|
-
|
|
568
|
-
function DocumentSubmit() {
|
|
569
|
-
const { settings } = useSettings();
|
|
570
|
-
const library = useLibrary();
|
|
571
|
-
|
|
572
|
-
const handleSubmit = (ids: string[], flow: string) => {
|
|
573
|
-
library.submitDocuments({
|
|
574
|
-
ids,
|
|
575
|
-
flow,
|
|
576
|
-
tags: ["important"],
|
|
577
|
-
collection: settings?.collection || "default", // Use settings with fallback
|
|
578
|
-
onSuccess: () => console.log("Submitted"),
|
|
579
|
-
});
|
|
580
|
-
};
|
|
581
|
-
|
|
582
|
-
return <button onClick={() => handleSubmit(["doc1"], "flow1")}>Submit</button>;
|
|
583
|
-
}
|
|
584
|
-
```
|
|
585
|
-
|
|
586
|
-
### Querying Multiple Collections
|
|
587
|
-
|
|
588
|
-
Override the default collection to query multiple collections side-by-side:
|
|
589
|
-
|
|
590
|
-
```typescript
|
|
591
|
-
import { useEntityDetail, useSettings } from "@trustgraph/react-state";
|
|
592
|
-
|
|
593
|
-
function MultiCollectionComparison({ entityUri }: { entityUri: string }) {
|
|
594
|
-
const { settings } = useSettings();
|
|
595
|
-
const flowId = useSessionStore((state) => state.flowId);
|
|
596
|
-
|
|
597
|
-
// Query same entity from different collections
|
|
598
|
-
const prod = useEntityDetail(entityUri, flowId, "production");
|
|
599
|
-
const staging = useEntityDetail(entityUri, flowId, "staging");
|
|
600
|
-
const defaultData = useEntityDetail(entityUri, flowId, settings?.collection || "default");
|
|
601
|
-
|
|
602
|
-
return (
|
|
603
|
-
<div>
|
|
604
|
-
<h3>Production: {prod.detail?.triples.length} triples</h3>
|
|
605
|
-
<h3>Staging: {staging.detail?.triples.length} triples</h3>
|
|
606
|
-
<h3>Default: {defaultData.detail?.triples.length} triples</h3>
|
|
607
|
-
</div>
|
|
608
|
-
);
|
|
609
|
-
}
|
|
610
|
-
```
|
|
611
|
-
|
|
612
|
-
### Composing Inference and Conversation Hooks
|
|
613
|
-
|
|
614
|
-
For custom chat UIs, compose the low-level hooks directly:
|
|
615
|
-
|
|
616
|
-
```typescript
|
|
617
|
-
import { useConversation, useInference, useSettings } from "@trustgraph/react-state";
|
|
618
|
-
|
|
619
|
-
function CustomChatUI() {
|
|
620
|
-
const messages = useConversation((state) => state.messages);
|
|
621
|
-
const input = useConversation((state) => state.input);
|
|
622
|
-
const setInput = useConversation((state) => state.setInput);
|
|
623
|
-
const addMessage = useConversation((state) => state.addMessage);
|
|
624
|
-
|
|
625
|
-
const { settings } = useSettings();
|
|
626
|
-
const inference = useInference();
|
|
627
|
-
|
|
628
|
-
const handleSubmit = async () => {
|
|
629
|
-
addMessage("user", input);
|
|
630
|
-
setInput("");
|
|
631
|
-
|
|
632
|
-
const result = await inference.graphRag({
|
|
633
|
-
input,
|
|
634
|
-
options: { entityLimit: 10, tripleLimit: 10 },
|
|
635
|
-
collection: settings?.collection || "default",
|
|
636
|
-
});
|
|
637
|
-
|
|
638
|
-
addMessage("ai", result.response);
|
|
639
|
-
};
|
|
640
|
-
|
|
641
|
-
return (
|
|
642
|
-
<div>
|
|
643
|
-
{messages.map((msg, i) => (
|
|
644
|
-
<div key={i}>{msg.role}: {msg.text}</div>
|
|
645
|
-
))}
|
|
646
|
-
<input value={input} onChange={(e) => setInput(e.target.value)} />
|
|
647
|
-
<button onClick={handleSubmit}>Send</button>
|
|
648
|
-
</div>
|
|
649
|
-
);
|
|
650
|
-
}
|
|
651
|
-
```
|
|
652
|
-
|
|
653
287
|
## Type Exports
|
|
654
288
|
|
|
655
289
|
The package re-exports types from `@trustgraph/client` for convenience:
|