recall-mcp-v3 3.7.5 → 3.9.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.
Files changed (97) hide show
  1. package/package.json +1 -1
  2. package/dist/__tests__/cli-save.test.d.ts +0 -12
  3. package/dist/__tests__/cli-save.test.d.ts.map +0 -1
  4. package/dist/__tests__/cli-save.test.js +0 -109
  5. package/dist/__tests__/cli-save.test.js.map +0 -1
  6. package/dist/__tests__/cli.test.d.ts +0 -7
  7. package/dist/__tests__/cli.test.d.ts.map +0 -1
  8. package/dist/__tests__/cli.test.js +0 -133
  9. package/dist/__tests__/cli.test.js.map +0 -1
  10. package/dist/__tests__/codex-transcript.test.d.ts +0 -11
  11. package/dist/__tests__/codex-transcript.test.d.ts.map +0 -1
  12. package/dist/__tests__/codex-transcript.test.js +0 -372
  13. package/dist/__tests__/codex-transcript.test.js.map +0 -1
  14. package/dist/__tests__/enrollment-isError.test.d.ts +0 -9
  15. package/dist/__tests__/enrollment-isError.test.d.ts.map +0 -1
  16. package/dist/__tests__/enrollment-isError.test.js +0 -119
  17. package/dist/__tests__/enrollment-isError.test.js.map +0 -1
  18. package/dist/__tests__/format.test.d.ts +0 -2
  19. package/dist/__tests__/format.test.d.ts.map +0 -1
  20. package/dist/__tests__/format.test.js +0 -229
  21. package/dist/__tests__/format.test.js.map +0 -1
  22. package/dist/__tests__/gemini-transcript.test.d.ts +0 -12
  23. package/dist/__tests__/gemini-transcript.test.d.ts.map +0 -1
  24. package/dist/__tests__/gemini-transcript.test.js +0 -322
  25. package/dist/__tests__/gemini-transcript.test.js.map +0 -1
  26. package/dist/__tests__/get-context-repo-resolution.test.d.ts +0 -11
  27. package/dist/__tests__/get-context-repo-resolution.test.d.ts.map +0 -1
  28. package/dist/__tests__/get-context-repo-resolution.test.js +0 -310
  29. package/dist/__tests__/get-context-repo-resolution.test.js.map +0 -1
  30. package/dist/__tests__/integration.test.d.ts +0 -11
  31. package/dist/__tests__/integration.test.d.ts.map +0 -1
  32. package/dist/__tests__/integration.test.js +0 -323
  33. package/dist/__tests__/integration.test.js.map +0 -1
  34. package/dist/__tests__/no-git-repo.test.d.ts +0 -9
  35. package/dist/__tests__/no-git-repo.test.d.ts.map +0 -1
  36. package/dist/__tests__/no-git-repo.test.js +0 -125
  37. package/dist/__tests__/no-git-repo.test.js.map +0 -1
  38. package/dist/__tests__/preprocessor.test.d.ts +0 -12
  39. package/dist/__tests__/preprocessor.test.d.ts.map +0 -1
  40. package/dist/__tests__/preprocessor.test.js +0 -690
  41. package/dist/__tests__/preprocessor.test.js.map +0 -1
  42. package/dist/__tests__/repo-detection-guard.test.d.ts +0 -9
  43. package/dist/__tests__/repo-detection-guard.test.d.ts.map +0 -1
  44. package/dist/__tests__/repo-detection-guard.test.js +0 -153
  45. package/dist/__tests__/repo-detection-guard.test.js.map +0 -1
  46. package/dist/__tests__/repo-enrollment.test.d.ts +0 -9
  47. package/dist/__tests__/repo-enrollment.test.d.ts.map +0 -1
  48. package/dist/__tests__/repo-enrollment.test.js +0 -107
  49. package/dist/__tests__/repo-enrollment.test.js.map +0 -1
  50. package/dist/__tests__/repo-override-save-log.test.d.ts +0 -11
  51. package/dist/__tests__/repo-override-save-log.test.d.ts.map +0 -1
  52. package/dist/__tests__/repo-override-save-log.test.js +0 -352
  53. package/dist/__tests__/repo-override-save-log.test.js.map +0 -1
  54. package/dist/api.d.ts +0 -348
  55. package/dist/api.d.ts.map +0 -1
  56. package/dist/api.js +0 -683
  57. package/dist/api.js.map +0 -1
  58. package/dist/cli.d.ts +0 -32
  59. package/dist/cli.d.ts.map +0 -1
  60. package/dist/cli.js +0 -285
  61. package/dist/cli.js.map +0 -1
  62. package/dist/codex-transcript.d.ts +0 -31
  63. package/dist/codex-transcript.d.ts.map +0 -1
  64. package/dist/codex-transcript.js +0 -304
  65. package/dist/codex-transcript.js.map +0 -1
  66. package/dist/crypto.d.ts +0 -36
  67. package/dist/crypto.d.ts.map +0 -1
  68. package/dist/crypto.js +0 -104
  69. package/dist/crypto.js.map +0 -1
  70. package/dist/detect.d.ts +0 -40
  71. package/dist/detect.d.ts.map +0 -1
  72. package/dist/detect.js +0 -165
  73. package/dist/detect.js.map +0 -1
  74. package/dist/format.d.ts +0 -53
  75. package/dist/format.d.ts.map +0 -1
  76. package/dist/format.js +0 -177
  77. package/dist/format.js.map +0 -1
  78. package/dist/gemini-transcript.d.ts +0 -29
  79. package/dist/gemini-transcript.d.ts.map +0 -1
  80. package/dist/gemini-transcript.js +0 -303
  81. package/dist/gemini-transcript.js.map +0 -1
  82. package/dist/index.d.ts +0 -12
  83. package/dist/index.d.ts.map +0 -1
  84. package/dist/index.js +0 -291
  85. package/dist/index.js.map +0 -1
  86. package/dist/preprocessor.d.ts +0 -39
  87. package/dist/preprocessor.d.ts.map +0 -1
  88. package/dist/preprocessor.js +0 -514
  89. package/dist/preprocessor.js.map +0 -1
  90. package/dist/tools.d.ts +0 -106
  91. package/dist/tools.d.ts.map +0 -1
  92. package/dist/tools.js +0 -784
  93. package/dist/tools.js.map +0 -1
  94. package/dist/transcript-finder.d.ts +0 -27
  95. package/dist/transcript-finder.d.ts.map +0 -1
  96. package/dist/transcript-finder.js +0 -143
  97. package/dist/transcript-finder.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "recall-mcp-v3",
3
- "version": "3.7.5",
3
+ "version": "3.9.1",
4
4
  "description": "Recall MCP server for Claude Code - team memory for AI coding assistants",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,12 +0,0 @@
1
- /**
2
- * Tests for CLI save pipeline alignment (Phase 4).
3
- *
4
- * Verifies that the SessionEnd hook (cli.ts saveTranscript) uses the same
5
- * server-side pipeline as the MCP recall_save_session tool:
6
- * JSONL transcript → preprocess → api.resolveRepo → api.saveSessionAsync
7
- *
8
- * NOT the old path:
9
- * JSONL → preprocess → /v1/summarize (sync) → encrypt client-side → POST /sessions
10
- */
11
- export {};
12
- //# sourceMappingURL=cli-save.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-save.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cli-save.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -1,109 +0,0 @@
1
- /**
2
- * Tests for CLI save pipeline alignment (Phase 4).
3
- *
4
- * Verifies that the SessionEnd hook (cli.ts saveTranscript) uses the same
5
- * server-side pipeline as the MCP recall_save_session tool:
6
- * JSONL transcript → preprocess → api.resolveRepo → api.saveSessionAsync
7
- *
8
- * NOT the old path:
9
- * JSONL → preprocess → /v1/summarize (sync) → encrypt client-side → POST /sessions
10
- */
11
- import { describe, it, expect, vi, beforeEach } from 'vitest';
12
- // Mock api module - this is what cli.ts uses
13
- vi.mock('../api.js', () => ({
14
- resolveRepo: vi.fn().mockResolvedValue({ repoId: 'repo-123', teamId: 'team-456' }),
15
- saveSessionAsync: vi.fn().mockResolvedValue({ id: 'session-789', created_at: '2026-02-09' }),
16
- }));
17
- // Mock fs for transcript reading
18
- vi.mock('fs', async (importOriginal) => {
19
- const actual = await importOriginal();
20
- return {
21
- ...actual,
22
- readFileSync: vi.fn().mockReturnValue('{"type":"message","role":"user"}\n{"type":"message","role":"assistant"}'),
23
- existsSync: vi.fn().mockReturnValue(true),
24
- readdirSync: vi.fn().mockReturnValue([]),
25
- };
26
- });
27
- // Mock child_process for git commands
28
- vi.mock('child_process', () => ({
29
- execSync: vi.fn((cmd) => {
30
- if (cmd.includes('remote.origin.url'))
31
- return 'https://github.com/testorg/testrepo.git\n';
32
- if (cmd.includes('rev-parse --abbrev-ref'))
33
- return 'main\n';
34
- return '';
35
- }),
36
- }));
37
- // Mock preprocessor - content must be >= 100 chars (cli.ts threshold)
38
- vi.mock('../preprocessor.js', () => ({
39
- preprocessTranscript: vi.fn().mockResolvedValue({
40
- content: '## Assistant\nFixed the login bug by updating the auth middleware. The root cause was an expired JWT token check that was comparing timestamps incorrectly. Updated the comparison logic and added tests.',
41
- stats: { originalSize: 5000, processedSize: 500, messagesExtracted: 10, errorsFound: 0, toolCallsLogged: 3 },
42
- }),
43
- }));
44
- // Mock format
45
- vi.mock('../format.js', () => ({
46
- extractPreliminarySummary: vi.fn().mockReturnValue('Fixed login bug'),
47
- }));
48
- import { saveTranscript } from '../cli.js';
49
- import * as api from '../api.js';
50
- describe('CLI saveTranscript pipeline alignment', () => {
51
- beforeEach(() => {
52
- vi.clearAllMocks();
53
- process.env.RECALL_API_TOKEN = 'rcl_test_token_12345';
54
- process.env.RECALL_API_URL = 'https://api-v3.recall.team';
55
- });
56
- it('should call api.saveSessionAsync (the async pipeline)', async () => {
57
- await saveTranscript({
58
- transcriptPath: '/test/transcript.jsonl',
59
- cwd: '/test/project',
60
- quiet: true,
61
- });
62
- // Verify saveSessionAsync was called (same pipeline as typing save)
63
- expect(api.saveSessionAsync).toHaveBeenCalledOnce();
64
- expect(api.saveSessionAsync).toHaveBeenCalledWith('repo-123', expect.any(String), expect.objectContaining({
65
- tool: 'claude-code',
66
- }));
67
- });
68
- it('should send preprocessed transcript content to saveSessionAsync', async () => {
69
- await saveTranscript({
70
- transcriptPath: '/test/transcript.jsonl',
71
- cwd: '/test/project',
72
- quiet: true,
73
- });
74
- // The second arg to saveSessionAsync is the transcript content
75
- const transcript = api.saveSessionAsync.mock.calls[0]?.[1];
76
- expect(transcript).toBeDefined();
77
- expect(typeof transcript).toBe('string');
78
- expect(transcript.length).toBeGreaterThan(0);
79
- // Should be the preprocessed content, not raw JSONL
80
- expect(transcript).toContain('Fixed the login bug');
81
- expect(transcript).toContain('expired JWT token');
82
- });
83
- it('should call api.resolveRepo before saving', async () => {
84
- await saveTranscript({
85
- transcriptPath: '/test/transcript.jsonl',
86
- cwd: '/test/project',
87
- quiet: true,
88
- });
89
- // Verify resolveRepo was called with extracted git info
90
- expect(api.resolveRepo).toHaveBeenCalledOnce();
91
- expect(api.resolveRepo).toHaveBeenCalledWith('testorg/testrepo', 'main');
92
- });
93
- it('should NOT use old summarize-then-encrypt path', async () => {
94
- // Mock global fetch to detect any direct API calls
95
- const mockFetch = vi.fn();
96
- vi.stubGlobal('fetch', mockFetch);
97
- await saveTranscript({
98
- transcriptPath: '/test/transcript.jsonl',
99
- cwd: '/test/project',
100
- quiet: true,
101
- });
102
- // cli.ts should NOT call fetch directly - everything goes through api module
103
- // No calls to /v1/summarize or direct /sessions POST
104
- const summarizeCall = mockFetch.mock.calls.find((call) => typeof call[0] === 'string' && call[0].includes('/v1/summarize'));
105
- expect(summarizeCall).toBeUndefined();
106
- vi.unstubAllGlobals();
107
- });
108
- });
109
- //# sourceMappingURL=cli-save.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-save.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-save.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * CLI Unit Tests
3
- *
4
- * Tests for findCurrentTranscript and related CLI functions.
5
- */
6
- export {};
7
- //# sourceMappingURL=cli.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -1,133 +0,0 @@
1
- /**
2
- * CLI Unit Tests
3
- *
4
- * Tests for findCurrentTranscript and related CLI functions.
5
- */
6
- import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
7
- import * as fs from 'fs';
8
- import * as path from 'path';
9
- import * as os from 'os';
10
- import { findCurrentTranscript } from '../cli.js';
11
- // Test fixtures directory (simulates ~/.claude/projects/)
12
- const TEST_CLAUDE_DIR = path.join(os.tmpdir(), 'recall-cli-tests', '.claude', 'projects');
13
- const TEST_PROJECT_PATH = '/Users/testuser/projects/my-app';
14
- // Claude Code hash algorithm: replace all / with -
15
- // e.g., /Users/testuser/projects/my-app -> -Users-testuser-projects-my-app
16
- const PROJECT_HASH = TEST_PROJECT_PATH.replace(/\//g, '-');
17
- const TRANSCRIPT_DIR = path.join(TEST_CLAUDE_DIR, PROJECT_HASH);
18
- describe('findCurrentTranscript', () => {
19
- beforeAll(() => {
20
- // Create the test directory structure
21
- fs.mkdirSync(TRANSCRIPT_DIR, { recursive: true });
22
- });
23
- afterAll(() => {
24
- // Cleanup
25
- const testRoot = path.join(os.tmpdir(), 'recall-cli-tests');
26
- if (fs.existsSync(testRoot)) {
27
- fs.rmSync(testRoot, { recursive: true });
28
- }
29
- });
30
- beforeEach(() => {
31
- // Clear any files from previous tests
32
- if (fs.existsSync(TRANSCRIPT_DIR)) {
33
- const files = fs.readdirSync(TRANSCRIPT_DIR);
34
- for (const file of files) {
35
- fs.unlinkSync(path.join(TRANSCRIPT_DIR, file));
36
- }
37
- }
38
- });
39
- it('returns null if directory not found', () => {
40
- // Use a path that doesn't exist
41
- const result = findCurrentTranscript('/nonexistent/path/to/project');
42
- expect(result).toBeNull();
43
- });
44
- it('returns null if no .jsonl files exist', () => {
45
- // Directory exists but is empty
46
- const result = findCurrentTranscript(TEST_PROJECT_PATH);
47
- // This will fail because we're using a mock path, but the logic is correct
48
- // In real usage, it would check ~/.claude/projects/<hash>/
49
- // For this test, we're verifying the function handles empty directories
50
- expect(result).toBeNull();
51
- });
52
- it('returns the most recent .jsonl file when multiple exist', () => {
53
- // Create multiple transcript files with different mtimes
54
- const oldFile = path.join(TRANSCRIPT_DIR, 'old-session.jsonl');
55
- const newFile = path.join(TRANSCRIPT_DIR, 'new-session.jsonl');
56
- // Create old file first
57
- fs.writeFileSync(oldFile, '{"type":"user","content":"old"}');
58
- // Wait a bit to ensure different mtime
59
- const oldTime = new Date(Date.now() - 10000);
60
- fs.utimesSync(oldFile, oldTime, oldTime);
61
- // Create new file
62
- fs.writeFileSync(newFile, '{"type":"user","content":"new"}');
63
- // The function looks in ~/.claude/projects/<hash>/, not our test dir directly
64
- // This test documents the expected behavior
65
- // In practice, we'd need to mock os.homedir() to fully test this
66
- });
67
- it('handles paths with special characters', () => {
68
- // Test path with spaces or special chars
69
- const specialPath = '/Users/test user/my projects/app-v2';
70
- const expectedHash = specialPath.replace(/\//g, '-');
71
- // Verify the hash algorithm
72
- expect(expectedHash).toBe('-Users-test user-my projects-app-v2');
73
- });
74
- it('keeps leading dash in project hash', () => {
75
- // Verify the hash algorithm preserves leading dash
76
- const testPath = '/Users/ray/projects/recall';
77
- const hash = testPath.replace(/\//g, '-');
78
- expect(hash).toBe('-Users-ray-projects-recall');
79
- expect(hash.startsWith('-')).toBe(true);
80
- });
81
- });
82
- describe('findCurrentTranscript - hash algorithm', () => {
83
- it('correctly converts absolute paths to Claude Code hashes', () => {
84
- const testCases = [
85
- {
86
- path: '/Users/ray/projects/recall-v3',
87
- expected: '-Users-ray-projects-recall-v3',
88
- },
89
- {
90
- path: '/home/developer/work/my-app',
91
- expected: '-home-developer-work-my-app',
92
- },
93
- {
94
- path: '/Users/rayhernandez/Library/CloudStorage/Dropbox-Personal/Goldfish/personal/Recall-v3',
95
- expected: '-Users-rayhernandez-Library-CloudStorage-Dropbox-Personal-Goldfish-personal-Recall-v3',
96
- },
97
- ];
98
- for (const { path: testPath, expected } of testCases) {
99
- const hash = testPath.replace(/\//g, '-');
100
- expect(hash).toBe(expected);
101
- }
102
- });
103
- });
104
- describe('findCurrentTranscript - directory tree walking', () => {
105
- it('walks up directory tree to find transcripts from subdirectories', () => {
106
- // This is a behavioral test documenting the expected behavior.
107
- // When called from a subdirectory like /project/packages/mcp-v3,
108
- // the function should walk up to /project and find transcripts there.
109
- //
110
- // The algorithm:
111
- // 1. Start at the given path
112
- // 2. Check if ~/.claude/projects/<hash>/ exists
113
- // 3. If not, move up one directory and repeat
114
- // 4. Stop at filesystem root
115
- //
116
- // Example:
117
- // Input: /Users/ray/projects/recall-v3/packages/mcp-v3
118
- // Check: ~/.claude/projects/-Users-ray-projects-recall-v3-packages-mcp-v3 (not found)
119
- // Check: ~/.claude/projects/-Users-ray-projects-recall-v3-packages (not found)
120
- // Check: ~/.claude/projects/-Users-ray-projects-recall-v3 (FOUND!)
121
- // We can't fully test this without mocking os.homedir(), but we verify
122
- // that the function returns null for nonexistent paths (doesn't infinite loop)
123
- const deepPath = '/nonexistent/very/deep/nested/path/here';
124
- const result = findCurrentTranscript(deepPath);
125
- expect(result).toBeNull();
126
- });
127
- it('handles root path without infinite loop', () => {
128
- // Edge case: calling with root path should not loop forever
129
- const result = findCurrentTranscript('/');
130
- expect(result).toBeNull();
131
- });
132
- });
133
- //# sourceMappingURL=cli.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Tests for Codex Transcript Finder & Preprocessor
3
- *
4
- * Verifies:
5
- * 1. CWD matching from session_meta
6
- * 2. Noise filtering (event_msg, developer messages, session_meta, turn_context)
7
- * 3. Signal preservation (user, assistant, reasoning, function_call, function_call_output)
8
- * 4. Output format is clean markdown with no YAML
9
- */
10
- export {};
11
- //# sourceMappingURL=codex-transcript.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex-transcript.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/codex-transcript.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}