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.
- package/package.json +1 -1
- package/dist/__tests__/cli-save.test.d.ts +0 -12
- package/dist/__tests__/cli-save.test.d.ts.map +0 -1
- package/dist/__tests__/cli-save.test.js +0 -109
- package/dist/__tests__/cli-save.test.js.map +0 -1
- package/dist/__tests__/cli.test.d.ts +0 -7
- package/dist/__tests__/cli.test.d.ts.map +0 -1
- package/dist/__tests__/cli.test.js +0 -133
- package/dist/__tests__/cli.test.js.map +0 -1
- package/dist/__tests__/codex-transcript.test.d.ts +0 -11
- package/dist/__tests__/codex-transcript.test.d.ts.map +0 -1
- package/dist/__tests__/codex-transcript.test.js +0 -372
- package/dist/__tests__/codex-transcript.test.js.map +0 -1
- package/dist/__tests__/enrollment-isError.test.d.ts +0 -9
- package/dist/__tests__/enrollment-isError.test.d.ts.map +0 -1
- package/dist/__tests__/enrollment-isError.test.js +0 -119
- package/dist/__tests__/enrollment-isError.test.js.map +0 -1
- package/dist/__tests__/format.test.d.ts +0 -2
- package/dist/__tests__/format.test.d.ts.map +0 -1
- package/dist/__tests__/format.test.js +0 -229
- package/dist/__tests__/format.test.js.map +0 -1
- package/dist/__tests__/gemini-transcript.test.d.ts +0 -12
- package/dist/__tests__/gemini-transcript.test.d.ts.map +0 -1
- package/dist/__tests__/gemini-transcript.test.js +0 -322
- package/dist/__tests__/gemini-transcript.test.js.map +0 -1
- package/dist/__tests__/get-context-repo-resolution.test.d.ts +0 -11
- package/dist/__tests__/get-context-repo-resolution.test.d.ts.map +0 -1
- package/dist/__tests__/get-context-repo-resolution.test.js +0 -310
- package/dist/__tests__/get-context-repo-resolution.test.js.map +0 -1
- package/dist/__tests__/integration.test.d.ts +0 -11
- package/dist/__tests__/integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration.test.js +0 -323
- package/dist/__tests__/integration.test.js.map +0 -1
- package/dist/__tests__/no-git-repo.test.d.ts +0 -9
- package/dist/__tests__/no-git-repo.test.d.ts.map +0 -1
- package/dist/__tests__/no-git-repo.test.js +0 -125
- package/dist/__tests__/no-git-repo.test.js.map +0 -1
- package/dist/__tests__/preprocessor.test.d.ts +0 -12
- package/dist/__tests__/preprocessor.test.d.ts.map +0 -1
- package/dist/__tests__/preprocessor.test.js +0 -690
- package/dist/__tests__/preprocessor.test.js.map +0 -1
- package/dist/__tests__/repo-detection-guard.test.d.ts +0 -9
- package/dist/__tests__/repo-detection-guard.test.d.ts.map +0 -1
- package/dist/__tests__/repo-detection-guard.test.js +0 -153
- package/dist/__tests__/repo-detection-guard.test.js.map +0 -1
- package/dist/__tests__/repo-enrollment.test.d.ts +0 -9
- package/dist/__tests__/repo-enrollment.test.d.ts.map +0 -1
- package/dist/__tests__/repo-enrollment.test.js +0 -107
- package/dist/__tests__/repo-enrollment.test.js.map +0 -1
- package/dist/__tests__/repo-override-save-log.test.d.ts +0 -11
- package/dist/__tests__/repo-override-save-log.test.d.ts.map +0 -1
- package/dist/__tests__/repo-override-save-log.test.js +0 -352
- package/dist/__tests__/repo-override-save-log.test.js.map +0 -1
- package/dist/api.d.ts +0 -348
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -683
- package/dist/api.js.map +0 -1
- package/dist/cli.d.ts +0 -32
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -285
- package/dist/cli.js.map +0 -1
- package/dist/codex-transcript.d.ts +0 -31
- package/dist/codex-transcript.d.ts.map +0 -1
- package/dist/codex-transcript.js +0 -304
- package/dist/codex-transcript.js.map +0 -1
- package/dist/crypto.d.ts +0 -36
- package/dist/crypto.d.ts.map +0 -1
- package/dist/crypto.js +0 -104
- package/dist/crypto.js.map +0 -1
- package/dist/detect.d.ts +0 -40
- package/dist/detect.d.ts.map +0 -1
- package/dist/detect.js +0 -165
- package/dist/detect.js.map +0 -1
- package/dist/format.d.ts +0 -53
- package/dist/format.d.ts.map +0 -1
- package/dist/format.js +0 -177
- package/dist/format.js.map +0 -1
- package/dist/gemini-transcript.d.ts +0 -29
- package/dist/gemini-transcript.d.ts.map +0 -1
- package/dist/gemini-transcript.js +0 -303
- package/dist/gemini-transcript.js.map +0 -1
- package/dist/index.d.ts +0 -12
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -291
- package/dist/index.js.map +0 -1
- package/dist/preprocessor.d.ts +0 -39
- package/dist/preprocessor.d.ts.map +0 -1
- package/dist/preprocessor.js +0 -514
- package/dist/preprocessor.js.map +0 -1
- package/dist/tools.d.ts +0 -106
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js +0 -784
- package/dist/tools.js.map +0 -1
- package/dist/transcript-finder.d.ts +0 -27
- package/dist/transcript-finder.d.ts.map +0 -1
- package/dist/transcript-finder.js +0 -143
- package/dist/transcript-finder.js.map +0 -1
package/package.json
CHANGED
|
@@ -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 +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"}
|