@mmnto/mcp 1.3.19 → 1.4.1

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.
@@ -1,3 +1,5 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /** Exported for testing — reset the rate-limit counter between test runs. */
3
+ export declare function _resetRateLimit(): void;
2
4
  export declare function registerAddLesson(server: McpServer): void;
3
5
  //# sourceMappingURL=add-lesson.d.ts.map
@@ -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;AAiGzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqFzD"}
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;AAczE,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AA0GD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuHzD"}
@@ -5,6 +5,28 @@ import { z } from 'zod';
5
5
  import { acquireLock, generateLessonHeading, sanitize, writeLessonFileAsync } from '@mmnto/totem';
6
6
  import { getContext, reconnectStore } from '../context.js';
7
7
  import { formatXmlResponse } from '../xml-format.js';
8
+ // ---------------------------------------------------------------------------
9
+ // Rate limiting (#844) — simple in-memory session counter
10
+ // ---------------------------------------------------------------------------
11
+ const MAX_LESSONS_PER_SESSION = 10;
12
+ let sessionLessonCount = 0;
13
+ /** Exported for testing — reset the rate-limit counter between test runs. */
14
+ export function _resetRateLimit() {
15
+ sessionLessonCount = 0;
16
+ }
17
+ // ---------------------------------------------------------------------------
18
+ // Input validation schema (#844)
19
+ // ---------------------------------------------------------------------------
20
+ const AddLessonInputSchema = z.object({
21
+ lesson: z.string().min(1, 'Lesson body must be a non-empty string'),
22
+ context_tags: z.array(z.string().min(1)).min(1, 'At least one context tag is required'),
23
+ });
24
+ // ---------------------------------------------------------------------------
25
+ // Heading sanitization (#844) — strip XML-like angle brackets
26
+ // ---------------------------------------------------------------------------
27
+ function sanitizeHeading(heading) {
28
+ return heading.replace(/[<>]/g, '');
29
+ }
8
30
  /**
9
31
  * Detect the correct package-manager command for running `totem sync`.
10
32
  */
@@ -101,17 +123,47 @@ export function registerAddLesson(server) {
101
123
  readOnlyHint: false,
102
124
  },
103
125
  }, async ({ lesson, context_tags }) => {
126
+ // --- Rate limiting (#844) ---
127
+ if (sessionLessonCount >= MAX_LESSONS_PER_SESSION) {
128
+ return {
129
+ content: [
130
+ {
131
+ type: 'text',
132
+ text: 'Rate limit exceeded: maximum 10 lessons per session',
133
+ },
134
+ ],
135
+ isError: true,
136
+ };
137
+ }
138
+ // --- Schema validation (#844) ---
139
+ const parsed = AddLessonInputSchema.safeParse({ lesson, context_tags });
140
+ if (!parsed.success) {
141
+ const issues = parsed.error.issues.map((i) => i.message).join('; ');
142
+ return {
143
+ content: [{ type: 'text', text: `Validation error: ${issues}` }],
144
+ isError: true,
145
+ };
146
+ }
104
147
  try {
105
148
  const { projectRoot, config } = await getContext();
106
149
  const totemDir = path.join(projectRoot, config.totemDir);
107
150
  await fs.promises.mkdir(totemDir, { recursive: true });
108
151
  const lessonsDir = path.join(totemDir, 'lessons');
109
- const safeLesson = sanitize(lesson);
110
- const safeTags = context_tags.length > 0
111
- ? context_tags.map((t) => sanitize(t).replace(/\n/g, ' ')).join(', ')
112
- : 'manual';
113
- const heading = generateLessonHeading(safeLesson);
114
- const entry = `## Lesson — ${heading}\n\n` + `**Tags:** ${safeTags}\n\n` + `${safeLesson.trim()}\n`;
152
+ const validLesson = parsed.data.lesson;
153
+ const validTags = parsed.data.context_tags;
154
+ const safeLesson = sanitize(validLesson);
155
+ const safeTags = validTags
156
+ .map((t) => sanitize(t).replace(/[\n,]/g, ' ').trim())
157
+ .filter(Boolean)
158
+ .join(', ') || 'untagged';
159
+ const rawHeading = generateLessonHeading(safeLesson);
160
+ const heading = sanitizeHeading(rawHeading);
161
+ // --- Source provenance (#844) ---
162
+ const provenance = `\n**Source:** mcp (added at ${new Date().toISOString()})`;
163
+ const entry = `## Lesson — ${heading}\n\n` +
164
+ `**Tags:** ${safeTags}\n\n` +
165
+ `${safeLesson.trim()}\n` +
166
+ provenance;
115
167
  // Acquire lock before writing lesson, release before spawning sync
116
168
  // (the spawned sync process acquires its own lock via runSync/withLock)
117
169
  const releaseLock = await acquireLock(totemDir);
@@ -119,6 +171,7 @@ export function registerAddLesson(server) {
119
171
  try {
120
172
  const writtenPath = await writeLessonFileAsync(lessonsDir, entry);
121
173
  fileName = path.basename(writtenPath);
174
+ sessionLessonCount++;
122
175
  }
123
176
  finally {
124
177
  releaseLock();
@@ -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,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAElG,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,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,uEAAuE;AACvE,IAAI,iBAAiB,GAAyD,IAAI,CAAC;AAEnF;;;GAGG;AACH,SAAS,QAAQ,CAAC,KAA+B;IAC/C,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI;QAAE,OAAO;IAC9B,IAAI,CAAC;QACH,yFAAyF;QACzF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;QAChD,KAAK,CAAC,IAAI,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,WAAmB;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAC7B,GAAG,EAAE,WAAW;YAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,qCAAqC;YAC7E,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;YAC/B,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC;YACzB,IAAI,UAAU,GAAG,gBAAgB,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACxE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBACxC,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAElC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACnE,CAAC,EAAE,eAAe,CAAC,CAAC;QAEpB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,WAAW,EACT,qHAAqH;QACvH,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YACzD,YAAY,EAAE,CAAC;iBACZ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,CAAC,8DAA8D,CAAC;SAC5E;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;SACpB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;YAEnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,QAAQ,GACZ,YAAY,CAAC,MAAM,GAAG,CAAC;gBACrB,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBACrE,CAAC,CAAC,QAAQ,CAAC;YACf,MAAM,OAAO,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;YAElD,MAAM,KAAK,GACT,eAAe,OAAO,MAAM,GAAG,aAAa,QAAQ,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;YAExF,mEAAmE;YACnE,wEAAwE;YACxE,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,QAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAClE,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACxC,CAAC;oBAAS,CAAC;gBACT,WAAW,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,SAAS,GAAG,iBAAiB,KAAK,IAAI,CAAC;YAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;oBACpD,iBAAiB,GAAG,IAAI,CAAC;gBAC3B,CAAC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC;YAEpD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,cAAc,EAAE,CAAC;gBACzB,CAAC;gBAAC,MAAM,CAAC;oBACP,kDAAkD;gBACpD,CAAC;YACH,CAAC;YAED,MAAM,WAAW,GAAG,OAAO;gBACzB,CAAC,CAAC,gCAAgC,MAAM,CAAC,IAAI,EAAE,EAAE;gBACjD,CAAC,CAAC,gBAAgB,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAEpC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,iBAAiB,CACrB,cAAc,EACd,mBAAmB,MAAM,CAAC,QAAQ,YAAY,QAAQ,KAAK,WAAW,EAAE,CACzE;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,eAAe,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzE,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,eAAe,CAAC;gBACzD,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,uCAAuC,eAAe,EAAE,CAAC;YAC7D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"add-lesson.js","sourceRoot":"","sources":["../../src/tools/add-lesson.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=add-lesson.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-lesson.test.d.ts","sourceRoot":"","sources":["../../src/tools/add-lesson.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,148 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ // ---------------------------------------------------------------------------
3
+ // Mocks — must be declared before imports that reference them
4
+ // ---------------------------------------------------------------------------
5
+ let capturedHandler;
6
+ vi.mock('@modelcontextprotocol/sdk/server/mcp.js', () => ({
7
+ McpServer: class {
8
+ },
9
+ }));
10
+ vi.mock('@mmnto/totem', () => ({
11
+ acquireLock: vi.fn(async () => vi.fn()),
12
+ generateLessonHeading: vi.fn((body) => body.slice(0, 40)),
13
+ sanitize: vi.fn((t) => t),
14
+ writeLessonFileAsync: vi.fn(async (_dir, entry) => {
15
+ lastWrittenEntry = entry;
16
+ return '/fake/lessons/lesson-001.md';
17
+ }),
18
+ }));
19
+ vi.mock('../context.js', () => ({
20
+ getContext: vi.fn(async () => ({
21
+ projectRoot: '/fake/project',
22
+ config: { totemDir: '.totem', lanceDir: '.totem/.lance' },
23
+ })),
24
+ reconnectStore: vi.fn(async () => undefined),
25
+ }));
26
+ vi.mock('../xml-format.js', () => ({
27
+ formatXmlResponse: vi.fn((_tag, msg) => msg),
28
+ }));
29
+ // Stub fs.promises.mkdir so the handler doesn't hit the real filesystem
30
+ vi.mock('node:fs', async () => {
31
+ const actual = await vi.importActual('node:fs');
32
+ return {
33
+ ...actual,
34
+ default: {
35
+ ...actual,
36
+ promises: { ...actual.promises, mkdir: vi.fn(async () => undefined) },
37
+ existsSync: vi.fn(() => true),
38
+ },
39
+ promises: { ...actual.promises, mkdir: vi.fn(async () => undefined) },
40
+ existsSync: vi.fn(() => true),
41
+ };
42
+ });
43
+ // Stub child_process.spawn so runSync never actually spawns
44
+ vi.mock('node:child_process', () => {
45
+ const { EventEmitter } = require('node:events');
46
+ return {
47
+ spawn: vi.fn(() => {
48
+ const child = new EventEmitter();
49
+ child.pid = 12345;
50
+ child.stdout = new EventEmitter();
51
+ child.stderr = new EventEmitter();
52
+ child.kill = vi.fn();
53
+ // Simulate instant success
54
+ setTimeout(() => child.emit('close', 0), 0);
55
+ return child;
56
+ }),
57
+ };
58
+ });
59
+ // ---------------------------------------------------------------------------
60
+ // Imports (after mocks are in place)
61
+ // ---------------------------------------------------------------------------
62
+ import { _resetRateLimit, registerAddLesson } from './add-lesson.js';
63
+ let lastWrittenEntry = '';
64
+ // ---------------------------------------------------------------------------
65
+ // Helpers
66
+ // ---------------------------------------------------------------------------
67
+ /** Register the tool and capture its handler. */
68
+ function setup() {
69
+ const fakeServer = {
70
+ registerTool: (_name, _opts, handler) => {
71
+ capturedHandler = handler;
72
+ },
73
+ };
74
+ registerAddLesson(fakeServer);
75
+ return capturedHandler;
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Tests
79
+ // ---------------------------------------------------------------------------
80
+ describe('add_lesson auth model (#844)', () => {
81
+ let handle;
82
+ beforeEach(() => {
83
+ _resetRateLimit();
84
+ lastWrittenEntry = '';
85
+ handle = setup();
86
+ });
87
+ // --- Schema validation ---
88
+ it('rejects lesson with empty heading (empty lesson string)', async () => {
89
+ const result = (await handle({ lesson: '', context_tags: ['tag'] }));
90
+ expect(result.isError).toBe(true);
91
+ expect(result.content[0].text).toContain('Validation error');
92
+ expect(result.content[0].text).toContain('non-empty');
93
+ });
94
+ it('rejects lesson with empty body', async () => {
95
+ const result = (await handle({ lesson: '', context_tags: ['test'] }));
96
+ expect(result.isError).toBe(true);
97
+ expect(result.content[0].text).toContain('Validation error');
98
+ });
99
+ it('rejects lesson with no tags', async () => {
100
+ const result = (await handle({ lesson: 'Some lesson body', context_tags: [] }));
101
+ expect(result.isError).toBe(true);
102
+ expect(result.content[0].text).toContain('Validation error');
103
+ expect(result.content[0].text).toContain('At least one context tag');
104
+ });
105
+ // --- Rate limiting ---
106
+ it('rejects after rate limit exceeded', async () => {
107
+ // Add 10 lessons successfully
108
+ for (let i = 0; i < 10; i++) {
109
+ const res = (await handle({
110
+ lesson: `Lesson number ${i + 1}`,
111
+ context_tags: ['test'],
112
+ }));
113
+ expect(res.isError).toBeUndefined();
114
+ }
115
+ // 11th should fail
116
+ const result = (await handle({
117
+ lesson: 'One too many',
118
+ context_tags: ['test'],
119
+ }));
120
+ expect(result.isError).toBe(true);
121
+ expect(result.content[0].text).toBe('Rate limit exceeded: maximum 10 lessons per session');
122
+ });
123
+ // --- Source provenance ---
124
+ it('adds source provenance to written lesson', async () => {
125
+ await handle({ lesson: 'Cache invalidation is hard', context_tags: ['caching'] });
126
+ expect(lastWrittenEntry).toContain('**Source:** mcp (added at ');
127
+ // Verify it looks like an ISO timestamp
128
+ const match = lastWrittenEntry.match(/added at (\d{4}-\d{2}-\d{2}T[\d:.]+Z?)/);
129
+ expect(match).not.toBeNull();
130
+ });
131
+ // --- Heading sanitization ---
132
+ it('sanitizes heading of XML-like content', async () => {
133
+ // generateLessonHeading mock returns the first 40 chars of the body
134
+ // We feed it a body that starts with XML-like tags so the heading will contain them
135
+ await handle({
136
+ lesson: '<script>alert("xss")</script> real lesson content here',
137
+ context_tags: ['security'],
138
+ });
139
+ // The heading in the written entry should have < and > stripped
140
+ // The heading comes from generateLessonHeading which returns first 40 chars
141
+ expect(lastWrittenEntry).toContain('## Lesson — ');
142
+ // Should NOT contain raw < or > in the heading line
143
+ const headingLine = lastWrittenEntry.split('\n')[0];
144
+ expect(headingLine).not.toMatch(/<(?!\/)/); // no opening angle brackets
145
+ expect(headingLine).not.toContain('>');
146
+ });
147
+ });
148
+ //# sourceMappingURL=add-lesson.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-lesson.test.js","sourceRoot":"","sources":["../../src/tools/add-lesson.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAE9E,IAAI,eAAoE,CAAC;AAEzE,EAAE,CAAC,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE,CAAC,CAAC;IACxD,SAAS,EAAE;KAAQ;CACpB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;IACvC,qBAAqB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjE,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IACjC,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,KAAa,EAAE,EAAE;QAChE,gBAAgB,GAAG,KAAK,CAAC;QACzB,OAAO,6BAA6B,CAAC;IACvC,CAAC,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC7B,WAAW,EAAE,eAAe;QAC5B,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE;KAC1D,CAAC,CAAC;IACH,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;CAC7C,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC;CAC7D,CAAC,CAAC,CAAC;AAEJ,wEAAwE;AACxE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;IAC5B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAA2B,SAAS,CAAC,CAAC;IAC1E,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE;YACP,GAAG,MAAM;YACT,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE;YACrE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAC9B;QACD,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE;QACrE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;KAC9B,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,4DAA4D;AAC5D,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACjC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAChD,OAAO;QACL,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;YAChB,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;YACjC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;YAClB,KAAK,CAAC,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAClC,KAAK,CAAC,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACrB,2BAA2B;YAC3B,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;KACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAErE,IAAI,gBAAgB,GAAG,EAAE,CAAC;AAE1B,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,iDAAiD;AACjD,SAAS,KAAK;IACZ,MAAM,UAAU,GAAG;QACjB,YAAY,EAAE,CAAC,KAAa,EAAE,KAAc,EAAE,OAAgB,EAAE,EAAE;YAChE,eAAe,GAAG,OAA8D,CAAC;QACnF,CAAC;KACF,CAAC;IACF,iBAAiB,CAAC,UAAmB,CAAC,CAAC;IACvC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAI,MAA2D,CAAC;IAEhE,UAAU,CAAC,GAAG,EAAE;QACd,eAAe,EAAE,CAAC;QAClB,gBAAgB,GAAG,EAAE,CAAC;QACtB,MAAM,GAAG,KAAK,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAE5B,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAGlE,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAGnE,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAG7E,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,wBAAwB;IAExB,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,8BAA8B;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC;gBACxB,MAAM,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE;gBAChC,YAAY,EAAE,CAAC,MAAM,CAAC;aACvB,CAAC,CAA0B,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACtC,CAAC;QAED,mBAAmB;QACnB,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;YAC3B,MAAM,EAAE,cAAc;YACtB,YAAY,EAAE,CAAC,MAAM,CAAC;SACvB,CAAC,CAA2D,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAE5B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,CAAC,EAAE,MAAM,EAAE,4BAA4B,EAAE,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACjE,wCAAwC;QACxC,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC/E,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,+BAA+B;IAE/B,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,oEAAoE;QACpE,oFAAoF;QACpF,MAAM,MAAM,CAAC;YACX,MAAM,EAAE,wDAAwD;YAChE,YAAY,EAAE,CAAC,UAAU,CAAC;SAC3B,CAAC,CAAC;QAEH,gEAAgE;QAChE,4EAA4E;QAC5E,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACnD,oDAAoD;QACpD,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC;QACrD,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,4BAA4B;QACxE,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmnto/mcp",
3
- "version": "1.3.19",
3
+ "version": "1.4.1",
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": "1.3.19"
21
+ "@mmnto/totem": "1.4.1"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/node": "^22.0.0",