@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.
Files changed (67) hide show
  1. package/dist/final-demo.js +0 -3
  2. package/dist/final-demo.js.map +1 -1
  3. package/dist/index.js +25 -15
  4. package/dist/index.js.map +1 -1
  5. package/dist/schemas/brain.schema.d.ts +70 -0
  6. package/dist/schemas/brain.schema.d.ts.map +1 -0
  7. package/dist/schemas/brain.schema.js +70 -0
  8. package/dist/schemas/brain.schema.js.map +1 -0
  9. package/dist/security.test.d.ts +2 -0
  10. package/dist/security.test.d.ts.map +1 -0
  11. package/dist/security.test.js +81 -0
  12. package/dist/security.test.js.map +1 -0
  13. package/dist/sse-server.js +39 -8
  14. package/dist/sse-server.js.map +1 -1
  15. package/dist/test-all.js +0 -20
  16. package/dist/test-all.js.map +1 -1
  17. package/dist/test-extended.js +0 -9
  18. package/dist/test-extended.js.map +1 -1
  19. package/dist/test-max-intelligence.d.ts +2 -0
  20. package/dist/test-max-intelligence.d.ts.map +1 -0
  21. package/dist/test-max-intelligence.js +52 -0
  22. package/dist/test-max-intelligence.js.map +1 -0
  23. package/dist/test-memory.js +0 -2
  24. package/dist/test-memory.js.map +1 -1
  25. package/dist/test-reflective.js +0 -6
  26. package/dist/test-reflective.js.map +1 -1
  27. package/dist/test-resilience.d.ts +2 -0
  28. package/dist/test-resilience.d.ts.map +1 -0
  29. package/dist/test-resilience.js +41 -0
  30. package/dist/test-resilience.js.map +1 -0
  31. package/dist/tools/orchestrator.d.ts +2 -47
  32. package/dist/tools/orchestrator.d.ts.map +1 -1
  33. package/dist/tools/orchestrator.js +224 -215
  34. package/dist/tools/orchestrator.js.map +1 -1
  35. package/dist/tools/sequential-thinking.d.ts +16 -95
  36. package/dist/tools/sequential-thinking.d.ts.map +1 -1
  37. package/dist/tools/sequential-thinking.js +313 -781
  38. package/dist/tools/sequential-thinking.js.map +1 -1
  39. package/dist/types/index.d.ts +18 -3
  40. package/dist/types/index.d.ts.map +1 -1
  41. package/dist/types/index.js +0 -3
  42. package/dist/types/index.js.map +1 -1
  43. package/dist/utils/dag.d.ts +0 -20
  44. package/dist/utils/dag.d.ts.map +1 -1
  45. package/dist/utils/dag.js +8 -48
  46. package/dist/utils/dag.js.map +1 -1
  47. package/dist/utils/memory.d.ts +5 -0
  48. package/dist/utils/memory.d.ts.map +1 -1
  49. package/dist/utils/memory.js +66 -60
  50. package/dist/utils/memory.js.map +1 -1
  51. package/dist/utils/mutex.d.ts +6 -0
  52. package/dist/utils/mutex.d.ts.map +1 -0
  53. package/dist/utils/mutex.js +22 -0
  54. package/dist/utils/mutex.js.map +1 -0
  55. package/dist/utils/resilience.d.ts +23 -0
  56. package/dist/utils/resilience.d.ts.map +1 -0
  57. package/dist/utils/resilience.js +82 -0
  58. package/dist/utils/resilience.js.map +1 -0
  59. package/dist/utils/tool-cache.d.ts +9 -0
  60. package/dist/utils/tool-cache.d.ts.map +1 -0
  61. package/dist/utils/tool-cache.js +23 -0
  62. package/dist/utils/tool-cache.js.map +1 -0
  63. package/dist/utils/vector-memory.d.ts +18 -0
  64. package/dist/utils/vector-memory.d.ts.map +1 -0
  65. package/dist/utils/vector-memory.js +86 -0
  66. package/dist/utils/vector-memory.js.map +1 -0
  67. package/package.json +22 -20
@@ -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.load();
14
+ this.tfidf = new natural.TfIdf();
15
+ this.init();
16
+ }
17
+ async init() {
18
+ await this.load();
10
19
  }
11
20
  async load() {
12
- try {
13
- const data = await fs.readFile(this.memoryPath, 'utf8');
14
- this.entries = JSON.parse(data);
15
- }
16
- catch (e) {
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
- this.entries = [];
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
- try {
25
- const dir = path.dirname(this.memoryPath);
26
- await fs.mkdir(dir, { recursive: true });
27
- await fs.writeFile(this.memoryPath, JSON.stringify(this.entries, null, 2));
28
- }
29
- catch (e) {
30
- console.error('[Memory] Failed to save memory:', e);
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
- // Remove old entry with same key if exists
45
- this.entries = this.entries.filter((e) => e.key !== key);
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
- await this.load();
62
- // Lazy import natural to keep startup fast
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
- // If no search term, return all candidates sorted by date
86
- return candidates.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
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
- // 2. Add documents to TF-IDF
90
- candidates.forEach((entry) => {
91
- // We index key, stringified value, and tags
92
- const content = `${entry.key} ${typeof entry.value === 'string' ? entry.value : JSON.stringify(entry.value)} ${entry.tags.join(' ')}`;
93
- tfidf.addDocument(content);
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; // Significant boost ensures exact matches usually win
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
  }
@@ -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;AAYzB,MAAM,OAAO,aAAa;IAChB,UAAU,CAAS;IACnB,OAAO,GAAkB,EAAE,CAAC;IAEpC;QACE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACxD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAK,CAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CACV,gFAAgF,CACjF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,KAAU,EACV,WAAmB,SAAS,EAC5B,OAAiB,EAAE;QAEnB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,KAAK,GAAgB;YACzB,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/C,GAAG;YACH,KAAK;YACL,QAAQ;YACR,IAAI;YACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,2CAA2C;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;QAC7E,MAAM,YAAY,GAAG,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACxD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,EAAE,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK,CACT,UAAkB,EAClB,UAAkD,EAAE;QAEpD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,2CAA2C;QAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,wCAAwC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE1E,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;YAC7F,wCAAwC;YACxC,MAAM,WAAW,GAAG;gBAChB,WAAW,CAAC,GAAW,IAAG,CAAC;gBAC3B,KAAK,CAAC,IAAY,EAAE,KAAa,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;aACnD,CAAC;YACF,aAAa;YACb,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAChC,2FAA2F;QAC/F,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;QAE1B,iDAAiD;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACzC,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACzG,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC3J,OAAO,eAAe,IAAI,WAAW,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,0DAA0D;YAC1D,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACxG,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAEtC,6BAA6B;QAC7B,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACzB,4CAA4C;YAC5C,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtI,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,oBAAoB;QACpB,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAClD,eAAe;YACf,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAE7C,qEAAqE;YACrE,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACtC,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAChF,KAAK,GAAG,EAAE,CAAC,CAAC,sDAAsD;YACtE,CAAC;YAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,kDAAkD;QAClD,OAAO,aAAa;aACf,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;aACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/utils/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare class Mutex {
2
+ private mutex;
3
+ lock(): PromiseLike<() => void>;
4
+ dispatch<T>(fn: (() => T) | (() => PromiseLike<T>)): Promise<T>;
5
+ }
6
+ //# sourceMappingURL=mutex.d.ts.map
@@ -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":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAgB7B,MAAM,OAAO,iBAAiB;IACpB,UAAU,GAAyB,EAAE,CAAC;IACtC,aAAa,GAA6D,IAAI,CAAC;IAEvF;QACE,IAAI,CAAC,yBAAyB,EAAE,CAAC;IACnC,CAAC;IAED,gBAAgB,CAAC,OAAwD;QACrE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,KAAa,EAAE,IAAc;QACtD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB,CAAC,QAA4B;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAY,EAAE,IAAc;QACzC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;gBAClC,OAAO,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,yBAAyB;QAG/B,IAAI,CAAC,gBAAgB,CAAC;YACpB,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,CAAC,KAAU,EAAE,IAAc,EAAE,EAAE;gBACtC,OAAO,CACL,IAAI,CAAC,QAAQ,KAAK,YAAY;oBAC9B,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAChC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CACpD,CAAC;YACJ,CAAC;YACD,iBAAiB,EAAE,KAAK,EAAE,KAAU,EAAE,IAAc,EAAE,EAAE;gBACtD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAW,CAAC;gBAC/E,IAAI,CAAC,QAAQ;oBAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,oBAAoB;gBAEnF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjD,OAAO;oBACL,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,GAAG,EAAE;oBACzC,WAAW,EAAE,6CAA6C,GAAG,EAAE;iBAChE,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;QAUH,IAAI,CAAC,gBAAgB,CAAC;YACpB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,CAAC,KAAU,EAAE,IAAc,EAAE,EAAE;gBACtC,OAAO,CACL,IAAI,CAAC,QAAQ,KAAK,eAAe;oBACjC,CAAC,IAAI,CAAC,SAAS,EAAE,OAAkB,CAAA,CAAC,QAAQ,CAAC,aAAa,CAAC;oBAC3D,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAC/E,CAAC;YACJ,CAAC;YACD,iBAAiB,EAAE,KAAK,EAAE,KAAU,EAAE,IAAc,EAAE,EAAE;gBACrD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,OAAiB,CAAC;gBAC9C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;oBAClE,OAAO;wBACH,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,GAAG,qBAAqB,EAAE;wBACjD,WAAW,EAAE,8CAA8C;qBAC9D,CAAC;gBACN,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;YAClD,CAAC;SACF,CAAC,CAAC;QAGH,IAAI,CAAC,gBAAgB,CAAC;YAClB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,CAAC,KAAU,EAAE,EAAE;gBACpB,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACzF,CAAC;YACD,iBAAiB,EAAE,KAAK,IAAI,EAAE;gBAC1B,OAAO;oBACH,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,qCAAqC;iBACrD,CAAC;YACN,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC"}
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gotza02/mathinking",
3
- "version": "2.9.3",
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": "sed -i '1i #!/usr/bin/env node' dist/cli.js && chmod +x dist/cli.js",
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.0.0",
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
- "uuid": "^11.0.0",
43
- "zod": "^3.23.8"
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.0",
47
- "@types/node": "^22.0.0",
48
- "@types/uuid": "^10.0.0",
49
- "@typescript-eslint/eslint-plugin": "^8.18.0",
50
- "@typescript-eslint/parser": "^8.18.0",
51
- "eslint": "^9.17.0",
52
- "eslint-config-prettier": "^9.1.0",
53
- "eslint-plugin-prettier": "^5.2.0",
54
- "globals": "^15.14.0",
55
- "prettier": "^3.4.0",
56
- "tsx": "^4.19.0",
57
- "typescript": "^5.7.0",
58
- "typescript-eslint": "^8.18.0",
59
- "vitest": "^2.1.0"
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"