adaptive-memory-multi-model-router 1.9.5 → 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.
Files changed (121) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +50 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +11 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +37 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +44 -0
  5. package/.github/workflows/npm-stats-validation.yml +152 -0
  6. package/.github/workflows/pages.yml +37 -0
  7. package/CHANGELOG.md +122 -0
  8. package/CODE_OF_CONDUCT.md +128 -0
  9. package/CONTRIBUTING.md +110 -0
  10. package/LAUNCH-PAIN-DRIVEN.md +339 -0
  11. package/LAUNCH.md +575 -0
  12. package/POPULARITY_BOOSTERS.md +285 -0
  13. package/README.md +231 -300
  14. package/SECURITY.md +69 -0
  15. package/articles/CONTENT_STRUCTURE.md +292 -0
  16. package/articles/DEVTO_COST_GUIDE.md +473 -0
  17. package/articles/DEVTO_FINAL.md +416 -0
  18. package/articles/DEVTO_MULTI_PROVIDER.md +542 -0
  19. package/articles/HN_10X_BETTER.md +430 -0
  20. package/articles/HN_CHINESE_STYLE.md +308 -0
  21. package/articles/HN_FINAL.md +199 -0
  22. package/articles/HN_POSTED_VERSION.md +56 -0
  23. package/articles/HN_RESEARCH.md +364 -0
  24. package/articles/PAIN-DRIVEN-devto-v2.md +308 -0
  25. package/articles/PAIN-DRIVEN-devto-v3.md +268 -0
  26. package/articles/PAIN-DRIVEN-devto.md +242 -0
  27. package/articles/PAIN-DRIVEN-hackernews-v2.md +138 -0
  28. package/articles/PAIN-DRIVEN-hackernews-v3.md +151 -0
  29. package/articles/PAIN-DRIVEN-hackernews.md +131 -0
  30. package/articles/PAIN-DRIVEN-reddit-v2.md +301 -0
  31. package/articles/PAIN-DRIVEN-reddit-v3.md +236 -0
  32. package/articles/PAIN-DRIVEN-reddit.md +218 -0
  33. package/articles/PAIN-DRIVEN-twitter-v2.md +110 -0
  34. package/articles/PAIN-DRIVEN-twitter-v3.md +121 -0
  35. package/articles/PAIN-DRIVEN-twitter.md +120 -0
  36. package/articles/PORTKEY_VS_A3M.md +147 -0
  37. package/articles/REDDIT_FINAL.md +232 -0
  38. package/articles/TWITTER_FINAL.md +167 -0
  39. package/articles/WHY_10X_BETTER.md +261 -0
  40. package/articles/WHY_CHINESE_STYLE_BETTER.md +323 -0
  41. package/articles/hashnode-llm-cost-optimization.md +125 -0
  42. package/articles/medium-building-llm-router.md +205 -0
  43. package/articles/twitter-thread-cost-savings.md +98 -0
  44. package/articles/youtube-tutorial-script.md +262 -0
  45. package/assets/banner.svg +109 -0
  46. package/assets/logo.svg +68 -0
  47. package/assets/social-preview.svg +64 -0
  48. package/demo/demo-script.md +53 -0
  49. package/dist/analytics/costAnalytics.d.ts +77 -0
  50. package/dist/analytics/costAnalytics.d.ts.map +1 -0
  51. package/dist/analytics/costAnalytics.js +219 -0
  52. package/dist/analytics/costAnalytics.js.map +1 -0
  53. package/dist/cache/semanticCache.d.ts +62 -0
  54. package/dist/cache/semanticCache.d.ts.map +1 -0
  55. package/dist/cache/semanticCache.js +176 -0
  56. package/dist/cache/semanticCache.js.map +1 -0
  57. package/dist/cli.js +35 -0
  58. package/dist/index.d.ts +4 -723
  59. package/dist/index.js +11 -362
  60. package/dist/index.js.map +1 -1
  61. package/dist/integrations/langchainAdapter.d.ts +146 -0
  62. package/dist/integrations/langchainAdapter.d.ts.map +1 -0
  63. package/dist/integrations/langchainAdapter.js +731 -0
  64. package/dist/integrations/langchainAdapter.js.map +1 -0
  65. package/dist/integrations/oauth.d.ts +69 -0
  66. package/dist/integrations/oauth.d.ts.map +1 -0
  67. package/dist/integrations/oauth.js +225 -21
  68. package/dist/integrations/oauth.js.map +1 -0
  69. package/dist/memory/autoFetch.d.ts +39 -0
  70. package/dist/memory/autoFetch.d.ts.map +1 -0
  71. package/dist/memory/autoFetch.js +80 -88
  72. package/dist/memory/autoFetch.js.map +1 -0
  73. package/dist/memory/memoryTree.d.ts +76 -0
  74. package/dist/memory/memoryTree.d.ts.map +1 -0
  75. package/dist/memory/memoryTree.js +185 -130
  76. package/dist/memory/memoryTree.js.map +1 -0
  77. package/dist/memory/obsidianVault.d.ts +71 -0
  78. package/dist/memory/obsidianVault.d.ts.map +1 -0
  79. package/dist/memory/obsidianVault.js +207 -22
  80. package/dist/memory/obsidianVault.js.map +1 -0
  81. package/dist/providers/providerConfig.d.ts +49 -0
  82. package/dist/providers/providerConfig.d.ts.map +1 -0
  83. package/dist/providers/providerConfig.js +806 -401
  84. package/dist/providers/providerConfig.js.map +1 -0
  85. package/dist/security/guardrails.d.ts +76 -0
  86. package/dist/security/guardrails.d.ts.map +1 -0
  87. package/dist/security/guardrails.js +479 -0
  88. package/dist/security/guardrails.js.map +1 -0
  89. package/dist/server/dashboard.d.ts +58 -0
  90. package/dist/server/dashboard.d.ts.map +1 -0
  91. package/dist/server/dashboard.js +553 -0
  92. package/dist/server/dashboard.js.map +1 -0
  93. package/dist/server/modelMapper.d.ts +43 -0
  94. package/dist/server/modelMapper.d.ts.map +1 -0
  95. package/dist/server/modelMapper.js +154 -0
  96. package/dist/server/modelMapper.js.map +1 -0
  97. package/dist/server/proxyServer.d.ts +41 -0
  98. package/dist/server/proxyServer.d.ts.map +1 -0
  99. package/dist/server/proxyServer.js +932 -0
  100. package/dist/server/proxyServer.js.map +1 -0
  101. package/dist/skills/__tests__/skill_manager.test.d.ts +2 -0
  102. package/dist/skills/__tests__/skill_manager.test.d.ts.map +1 -0
  103. package/dist/skills/__tests__/skill_manager.test.js +268 -0
  104. package/dist/skills/__tests__/skill_manager.test.js.map +1 -0
  105. package/docs-site/index.html +347 -0
  106. package/package.json +53 -7
  107. package/playground/README.md +51 -0
  108. package/playground/codesandbox.json +12 -0
  109. package/playground/index.js +39 -0
  110. package/scripts/update-npm-badges.js +158 -0
  111. package/src/analytics/costAnalytics.ts +304 -0
  112. package/src/cache/semanticCache.ts +221 -0
  113. package/src/index.ts +6 -0
  114. package/src/integrations/langchainAdapter.ts +955 -0
  115. package/src/providers/providerConfig.ts +923 -0
  116. package/src/security/guardrails.ts +585 -0
  117. package/src/server/dashboard.ts +610 -0
  118. package/src/server/modelMapper.ts +182 -0
  119. package/src/server/proxyServer.ts +1105 -0
  120. package/src/types/langchain.d.ts +83 -0
  121. 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 (Optimized v2)
3
- *
4
- * Improvements:
5
- * - LRU cache for recent chunks
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
- constructor(maxChunkSize = 3000) {
11
- this.maxChunkSize = maxChunkSize;
12
- this.root = { id: 'root', chunks: [], summary: '', children: [], depth: 0 };
13
- this.chunks = new Map();
14
- this.idCounter = 0;
15
- this.index = new Map(); // Fast lookup index
16
- this.lru = []; // LRU cache for recent chunks
17
- this.maxLruSize = 100;
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
- return added;
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
- if (current.length) chunks.push(current.join(' '));
69
- return chunks;
70
- }
71
-
72
- // Fast indexed search
73
- search(query) {
74
- const words = query.toLowerCase().split(/\s+/);
75
- let candidateIds = null;
76
-
77
- for (const word of words) {
78
- const clean = word.replace(/[^a-z0-9-]/g, '');
79
- if (clean.length < 3) continue;
80
- // Try exact match first, then substring match
81
- let ids = this.index.get(clean);
82
- if (!ids) {
83
- // Substring matching: find index keys containing this word
84
- for (const [key, val] of this.index) {
85
- if (key.includes(clean) || clean.includes(key)) {
86
- ids = val;
87
- break;
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
- if (ids) {
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
- if (!candidateIds) return []; // No matches
98
-
99
- // Update LRU and return chunks
100
- const results = [];
101
- for (const id of candidateIds) {
102
- const chunk = this.chunks.get(id);
103
- if (chunk) {
104
- this.updateLRU(chunk);
105
- chunk.accessCount++;
106
- results.push(chunk);
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
- return results;
110
- }
111
-
112
- updateLRU(chunk) {
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
- module.exports = { MemoryTree };
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"}