vibe-coding-mcp 2.5.0 → 2.7.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.
Files changed (40) hide show
  1. package/README.md +20 -2
  2. package/dist/__tests__/exportSession.test.d.ts +2 -0
  3. package/dist/__tests__/exportSession.test.d.ts.map +1 -0
  4. package/dist/__tests__/exportSession.test.js +180 -0
  5. package/dist/__tests__/exportSession.test.js.map +1 -0
  6. package/dist/__tests__/projectProfile.test.d.ts +2 -0
  7. package/dist/__tests__/projectProfile.test.d.ts.map +1 -0
  8. package/dist/__tests__/projectProfile.test.js +216 -0
  9. package/dist/__tests__/projectProfile.test.js.map +1 -0
  10. package/dist/__tests__/sessionHistory.test.d.ts +2 -0
  11. package/dist/__tests__/sessionHistory.test.d.ts.map +1 -0
  12. package/dist/__tests__/sessionHistory.test.js +229 -0
  13. package/dist/__tests__/sessionHistory.test.js.map +1 -0
  14. package/dist/core/profileStorage.d.ts +117 -0
  15. package/dist/core/profileStorage.d.ts.map +1 -0
  16. package/dist/core/profileStorage.js +251 -0
  17. package/dist/core/profileStorage.js.map +1 -0
  18. package/dist/core/schemas.d.ts +365 -0
  19. package/dist/core/schemas.d.ts.map +1 -1
  20. package/dist/core/schemas.js +90 -0
  21. package/dist/core/schemas.js.map +1 -1
  22. package/dist/core/sessionStorage.d.ts +95 -0
  23. package/dist/core/sessionStorage.d.ts.map +1 -0
  24. package/dist/core/sessionStorage.js +224 -0
  25. package/dist/core/sessionStorage.js.map +1 -0
  26. package/dist/stdio.js +20 -2
  27. package/dist/stdio.js.map +1 -1
  28. package/dist/tools/exportSession.d.ts +79 -0
  29. package/dist/tools/exportSession.d.ts.map +1 -0
  30. package/dist/tools/exportSession.js +434 -0
  31. package/dist/tools/exportSession.js.map +1 -0
  32. package/dist/tools/projectProfile.d.ts +230 -0
  33. package/dist/tools/projectProfile.d.ts.map +1 -0
  34. package/dist/tools/projectProfile.js +367 -0
  35. package/dist/tools/projectProfile.js.map +1 -0
  36. package/dist/tools/sessionHistory.d.ts +126 -0
  37. package/dist/tools/sessionHistory.d.ts.map +1 -0
  38. package/dist/tools/sessionHistory.js +245 -0
  39. package/dist/tools/sessionHistory.js.map +1 -0
  40. package/package.json +1 -1
@@ -0,0 +1,229 @@
1
+ import { sessionHistoryTool } from '../tools/sessionHistory.js';
2
+ import * as sessionStorage from '../core/sessionStorage.js';
3
+ import { promises as fs } from 'fs';
4
+ import * as path from 'path';
5
+ import * as os from 'os';
6
+ // Create a temp directory for tests
7
+ let testDir;
8
+ beforeAll(async () => {
9
+ testDir = path.join(os.tmpdir(), `vibe-coding-test-${Date.now()}`);
10
+ await sessionStorage.initializeStorage(testDir);
11
+ });
12
+ afterAll(async () => {
13
+ // Clean up test directory
14
+ try {
15
+ const files = await fs.readdir(testDir);
16
+ for (const file of files) {
17
+ await fs.unlink(path.join(testDir, file));
18
+ }
19
+ await fs.rmdir(testDir);
20
+ }
21
+ catch {
22
+ // Ignore cleanup errors
23
+ }
24
+ });
25
+ describe('sessionHistoryTool', () => {
26
+ let savedSessionId;
27
+ describe('save action', () => {
28
+ it('should save a new session', async () => {
29
+ const result = await sessionHistoryTool({
30
+ action: 'save',
31
+ title: 'Test Session',
32
+ summary: 'This is a test session',
33
+ tags: ['test', 'example'],
34
+ codeContexts: [
35
+ {
36
+ sessionId: 'ctx-1',
37
+ timestamp: new Date().toISOString(),
38
+ codeBlocks: [{ language: 'typescript', code: 'const x = 1;' }],
39
+ conversationSummary: 'Test context'
40
+ }
41
+ ],
42
+ designDecisions: [
43
+ {
44
+ id: 'dd-1',
45
+ title: 'Use TypeScript',
46
+ description: 'Chose TypeScript for type safety',
47
+ rationale: 'Better maintainability',
48
+ category: 'implementation',
49
+ timestamp: new Date().toISOString()
50
+ }
51
+ ]
52
+ });
53
+ expect(result.success).toBe(true);
54
+ expect(result.action).toBe('save');
55
+ expect(result.session).toBeDefined();
56
+ expect(result.session?.title).toBe('Test Session');
57
+ expect(result.session?.id).toMatch(/^session_/);
58
+ savedSessionId = result.session.id;
59
+ });
60
+ it('should fail without required fields', async () => {
61
+ const result = await sessionHistoryTool({
62
+ action: 'save',
63
+ title: 'Only Title'
64
+ // missing summary
65
+ });
66
+ expect(result.success).toBe(false);
67
+ expect(result.error).toContain('summary');
68
+ });
69
+ });
70
+ describe('get action', () => {
71
+ it('should retrieve a session by ID', async () => {
72
+ const result = await sessionHistoryTool({
73
+ action: 'get',
74
+ sessionId: savedSessionId
75
+ });
76
+ expect(result.success).toBe(true);
77
+ expect(result.session?.title).toBe('Test Session');
78
+ expect(result.session?.tags).toContain('test');
79
+ });
80
+ it('should fail for non-existent session', async () => {
81
+ const result = await sessionHistoryTool({
82
+ action: 'get',
83
+ sessionId: 'non-existent-id'
84
+ });
85
+ expect(result.success).toBe(false);
86
+ expect(result.error).toContain('not found');
87
+ });
88
+ it('should fail without sessionId', async () => {
89
+ const result = await sessionHistoryTool({
90
+ action: 'get'
91
+ });
92
+ expect(result.success).toBe(false);
93
+ expect(result.error).toContain('sessionId');
94
+ });
95
+ });
96
+ describe('update action', () => {
97
+ it('should update an existing session', async () => {
98
+ const result = await sessionHistoryTool({
99
+ action: 'update',
100
+ sessionId: savedSessionId,
101
+ title: 'Updated Test Session',
102
+ tags: ['test', 'updated']
103
+ });
104
+ expect(result.success).toBe(true);
105
+ expect(result.session?.title).toBe('Updated Test Session');
106
+ expect(result.session?.tags).toContain('updated');
107
+ });
108
+ it('should fail for non-existent session', async () => {
109
+ const result = await sessionHistoryTool({
110
+ action: 'update',
111
+ sessionId: 'non-existent-id',
112
+ title: 'New Title'
113
+ });
114
+ expect(result.success).toBe(false);
115
+ });
116
+ });
117
+ describe('list action', () => {
118
+ beforeAll(async () => {
119
+ // Add more sessions for list testing
120
+ await sessionHistoryTool({
121
+ action: 'save',
122
+ title: 'Session 2',
123
+ summary: 'Second session',
124
+ tags: ['second']
125
+ });
126
+ await sessionHistoryTool({
127
+ action: 'save',
128
+ title: 'Session 3',
129
+ summary: 'Third session with special',
130
+ tags: ['third', 'special']
131
+ });
132
+ });
133
+ it('should list all sessions', async () => {
134
+ const result = await sessionHistoryTool({
135
+ action: 'list'
136
+ });
137
+ expect(result.success).toBe(true);
138
+ expect(result.sessions).toBeDefined();
139
+ expect(result.total).toBeGreaterThanOrEqual(3);
140
+ });
141
+ it('should filter by tags', async () => {
142
+ const result = await sessionHistoryTool({
143
+ action: 'list',
144
+ filterTags: ['special']
145
+ });
146
+ expect(result.success).toBe(true);
147
+ expect(result.sessions?.length).toBe(1);
148
+ expect(result.sessions?.[0].tags).toContain('special');
149
+ });
150
+ it('should support pagination', async () => {
151
+ const result = await sessionHistoryTool({
152
+ action: 'list',
153
+ limit: 2,
154
+ offset: 0
155
+ });
156
+ expect(result.success).toBe(true);
157
+ expect(result.sessions?.length).toBeLessThanOrEqual(2);
158
+ });
159
+ });
160
+ describe('search action', () => {
161
+ it('should search sessions by keyword in title', async () => {
162
+ const result = await sessionHistoryTool({
163
+ action: 'search',
164
+ keyword: 'Updated',
165
+ searchIn: ['title']
166
+ });
167
+ expect(result.success).toBe(true);
168
+ expect(result.sessions?.length).toBeGreaterThanOrEqual(1);
169
+ });
170
+ it('should search sessions by keyword in summary', async () => {
171
+ const result = await sessionHistoryTool({
172
+ action: 'search',
173
+ keyword: 'special',
174
+ searchIn: ['summary']
175
+ });
176
+ expect(result.success).toBe(true);
177
+ expect(result.sessions?.length).toBeGreaterThanOrEqual(1);
178
+ });
179
+ it('should fail without keyword', async () => {
180
+ const result = await sessionHistoryTool({
181
+ action: 'search'
182
+ });
183
+ expect(result.success).toBe(false);
184
+ expect(result.error).toContain('keyword');
185
+ });
186
+ });
187
+ describe('stats action', () => {
188
+ it('should return storage statistics', async () => {
189
+ const result = await sessionHistoryTool({
190
+ action: 'stats'
191
+ });
192
+ expect(result.success).toBe(true);
193
+ expect(result.stats).toBeDefined();
194
+ expect(result.stats?.totalSessions).toBeGreaterThanOrEqual(3);
195
+ expect(result.stats?.storageDir).toBe(testDir);
196
+ });
197
+ });
198
+ describe('delete action', () => {
199
+ it('should delete a session', async () => {
200
+ // First save a session to delete
201
+ const saveResult = await sessionHistoryTool({
202
+ action: 'save',
203
+ title: 'To Delete',
204
+ summary: 'This will be deleted'
205
+ });
206
+ const deleteResult = await sessionHistoryTool({
207
+ action: 'delete',
208
+ sessionId: saveResult.session.id
209
+ });
210
+ expect(deleteResult.success).toBe(true);
211
+ // Verify it's deleted
212
+ const getResult = await sessionHistoryTool({
213
+ action: 'get',
214
+ sessionId: saveResult.session.id
215
+ });
216
+ expect(getResult.success).toBe(false);
217
+ expect(getResult.error).toContain('not found');
218
+ });
219
+ it('should fail for non-existent session', async () => {
220
+ const result = await sessionHistoryTool({
221
+ action: 'delete',
222
+ sessionId: 'non-existent-id'
223
+ });
224
+ expect(result.success).toBe(false);
225
+ expect(result.error).toContain('not found');
226
+ });
227
+ });
228
+ });
229
+ //# sourceMappingURL=sessionHistory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionHistory.test.js","sourceRoot":"","sources":["../../src/__tests__/sessionHistory.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * 프로젝트 프로파일 스토리지 모듈
3
+ * 프로젝트별 설정을 저장하고 관리
4
+ * v2.7: Project Profile
5
+ */
6
+ export interface PublishingConfig {
7
+ defaultPlatform?: 'notion' | 'github-wiki' | 'obsidian' | 'confluence' | 'slack' | 'discord';
8
+ platformSettings?: {
9
+ notion?: {
10
+ databaseId?: string;
11
+ };
12
+ obsidian?: {
13
+ vaultPath?: string;
14
+ };
15
+ confluence?: {
16
+ spaceKey?: string;
17
+ };
18
+ };
19
+ autoPublish?: boolean;
20
+ }
21
+ export interface CodeAnalysisConfig {
22
+ defaultLanguage?: 'typescript' | 'javascript' | 'python' | 'go';
23
+ defaultDiagramTypes?: ('class' | 'flowchart' | 'dependency' | 'all')[];
24
+ excludePatterns?: string[];
25
+ useAI?: boolean;
26
+ }
27
+ export interface DocumentationConfig {
28
+ defaultDocType?: 'README' | 'DESIGN' | 'TUTORIAL' | 'CHANGELOG' | 'API' | 'ARCHITECTURE';
29
+ language?: 'en' | 'ko';
30
+ author?: string;
31
+ license?: string;
32
+ includeTableOfContents?: boolean;
33
+ }
34
+ export interface ProjectProfile {
35
+ id: string;
36
+ name: string;
37
+ description?: string;
38
+ createdAt: string;
39
+ updatedAt: string;
40
+ projectPath?: string;
41
+ repository?: string;
42
+ version?: string;
43
+ publishing?: PublishingConfig;
44
+ codeAnalysis?: CodeAnalysisConfig;
45
+ documentation?: DocumentationConfig;
46
+ defaultTags?: string[];
47
+ tagCategories?: {
48
+ name: string;
49
+ tags: string[];
50
+ }[];
51
+ team?: {
52
+ name: string;
53
+ members?: {
54
+ name: string;
55
+ role?: string;
56
+ email?: string;
57
+ }[];
58
+ };
59
+ metadata?: Record<string, unknown>;
60
+ }
61
+ export interface StoredProfile {
62
+ id: string;
63
+ name: string;
64
+ description?: string;
65
+ createdAt: string;
66
+ updatedAt: string;
67
+ isActive: boolean;
68
+ }
69
+ /**
70
+ * 스토리지 초기화
71
+ */
72
+ export declare function initializeProfileStorage(customDir?: string): Promise<void>;
73
+ /**
74
+ * 프로파일 생성
75
+ */
76
+ export declare function createProfile(data: Omit<ProjectProfile, 'id' | 'createdAt' | 'updatedAt'>): Promise<ProjectProfile>;
77
+ /**
78
+ * 프로파일 조회
79
+ */
80
+ export declare function getProfile(profileId: string): Promise<ProjectProfile | null>;
81
+ /**
82
+ * 프로파일 업데이트
83
+ */
84
+ export declare function updateProfile(profileId: string, updates: Partial<Omit<ProjectProfile, 'id' | 'createdAt'>>): Promise<ProjectProfile>;
85
+ /**
86
+ * 프로파일 삭제
87
+ */
88
+ export declare function deleteProfile(profileId: string): Promise<boolean>;
89
+ /**
90
+ * 모든 프로파일 목록
91
+ */
92
+ export declare function listProfiles(options?: {
93
+ limit?: number;
94
+ offset?: number;
95
+ sortBy?: 'createdAt' | 'updatedAt' | 'name';
96
+ sortOrder?: 'asc' | 'desc';
97
+ }): Promise<{
98
+ profiles: StoredProfile[];
99
+ total: number;
100
+ }>;
101
+ /**
102
+ * 활성 프로파일 설정
103
+ */
104
+ export declare function setActiveProfile(profileId: string | null): Promise<void>;
105
+ /**
106
+ * 활성 프로파일 조회
107
+ */
108
+ export declare function getActiveProfile(): Promise<ProjectProfile | null>;
109
+ /**
110
+ * 이름으로 프로파일 검색
111
+ */
112
+ export declare function findProfileByName(name: string): Promise<ProjectProfile | null>;
113
+ /**
114
+ * 프로파일 복제
115
+ */
116
+ export declare function cloneProfile(profileId: string, newName: string): Promise<ProjectProfile>;
117
+ //# sourceMappingURL=profileStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileStorage.d.ts","sourceRoot":"","sources":["../../src/core/profileStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,251 @@
1
+ /**
2
+ * 프로젝트 프로파일 스토리지 모듈
3
+ * 프로젝트별 설정을 저장하고 관리
4
+ * v2.7: Project Profile
5
+ */
6
+ import { promises as fs } from 'fs';
7
+ import * as path from 'path';
8
+ import { logger } from './logger.js';
9
+ const profileLogger = logger.child({ module: 'profileStorage' });
10
+ // 기본 저장 경로
11
+ const DEFAULT_STORAGE_DIR = process.env.VIBE_CODING_STORAGE_DIR ||
12
+ path.join(process.env.HOME || process.env.USERPROFILE || '.', '.vibe-coding-mcp', 'profiles');
13
+ let storageDir = DEFAULT_STORAGE_DIR;
14
+ let activeProfileId = null;
15
+ /**
16
+ * 스토리지 초기화
17
+ */
18
+ export async function initializeProfileStorage(customDir) {
19
+ if (customDir) {
20
+ storageDir = customDir;
21
+ }
22
+ try {
23
+ await fs.mkdir(storageDir, { recursive: true });
24
+ // 활성 프로파일 ID 로드
25
+ const activeFile = path.join(storageDir, '.active');
26
+ try {
27
+ activeProfileId = (await fs.readFile(activeFile, 'utf-8')).trim();
28
+ }
29
+ catch {
30
+ activeProfileId = null;
31
+ }
32
+ profileLogger.info('Profile storage initialized', { path: storageDir });
33
+ }
34
+ catch (error) {
35
+ profileLogger.error('Failed to initialize profile storage', error);
36
+ throw error;
37
+ }
38
+ }
39
+ /**
40
+ * 프로파일 ID 생성
41
+ */
42
+ function generateProfileId() {
43
+ const timestamp = Date.now().toString(36);
44
+ const random = Math.random().toString(36).substring(2, 8);
45
+ return `profile_${timestamp}_${random}`;
46
+ }
47
+ /**
48
+ * 프로파일 파일 경로
49
+ */
50
+ function getProfilePath(profileId) {
51
+ return path.join(storageDir, `${profileId}.json`);
52
+ }
53
+ /**
54
+ * 프로파일 생성
55
+ */
56
+ export async function createProfile(data) {
57
+ await initializeProfileStorage();
58
+ const profileId = generateProfileId();
59
+ const now = new Date().toISOString();
60
+ const profile = {
61
+ id: profileId,
62
+ createdAt: now,
63
+ updatedAt: now,
64
+ ...data
65
+ };
66
+ const filePath = getProfilePath(profileId);
67
+ try {
68
+ await fs.writeFile(filePath, JSON.stringify(profile, null, 2), 'utf-8');
69
+ profileLogger.info('Profile created', { profileId, name: profile.name });
70
+ return profile;
71
+ }
72
+ catch (error) {
73
+ profileLogger.error('Failed to create profile', error);
74
+ throw error;
75
+ }
76
+ }
77
+ /**
78
+ * 프로파일 조회
79
+ */
80
+ export async function getProfile(profileId) {
81
+ const filePath = getProfilePath(profileId);
82
+ try {
83
+ const content = await fs.readFile(filePath, 'utf-8');
84
+ return JSON.parse(content);
85
+ }
86
+ catch (error) {
87
+ if (error.code === 'ENOENT') {
88
+ return null;
89
+ }
90
+ profileLogger.error('Failed to read profile', error);
91
+ throw error;
92
+ }
93
+ }
94
+ /**
95
+ * 프로파일 업데이트
96
+ */
97
+ export async function updateProfile(profileId, updates) {
98
+ const existing = await getProfile(profileId);
99
+ if (!existing) {
100
+ throw new Error(`Profile not found: ${profileId}`);
101
+ }
102
+ const updated = {
103
+ ...existing,
104
+ ...updates,
105
+ updatedAt: new Date().toISOString()
106
+ };
107
+ const filePath = getProfilePath(profileId);
108
+ try {
109
+ await fs.writeFile(filePath, JSON.stringify(updated, null, 2), 'utf-8');
110
+ profileLogger.info('Profile updated', { profileId });
111
+ return updated;
112
+ }
113
+ catch (error) {
114
+ profileLogger.error('Failed to update profile', error);
115
+ throw error;
116
+ }
117
+ }
118
+ /**
119
+ * 프로파일 삭제
120
+ */
121
+ export async function deleteProfile(profileId) {
122
+ const filePath = getProfilePath(profileId);
123
+ try {
124
+ await fs.unlink(filePath);
125
+ // 활성 프로파일이면 해제
126
+ if (activeProfileId === profileId) {
127
+ await setActiveProfile(null);
128
+ }
129
+ profileLogger.info('Profile deleted', { profileId });
130
+ return true;
131
+ }
132
+ catch (error) {
133
+ if (error.code === 'ENOENT') {
134
+ return false;
135
+ }
136
+ profileLogger.error('Failed to delete profile', error);
137
+ throw error;
138
+ }
139
+ }
140
+ /**
141
+ * 모든 프로파일 목록
142
+ */
143
+ export async function listProfiles(options) {
144
+ await initializeProfileStorage();
145
+ const { limit = 50, offset = 0, sortBy = 'updatedAt', sortOrder = 'desc' } = options || {};
146
+ try {
147
+ const files = await fs.readdir(storageDir);
148
+ const profileFiles = files.filter(f => f.endsWith('.json') && !f.startsWith('.'));
149
+ const profiles = [];
150
+ for (const file of profileFiles) {
151
+ try {
152
+ const content = await fs.readFile(path.join(storageDir, file), 'utf-8');
153
+ const data = JSON.parse(content);
154
+ profiles.push({
155
+ id: data.id,
156
+ name: data.name,
157
+ description: data.description,
158
+ createdAt: data.createdAt,
159
+ updatedAt: data.updatedAt,
160
+ isActive: data.id === activeProfileId
161
+ });
162
+ }
163
+ catch {
164
+ continue;
165
+ }
166
+ }
167
+ // 정렬
168
+ profiles.sort((a, b) => {
169
+ const aVal = a[sortBy] || '';
170
+ const bVal = b[sortBy] || '';
171
+ const cmp = aVal < bVal ? -1 : aVal > bVal ? 1 : 0;
172
+ return sortOrder === 'desc' ? -cmp : cmp;
173
+ });
174
+ // 페이지네이션
175
+ const total = profiles.length;
176
+ const paginated = profiles.slice(offset, offset + limit);
177
+ return { profiles: paginated, total };
178
+ }
179
+ catch (error) {
180
+ profileLogger.error('Failed to list profiles', error);
181
+ throw error;
182
+ }
183
+ }
184
+ /**
185
+ * 활성 프로파일 설정
186
+ */
187
+ export async function setActiveProfile(profileId) {
188
+ await initializeProfileStorage();
189
+ const activeFile = path.join(storageDir, '.active');
190
+ try {
191
+ if (profileId) {
192
+ // 프로파일 존재 확인
193
+ const profile = await getProfile(profileId);
194
+ if (!profile) {
195
+ throw new Error(`Profile not found: ${profileId}`);
196
+ }
197
+ await fs.writeFile(activeFile, profileId, 'utf-8');
198
+ activeProfileId = profileId;
199
+ profileLogger.info('Active profile set', { profileId });
200
+ }
201
+ else {
202
+ try {
203
+ await fs.unlink(activeFile);
204
+ }
205
+ catch { /* ignore */ }
206
+ activeProfileId = null;
207
+ profileLogger.info('Active profile cleared');
208
+ }
209
+ }
210
+ catch (error) {
211
+ profileLogger.error('Failed to set active profile', error);
212
+ throw error;
213
+ }
214
+ }
215
+ /**
216
+ * 활성 프로파일 조회
217
+ */
218
+ export async function getActiveProfile() {
219
+ await initializeProfileStorage();
220
+ if (!activeProfileId) {
221
+ return null;
222
+ }
223
+ return getProfile(activeProfileId);
224
+ }
225
+ /**
226
+ * 이름으로 프로파일 검색
227
+ */
228
+ export async function findProfileByName(name) {
229
+ const { profiles } = await listProfiles({ limit: 1000 });
230
+ const found = profiles.find(p => p.name.toLowerCase() === name.toLowerCase());
231
+ if (found) {
232
+ return getProfile(found.id);
233
+ }
234
+ return null;
235
+ }
236
+ /**
237
+ * 프로파일 복제
238
+ */
239
+ export async function cloneProfile(profileId, newName) {
240
+ const source = await getProfile(profileId);
241
+ if (!source) {
242
+ throw new Error(`Profile not found: ${profileId}`);
243
+ }
244
+ const { id, createdAt, updatedAt, ...profileData } = source;
245
+ return createProfile({
246
+ ...profileData,
247
+ name: newName,
248
+ description: `Cloned from ${source.name}`
249
+ });
250
+ }
251
+ //# sourceMappingURL=profileStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileStorage.js","sourceRoot":"","sources":["../../src/core/profileStorage.ts"],"names":[],"mappings":"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"}