@gotza02/mathinking 2.9.3 → 2.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/final-demo.js +0 -3
- package/dist/final-demo.js.map +1 -1
- package/dist/index.js +25 -15
- package/dist/index.js.map +1 -1
- package/dist/schemas/brain.schema.d.ts +70 -0
- package/dist/schemas/brain.schema.d.ts.map +1 -0
- package/dist/schemas/brain.schema.js +70 -0
- package/dist/schemas/brain.schema.js.map +1 -0
- package/dist/security.test.d.ts +2 -0
- package/dist/security.test.d.ts.map +1 -0
- package/dist/security.test.js +81 -0
- package/dist/security.test.js.map +1 -0
- package/dist/sse-server.js +39 -8
- package/dist/sse-server.js.map +1 -1
- package/dist/test-all.js +0 -20
- package/dist/test-all.js.map +1 -1
- package/dist/test-extended.js +0 -9
- package/dist/test-extended.js.map +1 -1
- package/dist/test-max-intelligence.d.ts +2 -0
- package/dist/test-max-intelligence.d.ts.map +1 -0
- package/dist/test-max-intelligence.js +52 -0
- package/dist/test-max-intelligence.js.map +1 -0
- package/dist/test-memory.js +0 -2
- package/dist/test-memory.js.map +1 -1
- package/dist/test-reflective.js +0 -6
- package/dist/test-reflective.js.map +1 -1
- package/dist/test-resilience.d.ts +2 -0
- package/dist/test-resilience.d.ts.map +1 -0
- package/dist/test-resilience.js +41 -0
- package/dist/test-resilience.js.map +1 -0
- package/dist/tools/orchestrator.d.ts +2 -47
- package/dist/tools/orchestrator.d.ts.map +1 -1
- package/dist/tools/orchestrator.js +224 -215
- package/dist/tools/orchestrator.js.map +1 -1
- package/dist/tools/sequential-thinking.d.ts +16 -95
- package/dist/tools/sequential-thinking.d.ts.map +1 -1
- package/dist/tools/sequential-thinking.js +313 -781
- package/dist/tools/sequential-thinking.js.map +1 -1
- package/dist/types/index.d.ts +18 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +1 -1
- package/dist/utils/dag.d.ts +0 -20
- package/dist/utils/dag.d.ts.map +1 -1
- package/dist/utils/dag.js +8 -48
- package/dist/utils/dag.js.map +1 -1
- package/dist/utils/memory.d.ts +5 -0
- package/dist/utils/memory.d.ts.map +1 -1
- package/dist/utils/memory.js +66 -60
- package/dist/utils/memory.js.map +1 -1
- package/dist/utils/mutex.d.ts +6 -0
- package/dist/utils/mutex.d.ts.map +1 -0
- package/dist/utils/mutex.js +22 -0
- package/dist/utils/mutex.js.map +1 -0
- package/dist/utils/resilience.d.ts +23 -0
- package/dist/utils/resilience.d.ts.map +1 -0
- package/dist/utils/resilience.js +82 -0
- package/dist/utils/resilience.js.map +1 -0
- package/dist/utils/tool-cache.d.ts +9 -0
- package/dist/utils/tool-cache.d.ts.map +1 -0
- package/dist/utils/tool-cache.js +23 -0
- package/dist/utils/tool-cache.js.map +1 -0
- package/dist/utils/vector-memory.d.ts +18 -0
- package/dist/utils/vector-memory.d.ts.map +1 -0
- package/dist/utils/vector-memory.js +86 -0
- package/dist/utils/vector-memory.js.map +1 -0
- package/package.json +22 -20
package/dist/utils/memory.js
CHANGED
|
@@ -1,37 +1,58 @@
|
|
|
1
1
|
import * as fs from 'fs/promises';
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import * as os from 'os';
|
|
4
|
+
import { Mutex } from './mutex.js';
|
|
5
|
+
import natural from 'natural';
|
|
4
6
|
export class MemoryManager {
|
|
5
7
|
memoryPath;
|
|
6
8
|
entries = [];
|
|
9
|
+
mutex = new Mutex();
|
|
10
|
+
tfidf;
|
|
11
|
+
isDirty = true; // Flag to rebuild index
|
|
7
12
|
constructor() {
|
|
8
13
|
this.memoryPath = path.join(os.homedir(), '.mathinking', 'knowledge_base.json');
|
|
9
|
-
this.
|
|
14
|
+
this.tfidf = new natural.TfIdf();
|
|
15
|
+
this.init();
|
|
16
|
+
}
|
|
17
|
+
async init() {
|
|
18
|
+
await this.load();
|
|
10
19
|
}
|
|
11
20
|
async load() {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
if (e.code !== 'ENOENT') {
|
|
18
|
-
console.warn('[Memory] Storage file is invalid or corrupted, initializing with empty memory.');
|
|
21
|
+
await this.mutex.dispatch(async () => {
|
|
22
|
+
try {
|
|
23
|
+
const data = await fs.readFile(this.memoryPath, 'utf8');
|
|
24
|
+
this.entries = JSON.parse(data);
|
|
25
|
+
this.rebuildIndex();
|
|
19
26
|
}
|
|
20
|
-
|
|
21
|
-
|
|
27
|
+
catch (e) {
|
|
28
|
+
if (e.code !== 'ENOENT') {
|
|
29
|
+
console.warn('[Memory] Storage file invalid, initializing empty.');
|
|
30
|
+
}
|
|
31
|
+
this.entries = [];
|
|
32
|
+
}
|
|
33
|
+
});
|
|
22
34
|
}
|
|
23
35
|
async save() {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
await this.mutex.dispatch(async () => {
|
|
37
|
+
try {
|
|
38
|
+
const dir = path.dirname(this.memoryPath);
|
|
39
|
+
await fs.mkdir(dir, { recursive: true });
|
|
40
|
+
await fs.writeFile(this.memoryPath, JSON.stringify(this.entries, null, 2));
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
console.error('[Memory] Failed to save memory:', e);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
rebuildIndex() {
|
|
48
|
+
this.tfidf = new natural.TfIdf();
|
|
49
|
+
this.entries.forEach((entry, index) => {
|
|
50
|
+
const content = `${entry.key} ${typeof entry.value === 'string' ? entry.value : JSON.stringify(entry.value)} ${entry.tags.join(' ')}`;
|
|
51
|
+
this.tfidf.addDocument(content); // Document index matches entries index
|
|
52
|
+
});
|
|
53
|
+
this.isDirty = false;
|
|
32
54
|
}
|
|
33
55
|
async add(key, value, category = 'general', tags = []) {
|
|
34
|
-
await this.load();
|
|
35
56
|
const entry = {
|
|
36
57
|
id: Math.random().toString(36).substring(2, 11),
|
|
37
58
|
key,
|
|
@@ -41,77 +62,62 @@ export class MemoryManager {
|
|
|
41
62
|
createdAt: new Date().toISOString(),
|
|
42
63
|
updatedAt: new Date().toISOString()
|
|
43
64
|
};
|
|
44
|
-
|
|
45
|
-
|
|
65
|
+
const index = this.entries.findIndex((e) => e.key === key);
|
|
66
|
+
if (index !== -1) {
|
|
67
|
+
this.entries.splice(index, 1);
|
|
68
|
+
}
|
|
46
69
|
this.entries.push(entry);
|
|
70
|
+
const content = `${entry.key} ${typeof entry.value === 'string' ? entry.value : JSON.stringify(entry.value)} ${entry.tags.join(' ')}`;
|
|
71
|
+
this.tfidf.addDocument(content);
|
|
72
|
+
if (index !== -1) {
|
|
73
|
+
this.isDirty = true;
|
|
74
|
+
}
|
|
47
75
|
await this.save();
|
|
48
76
|
return entry;
|
|
49
77
|
}
|
|
50
78
|
async delete(query) {
|
|
51
|
-
await this.load();
|
|
52
79
|
const initialCount = this.entries.length;
|
|
53
80
|
this.entries = this.entries.filter((e) => e.id !== query && e.key !== query);
|
|
54
81
|
const deletedCount = initialCount - this.entries.length;
|
|
55
82
|
if (deletedCount > 0) {
|
|
83
|
+
this.isDirty = true;
|
|
56
84
|
await this.save();
|
|
57
85
|
}
|
|
58
86
|
return { deletedCount };
|
|
59
87
|
}
|
|
60
88
|
async query(searchTerm, options = {}) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const natural = await import('natural');
|
|
64
|
-
// Handle both ESM and CJS import styles
|
|
65
|
-
const TfIdf = natural.TfIdf || (natural.default && natural.default.TfIdf);
|
|
66
|
-
if (!TfIdf) {
|
|
67
|
-
console.warn('[Memory] Failed to load TfIdf from natural. Falling back to simple matching.');
|
|
68
|
-
// Simple fallback class if import fails
|
|
69
|
-
const SimpleTfIdf = class {
|
|
70
|
-
addDocument(doc) { }
|
|
71
|
-
tfidf(term, index) { return 0; }
|
|
72
|
-
};
|
|
73
|
-
// @ts-ignore
|
|
74
|
-
const tfidf = new SimpleTfIdf();
|
|
75
|
-
// ... Logic continues with fallback (tfidf returns 0, so only exact match boost works) ...
|
|
89
|
+
if (this.isDirty) {
|
|
90
|
+
this.rebuildIndex();
|
|
76
91
|
}
|
|
77
|
-
const tfidf = new TfIdf();
|
|
78
|
-
// 1. Filter by category/tags first (hard filter)
|
|
79
|
-
const candidates = this.entries.filter((e) => {
|
|
80
|
-
const matchesCategory = !options.category || e.category.toLowerCase() === options.category.toLowerCase();
|
|
81
|
-
const matchesTags = !options.tags || options.tags.length === 0 || options.tags.some((tag) => e.tags.map(t => t.toLowerCase()).includes(tag.toLowerCase()));
|
|
82
|
-
return matchesCategory && matchesTags;
|
|
83
|
-
});
|
|
84
92
|
if (!searchTerm) {
|
|
85
|
-
|
|
86
|
-
|
|
93
|
+
return this.entries
|
|
94
|
+
.filter((e) => {
|
|
95
|
+
const matchesCategory = !options.category || e.category.toLowerCase() === options.category.toLowerCase();
|
|
96
|
+
const matchesTags = !options.tags || options.tags.length === 0 || options.tags.some((tag) => e.tags.map(t => t.toLowerCase()).includes(tag.toLowerCase()));
|
|
97
|
+
return matchesCategory && matchesTags;
|
|
98
|
+
})
|
|
99
|
+
.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
87
100
|
}
|
|
88
101
|
const term = searchTerm.toLowerCase();
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
// 3. Score and rank
|
|
96
|
-
const scoredResults = candidates.map((entry, index) => {
|
|
97
|
-
// TF-IDF score
|
|
98
|
-
const score = tfidf.tfidf(searchTerm, index);
|
|
99
|
-
// Boost for exact substring matches (fallback for short exact terms)
|
|
102
|
+
const scoredResults = this.entries.map((entry, index) => {
|
|
103
|
+
const matchesCategory = !options.category || entry.category.toLowerCase() === options.category.toLowerCase();
|
|
104
|
+
const matchesTags = !options.tags || options.tags.length === 0 || options.tags.some((tag) => entry.tags.map(t => t.toLowerCase()).includes(tag.toLowerCase()));
|
|
105
|
+
if (!matchesCategory || !matchesTags)
|
|
106
|
+
return { entry, score: -1 };
|
|
107
|
+
const score = this.tfidf.tfidf(searchTerm, index);
|
|
100
108
|
let boost = 0;
|
|
101
109
|
if (entry.key.toLowerCase().includes(term) ||
|
|
102
110
|
(typeof entry.value === 'string' && entry.value.toLowerCase().includes(term))) {
|
|
103
|
-
boost = 10;
|
|
111
|
+
boost = 10;
|
|
104
112
|
}
|
|
105
113
|
return { entry, score: score + boost };
|
|
106
114
|
});
|
|
107
|
-
// 4. Return results with score > 0 (or boost > 0)
|
|
108
115
|
return scoredResults
|
|
109
116
|
.filter(r => r.score > 0)
|
|
110
117
|
.sort((a, b) => b.score - a.score)
|
|
111
118
|
.map(r => r.entry);
|
|
112
119
|
}
|
|
113
120
|
async getAll() {
|
|
114
|
-
await this.load();
|
|
115
121
|
return this.entries;
|
|
116
122
|
}
|
|
117
123
|
}
|
package/dist/utils/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/utils/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/utils/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex.d.ts","sourceRoot":"","sources":["../../src/utils/mutex.ts"],"names":[],"mappings":"AACA,qBAAa,KAAK;IACd,OAAO,CAAC,KAAK,CAAqB;IAElC,IAAI,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC;IAYzB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAQtE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export class Mutex {
|
|
2
|
+
mutex = Promise.resolve();
|
|
3
|
+
lock() {
|
|
4
|
+
let begin = (unlock) => { };
|
|
5
|
+
this.mutex = this.mutex.then(() => {
|
|
6
|
+
return new Promise(begin);
|
|
7
|
+
});
|
|
8
|
+
return new Promise((res) => {
|
|
9
|
+
begin = res;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
async dispatch(fn) {
|
|
13
|
+
const unlock = await this.lock();
|
|
14
|
+
try {
|
|
15
|
+
return await Promise.resolve(fn());
|
|
16
|
+
}
|
|
17
|
+
finally {
|
|
18
|
+
unlock();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=mutex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../src/utils/mutex.ts"],"names":[],"mappings":"AACA,MAAM,OAAO,KAAK;IACN,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAElC,IAAI;QACF,IAAI,KAAK,GAAiC,CAAC,MAAM,EAAE,EAAE,GAAE,CAAC,CAAC;QAEzD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;YAChC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACzB,KAAK,GAAG,GAAG,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAI,EAAsC;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { TaskNode } from '../types/index.js';
|
|
2
|
+
export interface RecoveryAction {
|
|
3
|
+
type: 'retry' | 'skip' | 'modify_input' | 'run_command';
|
|
4
|
+
payload?: any;
|
|
5
|
+
description: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ResilienceStrategy {
|
|
8
|
+
name: string;
|
|
9
|
+
matches(error: Error, task: TaskNode): boolean;
|
|
10
|
+
getRecoveryAction(error: Error, task: TaskNode): Promise<RecoveryAction>;
|
|
11
|
+
}
|
|
12
|
+
export declare class ResilienceManager {
|
|
13
|
+
private strategies;
|
|
14
|
+
private replanHandler;
|
|
15
|
+
constructor();
|
|
16
|
+
setReplanHandler(handler: (error: string, task: TaskNode) => Promise<any>): void;
|
|
17
|
+
requestStrategicReplan(error: string, task: TaskNode): Promise<any>;
|
|
18
|
+
registerStrategy(strategy: ResilienceStrategy): void;
|
|
19
|
+
diagnose(error: Error, task: TaskNode): Promise<RecoveryAction | null>;
|
|
20
|
+
private registerDefaultStrategies;
|
|
21
|
+
}
|
|
22
|
+
export declare const resilienceManager: ResilienceManager;
|
|
23
|
+
//# sourceMappingURL=resilience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resilience.d.ts","sourceRoot":"","sources":["../../src/utils/resilience.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,aAAa,CAAC;IACxD,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC/C,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC1E;AAGD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,aAAa,CAAkE;;IAMvF,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,GAAG,CAAC;IAInE,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IAOzE,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB;IAIvC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAS5E,OAAO,CAAC,yBAAyB;CAqElC;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
export class ResilienceManager {
|
|
3
|
+
strategies = [];
|
|
4
|
+
replanHandler = null;
|
|
5
|
+
constructor() {
|
|
6
|
+
this.registerDefaultStrategies();
|
|
7
|
+
}
|
|
8
|
+
setReplanHandler(handler) {
|
|
9
|
+
this.replanHandler = handler;
|
|
10
|
+
}
|
|
11
|
+
async requestStrategicReplan(error, task) {
|
|
12
|
+
if (this.replanHandler) {
|
|
13
|
+
return this.replanHandler(error, task);
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
registerStrategy(strategy) {
|
|
18
|
+
this.strategies.push(strategy);
|
|
19
|
+
}
|
|
20
|
+
async diagnose(error, task) {
|
|
21
|
+
for (const strategy of this.strategies) {
|
|
22
|
+
if (strategy.matches(error, task)) {
|
|
23
|
+
return strategy.getRecoveryAction(error, task);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
registerDefaultStrategies() {
|
|
29
|
+
this.registerStrategy({
|
|
30
|
+
name: 'Auto-Mkdir',
|
|
31
|
+
matches: (error, task) => {
|
|
32
|
+
return (task.toolName === 'write_file' &&
|
|
33
|
+
error.message.includes('ENOENT') &&
|
|
34
|
+
error.message.includes('no such file or directory'));
|
|
35
|
+
},
|
|
36
|
+
getRecoveryAction: async (error, task) => {
|
|
37
|
+
const filePath = (task.toolInput?.file_path || task.toolInput?.path);
|
|
38
|
+
if (!filePath)
|
|
39
|
+
return { type: 'retry', description: 'Retry' }; // Should not happen
|
|
40
|
+
const dir = path.resolve(path.dirname(filePath));
|
|
41
|
+
return {
|
|
42
|
+
type: 'run_command',
|
|
43
|
+
payload: { command: `mkdir -p "${dir}"` },
|
|
44
|
+
description: `Automatically creating missing directory: ${dir}`
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
this.registerStrategy({
|
|
49
|
+
name: 'NPM-Fix',
|
|
50
|
+
matches: (error, task) => {
|
|
51
|
+
return (task.toolName === 'shell_execute' &&
|
|
52
|
+
(task.toolInput?.command).includes('npm install') &&
|
|
53
|
+
(error.message.includes('code 1') || error.message.includes('command failed')));
|
|
54
|
+
},
|
|
55
|
+
getRecoveryAction: async (error, task) => {
|
|
56
|
+
const cmd = task.toolInput?.command;
|
|
57
|
+
if (!cmd.includes('--force') && !cmd.includes('--legacy-peer-deps')) {
|
|
58
|
+
return {
|
|
59
|
+
type: 'modify_input',
|
|
60
|
+
payload: { command: `${cmd} --legacy-peer-deps` },
|
|
61
|
+
description: 'Retrying npm install with --legacy-peer-deps'
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return { type: 'retry', description: 'Retry' };
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
this.registerStrategy({
|
|
68
|
+
name: 'Network-Backoff',
|
|
69
|
+
matches: (error) => {
|
|
70
|
+
return error.message.includes('ETIMEDOUT') || error.message.includes('fetch failed');
|
|
71
|
+
},
|
|
72
|
+
getRecoveryAction: async () => {
|
|
73
|
+
return {
|
|
74
|
+
type: 'retry',
|
|
75
|
+
description: 'Network error detected. Retrying...'
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export const resilienceManager = new ResilienceManager();
|
|
82
|
+
//# sourceMappingURL=resilience.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resilience.js","sourceRoot":"","sources":["../../src/utils/resilience.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class ToolCache {
|
|
2
|
+
private cache;
|
|
3
|
+
constructor(maxSize?: number, ttl?: number);
|
|
4
|
+
get(toolName: string, input: any): any | undefined;
|
|
5
|
+
set(toolName: string, input: any, output: any): void;
|
|
6
|
+
private generateKey;
|
|
7
|
+
}
|
|
8
|
+
export declare const toolCache: ToolCache;
|
|
9
|
+
//# sourceMappingURL=tool-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-cache.d.ts","sourceRoot":"","sources":["../../src/utils/tool-cache.ts"],"names":[],"mappings":"AAGA,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAwB;gBAEzB,OAAO,GAAE,MAAW,EAAE,GAAG,GAAE,MAAsB;IAO7D,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS;IAKlD,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI;IAKpD,OAAO,CAAC,WAAW;CAGpB;AAED,eAAO,MAAM,SAAS,WAAkB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { LRUCache } from 'lru-cache';
|
|
2
|
+
export class ToolCache {
|
|
3
|
+
cache;
|
|
4
|
+
constructor(maxSize = 50, ttl = 1000 * 60 * 5) {
|
|
5
|
+
this.cache = new LRUCache({
|
|
6
|
+
max: maxSize,
|
|
7
|
+
ttl: ttl
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
get(toolName, input) {
|
|
11
|
+
const key = this.generateKey(toolName, input);
|
|
12
|
+
return this.cache.get(key);
|
|
13
|
+
}
|
|
14
|
+
set(toolName, input, output) {
|
|
15
|
+
const key = this.generateKey(toolName, input);
|
|
16
|
+
this.cache.set(key, output);
|
|
17
|
+
}
|
|
18
|
+
generateKey(toolName, input) {
|
|
19
|
+
return `${toolName}:${JSON.stringify(input)}`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export const toolCache = new ToolCache();
|
|
23
|
+
//# sourceMappingURL=tool-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../../src/utils/tool-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,MAAM,OAAO,SAAS;IACZ,KAAK,CAAwB;IAErC,YAAY,UAAkB,EAAE,EAAE,MAAc,IAAI,GAAG,EAAE,GAAG,CAAC;QAC3D,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC;YACxB,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,GAAG;SACT,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,QAAgB,EAAE,KAAU;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,QAAgB,EAAE,KAAU,EAAE,MAAW;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAEO,WAAW,CAAC,QAAgB,EAAE,KAAU;QAC9C,OAAO,GAAG,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IAChD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { VectorEntry } from '../types/index.js';
|
|
2
|
+
export declare class VectorMemoryManager {
|
|
3
|
+
private storagePath;
|
|
4
|
+
private entries;
|
|
5
|
+
private tfidf;
|
|
6
|
+
private initialized;
|
|
7
|
+
constructor();
|
|
8
|
+
private init;
|
|
9
|
+
private embed;
|
|
10
|
+
add(content: string, metadata?: Record<string, any>): Promise<VectorEntry>;
|
|
11
|
+
search(query: string, limit?: number): Promise<{
|
|
12
|
+
item: VectorEntry;
|
|
13
|
+
score: number;
|
|
14
|
+
}[]>;
|
|
15
|
+
private save;
|
|
16
|
+
}
|
|
17
|
+
export declare const vectorMemory: VectorMemoryManager;
|
|
18
|
+
//# sourceMappingURL=vector-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-memory.d.ts","sourceRoot":"","sources":["../../src/utils/vector-memory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,WAAW,CAAkB;;YAQvB,IAAI;YAoBJ,KAAK;IAUb,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuB9E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;YAkCjF,IAAI;CAOnB;AAED,eAAO,MAAM,YAAY,qBAA4B,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
5
|
+
import natural from 'natural';
|
|
6
|
+
export class VectorMemoryManager {
|
|
7
|
+
storagePath;
|
|
8
|
+
entries = [];
|
|
9
|
+
tfidf;
|
|
10
|
+
initialized = false;
|
|
11
|
+
constructor() {
|
|
12
|
+
this.storagePath = path.join(os.homedir(), '.mathinking', 'vector_memory.json');
|
|
13
|
+
this.tfidf = new natural.TfIdf();
|
|
14
|
+
this.init();
|
|
15
|
+
}
|
|
16
|
+
async init() {
|
|
17
|
+
try {
|
|
18
|
+
const dir = path.dirname(this.storagePath);
|
|
19
|
+
await fs.mkdir(dir, { recursive: true });
|
|
20
|
+
const data = await fs.readFile(this.storagePath, 'utf8');
|
|
21
|
+
this.entries = JSON.parse(data);
|
|
22
|
+
this.entries.forEach(entry => {
|
|
23
|
+
this.tfidf.addDocument(entry.content);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
this.entries = [];
|
|
28
|
+
}
|
|
29
|
+
this.initialized = true;
|
|
30
|
+
}
|
|
31
|
+
async embed(text) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
async add(content, metadata = {}) {
|
|
35
|
+
if (!this.initialized)
|
|
36
|
+
await this.init();
|
|
37
|
+
this.tfidf.addDocument(content);
|
|
38
|
+
const vector = [];
|
|
39
|
+
const entry = {
|
|
40
|
+
id: uuidv4(),
|
|
41
|
+
content,
|
|
42
|
+
vector,
|
|
43
|
+
metadata,
|
|
44
|
+
createdAt: new Date().toISOString()
|
|
45
|
+
};
|
|
46
|
+
this.entries.push(entry);
|
|
47
|
+
await this.save();
|
|
48
|
+
return entry;
|
|
49
|
+
}
|
|
50
|
+
async search(query, limit = 5) {
|
|
51
|
+
if (!this.initialized)
|
|
52
|
+
await this.init();
|
|
53
|
+
const measures = [];
|
|
54
|
+
this.tfidf.tfidfs(query, (i, measure) => {
|
|
55
|
+
measures.push({ index: i, measure });
|
|
56
|
+
});
|
|
57
|
+
if (measures.length === 0) {
|
|
58
|
+
console.warn(`[VectorMemory] No documents found in TF-IDF index. Entries: ${this.entries.length}`);
|
|
59
|
+
}
|
|
60
|
+
const results = measures
|
|
61
|
+
.sort((a, b) => b.measure - a.measure)
|
|
62
|
+
.slice(0, limit)
|
|
63
|
+
.map(m => {
|
|
64
|
+
if (!this.entries[m.index]) {
|
|
65
|
+
console.error(`Mismatch! Index ${m.index} not in entries (len: ${this.entries.length})`);
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
item: this.entries[m.index],
|
|
70
|
+
score: m.measure
|
|
71
|
+
};
|
|
72
|
+
})
|
|
73
|
+
.filter(r => r !== null);
|
|
74
|
+
return results;
|
|
75
|
+
}
|
|
76
|
+
async save() {
|
|
77
|
+
try {
|
|
78
|
+
await fs.writeFile(this.storagePath, JSON.stringify(this.entries), 'utf8');
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
console.error('[VectorMemory] Save failed:', e);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export const vectorMemory = new VectorMemoryManager();
|
|
86
|
+
//# sourceMappingURL=vector-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-memory.js","sourceRoot":"","sources":["../../src/utils/vector-memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAI9B,MAAM,OAAO,mBAAmB;IACtB,WAAW,CAAS;IACpB,OAAO,GAAkB,EAAE,CAAC;IAC5B,KAAK,CAAgB;IACrB,WAAW,GAAY,KAAK,CAAC;IAErC;QACE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC;QAChF,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,IAAI;QAEhB,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAGhC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACzB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAGO,KAAK,CAAC,KAAK,CAAC,IAAY;QAM7B,OAAO,EAAE,CAAC;IACb,CAAC;IAGD,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,WAAgC,EAAE;QAC3D,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAGzC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAGhC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,MAAM,KAAK,GAAgB;YACvB,EAAE,EAAE,MAAM,EAAE;YACZ,OAAO;YACP,MAAM;YACN,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAGD,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,QAAgB,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAIzC,MAAM,QAAQ,GAAyC,EAAE,CAAC;QAE1D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;YAEpC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,+DAA+D,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvG,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ;aACnB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;aACrC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;aACf,GAAG,CAAC,CAAC,CAAC,EAAE;YACL,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,KAAK,yBAAyB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBACzF,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,OAAO;gBACH,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3B,KAAK,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC;QACN,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAA2C,CAAC;QAEvE,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC;YACD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,mBAAmB,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gotza02/mathinking",
|
|
3
|
-
"version": "2.9.
|
|
3
|
+
"version": "2.9.5",
|
|
4
4
|
"description": "MCP Server with sequential thinking (The Brain) and orchestrator (The Body) capabilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
},
|
|
16
16
|
"scripts": {
|
|
17
17
|
"build": "tsc",
|
|
18
|
-
"postbuild": "
|
|
18
|
+
"postbuild": "node scripts/postbuild.mjs",
|
|
19
|
+
"prestart": "npm run build",
|
|
19
20
|
"start": "node dist/index.js",
|
|
20
21
|
"start:sse": "node dist/sse-server.js",
|
|
21
22
|
"dev": "tsx src/index.ts",
|
|
@@ -35,28 +36,29 @@
|
|
|
35
36
|
],
|
|
36
37
|
"license": "MIT",
|
|
37
38
|
"dependencies": {
|
|
38
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
39
|
-
"@types/natural": "^5.1.5",
|
|
39
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
40
40
|
"express": "^5.2.1",
|
|
41
|
+
"lru-cache": "^11.2.4",
|
|
41
42
|
"natural": "^8.1.0",
|
|
42
|
-
"
|
|
43
|
-
"
|
|
43
|
+
"quickjs-emscripten": "^0.31.0",
|
|
44
|
+
"uuid": "^13.0.0",
|
|
45
|
+
"zod": "^4.3.5"
|
|
44
46
|
},
|
|
45
47
|
"devDependencies": {
|
|
46
|
-
"@types/express": "^5.0.
|
|
47
|
-
"@types/node": "^
|
|
48
|
-
"@
|
|
49
|
-
"@typescript-eslint/
|
|
50
|
-
"
|
|
51
|
-
"eslint": "^
|
|
52
|
-
"eslint-
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"tsx": "^4.
|
|
57
|
-
"typescript": "^5.
|
|
58
|
-
"typescript-eslint": "^8.
|
|
59
|
-
"vitest": "^
|
|
48
|
+
"@types/express": "^5.0.6",
|
|
49
|
+
"@types/node": "^25.0.8",
|
|
50
|
+
"@typescript-eslint/eslint-plugin": "^8.53.0",
|
|
51
|
+
"@typescript-eslint/parser": "^8.53.0",
|
|
52
|
+
"eslint": "^9.39.2",
|
|
53
|
+
"eslint-config-prettier": "^10.1.8",
|
|
54
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
55
|
+
"globals": "^17.0.0",
|
|
56
|
+
"prettier": "^3.7.4",
|
|
57
|
+
"strip-comment": "^1.1.3",
|
|
58
|
+
"tsx": "^4.21.0",
|
|
59
|
+
"typescript": "^5.9.3",
|
|
60
|
+
"typescript-eslint": "^8.53.0",
|
|
61
|
+
"vitest": "^4.0.17"
|
|
60
62
|
},
|
|
61
63
|
"engines": {
|
|
62
64
|
"node": ">=18.0.0"
|