memo-grafter 0.2.4 → 0.2.5
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/USER_GUIDE.md +127 -5
- package/dist/MemoGrafter.d.ts +8 -5
- package/dist/MemoGrafter.d.ts.map +1 -1
- package/dist/MemoGrafter.js +12 -10
- package/dist/MemoGrafter.js.map +1 -1
- package/dist/MemoGrafterAgent.d.ts +5 -2
- package/dist/MemoGrafterAgent.d.ts.map +1 -1
- package/dist/MemoGrafterAgent.js +13 -3
- package/dist/MemoGrafterAgent.js.map +1 -1
- package/dist/crawler/memoryMaintenance.d.ts +1 -0
- package/dist/crawler/memoryMaintenance.d.ts.map +1 -1
- package/dist/crawler/memoryMaintenance.js +81 -11
- package/dist/crawler/memoryMaintenance.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/pipeline/IngestPipeline.d.ts +7 -3
- package/dist/pipeline/IngestPipeline.d.ts.map +1 -1
- package/dist/pipeline/IngestPipeline.js +24 -13
- package/dist/pipeline/IngestPipeline.js.map +1 -1
- package/dist/pipeline/RetrieverPipeline.d.ts +3 -0
- package/dist/pipeline/RetrieverPipeline.d.ts.map +1 -1
- package/dist/pipeline/RetrieverPipeline.js +56 -13
- package/dist/pipeline/RetrieverPipeline.js.map +1 -1
- package/dist/pipeline/SegmentProcessor.d.ts +3 -1
- package/dist/pipeline/SegmentProcessor.d.ts.map +1 -1
- package/dist/pipeline/SegmentProcessor.js +9 -5
- package/dist/pipeline/SegmentProcessor.js.map +1 -1
- package/dist/queue/IngestQueue.d.ts +2 -2
- package/dist/queue/IngestQueue.d.ts.map +1 -1
- package/dist/queue/IngestQueue.js +3 -2
- package/dist/queue/IngestQueue.js.map +1 -1
- package/dist/store/GraphStore.d.ts +4 -3
- package/dist/store/GraphStore.d.ts.map +1 -1
- package/dist/store/postgres-pgvector/GraphStore.d.ts +6 -3
- package/dist/store/postgres-pgvector/GraphStore.d.ts.map +1 -1
- package/dist/store/postgres-pgvector/GraphStore.js +66 -6
- package/dist/store/postgres-pgvector/GraphStore.js.map +1 -1
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/drift/adaptiveDriftSensitivity.d.ts +20 -0
- package/dist/utils/drift/adaptiveDriftSensitivity.d.ts.map +1 -0
- package/dist/utils/drift/adaptiveDriftSensitivity.js +67 -0
- package/dist/utils/drift/adaptiveDriftSensitivity.js.map +1 -0
- package/dist/utils/tags.d.ts +2 -0
- package/dist/utils/tags.d.ts.map +1 -0
- package/dist/utils/tags.js +13 -0
- package/dist/utils/tags.js.map +1 -0
- package/package.json +1 -1
package/USER_GUIDE.md
CHANGED
|
@@ -90,6 +90,8 @@ Current v1 tables:
|
|
|
90
90
|
- `mg_session_ingest_state`
|
|
91
91
|
- `mg_graft_registry`
|
|
92
92
|
|
|
93
|
+
`mg_topic_nodes` and `mg_memory_nodes` include optional `tags TEXT[]` columns. Tags default to an empty array, so existing untagged sessions continue to work normally.
|
|
94
|
+
|
|
93
95
|
## Quick Start
|
|
94
96
|
|
|
95
97
|
Create `src/index.ts`:
|
|
@@ -179,6 +181,7 @@ Important fields:
|
|
|
179
181
|
- `label`: short label.
|
|
180
182
|
- `summary`: structured summary of the segment.
|
|
181
183
|
- `embedding`: vector used for semantic search.
|
|
184
|
+
- `tags`: optional normalized tags such as `"project:memo-grafter"` or `"planning"`.
|
|
182
185
|
- `messageRange`: source message range.
|
|
183
186
|
- `topicOrder`: chronological order.
|
|
184
187
|
- `driftScore`: topic-change score.
|
|
@@ -196,6 +199,7 @@ Important fields:
|
|
|
196
199
|
- `subject`, `predicate`, `value`: the structured memory triple.
|
|
197
200
|
- `confidence`: confidence score from `0` to `1`.
|
|
198
201
|
- `topicNodeId`: parent topic node ID.
|
|
202
|
+
- `tags`: optional normalized tags copied from the session or ingest call.
|
|
199
203
|
- `decayed`: whether the memory is stale.
|
|
200
204
|
- `hasConflict`: whether crawler maintenance found a conflicting active fact.
|
|
201
205
|
- `supersededBy`: newer memory ID when this memory has been replaced.
|
|
@@ -302,6 +306,32 @@ await agent.clearSession();
|
|
|
302
306
|
|
|
303
307
|
This waits for pending ingestion, clears the agent's local in-memory history, removes stored messages, topic nodes, memory nodes, graph edges, segments, and resets the session ingest cursor. It is a destructive operation and is not part of normal `invoke()` processing.
|
|
304
308
|
|
|
309
|
+
### Session Tags
|
|
310
|
+
|
|
311
|
+
Use session tags when you want to organize memory by project, planning area, week, domain, or worker route.
|
|
312
|
+
|
|
313
|
+
```ts
|
|
314
|
+
await agent.setSessionTags([
|
|
315
|
+
"project:memo-grafter",
|
|
316
|
+
"planning",
|
|
317
|
+
"week:2026-05-25",
|
|
318
|
+
]);
|
|
319
|
+
|
|
320
|
+
console.log(agent.getSessionTags());
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
Tags are optional. They are normalized by trimming whitespace, lowercasing, deduplicating, and sorting. Calling `setSessionTags()` waits for pending ingestion, updates existing topic and memory rows for the current session, and applies the same tags to future memories created by `invoke()`.
|
|
324
|
+
|
|
325
|
+
You can also tag direct ingestion:
|
|
326
|
+
|
|
327
|
+
```ts
|
|
328
|
+
await memo.ingest(messages, sessionId, {
|
|
329
|
+
tags: ["project:memo-grafter", "planning"],
|
|
330
|
+
});
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
Tags do not replace `sessionId`. By default, MemoGrafter still reads from the current session. Tag filters are opt-in.
|
|
334
|
+
|
|
305
335
|
### Targeted Recall
|
|
306
336
|
|
|
307
337
|
Use `recall()` when you want to retrieve structured memory by meaning without asking the LLM to produce an answer.
|
|
@@ -311,6 +341,13 @@ const result = await agent.recall("deployment config", {
|
|
|
311
341
|
limit: 8,
|
|
312
342
|
minSimilarity: 0.55,
|
|
313
343
|
tokenBudget: 1000,
|
|
344
|
+
tags: ["project:memo-grafter"],
|
|
345
|
+
tagMode: "all",
|
|
346
|
+
scope: "session-and-tags",
|
|
347
|
+
scoring: {
|
|
348
|
+
similarityWeight: 0.7,
|
|
349
|
+
confidenceWeight: 0.3,
|
|
350
|
+
},
|
|
314
351
|
cache: {
|
|
315
352
|
ttlSeconds: 90,
|
|
316
353
|
},
|
|
@@ -334,9 +371,26 @@ Options:
|
|
|
334
371
|
- `limit`: max memory nodes to fetch before filtering. Defaults to `10`.
|
|
335
372
|
- `minSimilarity`: cosine similarity floor. Defaults to `0.6`.
|
|
336
373
|
- `tokenBudget`: max approximate tokens for included fact blocks. Defaults to `1200`.
|
|
374
|
+
- `tags`: optional normalized tag filter.
|
|
375
|
+
- `tagMode`: `"all"` requires every requested tag, `"any"` accepts at least one requested tag. Defaults to `"all"`.
|
|
376
|
+
- `scope`: `"session"` keeps normal current-session recall, `"session-and-tags"` filters current-session recall by tags, and `"tagged"` searches across sessions matching the tags.
|
|
377
|
+
- `scoring.similarityWeight`: weight applied to semantic similarity when ranking retrieved facts. Defaults to `0.7`.
|
|
378
|
+
- `scoring.confidenceWeight`: weight applied to memory confidence when ranking retrieved facts. Defaults to `0.3`.
|
|
337
379
|
- `cache.ttlSeconds`: per-call recall cache TTL override when `MemoGrafterConfig.cache` is enabled. Values are clamped to 60-120 seconds.
|
|
338
380
|
|
|
339
|
-
`recall()` is side-effect free. It does not call `invoke()`, does not trigger a new LLM completion, and does not mutate local history. Your application can call it directly to display memories, add `result.systemPrompt` to a model call, or ignore the result.
|
|
381
|
+
`recall()` is side-effect free. It does not call `invoke()`, does not trigger a new LLM completion, and does not mutate local history. Your application can call it directly to display memories, add `result.systemPrompt` to a model call, or ignore the result. Retrieval still uses `minSimilarity` for the vector search floor, then ranks returned active facts with `similarity * similarityWeight + confidence * confidenceWeight`.
|
|
382
|
+
|
|
383
|
+
Cross-session tagged recall is explicit:
|
|
384
|
+
|
|
385
|
+
```ts
|
|
386
|
+
const projectMemory = await agent.recall("deployment decisions", {
|
|
387
|
+
tags: ["project:memo-grafter"],
|
|
388
|
+
scope: "tagged",
|
|
389
|
+
minSimilarity: 0.3,
|
|
390
|
+
});
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
This can return matching active memories from older or different sessions with the same tag. If your development database contains repeated smoke-test runs, you may see more than one matching fact because the older tagged rows are still present.
|
|
340
394
|
|
|
341
395
|
`MemoGrafterAgent.invoke()` also calls `recall()` internally before answering when the session has topic nodes. In that automatic path, the returned `systemPrompt` is pinned as a single system message before the recent raw chat window. Automatic recall uses `inject.recallLimit` and `inject.recallMinSimilarity`, defaulting to `6` and `0.55`.
|
|
342
396
|
|
|
@@ -391,6 +445,15 @@ for (const node of nodes) {
|
|
|
391
445
|
}
|
|
392
446
|
```
|
|
393
447
|
|
|
448
|
+
Filter active topic nodes by tag:
|
|
449
|
+
|
|
450
|
+
```ts
|
|
451
|
+
const planningNodes = await agent.getActiveNodes({
|
|
452
|
+
tags: ["planning"],
|
|
453
|
+
tagMode: "all",
|
|
454
|
+
});
|
|
455
|
+
```
|
|
456
|
+
|
|
394
457
|
Read active segments:
|
|
395
458
|
|
|
396
459
|
```ts
|
|
@@ -504,9 +567,12 @@ The built-in conflict/versioning passes use deterministic matching:
|
|
|
504
567
|
- a group conflicts when it has different normalized `value` strings;
|
|
505
568
|
- decayed memories are skipped;
|
|
506
569
|
- already superseded memories are skipped;
|
|
570
|
+
- broad topic memories with generic subject/predicate pairs are skipped unless they match a recognized competing trip-plan pattern;
|
|
507
571
|
- the newest conflicting fact wins by `createdAt`;
|
|
508
572
|
- if timestamps tie, deterministic ID ordering is used.
|
|
509
573
|
|
|
574
|
+
Conflict detection is meant for mutually exclusive fact slots such as `user location Delhi` versus `user location Bangalore`. For generic "things discussed" memories, MemoGrafter only recognizes a narrow travel destination plan pattern by default. That means `Goa trip plan` and `Vietnam trip plan` can conflict, while `how to cook rajma chawal`, `food in Vietnam`, and `places to visit Vietnam` do not all conflict just because extraction used a generic subject and predicate.
|
|
575
|
+
|
|
510
576
|
`DecayScoringPass` uses confidence-weighted exponential recency decay:
|
|
511
577
|
|
|
512
578
|
```text
|
|
@@ -535,6 +601,8 @@ When conflicts are found:
|
|
|
535
601
|
|
|
536
602
|
Crawler maintenance is non-destructive. It annotates existing memory rows and creates memory edges. It does not delete nodes, does not rebuild topics, and does not rewrite topic summaries.
|
|
537
603
|
|
|
604
|
+
Existing incorrect conflict edges are not automatically deleted. If an older crawler run created a false-positive edge, handle cleanup with a future explicit pruning pass or filter displayed memory edges to active memories in your app.
|
|
605
|
+
|
|
538
606
|
Do not put crawler behavior inside `clearSession()`. `clearSession()` is a destructive reset. The crawler is a non-destructive maintenance worker. If you intentionally rebuild a session graph, use this order:
|
|
539
607
|
|
|
540
608
|
```ts
|
|
@@ -653,6 +721,9 @@ const agent = new MemoGrafterAgent({
|
|
|
653
721
|
mode: "intent",
|
|
654
722
|
windowSize: 5,
|
|
655
723
|
driftSensitivity: "medium",
|
|
724
|
+
adaptiveSensitivity: {
|
|
725
|
+
enabled: false,
|
|
726
|
+
},
|
|
656
727
|
minSegmentMessages: 3,
|
|
657
728
|
llmAmbiguityDetection: false,
|
|
658
729
|
reentryDetection: true,
|
|
@@ -701,7 +772,7 @@ const store: GraphStore = new PostgresGraphStore(process.env.DATABASE_URL!);
|
|
|
701
772
|
|
|
702
773
|
Useful store inspection methods include:
|
|
703
774
|
|
|
704
|
-
- `getNodesBySession(sessionId)`: read topic nodes for a session.
|
|
775
|
+
- `getNodesBySession(sessionId, options?)`: read topic nodes for a session, optionally filtered by tags.
|
|
705
776
|
- `getTopicNode(topicNodeId, sessionId?)`: read one topic node by ID.
|
|
706
777
|
- `getSegmentsBySession(sessionId)`: read topic segments for a session.
|
|
707
778
|
- `getEdgesByType(sessionId, type)`: inspect graph edges such as `"reentry"`, `"semantic"`, `"temporal"`, or `"grafted"`.
|
|
@@ -709,6 +780,7 @@ Useful store inspection methods include:
|
|
|
709
780
|
- `getMemoriesBySession(sessionId)`: read all memory nodes for a session, including decayed and superseded rows.
|
|
710
781
|
- `getMemoryEdgesBySession(sessionId)`: read memory-level edges such as `conflicts` and `updates`.
|
|
711
782
|
- `getGraftRegistry(sessionId)`: read graft provenance entries for a session.
|
|
783
|
+
- `setSessionTags(sessionId, tags)`: replace the normalized tag set on existing topic and memory rows for a session.
|
|
712
784
|
|
|
713
785
|
### `llm`
|
|
714
786
|
|
|
@@ -755,6 +827,9 @@ drift: {
|
|
|
755
827
|
mode: "intent",
|
|
756
828
|
windowSize: 5,
|
|
757
829
|
driftSensitivity: "medium",
|
|
830
|
+
adaptiveSensitivity: {
|
|
831
|
+
enabled: false,
|
|
832
|
+
},
|
|
758
833
|
minSegmentMessages: 3,
|
|
759
834
|
llmAmbiguityDetection: false,
|
|
760
835
|
reentryDetection: true,
|
|
@@ -767,6 +842,7 @@ Controls topic boundary detection.
|
|
|
767
842
|
- `mode`: `"intent"` or `"window"`.
|
|
768
843
|
- `windowSize`: message window size for window mode.
|
|
769
844
|
- `driftSensitivity`: preferred sensitivity preset, one of `"low"`, `"medium"`, or `"high"`.
|
|
845
|
+
- `adaptiveSensitivity`: optional session-history based threshold tuning. Disabled by default.
|
|
770
846
|
- `threshold`: deprecated numeric threshold. It still works when `driftSensitivity` is not set, but MemoGrafter logs a one-time warning.
|
|
771
847
|
- `minSegmentMessages`: minimum messages before a boundary.
|
|
772
848
|
- `llmAmbiguityDetection`: optional LLM check for borderline topic shifts. Defaults to `false`.
|
|
@@ -785,6 +861,30 @@ Use `"medium"` first. Boundaries are cut when a drift score exceeds the resolved
|
|
|
785
861
|
|
|
786
862
|
If both `driftSensitivity` and `threshold` are provided, `driftSensitivity` wins.
|
|
787
863
|
|
|
864
|
+
#### Adaptive Sensitivity
|
|
865
|
+
|
|
866
|
+
Adaptive sensitivity is opt-in and keeps the configured `driftSensitivity` as its baseline. When enabled, MemoGrafter looks at recent saved segments for the session and nudges the resolved threshold by a small bounded step:
|
|
867
|
+
|
|
868
|
+
```ts
|
|
869
|
+
drift: {
|
|
870
|
+
mode: "intent",
|
|
871
|
+
driftSensitivity: "medium",
|
|
872
|
+
adaptiveSensitivity: {
|
|
873
|
+
enabled: true,
|
|
874
|
+
minSegments: 4,
|
|
875
|
+
lookbackSegments: 8,
|
|
876
|
+
targetSegmentMessages: {
|
|
877
|
+
min: 3,
|
|
878
|
+
max: 8,
|
|
879
|
+
},
|
|
880
|
+
adjustmentStep: 0.05,
|
|
881
|
+
maxAdjustment: 0.1,
|
|
882
|
+
},
|
|
883
|
+
}
|
|
884
|
+
```
|
|
885
|
+
|
|
886
|
+
If recent segments are consistently short, MemoGrafter raises the threshold slightly to reduce fragmentation. If recent segments are consistently long, it lowers the threshold slightly to split more readily. It does not adapt until enough segment history exists, and it skips adjustment when recent segment lengths are too erratic.
|
|
887
|
+
|
|
788
888
|
#### Reentry Detection
|
|
789
889
|
|
|
790
890
|
Reentry detection handles conversations that leave a topic and later return to it:
|
|
@@ -851,6 +951,20 @@ Enables an opt-in Redis cache for targeted recall. MemoGrafter creates one share
|
|
|
851
951
|
|
|
852
952
|
Recall cache keys include the session ID, `limit`, `minSimilarity`, and a deterministic hash of the query embedding. Redis failures are logged as warnings and recall falls back to PostgreSQL search. The cache is disabled unless this section is present.
|
|
853
953
|
|
|
954
|
+
When tag-aware recall is used, cache keys also include recall `scope`, `tagMode`, and the normalized tag list. This prevents untagged, session-filtered, and cross-session tagged recall from sharing cached search results.
|
|
955
|
+
|
|
956
|
+
## Manual Smoke Tests
|
|
957
|
+
|
|
958
|
+
From this repository, run the session-tagging smoke with a real PostgreSQL database:
|
|
959
|
+
|
|
960
|
+
```powershell
|
|
961
|
+
npx tsx --env-file=.env ./tests/manual/graft/session-tags-smoke.ts
|
|
962
|
+
```
|
|
963
|
+
|
|
964
|
+
Use the forward-slash path in PowerShell. An unquoted backslash path can be collapsed before `tsx` receives it.
|
|
965
|
+
|
|
966
|
+
The smoke creates two tagged sessions, writes one memory into each, verifies current-session tag filtering with `getActiveNodes()`, and verifies cross-session project recall with `recall(..., { scope: "tagged" })`. If you run it repeatedly against the same database, tagged recall can return rows from previous smoke runs because those historical sessions are still present.
|
|
967
|
+
|
|
854
968
|
## Queue Mode
|
|
855
969
|
|
|
856
970
|
Without queue config, ingestion runs synchronously after `invoke()`.
|
|
@@ -983,6 +1097,10 @@ const retriever = new RetrieverPipeline(store, embedder, {
|
|
|
983
1097
|
limit: 8,
|
|
984
1098
|
minSimilarity: 0.55,
|
|
985
1099
|
tokenBudget: 1000,
|
|
1100
|
+
scoring: {
|
|
1101
|
+
similarityWeight: 0.7,
|
|
1102
|
+
confidenceWeight: 0.3,
|
|
1103
|
+
},
|
|
986
1104
|
});
|
|
987
1105
|
|
|
988
1106
|
const result = await retriever.run(
|
|
@@ -1250,12 +1368,14 @@ Main exports:
|
|
|
1250
1368
|
- `FleetAgentRecord`
|
|
1251
1369
|
- `RetrievalResult`
|
|
1252
1370
|
- `RetrieverConfig`
|
|
1371
|
+
- `TagFilterOptions`
|
|
1372
|
+
- `IngestOptions`
|
|
1253
1373
|
- public shared and fleet types
|
|
1254
1374
|
|
|
1255
1375
|
Useful `GraphStore` inspection methods:
|
|
1256
1376
|
|
|
1257
1377
|
- `getTopicNode(topicNodeId, sessionId?)`
|
|
1258
|
-
- `getNodesBySession(sessionId)`
|
|
1378
|
+
- `getNodesBySession(sessionId, options?)`
|
|
1259
1379
|
- `getSegmentsBySession(sessionId)`
|
|
1260
1380
|
- `getEdgesByType(sessionId, type)`
|
|
1261
1381
|
- `getEdgesBySession(sessionId)`
|
|
@@ -1272,10 +1392,12 @@ Common `MemoGrafterAgent` methods:
|
|
|
1272
1392
|
- `getSessionId()`: read the current session ID.
|
|
1273
1393
|
- `getGraphSnapshot()`: read nodes, edges, memories, session ID, and capture timestamp for visualization or inspection.
|
|
1274
1394
|
- `getGraftRegistry()`: inspect provenance for grafted nodes in the current session.
|
|
1275
|
-
- `getActiveNodes()`: inspect topic nodes.
|
|
1395
|
+
- `getActiveNodes(options?)`: inspect topic nodes, optionally filtered by tags.
|
|
1276
1396
|
- `getActiveSegments()`: inspect topic segments.
|
|
1397
|
+
- `setSessionTags(tags)`: replace tags on the current session and apply them to future ingested memories.
|
|
1398
|
+
- `getSessionTags()`: read the current agent's normalized session tags.
|
|
1277
1399
|
- `clearSession()`: explicitly clear local history and stored session memory.
|
|
1278
|
-
- `recall(query, options?)`: retrieve structured memory by semantic query.
|
|
1400
|
+
- `recall(query, options?)`: retrieve structured memory by semantic query, optionally filtered by tags.
|
|
1279
1401
|
- `graft(topicIds?)`: preview memory injection.
|
|
1280
1402
|
- `ingestGraftedNodes(nodes)`: copy provided nodes into this agent.
|
|
1281
1403
|
- `absorbFromAgent(sourceAgent, options)`: select and copy memory from another agent.
|
package/dist/MemoGrafter.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { Redis } from "ioredis";
|
|
|
2
2
|
import { MemoGrafterFleet } from "./fleet/MemoGrafterFleet.js";
|
|
3
3
|
import type { MemoGrafterFleetOptions } from "./fleet/types.js";
|
|
4
4
|
import type { GraphStore } from "./store/index.js";
|
|
5
|
-
import type { AbsorbFromAgentOptions, EmbedAdapter, InjectionResult, LLMAdapter, MemoGrafterConfig, Message, TopicNode, TopicSegment } from "./types.js";
|
|
5
|
+
import type { AbsorbFromAgentOptions, EmbedAdapter, IngestOptions, InjectionResult, LLMAdapter, MemoGrafterConfig, Message, TopicNode, TopicSegment } from "./types.js";
|
|
6
6
|
export declare class MemoGrafter {
|
|
7
7
|
readonly llm: LLMAdapter;
|
|
8
8
|
readonly embedder: EmbedAdapter;
|
|
@@ -13,10 +13,13 @@ export declare class MemoGrafter {
|
|
|
13
13
|
private readonly ingestQueue;
|
|
14
14
|
constructor(config: MemoGrafterConfig);
|
|
15
15
|
initialize(): Promise<void>;
|
|
16
|
-
ingest(messages: Message[], sessionId: string): Promise<TopicNode[]>;
|
|
17
|
-
ingestNow(messages: Message[], sessionId: string): Promise<TopicNode[]>;
|
|
18
|
-
enqueueIngest(messages: Message[], sessionId: string): Promise<void>;
|
|
19
|
-
getTopics(sessionId: string
|
|
16
|
+
ingest(messages: Message[], sessionId: string, options?: IngestOptions): Promise<TopicNode[]>;
|
|
17
|
+
ingestNow(messages: Message[], sessionId: string, options?: IngestOptions): Promise<TopicNode[]>;
|
|
18
|
+
enqueueIngest(messages: Message[], sessionId: string, options?: IngestOptions): Promise<void>;
|
|
19
|
+
getTopics(sessionId: string, options?: {
|
|
20
|
+
tags?: string[];
|
|
21
|
+
tagMode?: "all" | "any";
|
|
22
|
+
}): Promise<{
|
|
20
23
|
nodes: TopicNode[];
|
|
21
24
|
segments: TopicSegment[];
|
|
22
25
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoGrafter.d.ts","sourceRoot":"","sources":["../src/MemoGrafter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EACV,sBAAsB,EACtB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACtB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;gBAErC,MAAM,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"MemoGrafter.d.ts","sourceRoot":"","sources":["../src/MemoGrafter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EACV,sBAAsB,EACtB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACtB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;gBAErC,MAAM,EAAE,iBAAiB;IAqDrC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQjG,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAI9F,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IASjG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;KAAO,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;IAMzJ,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAIjE,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAMrF,oBAAoB,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAmBpG,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAMpF,WAAW,CAAC,OAAO,GAAE,uBAA4B,GAAG,gBAAgB;IAI9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,CAAC,uBAAuB;CAUhC"}
|
package/dist/MemoGrafter.js
CHANGED
|
@@ -22,6 +22,7 @@ export class MemoGrafter {
|
|
|
22
22
|
const llmAmbiguityDetection = config.drift?.llmAmbiguityDetection;
|
|
23
23
|
const reentryDetection = config.drift?.reentryDetection;
|
|
24
24
|
const reentryThreshold = config.drift?.reentryThreshold;
|
|
25
|
+
const adaptiveSensitivity = config.drift?.adaptiveSensitivity;
|
|
25
26
|
const topK = config.graph?.topK ?? 5;
|
|
26
27
|
const hopDepth = config.graph?.hopDepth ?? 1;
|
|
27
28
|
const bufferSize = config.inject?.bufferSize ?? 1;
|
|
@@ -51,6 +52,7 @@ export class MemoGrafter {
|
|
|
51
52
|
...(llmAmbiguityDetection !== undefined ? { llmAmbiguityDetection } : {}),
|
|
52
53
|
...(reentryDetection !== undefined ? { reentryDetection } : {}),
|
|
53
54
|
...(reentryThreshold !== undefined ? { reentryThreshold } : {}),
|
|
55
|
+
...(adaptiveSensitivity !== undefined ? { adaptiveSensitivity } : {}),
|
|
54
56
|
});
|
|
55
57
|
this.grafterPipeline = new GrafterPipeline(this.store, {
|
|
56
58
|
hopDepth,
|
|
@@ -62,24 +64,24 @@ export class MemoGrafter {
|
|
|
62
64
|
initialize() {
|
|
63
65
|
return this.store.initialize();
|
|
64
66
|
}
|
|
65
|
-
ingest(messages, sessionId) {
|
|
67
|
+
ingest(messages, sessionId, options = {}) {
|
|
66
68
|
if (this.ingestQueue) {
|
|
67
|
-
return this.enqueueIngest(messages, sessionId).then(() => []);
|
|
69
|
+
return this.enqueueIngest(messages, sessionId, options).then(() => []);
|
|
68
70
|
}
|
|
69
|
-
return this.ingestPipeline.run(messages, sessionId);
|
|
71
|
+
return this.ingestPipeline.run(messages, sessionId, options);
|
|
70
72
|
}
|
|
71
|
-
ingestNow(messages, sessionId) {
|
|
72
|
-
return this.ingestPipeline.run(messages, sessionId);
|
|
73
|
+
ingestNow(messages, sessionId, options = {}) {
|
|
74
|
+
return this.ingestPipeline.run(messages, sessionId, options);
|
|
73
75
|
}
|
|
74
|
-
async enqueueIngest(messages, sessionId) {
|
|
76
|
+
async enqueueIngest(messages, sessionId, options = {}) {
|
|
75
77
|
if (this.ingestQueue) {
|
|
76
|
-
await this.ingestQueue.enqueue(messages, sessionId);
|
|
78
|
+
await this.ingestQueue.enqueue(messages, sessionId, options);
|
|
77
79
|
return;
|
|
78
80
|
}
|
|
79
|
-
await this.ingestPipeline.run(messages, sessionId);
|
|
81
|
+
await this.ingestPipeline.run(messages, sessionId, options);
|
|
80
82
|
}
|
|
81
|
-
async getTopics(sessionId) {
|
|
82
|
-
const nodes = await this.store.getNodesBySession(sessionId);
|
|
83
|
+
async getTopics(sessionId, options = {}) {
|
|
84
|
+
const nodes = await this.store.getNodesBySession(sessionId, options);
|
|
83
85
|
const segments = await this.store.getSegmentsBySession(sessionId);
|
|
84
86
|
return { nodes, segments };
|
|
85
87
|
}
|
package/dist/MemoGrafter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoGrafter.js","sourceRoot":"","sources":["../src/MemoGrafter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"MemoGrafter.js","sourceRoot":"","sources":["../src/MemoGrafter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAe/D,MAAM,OAAO,WAAW;IACb,GAAG,CAAa;IAChB,QAAQ,CAAe;IACvB,KAAK,CAAa;IAClB,WAAW,CAAe;IAClB,cAAc,CAAiB;IAC/B,eAAe,CAAkB;IACjC,WAAW,CAAqB;IAEjD,YAAY,MAAyB;QACnC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,QAAQ,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC;QAC1C,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC;QACxD,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,EAAE,kBAAkB,IAAI,CAAC,CAAC;QACjE,MAAM,qBAAqB,GAAG,MAAM,CAAC,KAAK,EAAE,qBAAqB,CAAC;QAClE,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC;QACxD,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC;QACxD,MAAM,mBAAmB,GAAG,MAAM,CAAC,KAAK,EAAE,mBAAmB,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,IAAI,IAAI,CAAC;QAEvD,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAChE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK;YAC7B,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE;gBACzC,kBAAkB,EAAE,KAAK;gBACzB,oBAAoB,EAAE,CAAC;aACxB,CAAC;YACF,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YAC7C,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QACH,MAAM,YAAY,GAAG;YACnB,UAAU;YACV,IAAI;YACJ,IAAI;YACJ,kBAAkB;SACnB,CAAC;QAEF,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE;YAChF,GAAG,YAAY;YACf,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE;YACrD,QAAQ;YACR,UAAU;YACV,WAAW;SACZ,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,QAAmB,EAAE,SAAiB,EAAE,UAAyB,EAAE;QACxE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,SAAS,CAAC,QAAmB,EAAE,SAAiB,EAAE,UAAyB,EAAE;QAC3E,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAmB,EAAE,SAAiB,EAAE,UAAyB,EAAE;QACrF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,UAAwD,EAAE;QAC3F,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAClE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,QAAkB;QAC1C,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,KAAkB,EAAE,eAAuB;QAClE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACzE,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC;QACzD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,eAAuB,EAAE,OAA+B;QACjF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAExE,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC3C,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,EAAE;gBAC5D,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;gBACrB,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,GAAG;aAC5C,CAAC,CAAC;QACL,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAkB,EAAE,eAAuB;QAC3D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACzE,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC;QACzD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,WAAW,CAAC,UAAmC,EAAE;QAC/C,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAChC,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACtD,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YAC/D,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAEO,uBAAuB;QAC7B,MAAM,WAAW,GAAG,UAGnB,CAAC;QAEF,IAAI,OAAO,WAAW,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,WAAW,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC7F,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AbsorbFromAgentOptions, GraftRegistryEntry, GraphSnapshot, InjectionResult, MemoGrafterConfig, Message, RetrievalResult, RetrieverConfig, TopicNode, TopicSegment } from "./types.js";
|
|
1
|
+
import type { AbsorbFromAgentOptions, GraftRegistryEntry, GraphSnapshot, InjectionResult, MemoGrafterConfig, Message, RetrievalResult, RetrieverConfig, TagFilterOptions, TopicNode, TopicSegment } from "./types.js";
|
|
2
2
|
export declare class MemoGrafterAgent {
|
|
3
3
|
private readonly core;
|
|
4
4
|
private readonly sessionId;
|
|
@@ -8,15 +8,18 @@ export declare class MemoGrafterAgent {
|
|
|
8
8
|
private readonly recallLimit;
|
|
9
9
|
private readonly recallMinSimilarity;
|
|
10
10
|
private readonly cacheConfig;
|
|
11
|
+
private sessionTags;
|
|
11
12
|
private pendingIngest;
|
|
12
13
|
constructor(config: MemoGrafterConfig);
|
|
13
14
|
initialize(): Promise<void>;
|
|
14
15
|
invoke(userMessage: string): Promise<string>;
|
|
15
16
|
getHistory(): Message[];
|
|
16
17
|
getSessionId(): string;
|
|
17
|
-
getActiveNodes(): Promise<TopicNode[]>;
|
|
18
|
+
getActiveNodes(options?: TagFilterOptions): Promise<TopicNode[]>;
|
|
18
19
|
getActiveSegments(): Promise<TopicSegment[]>;
|
|
19
20
|
getGraphSnapshot(): Promise<GraphSnapshot>;
|
|
21
|
+
setSessionTags(tags: string[]): Promise<void>;
|
|
22
|
+
getSessionTags(): string[];
|
|
20
23
|
getGraftRegistry(): Promise<GraftRegistryEntry[]>;
|
|
21
24
|
removeGraft(nodeId: string): Promise<void>;
|
|
22
25
|
clearSession(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoGrafterAgent.d.ts","sourceRoot":"","sources":["../src/MemoGrafterAgent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,eAAe,EACf,eAAe,EACf,SAAS,EACT,YAAY,EACb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"MemoGrafterAgent.d.ts","sourceRoot":"","sources":["../src/MemoGrafterAgent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,YAAY,EACb,MAAM,YAAY,CAAC;AAGpB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,aAAa,CAAoC;gBAE7C,MAAM,EAAE,iBAAiB;IASrC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBlD,UAAU,IAAI,OAAO,EAAE;IAIvB,YAAY,IAAI,MAAM;IAIhB,cAAc,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAMpE,iBAAiB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAM5C,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAmC1C,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,cAAc,IAAI,MAAM,EAAE;IAIpB,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAKjD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAM7B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAO1D,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAItD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,eAAe,CAAC;IAkB9E,eAAe,CAAC,WAAW,EAAE,gBAAgB,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAKhH,OAAO,CAAC,uBAAuB;YAUjB,mBAAmB;IAsBjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvB"}
|
package/dist/MemoGrafterAgent.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { MemoGrafter } from "./MemoGrafter.js";
|
|
3
3
|
import { RetrieverPipeline } from "./pipeline/RetrieverPipeline.js";
|
|
4
|
+
import { normalizeTags } from "./utils/tags.js";
|
|
4
5
|
export class MemoGrafterAgent {
|
|
5
6
|
core;
|
|
6
7
|
sessionId = randomUUID();
|
|
@@ -10,6 +11,7 @@ export class MemoGrafterAgent {
|
|
|
10
11
|
recallLimit;
|
|
11
12
|
recallMinSimilarity;
|
|
12
13
|
cacheConfig;
|
|
14
|
+
sessionTags = [];
|
|
13
15
|
pendingIngest = Promise.resolve();
|
|
14
16
|
constructor(config) {
|
|
15
17
|
this.core = new MemoGrafter(config);
|
|
@@ -45,9 +47,9 @@ export class MemoGrafterAgent {
|
|
|
45
47
|
getSessionId() {
|
|
46
48
|
return this.sessionId;
|
|
47
49
|
}
|
|
48
|
-
async getActiveNodes() {
|
|
50
|
+
async getActiveNodes(options = {}) {
|
|
49
51
|
await this.pendingIngest;
|
|
50
|
-
const { nodes } = await this.core.getTopics(this.sessionId);
|
|
52
|
+
const { nodes } = await this.core.getTopics(this.sessionId, options);
|
|
51
53
|
return nodes;
|
|
52
54
|
}
|
|
53
55
|
async getActiveSegments() {
|
|
@@ -87,6 +89,14 @@ export class MemoGrafterAgent {
|
|
|
87
89
|
capturedAt: new Date().toISOString(),
|
|
88
90
|
};
|
|
89
91
|
}
|
|
92
|
+
async setSessionTags(tags) {
|
|
93
|
+
await this.pendingIngest;
|
|
94
|
+
this.sessionTags = normalizeTags(tags);
|
|
95
|
+
await this.core.store.setSessionTags(this.sessionId, this.sessionTags);
|
|
96
|
+
}
|
|
97
|
+
getSessionTags() {
|
|
98
|
+
return [...this.sessionTags];
|
|
99
|
+
}
|
|
90
100
|
async getGraftRegistry() {
|
|
91
101
|
await this.pendingIngest;
|
|
92
102
|
return this.core.store.getGraftRegistry(this.sessionId);
|
|
@@ -133,7 +143,7 @@ export class MemoGrafterAgent {
|
|
|
133
143
|
enqueueBackgroundIngest() {
|
|
134
144
|
const historySnapshot = [...this.history];
|
|
135
145
|
this.pendingIngest = this.pendingIngest
|
|
136
|
-
.then(() => this.core.enqueueIngest(historySnapshot, this.sessionId))
|
|
146
|
+
.then(() => this.core.enqueueIngest(historySnapshot, this.sessionId, { tags: this.sessionTags }))
|
|
137
147
|
.catch((error) => {
|
|
138
148
|
console.warn("MemoGrafter background ingest warning:", error);
|
|
139
149
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoGrafterAgent.js","sourceRoot":"","sources":["../src/MemoGrafterAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAcpE,MAAM,OAAO,gBAAgB;IACV,IAAI,CAAc;IAClB,SAAS,GAAG,UAAU,EAAE,CAAC;IACzB,OAAO,GAAc,EAAE,CAAC;IACxB,gBAAgB,CAAS;IACzB,gBAAgB,CAAS;IACzB,WAAW,CAAS;IACpB,mBAAmB,CAAS;IAC5B,WAAW,CAA6B;IACjD,aAAa,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEzD,YAAY,MAAyB;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,IAAI,EAAE,CAAC;QAC9D,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,IAAI,IAAI,CAAC;QACtE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IAClC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE;YAChE,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,aAAa,EAAE,IAAI,CAAC,mBAAmB;SACxC,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAc;YAC1B,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,GAAG,cAAc;YACjB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;SACvC,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAE/E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,cAAc;
|
|
1
|
+
{"version":3,"file":"MemoGrafterAgent.js","sourceRoot":"","sources":["../src/MemoGrafterAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export interface MemoryConflictGroup {
|
|
|
5
5
|
}
|
|
6
6
|
export declare function normalizeMemoryPart(value: string): string;
|
|
7
7
|
export declare function findMemoryConflictGroups(memories: MemoryNode[]): MemoryConflictGroup[];
|
|
8
|
+
export declare function isBroadTopicMemory(memory: Pick<MemoryNode, "subject" | "predicate">): boolean;
|
|
8
9
|
export declare function getNewestMemoryNode(nodes: MemoryNode[]): MemoryNode | null;
|
|
9
10
|
export declare function compareNewestFirst(left: MemoryNode, right: MemoryNode): number;
|
|
10
11
|
export declare function getSkippedMaintenanceCounts(memories: MemoryNode[]): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoryMaintenance.d.ts","sourceRoot":"","sources":["../../src/crawler/memoryMaintenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"memoryMaintenance.d.ts","sourceRoot":"","sources":["../../src/crawler/memoryMaintenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAOD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,mBAAmB,EAAE,CA6BtF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,WAAW,CAAC,GAAG,OAAO,CAG7F;AA8CD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,GAAG,IAAI,CAE1E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAK9E;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG;IACnE,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAKA"}
|
|
@@ -2,25 +2,74 @@ export function normalizeMemoryPart(value) {
|
|
|
2
2
|
return value.trim().toLowerCase().replace(/\s+/g, " ");
|
|
3
3
|
}
|
|
4
4
|
export function findMemoryConflictGroups(memories) {
|
|
5
|
-
const activeMemories = memories.filter((memory) => !memory.decayed && memory.supersededBy == null);
|
|
6
5
|
const byFactKey = new Map();
|
|
7
|
-
for (const memory of
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
for (const memory of memories) {
|
|
7
|
+
if (memory.decayed || memory.supersededBy != null)
|
|
8
|
+
continue;
|
|
9
|
+
const grouping = getConflictGrouping(memory);
|
|
10
|
+
if (!grouping)
|
|
11
|
+
continue;
|
|
12
|
+
const key = grouping.key;
|
|
13
13
|
const group = byFactKey.get(key);
|
|
14
|
+
const item = {
|
|
15
|
+
memory,
|
|
16
|
+
value: grouping.value,
|
|
17
|
+
};
|
|
14
18
|
if (group) {
|
|
15
|
-
group.push(
|
|
19
|
+
group.push(item);
|
|
16
20
|
}
|
|
17
21
|
else {
|
|
18
|
-
byFactKey.set(key, [
|
|
22
|
+
byFactKey.set(key, [item]);
|
|
19
23
|
}
|
|
20
24
|
}
|
|
21
25
|
return [...byFactKey.entries()]
|
|
22
|
-
.filter(([,
|
|
23
|
-
.map(([key,
|
|
26
|
+
.filter(([, items]) => new Set(items.map((item) => item.value)).size > 1)
|
|
27
|
+
.map(([key, items]) => ({
|
|
28
|
+
key,
|
|
29
|
+
nodes: items.map((item) => item.memory),
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
export function isBroadTopicMemory(memory) {
|
|
33
|
+
return GENERIC_SUBJECTS.has(normalizeMemoryPart(memory.subject))
|
|
34
|
+
&& GENERIC_PREDICATES.has(normalizeMemoryPart(memory.predicate));
|
|
35
|
+
}
|
|
36
|
+
function getConflictGrouping(memory) {
|
|
37
|
+
if (isBroadTopicMemory(memory)) {
|
|
38
|
+
return getBroadTopicConflictGrouping(memory);
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
key: [
|
|
42
|
+
memory.sessionId,
|
|
43
|
+
normalizeMemoryPart(memory.subject),
|
|
44
|
+
normalizeMemoryPart(memory.predicate),
|
|
45
|
+
].join("\u0000"),
|
|
46
|
+
value: normalizeMemoryPart(memory.value),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function getBroadTopicConflictGrouping(memory) {
|
|
50
|
+
const value = normalizeMemoryPart(memory.value);
|
|
51
|
+
const destination = extractTravelPlanDestination(value);
|
|
52
|
+
if (!destination)
|
|
53
|
+
return null;
|
|
54
|
+
return {
|
|
55
|
+
key: [memory.sessionId, "broad-topic", "travel-trip-plan"].join("\u0000"),
|
|
56
|
+
value: destination,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function extractTravelPlanDestination(value) {
|
|
60
|
+
if (!/\b(trip|travel|itinerary|vacation|holiday)\b/.test(value)) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const destinationPatterns = [
|
|
64
|
+
/\b(?:to|for|in)\s+([a-z][a-z\s]+?)(?:\s+(?:trip|travel|itinerary|plan|planning|vacation|holiday)\b|$)/,
|
|
65
|
+
/^([a-z][a-z\s]+?)\s+(?:trip|travel|itinerary|plan|planning|vacation|holiday)\b/,
|
|
66
|
+
];
|
|
67
|
+
for (const pattern of destinationPatterns) {
|
|
68
|
+
const destination = value.match(pattern)?.[1]?.trim();
|
|
69
|
+
if (destination)
|
|
70
|
+
return destination;
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
24
73
|
}
|
|
25
74
|
export function getNewestMemoryNode(nodes) {
|
|
26
75
|
return [...nodes].sort(compareNewestFirst)[0] ?? null;
|
|
@@ -37,4 +86,25 @@ export function getSkippedMaintenanceCounts(memories) {
|
|
|
37
86
|
skippedSuperseded: memories.filter((memory) => memory.supersededBy != null).length,
|
|
38
87
|
};
|
|
39
88
|
}
|
|
89
|
+
const GENERIC_SUBJECTS = new Set([
|
|
90
|
+
"conversation",
|
|
91
|
+
"memory",
|
|
92
|
+
"plan",
|
|
93
|
+
"request",
|
|
94
|
+
"topic",
|
|
95
|
+
"user",
|
|
96
|
+
]);
|
|
97
|
+
const GENERIC_PREDICATES = new Set([
|
|
98
|
+
"asked about",
|
|
99
|
+
"asked_about",
|
|
100
|
+
"asks about",
|
|
101
|
+
"asks_about",
|
|
102
|
+
"discussed",
|
|
103
|
+
"interested in",
|
|
104
|
+
"interested_in",
|
|
105
|
+
"is",
|
|
106
|
+
"mentioned",
|
|
107
|
+
"plan",
|
|
108
|
+
"wants",
|
|
109
|
+
]);
|
|
40
110
|
//# sourceMappingURL=memoryMaintenance.js.map
|