adaptive-memory-multi-model-router 1.9.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +50 -0
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +37 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +44 -0
- package/.github/workflows/npm-stats-validation.yml +152 -0
- package/.github/workflows/pages.yml +37 -0
- package/CHANGELOG.md +122 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +110 -0
- package/LAUNCH-PAIN-DRIVEN.md +339 -0
- package/LAUNCH.md +575 -0
- package/POPULARITY_BOOSTERS.md +285 -0
- package/README.md +231 -300
- package/SECURITY.md +69 -0
- package/articles/CONTENT_STRUCTURE.md +292 -0
- package/articles/DEVTO_COST_GUIDE.md +473 -0
- package/articles/DEVTO_FINAL.md +416 -0
- package/articles/DEVTO_MULTI_PROVIDER.md +542 -0
- package/articles/HN_10X_BETTER.md +430 -0
- package/articles/HN_CHINESE_STYLE.md +308 -0
- package/articles/HN_FINAL.md +199 -0
- package/articles/HN_POSTED_VERSION.md +56 -0
- package/articles/HN_RESEARCH.md +364 -0
- package/articles/PAIN-DRIVEN-devto-v2.md +308 -0
- package/articles/PAIN-DRIVEN-devto-v3.md +268 -0
- package/articles/PAIN-DRIVEN-devto.md +242 -0
- package/articles/PAIN-DRIVEN-hackernews-v2.md +138 -0
- package/articles/PAIN-DRIVEN-hackernews-v3.md +151 -0
- package/articles/PAIN-DRIVEN-hackernews.md +131 -0
- package/articles/PAIN-DRIVEN-reddit-v2.md +301 -0
- package/articles/PAIN-DRIVEN-reddit-v3.md +236 -0
- package/articles/PAIN-DRIVEN-reddit.md +218 -0
- package/articles/PAIN-DRIVEN-twitter-v2.md +110 -0
- package/articles/PAIN-DRIVEN-twitter-v3.md +121 -0
- package/articles/PAIN-DRIVEN-twitter.md +120 -0
- package/articles/PORTKEY_VS_A3M.md +147 -0
- package/articles/REDDIT_FINAL.md +232 -0
- package/articles/TWITTER_FINAL.md +167 -0
- package/articles/WHY_10X_BETTER.md +261 -0
- package/articles/WHY_CHINESE_STYLE_BETTER.md +323 -0
- package/articles/ai-discoverability-llm-routing.md +210 -0
- package/articles/devto-llm-routing.md +109 -0
- package/articles/hackernews-show-hn.md +65 -0
- package/articles/hashnode-llm-cost-optimization.md +125 -0
- package/articles/medium-building-llm-router.md +205 -0
- package/articles/reddit-ml.md +86 -0
- package/articles/twitter-thread-cost-savings.md +98 -0
- package/articles/youtube-tutorial-script.md +262 -0
- package/assets/banner.svg +109 -0
- package/assets/logo.svg +68 -0
- package/assets/social-preview.svg +64 -0
- package/demo/demo-script.md +53 -0
- package/dist/analytics/costAnalytics.d.ts +77 -0
- package/dist/analytics/costAnalytics.d.ts.map +1 -0
- package/dist/analytics/costAnalytics.js +219 -0
- package/dist/analytics/costAnalytics.js.map +1 -0
- package/dist/cache/semanticCache.d.ts +62 -0
- package/dist/cache/semanticCache.d.ts.map +1 -0
- package/dist/cache/semanticCache.js +176 -0
- package/dist/cache/semanticCache.js.map +1 -0
- package/dist/cli.js +35 -0
- package/dist/geo/generativeEngineOptimization.js +321 -0
- package/dist/geo/geoRouter.js +387 -0
- package/dist/index.d.ts +4 -723
- package/dist/index.js +11 -344
- package/dist/index.js.map +1 -1
- package/dist/integrations/langchainAdapter.d.ts +146 -0
- package/dist/integrations/langchainAdapter.d.ts.map +1 -0
- package/dist/integrations/langchainAdapter.js +731 -0
- package/dist/integrations/langchainAdapter.js.map +1 -0
- package/dist/integrations/oauth.d.ts +69 -0
- package/dist/integrations/oauth.d.ts.map +1 -0
- package/dist/integrations/oauth.js +225 -21
- package/dist/integrations/oauth.js.map +1 -0
- package/dist/memory/autoFetch.d.ts +39 -0
- package/dist/memory/autoFetch.d.ts.map +1 -0
- package/dist/memory/autoFetch.js +80 -88
- package/dist/memory/autoFetch.js.map +1 -0
- package/dist/memory/memoryTree.d.ts +76 -0
- package/dist/memory/memoryTree.d.ts.map +1 -0
- package/dist/memory/memoryTree.js +185 -130
- package/dist/memory/memoryTree.js.map +1 -0
- package/dist/memory/obsidianVault.d.ts +71 -0
- package/dist/memory/obsidianVault.d.ts.map +1 -0
- package/dist/memory/obsidianVault.js +207 -22
- package/dist/memory/obsidianVault.js.map +1 -0
- package/dist/providers/providerConfig.d.ts +49 -0
- package/dist/providers/providerConfig.d.ts.map +1 -0
- package/dist/providers/providerConfig.js +806 -401
- package/dist/providers/providerConfig.js.map +1 -0
- package/dist/security/guardrails.d.ts +76 -0
- package/dist/security/guardrails.d.ts.map +1 -0
- package/dist/security/guardrails.js +479 -0
- package/dist/security/guardrails.js.map +1 -0
- package/dist/security/inputValidation.js +351 -0
- package/dist/server/dashboard.d.ts +58 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js +553 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/modelMapper.d.ts +43 -0
- package/dist/server/modelMapper.d.ts.map +1 -0
- package/dist/server/modelMapper.js +154 -0
- package/dist/server/modelMapper.js.map +1 -0
- package/dist/server/proxyServer.d.ts +41 -0
- package/dist/server/proxyServer.d.ts.map +1 -0
- package/dist/server/proxyServer.js +932 -0
- package/dist/server/proxyServer.js.map +1 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts +2 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts.map +1 -0
- package/dist/skills/__tests__/skill_manager.test.js +268 -0
- package/dist/skills/__tests__/skill_manager.test.js.map +1 -0
- package/docs/geo/GENERATIVE_ENGINE_OPTIMIZATION.md +232 -0
- package/docs-site/index.html +347 -0
- package/llms.txt +138 -0
- package/package.json +72 -7
- package/playground/README.md +51 -0
- package/playground/codesandbox.json +12 -0
- package/playground/index.js +39 -0
- package/scripts/update-npm-badges.js +158 -0
- package/src/analytics/costAnalytics.ts +304 -0
- package/src/cache/semanticCache.ts +221 -0
- package/src/index.ts +6 -0
- package/src/integrations/langchainAdapter.ts +955 -0
- package/src/providers/providerConfig.ts +923 -0
- package/src/security/guardrails.ts +585 -0
- package/src/server/dashboard.ts +610 -0
- package/src/server/modelMapper.ts +182 -0
- package/src/server/proxyServer.ts +1105 -0
- package/src/types/langchain.d.ts +83 -0
- package/tsconfig.build.json +20 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Tree Hierarchy
|
|
3
|
+
*
|
|
4
|
+
* Canonicalizes data into ≤3k-token chunks, scores them,
|
|
5
|
+
* and builds hierarchical summary trees.
|
|
6
|
+
*/
|
|
7
|
+
export interface MemoryChunk {
|
|
8
|
+
id: string;
|
|
9
|
+
content: string;
|
|
10
|
+
score: number;
|
|
11
|
+
parentId?: string;
|
|
12
|
+
depth: number;
|
|
13
|
+
createdAt: number;
|
|
14
|
+
accessCount: number;
|
|
15
|
+
}
|
|
16
|
+
export interface TreeNode {
|
|
17
|
+
id: string;
|
|
18
|
+
chunks: MemoryChunk[];
|
|
19
|
+
summary: string;
|
|
20
|
+
children: TreeNode[];
|
|
21
|
+
depth: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class MemoryTree {
|
|
24
|
+
private maxChunkSize;
|
|
25
|
+
private root;
|
|
26
|
+
private chunks;
|
|
27
|
+
private idCounter;
|
|
28
|
+
constructor(maxChunkSize?: number);
|
|
29
|
+
private createNode;
|
|
30
|
+
private generateId;
|
|
31
|
+
/**
|
|
32
|
+
* Add data to the memory tree
|
|
33
|
+
*/
|
|
34
|
+
add(data: string): Promise<MemoryChunk[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Split text into chunks of maxChunkSize
|
|
37
|
+
*/
|
|
38
|
+
private chunk;
|
|
39
|
+
/**
|
|
40
|
+
* Score a chunk by relevance
|
|
41
|
+
*/
|
|
42
|
+
private scoreChunk;
|
|
43
|
+
/**
|
|
44
|
+
* Insert chunk into tree hierarchy
|
|
45
|
+
*/
|
|
46
|
+
private insertIntoTree;
|
|
47
|
+
private getAverageScore;
|
|
48
|
+
/**
|
|
49
|
+
* Update summaries for tree nodes
|
|
50
|
+
*/
|
|
51
|
+
private updateSummaries;
|
|
52
|
+
private summarizeNode;
|
|
53
|
+
/**
|
|
54
|
+
* Search chunks by content
|
|
55
|
+
*/
|
|
56
|
+
search(query: string): MemoryChunk[];
|
|
57
|
+
/**
|
|
58
|
+
* Get context for routing
|
|
59
|
+
*/
|
|
60
|
+
getContext(maxTokens?: number): string;
|
|
61
|
+
/**
|
|
62
|
+
* Export as markdown for Obsidian
|
|
63
|
+
*/
|
|
64
|
+
toMarkdown(): string;
|
|
65
|
+
/**
|
|
66
|
+
* Get tree stats
|
|
67
|
+
*/
|
|
68
|
+
getStats(): {
|
|
69
|
+
totalChunks: number;
|
|
70
|
+
maxDepth: number;
|
|
71
|
+
rootChunks: number;
|
|
72
|
+
treeSize: number;
|
|
73
|
+
};
|
|
74
|
+
private getMaxDepth;
|
|
75
|
+
}
|
|
76
|
+
export default MemoryTree;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryTree.d.ts","sourceRoot":"","sources":["../../src/memory/memoryTree.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,SAAS,CAAS;gBAEd,YAAY,SAAO;IAO/B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAyB/C;;OAEG;IACH,OAAO,CAAC,KAAK;IAwBb;;OAEG;YACW,UAAU;IAUxB;;OAEG;IACH,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,eAAe;IAKvB;;OAEG;YACW,eAAe;IAI7B,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE;IAcpC;;OAEG;IACH,UAAU,CAAC,SAAS,SAAO,GAAG,MAAM;IAcpC;;OAEG;IACH,UAAU,IAAI,MAAM;IAoBpB;;OAEG;IACH,QAAQ;;;;;;IASR,OAAO,CAAC,WAAW;CAIpB;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -1,141 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
|
-
* Memory Tree Hierarchy
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* - Faster search with index
|
|
7
|
-
* - Lower memory footprint
|
|
3
|
+
* Memory Tree Hierarchy
|
|
4
|
+
*
|
|
5
|
+
* Canonicalizes data into ≤3k-token chunks, scores them,
|
|
6
|
+
* and builds hierarchical summary trees.
|
|
8
7
|
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MemoryTree = void 0;
|
|
9
10
|
class MemoryTree {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
generateId() { return `chunk_${Date.now()}_${this.idCounter++}`; }
|
|
21
|
-
|
|
22
|
-
async add(data) {
|
|
23
|
-
const texts = this.chunk(data);
|
|
24
|
-
const added = [];
|
|
25
|
-
for (const text of texts) {
|
|
26
|
-
const chunk = {
|
|
27
|
-
id: this.generateId(),
|
|
28
|
-
content: text,
|
|
29
|
-
score: 0.5,
|
|
30
|
-
depth: 0,
|
|
31
|
-
createdAt: Date.now(),
|
|
32
|
-
accessCount: 0
|
|
33
|
-
};
|
|
34
|
-
this.chunks.set(chunk.id, chunk);
|
|
35
|
-
this.indexChunk(chunk);
|
|
36
|
-
this.root.chunks.push(chunk);
|
|
37
|
-
added.push(chunk);
|
|
11
|
+
maxChunkSize;
|
|
12
|
+
root;
|
|
13
|
+
chunks;
|
|
14
|
+
idCounter;
|
|
15
|
+
constructor(maxChunkSize = 3000) {
|
|
16
|
+
this.maxChunkSize = maxChunkSize;
|
|
17
|
+
this.root = this.createNode('root');
|
|
18
|
+
this.chunks = new Map();
|
|
19
|
+
this.idCounter = 0;
|
|
38
20
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// Index a chunk for fast search
|
|
43
|
-
indexChunk(chunk) {
|
|
44
|
-
const words = chunk.content.toLowerCase().split(/\s+/);
|
|
45
|
-
for (const word of words) {
|
|
46
|
-
// Strip punctuation for better matching
|
|
47
|
-
const clean = word.replace(/[^a-z0-9-]/g, '');
|
|
48
|
-
if (clean.length >= 3) { // Skip very short words
|
|
49
|
-
if (!this.index.has(clean)) this.index.set(clean, new Set());
|
|
50
|
-
this.index.get(clean).add(chunk.id);
|
|
51
|
-
}
|
|
21
|
+
createNode(id, depth = 0) {
|
|
22
|
+
return { id, chunks: [], summary: '', children: [], depth };
|
|
52
23
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
chunk(text) {
|
|
56
|
-
const chunks = [], words = text.split(/\s+/);
|
|
57
|
-
let current = [], size = 0;
|
|
58
|
-
for (const word of words) {
|
|
59
|
-
size += word.length + 1;
|
|
60
|
-
if (size > this.maxChunkSize) {
|
|
61
|
-
chunks.push(current.join(' '));
|
|
62
|
-
current = [word];
|
|
63
|
-
size = word.length + 1;
|
|
64
|
-
} else {
|
|
65
|
-
current.push(word);
|
|
66
|
-
}
|
|
24
|
+
generateId() {
|
|
25
|
+
return `chunk_${Date.now()}_${this.idCounter++}`;
|
|
67
26
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
27
|
+
/**
|
|
28
|
+
* Add data to the memory tree
|
|
29
|
+
*/
|
|
30
|
+
async add(data) {
|
|
31
|
+
const textChunks = this.chunk(data);
|
|
32
|
+
const addedChunks = [];
|
|
33
|
+
for (const text of textChunks) {
|
|
34
|
+
const score = await this.scoreChunk(text);
|
|
35
|
+
const chunk = {
|
|
36
|
+
id: this.generateId(),
|
|
37
|
+
content: text,
|
|
38
|
+
score,
|
|
39
|
+
depth: 0,
|
|
40
|
+
createdAt: Date.now(),
|
|
41
|
+
accessCount: 0
|
|
42
|
+
};
|
|
43
|
+
this.chunks.set(chunk.id, chunk);
|
|
44
|
+
this.root.chunks.push(chunk);
|
|
45
|
+
this.insertIntoTree(chunk);
|
|
46
|
+
addedChunks.push(chunk);
|
|
89
47
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (!candidateIds) candidateIds = new Set(ids);
|
|
93
|
-
else candidateIds = new Set([...candidateIds].filter(id => ids.has(id)));
|
|
94
|
-
}
|
|
48
|
+
await this.updateSummaries();
|
|
49
|
+
return addedChunks;
|
|
95
50
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
51
|
+
/**
|
|
52
|
+
* Split text into chunks of maxChunkSize
|
|
53
|
+
*/
|
|
54
|
+
chunk(text) {
|
|
55
|
+
const chunks = [];
|
|
56
|
+
const words = text.split(/\s+/);
|
|
57
|
+
let current = [];
|
|
58
|
+
let currentSize = 0;
|
|
59
|
+
for (const word of words) {
|
|
60
|
+
currentSize += word.length + 1;
|
|
61
|
+
if (currentSize > this.maxChunkSize) {
|
|
62
|
+
chunks.push(current.join(' '));
|
|
63
|
+
current = [word];
|
|
64
|
+
currentSize = word.length + 1;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
current.push(word);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (current.length > 0) {
|
|
71
|
+
chunks.push(current.join(' '));
|
|
72
|
+
}
|
|
73
|
+
return chunks;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Score a chunk by relevance
|
|
77
|
+
*/
|
|
78
|
+
async scoreChunk(content) {
|
|
79
|
+
// Simple scoring: length + unique words ratio
|
|
80
|
+
const words = content.split(/\s+/);
|
|
81
|
+
const uniqueWords = new Set(words.map(w => w.toLowerCase()));
|
|
82
|
+
const uniqueRatio = uniqueWords.size / words.length;
|
|
83
|
+
// Base score + bonus for high unique ratio
|
|
84
|
+
return Math.min(1, (content.length / this.maxChunkSize) * uniqueRatio * 1.5);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Insert chunk into tree hierarchy
|
|
88
|
+
*/
|
|
89
|
+
insertIntoTree(chunk) {
|
|
90
|
+
let parent = this.root;
|
|
91
|
+
while (parent.children.length > 0 && chunk.score < 0.5) {
|
|
92
|
+
// Find best matching child
|
|
93
|
+
let bestChild = parent.children[0];
|
|
94
|
+
let bestScore = 0;
|
|
95
|
+
for (const child of parent.children) {
|
|
96
|
+
const avgScore = this.getAverageScore(child);
|
|
97
|
+
if (avgScore > bestScore && avgScore >= chunk.score) {
|
|
98
|
+
bestScore = avgScore;
|
|
99
|
+
bestChild = child;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (bestScore >= chunk.score) {
|
|
103
|
+
parent = bestChild;
|
|
104
|
+
chunk.depth = parent.depth + 1;
|
|
105
|
+
chunk.parentId = parent.id;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
parent.chunks.push(chunk);
|
|
112
|
+
}
|
|
113
|
+
getAverageScore(node) {
|
|
114
|
+
if (node.chunks.length === 0)
|
|
115
|
+
return 0;
|
|
116
|
+
return node.chunks.reduce((sum, c) => sum + c.score, 0) / node.chunks.length;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Update summaries for tree nodes
|
|
120
|
+
*/
|
|
121
|
+
async updateSummaries() {
|
|
122
|
+
this.summarizeNode(this.root);
|
|
123
|
+
}
|
|
124
|
+
summarizeNode(node) {
|
|
125
|
+
const allContent = node.chunks.map(c => c.content).join(' ');
|
|
126
|
+
node.summary = allContent.slice(0, 200) + (allContent.length > 200 ? '...' : '');
|
|
127
|
+
for (const child of node.children) {
|
|
128
|
+
this.summarizeNode(child);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Search chunks by content
|
|
133
|
+
*/
|
|
134
|
+
search(query) {
|
|
135
|
+
const results = [];
|
|
136
|
+
const queryLower = query.toLowerCase();
|
|
137
|
+
for (const chunk of this.chunks.values()) {
|
|
138
|
+
if (chunk.content.toLowerCase().includes(queryLower)) {
|
|
139
|
+
chunk.accessCount++;
|
|
140
|
+
results.push(chunk);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return results.sort((a, b) => b.score - a.score);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get context for routing
|
|
147
|
+
*/
|
|
148
|
+
getContext(maxTokens = 3000) {
|
|
149
|
+
const allChunks = Array.from(this.chunks.values())
|
|
150
|
+
.sort((a, b) => b.score - a.score)
|
|
151
|
+
.slice(0, 10);
|
|
152
|
+
let context = allChunks.map(c => c.content).join('\n\n');
|
|
153
|
+
if (context.length > maxTokens) {
|
|
154
|
+
context = context.slice(0, maxTokens) + '...';
|
|
155
|
+
}
|
|
156
|
+
return context;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Export as markdown for Obsidian
|
|
160
|
+
*/
|
|
161
|
+
toMarkdown() {
|
|
162
|
+
const lines = ['# Memory Tree\n'];
|
|
163
|
+
const traverse = (node, prefix = '') => {
|
|
164
|
+
for (const chunk of node.chunks) {
|
|
165
|
+
lines.push(`${prefix}## ${chunk.id} (score: ${chunk.score.toFixed(2)})`);
|
|
166
|
+
lines.push(chunk.content);
|
|
167
|
+
lines.push('');
|
|
168
|
+
}
|
|
169
|
+
for (const child of node.children) {
|
|
170
|
+
lines.push(`${prefix}### ${child.id}`);
|
|
171
|
+
traverse(child, prefix + '#');
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
traverse(this.root);
|
|
175
|
+
return lines.join('\n');
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get tree stats
|
|
179
|
+
*/
|
|
180
|
+
getStats() {
|
|
181
|
+
return {
|
|
182
|
+
totalChunks: this.chunks.size,
|
|
183
|
+
maxDepth: this.getMaxDepth(this.root),
|
|
184
|
+
rootChunks: this.root.chunks.length,
|
|
185
|
+
treeSize: JSON.stringify(this.root).length
|
|
186
|
+
};
|
|
108
187
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
this.lru = this.lru.filter(c => c.id !== chunk.id);
|
|
114
|
-
this.lru.unshift(chunk);
|
|
115
|
-
if (this.lru.length > this.maxLruSize) {
|
|
116
|
-
this.lru.pop();
|
|
188
|
+
getMaxDepth(node) {
|
|
189
|
+
if (node.children.length === 0)
|
|
190
|
+
return node.depth;
|
|
191
|
+
return Math.max(...node.children.map(c => this.getMaxDepth(c)));
|
|
117
192
|
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
getContext(maxTokens = 3000) {
|
|
121
|
-
// Use LRU for context (most recent first)
|
|
122
|
-
const context = this.lru.map(c => c.content).join('\n\n');
|
|
123
|
-
return context.slice(0, maxTokens);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
toMarkdown() {
|
|
127
|
-
return '# Memory Tree\n' + this.lru.map(c => `## ${c.id}\n${c.content}`).join('\n');
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
getStats() {
|
|
131
|
-
return {
|
|
132
|
-
totalChunks: this.chunks.size,
|
|
133
|
-
maxDepth: 0,
|
|
134
|
-
rootChunks: this.root.chunks.length,
|
|
135
|
-
indexSize: this.index.size,
|
|
136
|
-
lruSize: this.lru.length
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
193
|
}
|
|
140
|
-
|
|
141
|
-
|
|
194
|
+
exports.MemoryTree = MemoryTree;
|
|
195
|
+
exports.default = MemoryTree;
|
|
196
|
+
//# sourceMappingURL=memoryTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryTree.js","sourceRoot":"","sources":["../../src/memory/memoryTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Obsidian Vault Integration
|
|
3
|
+
*
|
|
4
|
+
* Stores routing decisions and context as markdown files
|
|
5
|
+
* compatible with Obsidian note-taking app.
|
|
6
|
+
*/
|
|
7
|
+
export interface VaultConfig {
|
|
8
|
+
path: string;
|
|
9
|
+
autoSave: boolean;
|
|
10
|
+
maxFileAge: number;
|
|
11
|
+
}
|
|
12
|
+
export interface RoutingDecision {
|
|
13
|
+
id: string;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
prompt: string;
|
|
16
|
+
context: any;
|
|
17
|
+
selectedProvider: string;
|
|
18
|
+
selectedModel: string;
|
|
19
|
+
reasoning: string;
|
|
20
|
+
cost: number;
|
|
21
|
+
latency: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class ObsidianVault {
|
|
24
|
+
private config;
|
|
25
|
+
private decisions;
|
|
26
|
+
constructor(config?: Partial<VaultConfig>);
|
|
27
|
+
private ensureDirectory;
|
|
28
|
+
/**
|
|
29
|
+
* Save a routing decision
|
|
30
|
+
*/
|
|
31
|
+
saveDecision(decision: RoutingDecision): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Format decision as markdown
|
|
34
|
+
*/
|
|
35
|
+
private formatDecisionAsMarkdown;
|
|
36
|
+
/**
|
|
37
|
+
* Escape markdown special characters
|
|
38
|
+
*/
|
|
39
|
+
private escapeMarkdown;
|
|
40
|
+
/**
|
|
41
|
+
* Update the vault index
|
|
42
|
+
*/
|
|
43
|
+
private updateIndex;
|
|
44
|
+
/**
|
|
45
|
+
* Get recent decisions
|
|
46
|
+
*/
|
|
47
|
+
getRecentDecisions(count?: number): RoutingDecision[];
|
|
48
|
+
/**
|
|
49
|
+
* Search decisions
|
|
50
|
+
*/
|
|
51
|
+
searchDecisions(query: string): RoutingDecision[];
|
|
52
|
+
/**
|
|
53
|
+
* Export all decisions
|
|
54
|
+
*/
|
|
55
|
+
exportAll(filepath: string): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Get vault statistics
|
|
58
|
+
*/
|
|
59
|
+
getStats(): {
|
|
60
|
+
totalDecisions: number;
|
|
61
|
+
vaultPath: string;
|
|
62
|
+
fileCount: number;
|
|
63
|
+
totalSize: number;
|
|
64
|
+
};
|
|
65
|
+
private getDirectorySize;
|
|
66
|
+
/**
|
|
67
|
+
* Clean old files
|
|
68
|
+
*/
|
|
69
|
+
cleanOldFiles(): Promise<number>;
|
|
70
|
+
}
|
|
71
|
+
export default ObsidianVault;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidianVault.d.ts","sourceRoot":"","sources":["../../src/memory/obsidianVault.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,GAAG,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAoB;gBAEzB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAU7C,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAe9D;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAiChC;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;YACW,WAAW;IAsBzB;;OAEG;IACH,kBAAkB,CAAC,KAAK,SAAK,GAAG,eAAe,EAAE;IAIjD;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE;IASjD;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM;IAQhC;;OAEG;IACH,QAAQ;;;;;;IASR,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACG,aAAa;CAoBpB;AAED,eAAe,aAAa,CAAC"}
|