@londer/cortex 0.1.0 → 0.2.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/CHANGELOG.md +61 -1
- package/README.md +43 -14
- package/dist/cli.js +301 -29
- package/dist/cli.js.map +1 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +3 -0
- package/dist/config-store.js.map +1 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/extraction/extractor.d.ts +5 -2
- package/dist/extraction/extractor.d.ts.map +1 -1
- package/dist/extraction/extractor.js +38 -2
- package/dist/extraction/extractor.js.map +1 -1
- package/dist/extraction/tier25-ollama.d.ts +8 -0
- package/dist/extraction/tier25-ollama.d.ts.map +1 -0
- package/dist/extraction/tier25-ollama.js +56 -0
- package/dist/extraction/tier25-ollama.js.map +1 -0
- package/dist/index.js +164 -11
- package/dist/index.js.map +1 -1
- package/dist/llm/ollama-client.d.ts +39 -0
- package/dist/llm/ollama-client.d.ts.map +1 -0
- package/dist/llm/ollama-client.js +172 -0
- package/dist/llm/ollama-client.js.map +1 -0
- package/dist/orchestration/ranker.d.ts +2 -1
- package/dist/orchestration/ranker.d.ts.map +1 -1
- package/dist/orchestration/ranker.js +11 -1
- package/dist/orchestration/ranker.js.map +1 -1
- package/dist/orchestration/scope.d.ts +4 -3
- package/dist/orchestration/scope.d.ts.map +1 -1
- package/dist/orchestration/scope.js +16 -2
- package/dist/orchestration/scope.js.map +1 -1
- package/dist/portability/dump.d.ts +19 -0
- package/dist/portability/dump.d.ts.map +1 -0
- package/dist/portability/dump.js +225 -0
- package/dist/portability/dump.js.map +1 -0
- package/dist/portability/exporter.d.ts +5 -0
- package/dist/portability/exporter.d.ts.map +1 -0
- package/dist/portability/exporter.js +116 -0
- package/dist/portability/exporter.js.map +1 -0
- package/dist/portability/importer.d.ts +12 -0
- package/dist/portability/importer.d.ts.map +1 -0
- package/dist/portability/importer.js +164 -0
- package/dist/portability/importer.js.map +1 -0
- package/dist/sharing/cross-project.d.ts +15 -0
- package/dist/sharing/cross-project.d.ts.map +1 -0
- package/dist/sharing/cross-project.js +35 -0
- package/dist/sharing/cross-project.js.map +1 -0
- package/dist/storage/neo4j.d.ts +1 -0
- package/dist/storage/neo4j.d.ts.map +1 -1
- package/dist/storage/neo4j.js +10 -0
- package/dist/storage/neo4j.js.map +1 -1
- package/dist/storage/sqlite.d.ts +50 -1
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +276 -3
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/templates/claude-instructions.d.ts +1 -1
- package/dist/templates/claude-instructions.d.ts.map +1 -1
- package/dist/templates/claude-instructions.js +6 -1
- package/dist/templates/claude-instructions.js.map +1 -1
- package/dist/tools/config.d.ts +2 -0
- package/dist/tools/config.d.ts.map +1 -1
- package/dist/tools/config.js +12 -1
- package/dist/tools/config.js.map +1 -1
- package/dist/tools/context.d.ts +2 -1
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +13 -4
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/export.d.ts +5 -0
- package/dist/tools/export.d.ts.map +1 -0
- package/dist/tools/export.js +24 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/graph-query.d.ts +2 -1
- package/dist/tools/graph-query.d.ts.map +1 -1
- package/dist/tools/graph-query.js +5 -1
- package/dist/tools/graph-query.js.map +1 -1
- package/dist/tools/import.d.ts +7 -0
- package/dist/tools/import.d.ts.map +1 -0
- package/dist/tools/import.js +25 -0
- package/dist/tools/import.js.map +1 -0
- package/dist/tools/search.d.ts +2 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +16 -3
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/share.d.ts +4 -0
- package/dist/tools/share.d.ts.map +1 -0
- package/dist/tools/share.js +51 -0
- package/dist/tools/share.js.map +1 -0
- package/dist/tools/stats.d.ts +5 -0
- package/dist/tools/stats.d.ts.map +1 -0
- package/dist/tools/stats.js +30 -0
- package/dist/tools/stats.js.map +1 -0
- package/dist/tools/store.d.ts.map +1 -1
- package/dist/tools/store.js +2 -0
- package/dist/tools/store.js.map +1 -1
- package/dist/tracking/access-tracker.d.ts +36 -0
- package/dist/tracking/access-tracker.d.ts.map +1 -0
- package/dist/tracking/access-tracker.js +68 -0
- package/dist/tracking/access-tracker.js.map +1 -0
- package/dist/types/index.d.ts +161 -4
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +73 -69
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export async function handleMemoryGraphQuery(args, neo4j, sqlite) {
|
|
1
|
+
export async function handleMemoryGraphQuery(args, neo4j, sqlite, accessTracker) {
|
|
2
2
|
const depth = Math.min(args.depth ?? 2, 4);
|
|
3
3
|
// 1. Traverse the graph from the starting entity
|
|
4
4
|
const graphResult = await neo4j.traverse(args.entity, depth, args.relation_types, args.project);
|
|
@@ -26,6 +26,10 @@ export async function handleMemoryGraphQuery(args, neo4j, sqlite) {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
+
// Log access for returned memories
|
|
30
|
+
if (accessTracker && relatedMemories.length > 0) {
|
|
31
|
+
accessTracker.logAccess(relatedMemories.map(m => m.id), 'memory_graph_query', args.project ?? null);
|
|
32
|
+
}
|
|
29
33
|
return {
|
|
30
34
|
entity: args.entity,
|
|
31
35
|
connections: graphResult.connections,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-query.js","sourceRoot":"","sources":["../../src/tools/graph-query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph-query.js","sourceRoot":"","sources":["../../src/tools/graph-query.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAA2B,EAC3B,KAAiB,EACjB,MAAmB,EACnB,aAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3C,iDAAiD;IACjD,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,QAAQ,CACtC,IAAI,CAAC,MAAM,EACX,KAAK,EACL,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,OAAO,CACb,CAAC;IAEF,wDAAwD;IACxD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;QAC3C,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,mDAAmD;IACnD,MAAM,eAAe,GAAoB,EAAE,CAAC;IAC5C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS;YACvC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAEzB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,GAAG,EAAE,CAAC;gBACR,eAAe,CAAC,IAAI,CAAC;oBACnB,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,KAAK,EAAE,GAAG;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,IAAI,aAAa,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,aAAa,CAAC,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,oBAAoB,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IACtG,CAAC;IAED,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,gBAAgB,EAAE,eAAe;KAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SQLiteStore } from '../storage/sqlite.js';
|
|
2
|
+
import type { QdrantStore } from '../storage/qdrant.js';
|
|
3
|
+
import type { Neo4jStore } from '../storage/neo4j.js';
|
|
4
|
+
import type { Embedder } from '../embedding/embedder.js';
|
|
5
|
+
import type { MemoryImportInput, MemoryImportOutput } from '../types/index.js';
|
|
6
|
+
export declare function handleMemoryImport(args: MemoryImportInput, sqlite: SQLiteStore, qdrant: QdrantStore, neo4j: Neo4jStore, embedder: Embedder): Promise<MemoryImportOutput>;
|
|
7
|
+
//# sourceMappingURL=import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/tools/import.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAwB7B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { validateExportData, importMemories } from '../portability/importer.js';
|
|
2
|
+
export async function handleMemoryImport(args, sqlite, qdrant, neo4j, embedder) {
|
|
3
|
+
// Parse and validate
|
|
4
|
+
let parsed;
|
|
5
|
+
try {
|
|
6
|
+
parsed = JSON.parse(args.data);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
throw new Error('Invalid JSON data');
|
|
10
|
+
}
|
|
11
|
+
const exportData = validateExportData(parsed);
|
|
12
|
+
// Import
|
|
13
|
+
const result = await importMemories(exportData, sqlite, qdrant, neo4j, embedder, {
|
|
14
|
+
merge: args.merge ?? false,
|
|
15
|
+
dryRun: args.dry_run !== false, // default true
|
|
16
|
+
projectOverride: args.project_override,
|
|
17
|
+
});
|
|
18
|
+
return {
|
|
19
|
+
imported: result.imported,
|
|
20
|
+
skipped: result.skipped,
|
|
21
|
+
errors: result.errors,
|
|
22
|
+
details: result.details,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/tools/import.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAuB,EACvB,MAAmB,EACnB,MAAmB,EACnB,KAAiB,EACjB,QAAkB;IAElB,qBAAqB;IACrB,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE9C,SAAS;IACT,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC/E,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK;QAC1B,MAAM,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,eAAe;QAC/C,eAAe,EAAE,IAAI,CAAC,gBAAgB;KACvC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC"}
|
package/dist/tools/search.d.ts
CHANGED
|
@@ -2,5 +2,6 @@ import type { MemorySearchInput, MemorySearchOutput } from '../types/index.js';
|
|
|
2
2
|
import type { Embedder } from '../embedding/embedder.js';
|
|
3
3
|
import type { SQLiteStore } from '../storage/sqlite.js';
|
|
4
4
|
import type { QdrantStore } from '../storage/qdrant.js';
|
|
5
|
-
|
|
5
|
+
import type { AccessTracker } from '../tracking/access-tracker.js';
|
|
6
|
+
export declare function handleMemorySearch(args: MemorySearchInput, embedder: Embedder, sqlite: SQLiteStore, qdrant: QdrantStore, currentProject?: string, accessTracker?: AccessTracker): Promise<MemorySearchOutput>;
|
|
6
7
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAgB,MAAM,mBAAmB,CAAC;AAC7F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAgB,MAAM,mBAAmB,CAAC;AAC7F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAGnE,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,cAAc,CAAC,EAAE,MAAM,EACvB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CA8D7B"}
|
package/dist/tools/search.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { inferScopeTier } from '../orchestration/scope.js';
|
|
2
|
-
export async function handleMemorySearch(args, embedder, sqlite, qdrant, currentProject) {
|
|
2
|
+
export async function handleMemorySearch(args, embedder, sqlite, qdrant, currentProject, accessTracker) {
|
|
3
3
|
const limit = args.limit ?? 10;
|
|
4
4
|
const project = args.project ?? currentProject ?? null;
|
|
5
5
|
// 1. Embed the query
|
|
@@ -17,13 +17,22 @@ export async function handleMemorySearch(args, embedder, sqlite, qdrant, current
|
|
|
17
17
|
const ids = qdrantResults.map(r => r.id);
|
|
18
18
|
const memories = sqlite.getMemoriesByIds(ids);
|
|
19
19
|
const memoryMap = new Map(memories.map(m => [m.id, m]));
|
|
20
|
-
// 5.
|
|
20
|
+
// 5. Get linked projects for cross-project scope boosting
|
|
21
|
+
const linkedProjects = project ? sqlite.getLinkedProjects(project) : [];
|
|
22
|
+
// 6. Apply scope boosting and merge (respecting visibility)
|
|
21
23
|
const results = qdrantResults
|
|
22
24
|
.map(r => {
|
|
23
25
|
const mem = memoryMap.get(r.id);
|
|
24
26
|
if (!mem)
|
|
25
27
|
return null;
|
|
26
|
-
|
|
28
|
+
// Filter: project-only memories should not appear outside their project
|
|
29
|
+
if (mem.visibility === 'project-only' &&
|
|
30
|
+
project &&
|
|
31
|
+
mem.project !== project &&
|
|
32
|
+
mem.project !== null) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const boost = inferScopeTier(mem.project, project, linkedProjects, mem.visibility);
|
|
27
36
|
return {
|
|
28
37
|
id: mem.id,
|
|
29
38
|
content: mem.content,
|
|
@@ -38,6 +47,10 @@ export async function handleMemorySearch(args, embedder, sqlite, qdrant, current
|
|
|
38
47
|
.filter((r) => r !== null)
|
|
39
48
|
.sort((a, b) => b.score - a.score)
|
|
40
49
|
.slice(0, limit);
|
|
50
|
+
// Log access for returned results
|
|
51
|
+
if (accessTracker && results.length > 0) {
|
|
52
|
+
accessTracker.logAccess(results.map(r => r.id), 'memory_search', project);
|
|
53
|
+
}
|
|
41
54
|
return { results };
|
|
42
55
|
}
|
|
43
56
|
//# sourceMappingURL=search.js.map
|
package/dist/tools/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { MemoryShareInput, MemoryShareOutput } from '../types/index.js';
|
|
2
|
+
import type { SQLiteStore } from '../storage/sqlite.js';
|
|
3
|
+
export declare function handleMemoryShare(args: MemoryShareInput, sqlite: SQLiteStore): MemoryShareOutput;
|
|
4
|
+
//# sourceMappingURL=share.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/tools/share.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,WAAW,GAClB,iBAAiB,CAoDnB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { promoteVisibility } from '../sharing/cross-project.js';
|
|
2
|
+
export function handleMemoryShare(args, sqlite) {
|
|
3
|
+
switch (args.action) {
|
|
4
|
+
case 'promote': {
|
|
5
|
+
if (!args.memory_id || !args.visibility) {
|
|
6
|
+
return { success: false, message: 'promote requires memory_id and visibility' };
|
|
7
|
+
}
|
|
8
|
+
return promoteVisibility(sqlite, args.memory_id, args.visibility);
|
|
9
|
+
}
|
|
10
|
+
case 'link_projects': {
|
|
11
|
+
if (!args.project_a || !args.project_b) {
|
|
12
|
+
return { success: false, message: 'link_projects requires project_a and project_b' };
|
|
13
|
+
}
|
|
14
|
+
if (args.project_a === args.project_b) {
|
|
15
|
+
return { success: false, message: 'Cannot link a project to itself' };
|
|
16
|
+
}
|
|
17
|
+
sqlite.linkProjects(args.project_a, args.project_b);
|
|
18
|
+
return {
|
|
19
|
+
success: true,
|
|
20
|
+
message: `Linked projects: ${args.project_a} ↔ ${args.project_b}`,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
case 'unlink_projects': {
|
|
24
|
+
if (!args.project_a || !args.project_b) {
|
|
25
|
+
return { success: false, message: 'unlink_projects requires project_a and project_b' };
|
|
26
|
+
}
|
|
27
|
+
sqlite.unlinkProjects(args.project_a, args.project_b);
|
|
28
|
+
return {
|
|
29
|
+
success: true,
|
|
30
|
+
message: `Unlinked projects: ${args.project_a} ↔ ${args.project_b}`,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
case 'list_links': {
|
|
34
|
+
const links = args.project
|
|
35
|
+
? sqlite.getLinkedProjects(args.project).map(p => ({
|
|
36
|
+
project_a: args.project,
|
|
37
|
+
project_b: p,
|
|
38
|
+
created_at: '',
|
|
39
|
+
}))
|
|
40
|
+
: sqlite.getAllProjectLinks();
|
|
41
|
+
return {
|
|
42
|
+
success: true,
|
|
43
|
+
message: `Found ${links.length} project link(s)`,
|
|
44
|
+
links,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
default:
|
|
48
|
+
return { success: false, message: `Unknown action: ${args.action}` };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=share.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.js","sourceRoot":"","sources":["../../src/tools/share.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,UAAU,iBAAiB,CAC/B,IAAsB,EACtB,MAAmB;IAEnB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC;YAClF,CAAC;YACD,OAAO,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpE,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC;YACvF,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC;YACxE,CAAC;YACD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACpD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,oBAAoB,IAAI,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,EAAE;aAClE,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kDAAkD,EAAE,CAAC;YACzF,CAAC;YACD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,sBAAsB,IAAI,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,EAAE;aACpE,CAAC;QACJ,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO;gBACxB,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC/C,SAAS,EAAE,IAAI,CAAC,OAAQ;oBACxB,SAAS,EAAE,CAAC;oBACZ,UAAU,EAAE,EAAE;iBACf,CAAC,CAAC;gBACL,CAAC,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,SAAS,KAAK,CAAC,MAAM,kBAAkB;gBAChD,KAAK;aACN,CAAC;QACJ,CAAC;QAED;YACE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IACzE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { MemoryStatsInput, MemoryStatsOutput } from '../types/index.js';
|
|
2
|
+
import type { SQLiteStore } from '../storage/sqlite.js';
|
|
3
|
+
import type { Neo4jStore } from '../storage/neo4j.js';
|
|
4
|
+
export declare function handleMemoryStats(args: MemoryStatsInput, sqlite: SQLiteStore, neo4j: Neo4jStore): Promise<MemoryStatsOutput>;
|
|
5
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/tools/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,iBAAiB,CAAC,CA6B5B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export async function handleMemoryStats(args, sqlite, neo4j) {
|
|
2
|
+
const baseStats = sqlite.getStats();
|
|
3
|
+
const byType = sqlite.getMemoryCountByType();
|
|
4
|
+
const byProject = sqlite.getMemoryCountByProject();
|
|
5
|
+
const { mostAccessed, leastAccessed } = sqlite.getMemoryAccessStats(5);
|
|
6
|
+
const averageStaleness = sqlite.getAverageStaleness();
|
|
7
|
+
const staleCount = sqlite.getStaleMemoryCount(0.7);
|
|
8
|
+
// Get relationship count from Neo4j
|
|
9
|
+
let totalRelationships = 0;
|
|
10
|
+
try {
|
|
11
|
+
totalRelationships = await neo4j.getRelationshipCount();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Neo4j may be unavailable
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
total_memories: baseStats.totalMemories,
|
|
18
|
+
by_type: byType,
|
|
19
|
+
by_project: byProject,
|
|
20
|
+
most_accessed: mostAccessed,
|
|
21
|
+
least_accessed: leastAccessed,
|
|
22
|
+
average_staleness: Math.round(averageStaleness * 1000) / 1000,
|
|
23
|
+
stale_count: staleCount,
|
|
24
|
+
graph_stats: {
|
|
25
|
+
total_entities: baseStats.totalEntities,
|
|
26
|
+
total_relationships: totalRelationships,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/tools/stats.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAsB,EACtB,MAAmB,EACnB,KAAiB;IAEjB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,uBAAuB,EAAE,CAAC;IACnD,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;IACtD,MAAM,UAAU,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEnD,oCAAoC;IACpC,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC;QACH,kBAAkB,GAAG,MAAM,KAAK,CAAC,oBAAoB,EAAE,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;IAED,OAAO;QACL,cAAc,EAAE,SAAS,CAAC,aAAa;QACvC,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,SAAS;QACrB,aAAa,EAAE,YAAY;QAC3B,cAAc,EAAE,aAAa;QAC7B,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,IAAI;QAC7D,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE;YACX,cAAc,EAAE,SAAS,CAAC,aAAa;YACvC,mBAAmB,EAAE,kBAAkB;SACxC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/tools/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAyB,MAAM,mBAAmB,CAAC;AACpG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,EACjB,SAAS,CAAC,EAAE,eAAe,GAC1B,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/tools/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAyB,MAAM,mBAAmB,CAAC;AACpG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,EACjB,SAAS,CAAC,EAAE,eAAe,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAsE5B"}
|
package/dist/tools/store.js
CHANGED
|
@@ -5,6 +5,7 @@ export async function handleMemoryStore(args, embedder, sqlite, qdrant, neo4j, e
|
|
|
5
5
|
const tags = args.tags ?? [];
|
|
6
6
|
const project = args.project ?? null;
|
|
7
7
|
const source = args.source ?? null;
|
|
8
|
+
const visibility = args.visibility ?? 'project-only';
|
|
8
9
|
// Determine entities: use provided ones, or auto-extract
|
|
9
10
|
let entities = args.entities ?? [];
|
|
10
11
|
let extractionTier = null;
|
|
@@ -43,6 +44,7 @@ export async function handleMemoryStore(args, embedder, sqlite, qdrant, neo4j, e
|
|
|
43
44
|
source_type: 'manual',
|
|
44
45
|
extraction_confidence: extractionConfidence,
|
|
45
46
|
extraction_tier: extractionTier,
|
|
47
|
+
visibility,
|
|
46
48
|
};
|
|
47
49
|
sqlite.insertMemory(memory);
|
|
48
50
|
// 3. Store vector in Qdrant
|
package/dist/tools/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/tools/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAQpC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAsB,EACtB,QAAkB,EAClB,MAAmB,EACnB,MAAmB,EACnB,KAAiB,EACjB,SAA2B;IAE3B,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IACpB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/tools/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { SQLiteStore } from '../storage/sqlite.js';
|
|
2
|
+
export interface StalenessFactors {
|
|
3
|
+
daysSinceCreation: number;
|
|
4
|
+
daysSinceLastAccess: number;
|
|
5
|
+
accessCount: number;
|
|
6
|
+
hasGraphConnections: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Compute a staleness score between 0 (fresh) and 1 (stale).
|
|
10
|
+
*
|
|
11
|
+
* Formula:
|
|
12
|
+
* base = daysSinceLastAccess / thresholdDays (clamped to [0, 1])
|
|
13
|
+
* frequency discount = min(accessCount / 10, 0.3) — accessed more = less stale
|
|
14
|
+
* graph discount = 0.1 if entity has graph connections
|
|
15
|
+
* staleness = max(0, base - frequency discount - graph discount)
|
|
16
|
+
*/
|
|
17
|
+
export declare function computeStaleness(factors: StalenessFactors, thresholdDays: number): number;
|
|
18
|
+
export declare class AccessTracker {
|
|
19
|
+
private sqlite;
|
|
20
|
+
private thresholdDays;
|
|
21
|
+
constructor(sqlite: SQLiteStore, thresholdDays?: number);
|
|
22
|
+
/**
|
|
23
|
+
* Log an access event for one or more memory IDs.
|
|
24
|
+
* Uses synchronous SQLite inserts — fast for single rows.
|
|
25
|
+
*/
|
|
26
|
+
logAccess(memoryIds: string[], tool: string, project: string | null): void;
|
|
27
|
+
/**
|
|
28
|
+
* Recalculate staleness scores for all memories.
|
|
29
|
+
* Called periodically (e.g. during consolidation) or via CLI.
|
|
30
|
+
*/
|
|
31
|
+
updateAllStaleness(): {
|
|
32
|
+
updated: number;
|
|
33
|
+
averageStaleness: number;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=access-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-tracker.d.ts","sourceRoot":"","sources":["../../src/tracking/access-tracker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,MAAM,GACpB,MAAM,CAKR;AAED,qBAAa,aAAa;IAEtB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,aAAa;gBADb,MAAM,EAAE,WAAW,EACnB,aAAa,GAAE,MAAW;IAGpC;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAa1E;;;OAGG;IACH,kBAAkB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE;CA8BpE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
/**
|
|
3
|
+
* Compute a staleness score between 0 (fresh) and 1 (stale).
|
|
4
|
+
*
|
|
5
|
+
* Formula:
|
|
6
|
+
* base = daysSinceLastAccess / thresholdDays (clamped to [0, 1])
|
|
7
|
+
* frequency discount = min(accessCount / 10, 0.3) — accessed more = less stale
|
|
8
|
+
* graph discount = 0.1 if entity has graph connections
|
|
9
|
+
* staleness = max(0, base - frequency discount - graph discount)
|
|
10
|
+
*/
|
|
11
|
+
export function computeStaleness(factors, thresholdDays) {
|
|
12
|
+
const base = Math.min(factors.daysSinceLastAccess / thresholdDays, 1.0);
|
|
13
|
+
const frequencyDiscount = Math.min(factors.accessCount / 10, 0.3);
|
|
14
|
+
const graphDiscount = factors.hasGraphConnections ? 0.1 : 0;
|
|
15
|
+
return Math.max(0, base - frequencyDiscount - graphDiscount);
|
|
16
|
+
}
|
|
17
|
+
export class AccessTracker {
|
|
18
|
+
sqlite;
|
|
19
|
+
thresholdDays;
|
|
20
|
+
constructor(sqlite, thresholdDays = 90) {
|
|
21
|
+
this.sqlite = sqlite;
|
|
22
|
+
this.thresholdDays = thresholdDays;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Log an access event for one or more memory IDs.
|
|
26
|
+
* Uses synchronous SQLite inserts — fast for single rows.
|
|
27
|
+
*/
|
|
28
|
+
logAccess(memoryIds, tool, project) {
|
|
29
|
+
for (const memoryId of memoryIds) {
|
|
30
|
+
this.sqlite.insertAccessLog({
|
|
31
|
+
id: uuidv4(),
|
|
32
|
+
memory_id: memoryId,
|
|
33
|
+
tool,
|
|
34
|
+
project,
|
|
35
|
+
accessed_at: new Date().toISOString(),
|
|
36
|
+
});
|
|
37
|
+
this.sqlite.incrementAccessCount(memoryId);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Recalculate staleness scores for all memories.
|
|
42
|
+
* Called periodically (e.g. during consolidation) or via CLI.
|
|
43
|
+
*/
|
|
44
|
+
updateAllStaleness() {
|
|
45
|
+
const memories = this.sqlite.getAllMemoriesForStaleness();
|
|
46
|
+
let totalStaleness = 0;
|
|
47
|
+
const now = Date.now();
|
|
48
|
+
for (const mem of memories) {
|
|
49
|
+
const daysSinceCreation = (now - new Date(mem.created_at).getTime()) / (1000 * 60 * 60 * 24);
|
|
50
|
+
const daysSinceLastAccess = mem.last_accessed_at
|
|
51
|
+
? (now - new Date(mem.last_accessed_at).getTime()) / (1000 * 60 * 60 * 24)
|
|
52
|
+
: daysSinceCreation; // Never accessed → use creation date
|
|
53
|
+
const staleness = computeStaleness({
|
|
54
|
+
daysSinceCreation,
|
|
55
|
+
daysSinceLastAccess,
|
|
56
|
+
accessCount: mem.access_count,
|
|
57
|
+
hasGraphConnections: mem.has_graph_connections,
|
|
58
|
+
}, this.thresholdDays);
|
|
59
|
+
this.sqlite.updateStalenessScore(mem.id, staleness);
|
|
60
|
+
totalStaleness += staleness;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
updated: memories.length,
|
|
64
|
+
averageStaleness: memories.length > 0 ? totalStaleness / memories.length : 0,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=access-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-tracker.js","sourceRoot":"","sources":["../../src/tracking/access-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAUpC;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAyB,EACzB,aAAqB;IAErB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,GAAG,aAAa,EAAE,GAAG,CAAC,CAAC;IACxE,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,iBAAiB,GAAG,aAAa,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,OAAO,aAAa;IAEd;IACA;IAFV,YACU,MAAmB,EACnB,gBAAwB,EAAE;QAD1B,WAAM,GAAN,MAAM,CAAa;QACnB,kBAAa,GAAb,aAAa,CAAa;IACjC,CAAC;IAEJ;;;OAGG;IACH,SAAS,CAAC,SAAmB,EAAE,IAAY,EAAE,OAAsB;QACjE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;gBAC1B,EAAE,EAAE,MAAM,EAAE;gBACZ,SAAS,EAAE,QAAQ;gBACnB,IAAI;gBACJ,OAAO;gBACP,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,CAAC;QAC1D,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,iBAAiB,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7F,MAAM,mBAAmB,GAAG,GAAG,CAAC,gBAAgB;gBAC9C,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBAC1E,CAAC,CAAC,iBAAiB,CAAC,CAAC,qCAAqC;YAE5D,MAAM,SAAS,GAAG,gBAAgB,CAChC;gBACE,iBAAiB;gBACjB,mBAAmB;gBACnB,WAAW,EAAE,GAAG,CAAC,YAAY;gBAC7B,mBAAmB,EAAE,GAAG,CAAC,qBAAqB;aAC/C,EACD,IAAI,CAAC,aAAa,CACnB,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACpD,cAAc,IAAI,SAAS,CAAC;QAC9B,CAAC;QAED,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,MAAM;YACxB,gBAAgB,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC7E,CAAC;IACJ,CAAC;CACF"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -14,6 +14,10 @@ export interface Memory {
|
|
|
14
14
|
consolidated_from?: string | null;
|
|
15
15
|
extraction_confidence?: number | null;
|
|
16
16
|
extraction_tier?: number | null;
|
|
17
|
+
access_count?: number;
|
|
18
|
+
last_accessed_at?: string | null;
|
|
19
|
+
staleness_score?: number;
|
|
20
|
+
visibility?: MemoryVisibility;
|
|
17
21
|
}
|
|
18
22
|
export interface MemoryPayload {
|
|
19
23
|
id: string;
|
|
@@ -56,6 +60,7 @@ export interface MemoryStoreInput {
|
|
|
56
60
|
project?: string;
|
|
57
61
|
entities?: string[];
|
|
58
62
|
source?: string;
|
|
63
|
+
visibility?: MemoryVisibility;
|
|
59
64
|
}
|
|
60
65
|
export interface MemoryStoreOutput {
|
|
61
66
|
id: string;
|
|
@@ -124,7 +129,7 @@ export interface Session {
|
|
|
124
129
|
last_active: string | null;
|
|
125
130
|
tool_calls: number;
|
|
126
131
|
}
|
|
127
|
-
export type ScopeTier = 'project_local' | 'related_project' | 'global';
|
|
132
|
+
export type ScopeTier = 'project_local' | 'cross_project' | 'related_project' | 'global';
|
|
128
133
|
export interface ScopeBoost {
|
|
129
134
|
tier: ScopeTier;
|
|
130
135
|
weight: number;
|
|
@@ -156,7 +161,7 @@ export interface ExtractedRelationship {
|
|
|
156
161
|
export interface ExtractionResult {
|
|
157
162
|
entities: ExtractedEntity[];
|
|
158
163
|
relationships: ExtractedRelationship[];
|
|
159
|
-
tier: 1 | 2 | 3;
|
|
164
|
+
tier: 1 | 2 | 2.5 | 3;
|
|
160
165
|
}
|
|
161
166
|
export type ExtractionTier = 'auto' | 'local-only' | 'llm-preferred';
|
|
162
167
|
export interface BufferedEvent {
|
|
@@ -215,8 +220,12 @@ export interface MemoryConfigOutput {
|
|
|
215
220
|
config: {
|
|
216
221
|
llm_available: boolean;
|
|
217
222
|
llm_model: string | null;
|
|
223
|
+
ollama_available: boolean;
|
|
224
|
+
ollama_enabled: boolean;
|
|
225
|
+
ollama_model: string | null;
|
|
226
|
+
ollama_url: string | null;
|
|
218
227
|
extraction_tier: ExtractionTier;
|
|
219
|
-
active_extraction_tier: 1 | 2 | 3;
|
|
228
|
+
active_extraction_tier: 1 | 2 | 2.5 | 3;
|
|
220
229
|
auto_extract: boolean;
|
|
221
230
|
consolidation_enabled: boolean;
|
|
222
231
|
consolidation_interval_ms: number;
|
|
@@ -255,7 +264,7 @@ export interface MemoryIngestOutput {
|
|
|
255
264
|
type: string;
|
|
256
265
|
}>;
|
|
257
266
|
relationships: number;
|
|
258
|
-
tier_used: 1 | 2 | 3;
|
|
267
|
+
tier_used: 1 | 2 | 2.5 | 3;
|
|
259
268
|
}
|
|
260
269
|
export interface MemoryConsolidateInput {
|
|
261
270
|
project?: string;
|
|
@@ -276,6 +285,154 @@ export interface MemoryConsolidateOutput {
|
|
|
276
285
|
memories: string[];
|
|
277
286
|
}>;
|
|
278
287
|
}
|
|
288
|
+
export type MemoryVisibility = 'project-only' | 'cross-project' | 'global';
|
|
289
|
+
export interface ProjectLink {
|
|
290
|
+
project_a: string;
|
|
291
|
+
project_b: string;
|
|
292
|
+
created_at: string;
|
|
293
|
+
}
|
|
294
|
+
export interface MemoryShareInput {
|
|
295
|
+
action: 'promote' | 'link_projects' | 'unlink_projects' | 'list_links';
|
|
296
|
+
memory_id?: string;
|
|
297
|
+
visibility?: MemoryVisibility;
|
|
298
|
+
project_a?: string;
|
|
299
|
+
project_b?: string;
|
|
300
|
+
project?: string;
|
|
301
|
+
}
|
|
302
|
+
export interface MemoryShareOutput {
|
|
303
|
+
success: boolean;
|
|
304
|
+
message: string;
|
|
305
|
+
links?: ProjectLink[];
|
|
306
|
+
}
|
|
307
|
+
export interface AccessLogEntry {
|
|
308
|
+
id: string;
|
|
309
|
+
memory_id: string;
|
|
310
|
+
tool: string;
|
|
311
|
+
project: string | null;
|
|
312
|
+
accessed_at: string;
|
|
313
|
+
}
|
|
314
|
+
export interface MemoryStatsInput {
|
|
315
|
+
project?: string;
|
|
316
|
+
}
|
|
317
|
+
export interface MemoryStatsOutput {
|
|
318
|
+
total_memories: number;
|
|
319
|
+
by_type: Record<string, number>;
|
|
320
|
+
by_project: Record<string, number>;
|
|
321
|
+
most_accessed: Array<{
|
|
322
|
+
id: string;
|
|
323
|
+
content: string;
|
|
324
|
+
access_count: number;
|
|
325
|
+
}>;
|
|
326
|
+
least_accessed: Array<{
|
|
327
|
+
id: string;
|
|
328
|
+
content: string;
|
|
329
|
+
access_count: number;
|
|
330
|
+
}>;
|
|
331
|
+
average_staleness: number;
|
|
332
|
+
stale_count: number;
|
|
333
|
+
graph_stats: {
|
|
334
|
+
total_entities: number;
|
|
335
|
+
total_relationships: number;
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
export interface CortexExportData {
|
|
339
|
+
version: string;
|
|
340
|
+
exported_at: string;
|
|
341
|
+
source_instance: string;
|
|
342
|
+
filters: {
|
|
343
|
+
project: string | null;
|
|
344
|
+
types: MemoryType[] | null;
|
|
345
|
+
date_range: string | null;
|
|
346
|
+
min_access: number | null;
|
|
347
|
+
};
|
|
348
|
+
data: {
|
|
349
|
+
memories: ExportedMemory[];
|
|
350
|
+
entities: ExportedEntity[];
|
|
351
|
+
project_links: ExportedProjectLink[];
|
|
352
|
+
};
|
|
353
|
+
stats: {
|
|
354
|
+
memories: number;
|
|
355
|
+
entities: number;
|
|
356
|
+
relationships: number;
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
export interface ExportedMemory {
|
|
360
|
+
id: string;
|
|
361
|
+
content: string;
|
|
362
|
+
type: MemoryType;
|
|
363
|
+
project: string | null;
|
|
364
|
+
tags: string[];
|
|
365
|
+
entities: string[];
|
|
366
|
+
source: string | null;
|
|
367
|
+
source_type: string | null;
|
|
368
|
+
visibility: MemoryVisibility;
|
|
369
|
+
created_at: string;
|
|
370
|
+
access_count: number;
|
|
371
|
+
staleness_score: number;
|
|
372
|
+
}
|
|
373
|
+
export interface ExportedEntity {
|
|
374
|
+
name: string;
|
|
375
|
+
project: string | null;
|
|
376
|
+
connections: Array<{
|
|
377
|
+
entity: string;
|
|
378
|
+
relation: string;
|
|
379
|
+
direction: 'incoming' | 'outgoing';
|
|
380
|
+
}>;
|
|
381
|
+
}
|
|
382
|
+
export interface ExportedProjectLink {
|
|
383
|
+
project_a: string;
|
|
384
|
+
project_b: string;
|
|
385
|
+
reason?: string;
|
|
386
|
+
}
|
|
387
|
+
export interface ExportFilters {
|
|
388
|
+
project?: string;
|
|
389
|
+
types?: MemoryType[];
|
|
390
|
+
since?: string;
|
|
391
|
+
min_access?: number;
|
|
392
|
+
}
|
|
393
|
+
export interface ImportResult {
|
|
394
|
+
imported: number;
|
|
395
|
+
skipped: number;
|
|
396
|
+
errors: number;
|
|
397
|
+
details: Array<{
|
|
398
|
+
id: string;
|
|
399
|
+
action: 'imported' | 'skipped' | 'error';
|
|
400
|
+
reason?: string;
|
|
401
|
+
}>;
|
|
402
|
+
}
|
|
403
|
+
export interface MemoryExportInput {
|
|
404
|
+
format?: 'json';
|
|
405
|
+
project?: string;
|
|
406
|
+
types?: MemoryType[];
|
|
407
|
+
since?: string;
|
|
408
|
+
min_access?: number;
|
|
409
|
+
limit?: number;
|
|
410
|
+
}
|
|
411
|
+
export interface MemoryExportOutput {
|
|
412
|
+
data: string;
|
|
413
|
+
stats: {
|
|
414
|
+
memories: number;
|
|
415
|
+
entities: number;
|
|
416
|
+
relationships: number;
|
|
417
|
+
};
|
|
418
|
+
truncated?: boolean;
|
|
419
|
+
}
|
|
420
|
+
export interface MemoryImportInput {
|
|
421
|
+
data: string;
|
|
422
|
+
project_override?: string;
|
|
423
|
+
merge?: boolean;
|
|
424
|
+
dry_run?: boolean;
|
|
425
|
+
}
|
|
426
|
+
export interface MemoryImportOutput {
|
|
427
|
+
imported: number;
|
|
428
|
+
skipped: number;
|
|
429
|
+
errors: number;
|
|
430
|
+
details?: Array<{
|
|
431
|
+
id: string;
|
|
432
|
+
action: 'imported' | 'skipped' | 'error';
|
|
433
|
+
reason?: string;
|
|
434
|
+
}>;
|
|
435
|
+
}
|
|
279
436
|
export interface LLMClient {
|
|
280
437
|
isAvailable(): boolean;
|
|
281
438
|
setApiKey(key: string): Promise<boolean>;
|