@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.
Files changed (103) hide show
  1. package/CHANGELOG.md +61 -1
  2. package/README.md +43 -14
  3. package/dist/cli.js +301 -29
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config-store.d.ts.map +1 -1
  6. package/dist/config-store.js +3 -0
  7. package/dist/config-store.js.map +1 -1
  8. package/dist/config.d.ts +5 -0
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +6 -0
  11. package/dist/config.js.map +1 -1
  12. package/dist/extraction/extractor.d.ts +5 -2
  13. package/dist/extraction/extractor.d.ts.map +1 -1
  14. package/dist/extraction/extractor.js +38 -2
  15. package/dist/extraction/extractor.js.map +1 -1
  16. package/dist/extraction/tier25-ollama.d.ts +8 -0
  17. package/dist/extraction/tier25-ollama.d.ts.map +1 -0
  18. package/dist/extraction/tier25-ollama.js +56 -0
  19. package/dist/extraction/tier25-ollama.js.map +1 -0
  20. package/dist/index.js +164 -11
  21. package/dist/index.js.map +1 -1
  22. package/dist/llm/ollama-client.d.ts +39 -0
  23. package/dist/llm/ollama-client.d.ts.map +1 -0
  24. package/dist/llm/ollama-client.js +172 -0
  25. package/dist/llm/ollama-client.js.map +1 -0
  26. package/dist/orchestration/ranker.d.ts +2 -1
  27. package/dist/orchestration/ranker.d.ts.map +1 -1
  28. package/dist/orchestration/ranker.js +11 -1
  29. package/dist/orchestration/ranker.js.map +1 -1
  30. package/dist/orchestration/scope.d.ts +4 -3
  31. package/dist/orchestration/scope.d.ts.map +1 -1
  32. package/dist/orchestration/scope.js +16 -2
  33. package/dist/orchestration/scope.js.map +1 -1
  34. package/dist/portability/dump.d.ts +19 -0
  35. package/dist/portability/dump.d.ts.map +1 -0
  36. package/dist/portability/dump.js +225 -0
  37. package/dist/portability/dump.js.map +1 -0
  38. package/dist/portability/exporter.d.ts +5 -0
  39. package/dist/portability/exporter.d.ts.map +1 -0
  40. package/dist/portability/exporter.js +116 -0
  41. package/dist/portability/exporter.js.map +1 -0
  42. package/dist/portability/importer.d.ts +12 -0
  43. package/dist/portability/importer.d.ts.map +1 -0
  44. package/dist/portability/importer.js +164 -0
  45. package/dist/portability/importer.js.map +1 -0
  46. package/dist/sharing/cross-project.d.ts +15 -0
  47. package/dist/sharing/cross-project.d.ts.map +1 -0
  48. package/dist/sharing/cross-project.js +35 -0
  49. package/dist/sharing/cross-project.js.map +1 -0
  50. package/dist/storage/neo4j.d.ts +1 -0
  51. package/dist/storage/neo4j.d.ts.map +1 -1
  52. package/dist/storage/neo4j.js +10 -0
  53. package/dist/storage/neo4j.js.map +1 -1
  54. package/dist/storage/sqlite.d.ts +50 -1
  55. package/dist/storage/sqlite.d.ts.map +1 -1
  56. package/dist/storage/sqlite.js +276 -3
  57. package/dist/storage/sqlite.js.map +1 -1
  58. package/dist/templates/claude-instructions.d.ts +1 -1
  59. package/dist/templates/claude-instructions.d.ts.map +1 -1
  60. package/dist/templates/claude-instructions.js +6 -1
  61. package/dist/templates/claude-instructions.js.map +1 -1
  62. package/dist/tools/config.d.ts +2 -0
  63. package/dist/tools/config.d.ts.map +1 -1
  64. package/dist/tools/config.js +12 -1
  65. package/dist/tools/config.js.map +1 -1
  66. package/dist/tools/context.d.ts +2 -1
  67. package/dist/tools/context.d.ts.map +1 -1
  68. package/dist/tools/context.js +13 -4
  69. package/dist/tools/context.js.map +1 -1
  70. package/dist/tools/export.d.ts +5 -0
  71. package/dist/tools/export.d.ts.map +1 -0
  72. package/dist/tools/export.js +24 -0
  73. package/dist/tools/export.js.map +1 -0
  74. package/dist/tools/graph-query.d.ts +2 -1
  75. package/dist/tools/graph-query.d.ts.map +1 -1
  76. package/dist/tools/graph-query.js +5 -1
  77. package/dist/tools/graph-query.js.map +1 -1
  78. package/dist/tools/import.d.ts +7 -0
  79. package/dist/tools/import.d.ts.map +1 -0
  80. package/dist/tools/import.js +25 -0
  81. package/dist/tools/import.js.map +1 -0
  82. package/dist/tools/search.d.ts +2 -1
  83. package/dist/tools/search.d.ts.map +1 -1
  84. package/dist/tools/search.js +16 -3
  85. package/dist/tools/search.js.map +1 -1
  86. package/dist/tools/share.d.ts +4 -0
  87. package/dist/tools/share.d.ts.map +1 -0
  88. package/dist/tools/share.js +51 -0
  89. package/dist/tools/share.js.map +1 -0
  90. package/dist/tools/stats.d.ts +5 -0
  91. package/dist/tools/stats.d.ts.map +1 -0
  92. package/dist/tools/stats.js +30 -0
  93. package/dist/tools/stats.js.map +1 -0
  94. package/dist/tools/store.d.ts.map +1 -1
  95. package/dist/tools/store.js +2 -0
  96. package/dist/tools/store.js.map +1 -1
  97. package/dist/tracking/access-tracker.d.ts +36 -0
  98. package/dist/tracking/access-tracker.d.ts.map +1 -0
  99. package/dist/tracking/access-tracker.js +68 -0
  100. package/dist/tracking/access-tracker.js.map +1 -0
  101. package/dist/types/index.d.ts +161 -4
  102. package/dist/types/index.d.ts.map +1 -1
  103. 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":"AAIA,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAA2B,EAC3B,KAAiB,EACjB,MAAmB;IAEnB,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,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,gBAAgB,EAAE,eAAe;KAClC,CAAC;AACJ,CAAC"}
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"}
@@ -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
- export declare function handleMemorySearch(args: MemorySearchInput, embedder: Embedder, sqlite: SQLiteStore, qdrant: QdrantStore, currentProject?: string): Promise<MemorySearchOutput>;
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;AAGtE,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,kBAAkB,CAAC,CA2C7B"}
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"}
@@ -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. Apply scope boosting and merge
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
- const boost = inferScopeTier(mem.project, project);
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
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAuB,EACvB,QAAkB,EAClB,MAAmB,EACnB,MAAmB,EACnB,cAAuB;IAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,IAAI,IAAI,CAAC;IAEvD,qBAAqB;IACrB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEhD,yBAAyB;IACzB,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAC/D,mFAAmF;IAEnF,iFAAiF;IACjF,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAElH,qCAAqC;IACrC,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAExD,oCAAoC;IACpC,MAAM,OAAO,GAAmB,aAAa;SAC1C,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM;YAC7B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,UAAU,EAAE,GAAG,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAqB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;SAC5C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnB,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAuB,EACvB,QAAkB,EAClB,MAAmB,EACnB,MAAmB,EACnB,cAAuB,EACvB,aAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,IAAI,IAAI,CAAC;IAEvD,qBAAqB;IACrB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEhD,yBAAyB;IACzB,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAC/D,mFAAmF;IAEnF,iFAAiF;IACjF,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAElH,qCAAqC;IACrC,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAExD,0DAA0D;IAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAExE,4DAA4D;IAC5D,MAAM,OAAO,GAAmB,aAAa;SAC1C,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,wEAAwE;QACxE,IACE,GAAG,CAAC,UAAU,KAAK,cAAc;YACjC,OAAO;YACP,GAAG,CAAC,OAAO,KAAK,OAAO;YACvB,GAAG,CAAC,OAAO,KAAK,IAAI,EACpB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QACnF,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM;YAC7B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,UAAU,EAAE,GAAG,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAqB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;SAC5C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnB,kCAAkC;IAClC,IAAI,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC"}
@@ -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,CAoE5B"}
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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/tools/store.ts"],"names":[],"mappings":"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"}
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"}
@@ -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>;