@mmnto/mcp 0.10.0 → 0.11.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/dist/tools/add-lesson.d.ts.map +1 -1
- package/dist/tools/add-lesson.js +91 -33
- package/dist/tools/add-lesson.js.map +1 -1
- package/dist/tools/search-knowledge.d.ts.map +1 -1
- package/dist/tools/search-knowledge.js +11 -3
- package/dist/tools/search-knowledge.js.map +1 -1
- package/dist/xml-format.d.ts +5 -0
- package/dist/xml-format.d.ts.map +1 -1
- package/dist/xml-format.js +7 -0
- package/dist/xml-format.js.map +1 -1
- package/dist/xml-format.test.js +13 -1
- package/dist/xml-format.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-lesson.d.ts","sourceRoot":"","sources":["../../src/tools/add-lesson.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"add-lesson.d.ts","sourceRoot":"","sources":["../../src/tools/add-lesson.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgGzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6EzD"}
|
package/dist/tools/add-lesson.js
CHANGED
|
@@ -16,12 +16,81 @@ function detectSyncCommand(projectRoot) {
|
|
|
16
16
|
}
|
|
17
17
|
return { cmd: 'npx', args: ['totem', 'sync', '--incremental'] };
|
|
18
18
|
}
|
|
19
|
-
const
|
|
19
|
+
const SYNC_TIMEOUT_MS = 60_000;
|
|
20
|
+
const MAX_OUTPUT_BYTES = 10_000;
|
|
20
21
|
/** Debounce guard — prevents concurrent sync processes. */
|
|
21
22
|
let syncPending = false;
|
|
23
|
+
/**
|
|
24
|
+
* Kill a child process tree. With `shell: true`, child.kill() only kills the
|
|
25
|
+
* shell — we need to kill the process group to prevent orphaned children.
|
|
26
|
+
*/
|
|
27
|
+
function killTree(child) {
|
|
28
|
+
if (child.pid == null)
|
|
29
|
+
return;
|
|
30
|
+
try {
|
|
31
|
+
// Negative PID kills the process group on Unix; on Windows, taskkill /T handles the tree
|
|
32
|
+
if (process.platform === 'win32') {
|
|
33
|
+
spawn('taskkill', ['/pid', String(child.pid), '/T', '/F'], { stdio: 'ignore' });
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
process.kill(-child.pid, 'SIGTERM');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Best-effort — process may have already exited
|
|
41
|
+
child.kill();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Spawn `totem sync --incremental` and await its completion (up to SYNC_TIMEOUT_MS).
|
|
46
|
+
* Returns { success, output } with captured stdout/stderr (capped at MAX_OUTPUT_BYTES).
|
|
47
|
+
*/
|
|
48
|
+
function runSync(projectRoot) {
|
|
49
|
+
return new Promise((resolve) => {
|
|
50
|
+
const { cmd, args } = detectSyncCommand(projectRoot);
|
|
51
|
+
const chunks = [];
|
|
52
|
+
let totalBytes = 0;
|
|
53
|
+
let capped = false;
|
|
54
|
+
const child = spawn(cmd, args, {
|
|
55
|
+
cwd: projectRoot,
|
|
56
|
+
detached: process.platform !== 'win32', // enables process group kill on Unix
|
|
57
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
58
|
+
shell: true,
|
|
59
|
+
windowsHide: true,
|
|
60
|
+
});
|
|
61
|
+
const capture = (data) => {
|
|
62
|
+
if (capped)
|
|
63
|
+
return;
|
|
64
|
+
const str = data.toString();
|
|
65
|
+
totalBytes += str.length;
|
|
66
|
+
if (totalBytes > MAX_OUTPUT_BYTES) {
|
|
67
|
+
chunks.push(str.slice(0, MAX_OUTPUT_BYTES - (totalBytes - str.length)));
|
|
68
|
+
chunks.push('\n... (output truncated)');
|
|
69
|
+
capped = true;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
chunks.push(str);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
child.stdout?.on('data', capture);
|
|
76
|
+
child.stderr?.on('data', capture);
|
|
77
|
+
const timer = setTimeout(() => {
|
|
78
|
+
killTree(child);
|
|
79
|
+
resolve({ success: false, output: 'Sync timed out after 60s.' });
|
|
80
|
+
}, SYNC_TIMEOUT_MS);
|
|
81
|
+
child.on('close', (code) => {
|
|
82
|
+
clearTimeout(timer);
|
|
83
|
+
resolve({ success: code === 0, output: chunks.join('') });
|
|
84
|
+
});
|
|
85
|
+
child.on('error', (err) => {
|
|
86
|
+
clearTimeout(timer);
|
|
87
|
+
resolve({ success: false, output: `Spawn error: ${err.message}` });
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
22
91
|
export function registerAddLesson(server) {
|
|
23
92
|
server.registerTool('add_lesson', {
|
|
24
|
-
description: 'Persist a lesson learned to .totem/lessons.md. An incremental re-index
|
|
93
|
+
description: 'Persist a lesson learned to .totem/lessons.md. An incremental re-index runs automatically and the result is returned.',
|
|
25
94
|
inputSchema: {
|
|
26
95
|
lesson: z.string().describe('The lesson text to persist'),
|
|
27
96
|
context_tags: z
|
|
@@ -41,48 +110,37 @@ export function registerAddLesson(server) {
|
|
|
41
110
|
const tags = context_tags.join(', ');
|
|
42
111
|
const entry = `\n## Lesson — ${timestamp}\n\n` + `**Tags:** ${tags}\n\n` + `${lesson}\n`;
|
|
43
112
|
await fs.promises.appendFile(lessonsPath, entry, 'utf-8');
|
|
44
|
-
//
|
|
45
|
-
// is searchable within this session (Issue #22).
|
|
113
|
+
// Await sync so the LLM gets definitive success/failure confirmation.
|
|
46
114
|
// Debounce: skip if a sync is already in flight.
|
|
47
|
-
|
|
115
|
+
let syncMessage;
|
|
116
|
+
if (syncPending) {
|
|
117
|
+
syncMessage =
|
|
118
|
+
'A sync is already in progress — this lesson will be indexed when it completes.';
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
48
121
|
syncPending = true;
|
|
49
|
-
const { cmd, args } = detectSyncCommand(projectRoot);
|
|
50
|
-
const logPath = path.join(totemDir, 'mcp-sync.log');
|
|
51
|
-
const logFd = fs.openSync(logPath, 'a');
|
|
52
122
|
try {
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
123
|
+
const { success, output } = await runSync(projectRoot);
|
|
124
|
+
// Reconnect so the next search_knowledge call sees new data.
|
|
125
|
+
try {
|
|
126
|
+
await reconnectStore();
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Non-fatal — store will reconnect on next search
|
|
130
|
+
}
|
|
131
|
+
syncMessage = success
|
|
132
|
+
? `Sync completed successfully. ${output.trim()}`
|
|
133
|
+
: `Sync failed: ${output.trim()}`;
|
|
61
134
|
}
|
|
62
135
|
finally {
|
|
63
|
-
|
|
136
|
+
syncPending = false;
|
|
64
137
|
}
|
|
65
|
-
// Reconnect the store after the sync has had time to finish,
|
|
66
|
-
// so the next search_knowledge call sees the new data.
|
|
67
|
-
const errLogPath = path.join(totemDir, 'mcp-errors.log');
|
|
68
|
-
setTimeout(() => {
|
|
69
|
-
reconnectStore()
|
|
70
|
-
.catch((err) => {
|
|
71
|
-
const msg = `[${new Date().toISOString()}] Store reconnect failed: ${err instanceof Error ? err.message : String(err)}\n`;
|
|
72
|
-
fs.promises.appendFile(errLogPath, msg, 'utf-8').catch(() => {
|
|
73
|
-
// Last-resort: file logging failed — nothing left to do.
|
|
74
|
-
});
|
|
75
|
-
})
|
|
76
|
-
.finally(() => {
|
|
77
|
-
syncPending = false;
|
|
78
|
-
});
|
|
79
|
-
}, RECONNECT_DELAY_MS);
|
|
80
138
|
}
|
|
81
139
|
return {
|
|
82
140
|
content: [
|
|
83
141
|
{
|
|
84
142
|
type: 'text',
|
|
85
|
-
text: formatXmlResponse('lesson_added', `Lesson saved to ${config.totemDir}/lessons.md.
|
|
143
|
+
text: formatXmlResponse('lesson_added', `Lesson saved to ${config.totemDir}/lessons.md. ${syncMessage}`),
|
|
86
144
|
},
|
|
87
145
|
],
|
|
88
146
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-lesson.js","sourceRoot":"","sources":["../../src/tools/add-lesson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD;;GAEG;AACH,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC;IACnE,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"add-lesson.js","sourceRoot":"","sources":["../../src/tools/add-lesson.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"search-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuDzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkD/D"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { ContentTypeSchema } from '@mmnto/totem';
|
|
3
3
|
import { getContext, reconnectStore } from '../context.js';
|
|
4
|
-
import { formatXmlResponse } from '../xml-format.js';
|
|
4
|
+
import { formatSystemWarning, formatXmlResponse } from '../xml-format.js';
|
|
5
5
|
async function performSearch(query, typeFilter, maxResults) {
|
|
6
|
-
const { store } = await getContext();
|
|
6
|
+
const { store, config } = await getContext();
|
|
7
7
|
const results = await store.search({
|
|
8
8
|
query,
|
|
9
9
|
typeFilter,
|
|
@@ -21,7 +21,15 @@ async function performSearch(query, typeFilter, maxResults) {
|
|
|
21
21
|
`**File:** ${r.filePath} | **Score:** ${r.score.toFixed(3)}\n\n` +
|
|
22
22
|
`${r.content}`)
|
|
23
23
|
.join('\n\n---\n\n');
|
|
24
|
-
|
|
24
|
+
let text = formatXmlResponse('knowledge', formatted);
|
|
25
|
+
// Append a system warning when the payload is large enough to risk context pressure
|
|
26
|
+
if (text.length > config.contextWarningThreshold) {
|
|
27
|
+
text +=
|
|
28
|
+
'\n\n' +
|
|
29
|
+
formatSystemWarning('You just ingested a large amount of context. You may be at risk of forgetting earlier instructions. ' +
|
|
30
|
+
'Consider warning the user about context pressure and suggest running `totem bridge` to consolidate.');
|
|
31
|
+
}
|
|
32
|
+
return { content: [{ type: 'text', text }] };
|
|
25
33
|
}
|
|
26
34
|
export function registerSearchKnowledge(server) {
|
|
27
35
|
server.registerTool('search_knowledge', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-knowledge.js","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-knowledge.js","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"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"}
|
package/dist/xml-format.d.ts
CHANGED
|
@@ -3,4 +3,9 @@ import { wrapXml } from '@mmnto/totem';
|
|
|
3
3
|
* Alias for wrapXml — preserves the existing API used by MCP tools.
|
|
4
4
|
*/
|
|
5
5
|
export declare const formatXmlResponse: typeof wrapXml;
|
|
6
|
+
/**
|
|
7
|
+
* Emit an invisible system warning that instructs the AI to act on context pressure.
|
|
8
|
+
* The AI should read this silently and synthesize a natural-language warning — not echo it raw.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatSystemWarning(message: string): string;
|
|
6
11
|
//# sourceMappingURL=xml-format.d.ts.map
|
package/dist/xml-format.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml-format.d.ts","sourceRoot":"","sources":["../src/xml-format.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,iBAAiB,gBAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"xml-format.d.ts","sourceRoot":"","sources":["../src/xml-format.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,iBAAiB,gBAAU,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
package/dist/xml-format.js
CHANGED
|
@@ -4,4 +4,11 @@ import { wrapXml } from '@mmnto/totem';
|
|
|
4
4
|
* Alias for wrapXml — preserves the existing API used by MCP tools.
|
|
5
5
|
*/
|
|
6
6
|
export const formatXmlResponse = wrapXml;
|
|
7
|
+
/**
|
|
8
|
+
* Emit an invisible system warning that instructs the AI to act on context pressure.
|
|
9
|
+
* The AI should read this silently and synthesize a natural-language warning — not echo it raw.
|
|
10
|
+
*/
|
|
11
|
+
export function formatSystemWarning(message) {
|
|
12
|
+
return wrapXml('totem_system_warning', message);
|
|
13
|
+
}
|
|
7
14
|
//# sourceMappingURL=xml-format.js.map
|
package/dist/xml-format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml-format.js","sourceRoot":"","sources":["../src/xml-format.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"xml-format.js","sourceRoot":"","sources":["../src/xml-format.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,OAAO,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC"}
|
package/dist/xml-format.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { formatXmlResponse } from './xml-format.js';
|
|
2
|
+
import { formatSystemWarning, formatXmlResponse } from './xml-format.js';
|
|
3
3
|
describe('formatXmlResponse', () => {
|
|
4
4
|
it('wraps content in XML tags', () => {
|
|
5
5
|
const result = formatXmlResponse('knowledge', 'Hello world');
|
|
@@ -30,4 +30,16 @@ describe('formatXmlResponse', () => {
|
|
|
30
30
|
expect(result).toBe('<knowledge>\ntry <\\/ knowledge> or <\\/knowledge >\n</knowledge>');
|
|
31
31
|
});
|
|
32
32
|
});
|
|
33
|
+
describe('formatSystemWarning', () => {
|
|
34
|
+
it('wraps message in totem_system_warning tags', () => {
|
|
35
|
+
const result = formatSystemWarning('Context is large.');
|
|
36
|
+
expect(result).toBe('<totem_system_warning>\nContext is large.\n</totem_system_warning>');
|
|
37
|
+
});
|
|
38
|
+
it('escapes closing tags in warning content', () => {
|
|
39
|
+
const result = formatSystemWarning('data </totem_system_warning> injection');
|
|
40
|
+
expect(result).toContain('<\\/totem_system_warning>');
|
|
41
|
+
expect(result.startsWith('<totem_system_warning>')).toBe(true);
|
|
42
|
+
expect(result.endsWith('</totem_system_warning>')).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
33
45
|
//# sourceMappingURL=xml-format.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml-format.test.js","sourceRoot":"","sources":["../src/xml-format.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"xml-format.test.js","sourceRoot":"","sources":["../src/xml-format.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,gCAAgC,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,kCAAkC,CAAC,CAAC;QAClF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,+BAA+B,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,EAAE,6BAA6B,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,oCAAoC,CAAC,CAAC;QACpF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,mBAAmB,CAAC,wCAAwC,CAAC,CAAC;QAC7E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmnto/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "MCP server for Totem — AI persistent memory and context layer",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
19
19
|
"jiti": "^2.4.0",
|
|
20
20
|
"zod": "^3.24.0",
|
|
21
|
-
"@mmnto/totem": "0.
|
|
21
|
+
"@mmnto/totem": "0.11.0"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@types/node": "^22.0.0",
|