@synth-coder/memhub 0.1.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 (104) hide show
  1. package/.eslintrc.cjs +46 -0
  2. package/.github/workflows/ci.yml +74 -0
  3. package/.iflow/commands/opsx-apply.md +152 -0
  4. package/.iflow/commands/opsx-archive.md +157 -0
  5. package/.iflow/commands/opsx-explore.md +173 -0
  6. package/.iflow/commands/opsx-propose.md +106 -0
  7. package/.iflow/skills/openspec-apply-change/SKILL.md +156 -0
  8. package/.iflow/skills/openspec-archive-change/SKILL.md +114 -0
  9. package/.iflow/skills/openspec-explore/SKILL.md +288 -0
  10. package/.iflow/skills/openspec-propose/SKILL.md +110 -0
  11. package/.prettierrc +11 -0
  12. package/README.md +171 -0
  13. package/README.zh-CN.md +169 -0
  14. package/dist/src/contracts/index.d.ts +7 -0
  15. package/dist/src/contracts/index.d.ts.map +1 -0
  16. package/dist/src/contracts/index.js +10 -0
  17. package/dist/src/contracts/index.js.map +1 -0
  18. package/dist/src/contracts/mcp.d.ts +194 -0
  19. package/dist/src/contracts/mcp.d.ts.map +1 -0
  20. package/dist/src/contracts/mcp.js +112 -0
  21. package/dist/src/contracts/mcp.js.map +1 -0
  22. package/dist/src/contracts/schemas.d.ts +1153 -0
  23. package/dist/src/contracts/schemas.d.ts.map +1 -0
  24. package/dist/src/contracts/schemas.js +246 -0
  25. package/dist/src/contracts/schemas.js.map +1 -0
  26. package/dist/src/contracts/types.d.ts +328 -0
  27. package/dist/src/contracts/types.d.ts.map +1 -0
  28. package/dist/src/contracts/types.js +30 -0
  29. package/dist/src/contracts/types.js.map +1 -0
  30. package/dist/src/index.d.ts +8 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js +8 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/server/index.d.ts +5 -0
  35. package/dist/src/server/index.d.ts.map +1 -0
  36. package/dist/src/server/index.js +5 -0
  37. package/dist/src/server/index.js.map +1 -0
  38. package/dist/src/server/mcp-server.d.ts +80 -0
  39. package/dist/src/server/mcp-server.d.ts.map +1 -0
  40. package/dist/src/server/mcp-server.js +263 -0
  41. package/dist/src/server/mcp-server.js.map +1 -0
  42. package/dist/src/services/index.d.ts +5 -0
  43. package/dist/src/services/index.d.ts.map +1 -0
  44. package/dist/src/services/index.js +5 -0
  45. package/dist/src/services/index.js.map +1 -0
  46. package/dist/src/services/memory-service.d.ts +105 -0
  47. package/dist/src/services/memory-service.d.ts.map +1 -0
  48. package/dist/src/services/memory-service.js +447 -0
  49. package/dist/src/services/memory-service.js.map +1 -0
  50. package/dist/src/storage/frontmatter-parser.d.ts +69 -0
  51. package/dist/src/storage/frontmatter-parser.d.ts.map +1 -0
  52. package/dist/src/storage/frontmatter-parser.js +207 -0
  53. package/dist/src/storage/frontmatter-parser.js.map +1 -0
  54. package/dist/src/storage/index.d.ts +6 -0
  55. package/dist/src/storage/index.d.ts.map +1 -0
  56. package/dist/src/storage/index.js +6 -0
  57. package/dist/src/storage/index.js.map +1 -0
  58. package/dist/src/storage/markdown-storage.d.ts +76 -0
  59. package/dist/src/storage/markdown-storage.d.ts.map +1 -0
  60. package/dist/src/storage/markdown-storage.js +193 -0
  61. package/dist/src/storage/markdown-storage.js.map +1 -0
  62. package/dist/src/utils/index.d.ts +5 -0
  63. package/dist/src/utils/index.d.ts.map +1 -0
  64. package/dist/src/utils/index.js +5 -0
  65. package/dist/src/utils/index.js.map +1 -0
  66. package/dist/src/utils/slugify.d.ts +24 -0
  67. package/dist/src/utils/slugify.d.ts.map +1 -0
  68. package/dist/src/utils/slugify.js +56 -0
  69. package/dist/src/utils/slugify.js.map +1 -0
  70. package/docs/architecture.md +349 -0
  71. package/docs/contracts.md +119 -0
  72. package/docs/prompt-template.md +79 -0
  73. package/docs/proposal-close-gates.md +58 -0
  74. package/docs/tool-calling-policy.md +107 -0
  75. package/package.json +53 -0
  76. package/src/contracts/index.ts +12 -0
  77. package/src/contracts/mcp.ts +303 -0
  78. package/src/contracts/schemas.ts +311 -0
  79. package/src/contracts/types.ts +414 -0
  80. package/src/index.ts +8 -0
  81. package/src/server/index.ts +5 -0
  82. package/src/server/mcp-server.ts +352 -0
  83. package/src/services/index.ts +5 -0
  84. package/src/services/memory-service.ts +548 -0
  85. package/src/storage/frontmatter-parser.ts +243 -0
  86. package/src/storage/index.ts +6 -0
  87. package/src/storage/markdown-storage.ts +236 -0
  88. package/src/utils/index.ts +5 -0
  89. package/src/utils/slugify.ts +63 -0
  90. package/test/contracts/schemas.test.ts +313 -0
  91. package/test/contracts/types.test.ts +21 -0
  92. package/test/frontmatter-parser-more.test.ts +94 -0
  93. package/test/server/mcp-server-internals.test.ts +257 -0
  94. package/test/server/mcp-server.test.ts +97 -0
  95. package/test/services/memory-service-edge.test.ts +248 -0
  96. package/test/services/memory-service.test.ts +279 -0
  97. package/test/storage/frontmatter-parser.test.ts +223 -0
  98. package/test/storage/markdown-storage.test.ts +217 -0
  99. package/test/storage/storage-edge.test.ts +238 -0
  100. package/test/utils/slugify-edge.test.ts +94 -0
  101. package/test/utils/slugify.test.ts +68 -0
  102. package/tsconfig.json +26 -0
  103. package/tsconfig.test.json +8 -0
  104. package/vitest.config.ts +27 -0
@@ -0,0 +1,447 @@
1
+ /**
2
+ * Memory Service - Business logic for memory operations
3
+ */
4
+ import { randomUUID } from 'crypto';
5
+ import { ErrorCode } from '../contracts/types.js';
6
+ import { MarkdownStorage, StorageError } from '../storage/markdown-storage.js';
7
+ /**
8
+ * Custom error for service operations
9
+ */
10
+ export class ServiceError extends Error {
11
+ code;
12
+ data;
13
+ constructor(message, code, data) {
14
+ super(message);
15
+ this.code = code;
16
+ this.data = data;
17
+ this.name = 'ServiceError';
18
+ }
19
+ }
20
+ /**
21
+ * Memory service implementation
22
+ */
23
+ export class MemoryService {
24
+ storage;
25
+ constructor(config) {
26
+ this.storage = new MarkdownStorage({ storagePath: config.storagePath });
27
+ }
28
+ /**
29
+ * Creates a new memory entry
30
+ *
31
+ * @param input - Create memory input
32
+ * @returns Create result with ID, file path, and memory object
33
+ * @throws ServiceError if creation fails
34
+ */
35
+ async create(input) {
36
+ const now = new Date().toISOString();
37
+ const id = randomUUID();
38
+ const memory = {
39
+ id,
40
+ createdAt: now,
41
+ updatedAt: now,
42
+ tags: input.tags ?? [],
43
+ category: input.category ?? 'general',
44
+ importance: input.importance ?? 3,
45
+ title: input.title,
46
+ content: input.content,
47
+ };
48
+ try {
49
+ const filePath = await this.storage.write(memory);
50
+ return {
51
+ id,
52
+ filePath,
53
+ memory,
54
+ };
55
+ }
56
+ catch (error) {
57
+ throw new ServiceError(`Failed to create memory: ${error instanceof Error ? error.message : 'Unknown error'}`, ErrorCode.STORAGE_ERROR);
58
+ }
59
+ }
60
+ /**
61
+ * Reads a memory by ID
62
+ *
63
+ * @param input - Read memory input
64
+ * @returns Memory object
65
+ * @throws ServiceError if memory not found
66
+ */
67
+ async read(input) {
68
+ try {
69
+ const memory = await this.storage.read(input.id);
70
+ return { memory };
71
+ }
72
+ catch (error) {
73
+ if (error instanceof StorageError && error.message.includes('not found')) {
74
+ throw new ServiceError(`Memory not found: ${input.id}`, ErrorCode.NOT_FOUND);
75
+ }
76
+ throw new ServiceError(`Failed to read memory: ${error instanceof Error ? error.message : 'Unknown error'}`, ErrorCode.STORAGE_ERROR);
77
+ }
78
+ }
79
+ /**
80
+ * Updates an existing memory
81
+ *
82
+ * @param input - Update memory input
83
+ * @returns Updated memory object
84
+ * @throws ServiceError if memory not found
85
+ */
86
+ async update(input) {
87
+ // First read the existing memory
88
+ let existing;
89
+ try {
90
+ existing = await this.storage.read(input.id);
91
+ }
92
+ catch (error) {
93
+ if (error instanceof StorageError && error.message.includes('not found')) {
94
+ throw new ServiceError(`Memory not found: ${input.id}`, ErrorCode.NOT_FOUND);
95
+ }
96
+ throw new ServiceError(`Failed to read memory for update: ${error instanceof Error ? error.message : 'Unknown error'}`, ErrorCode.STORAGE_ERROR);
97
+ }
98
+ // Apply updates
99
+ const updated = {
100
+ ...existing,
101
+ updatedAt: new Date().toISOString(),
102
+ ...(input.title !== undefined && { title: input.title }),
103
+ ...(input.content !== undefined && { content: input.content }),
104
+ ...(input.tags !== undefined && { tags: input.tags }),
105
+ ...(input.category !== undefined && { category: input.category }),
106
+ ...(input.importance !== undefined && { importance: input.importance }),
107
+ };
108
+ try {
109
+ await this.storage.write(updated);
110
+ return { memory: updated };
111
+ }
112
+ catch (error) {
113
+ throw new ServiceError(`Failed to update memory: ${error instanceof Error ? error.message : 'Unknown error'}`, ErrorCode.STORAGE_ERROR);
114
+ }
115
+ }
116
+ /**
117
+ * Deletes a memory by ID
118
+ *
119
+ * @param input - Delete memory input
120
+ * @returns Delete result
121
+ * @throws ServiceError if memory not found
122
+ */
123
+ async delete(input) {
124
+ try {
125
+ const filePath = await this.storage.delete(input.id);
126
+ return {
127
+ success: true,
128
+ filePath,
129
+ };
130
+ }
131
+ catch (error) {
132
+ if (error instanceof StorageError && error.message.includes('not found')) {
133
+ throw new ServiceError(`Memory not found: ${input.id}`, ErrorCode.NOT_FOUND);
134
+ }
135
+ throw new ServiceError(`Failed to delete memory: ${error instanceof Error ? error.message : 'Unknown error'}`, ErrorCode.STORAGE_ERROR);
136
+ }
137
+ }
138
+ /**
139
+ * Lists memories with filtering and pagination
140
+ *
141
+ * @param input - List memory input
142
+ * @returns List result with memories, total count, and hasMore flag
143
+ */
144
+ async list(input) {
145
+ try {
146
+ const files = await this.storage.list();
147
+ // Parse all files into memories
148
+ let memories = [];
149
+ for (const file of files) {
150
+ try {
151
+ const memory = await this.storage.read(this.extractIdFromContent(file.content));
152
+ memories.push(memory);
153
+ }
154
+ catch {
155
+ // Skip invalid files
156
+ continue;
157
+ }
158
+ }
159
+ // Apply filters
160
+ if (input.category) {
161
+ memories = memories.filter(m => m.category === input.category);
162
+ }
163
+ if (input.tags && input.tags.length > 0) {
164
+ memories = memories.filter(m => input.tags.every(tag => m.tags.includes(tag)));
165
+ }
166
+ if (input.fromDate) {
167
+ memories = memories.filter(m => m.createdAt >= input.fromDate);
168
+ }
169
+ if (input.toDate) {
170
+ memories = memories.filter(m => m.createdAt <= input.toDate);
171
+ }
172
+ // Sort
173
+ const sortBy = input.sortBy ?? 'createdAt';
174
+ const sortOrder = input.sortOrder ?? 'desc';
175
+ memories.sort((a, b) => {
176
+ let comparison = 0;
177
+ switch (sortBy) {
178
+ case 'createdAt':
179
+ comparison = a.createdAt.localeCompare(b.createdAt);
180
+ break;
181
+ case 'updatedAt':
182
+ comparison = a.updatedAt.localeCompare(b.updatedAt);
183
+ break;
184
+ case 'title':
185
+ comparison = a.title.localeCompare(b.title);
186
+ break;
187
+ case 'importance':
188
+ comparison = a.importance - b.importance;
189
+ break;
190
+ }
191
+ return sortOrder === 'asc' ? comparison : -comparison;
192
+ });
193
+ // Apply pagination
194
+ const total = memories.length;
195
+ const limit = input.limit ?? 20;
196
+ const offset = input.offset ?? 0;
197
+ const paginatedMemories = memories.slice(offset, offset + limit);
198
+ const hasMore = offset + limit < total;
199
+ return {
200
+ memories: paginatedMemories,
201
+ total,
202
+ hasMore,
203
+ };
204
+ }
205
+ catch (error) {
206
+ throw new ServiceError(`Failed to list memories: ${error instanceof Error ? error.message : 'Unknown error'}`, ErrorCode.STORAGE_ERROR);
207
+ }
208
+ }
209
+ /**
210
+ * Searches memories by query
211
+ *
212
+ * @param input - Search memory input
213
+ * @returns Search results with scores and matches
214
+ */
215
+ async search(input) {
216
+ try {
217
+ const listResult = await this.list({
218
+ category: input.category,
219
+ tags: input.tags,
220
+ limit: 1000, // Get all for search
221
+ });
222
+ const query = input.query.toLowerCase();
223
+ const keywords = query.split(/\s+/).filter(k => k.length > 0);
224
+ const results = [];
225
+ for (const memory of listResult.memories) {
226
+ let score = 0;
227
+ const matches = [];
228
+ // Search in title (higher weight)
229
+ const titleLower = memory.title.toLowerCase();
230
+ if (titleLower.includes(query)) {
231
+ score += 10;
232
+ matches.push(memory.title);
233
+ }
234
+ else {
235
+ // Check individual keywords in title
236
+ for (const keyword of keywords) {
237
+ if (titleLower.includes(keyword)) {
238
+ score += 5;
239
+ if (!matches.includes(memory.title)) {
240
+ matches.push(memory.title);
241
+ }
242
+ }
243
+ }
244
+ }
245
+ // Search in content
246
+ const contentLower = memory.content.toLowerCase();
247
+ if (contentLower.includes(query)) {
248
+ score += 3;
249
+ // Extract matching snippet
250
+ const index = contentLower.indexOf(query);
251
+ const start = Math.max(0, index - 50);
252
+ const end = Math.min(contentLower.length, index + query.length + 50);
253
+ const snippet = memory.content.slice(start, end);
254
+ matches.push(snippet);
255
+ }
256
+ else {
257
+ // Check individual keywords in content
258
+ for (const keyword of keywords) {
259
+ if (contentLower.includes(keyword)) {
260
+ score += 1;
261
+ const index = contentLower.indexOf(keyword);
262
+ const start = Math.max(0, index - 30);
263
+ const end = Math.min(contentLower.length, index + keyword.length + 30);
264
+ const snippet = memory.content.slice(start, end);
265
+ if (!matches.some(m => m.includes(snippet))) {
266
+ matches.push(snippet);
267
+ }
268
+ }
269
+ }
270
+ }
271
+ // Search in tags
272
+ for (const tag of memory.tags) {
273
+ if (tag.toLowerCase().includes(query) || keywords.some(k => tag.toLowerCase().includes(k))) {
274
+ score += 2;
275
+ matches.push(`Tag: ${tag}`);
276
+ }
277
+ }
278
+ if (score > 0) {
279
+ results.push({
280
+ memory,
281
+ score: Math.min(score / 20, 1), // Normalize to 0-1
282
+ matches: matches.slice(0, 3), // Limit matches
283
+ });
284
+ }
285
+ }
286
+ // Sort by score descending
287
+ results.sort((a, b) => b.score - a.score);
288
+ // Apply limit
289
+ const limit = input.limit ?? 10;
290
+ const limitedResults = results.slice(0, limit);
291
+ return {
292
+ results: limitedResults,
293
+ total: results.length,
294
+ };
295
+ }
296
+ catch (error) {
297
+ throw new ServiceError(`Failed to search memories: ${error instanceof Error ? error.message : 'Unknown error'}`, ErrorCode.STORAGE_ERROR);
298
+ }
299
+ }
300
+ /**
301
+ * memory_load unified read API (STM-first)
302
+ */
303
+ async memoryLoad(input) {
304
+ if (input.id) {
305
+ const { memory } = await this.read({ id: input.id });
306
+ return { items: [memory], total: 1 };
307
+ }
308
+ if (input.query) {
309
+ const searched = await this.search({
310
+ query: input.query,
311
+ category: input.category,
312
+ tags: input.tags,
313
+ limit: input.limit,
314
+ });
315
+ let items = searched.results.map(r => r.memory);
316
+ if (input.sessionId) {
317
+ items = items.filter(m => m.sessionId === input.sessionId);
318
+ }
319
+ return { items, total: items.length };
320
+ }
321
+ const listResult = await this.list({
322
+ category: input.category,
323
+ tags: input.tags,
324
+ limit: input.limit ?? 20,
325
+ sortBy: 'updatedAt',
326
+ sortOrder: 'desc',
327
+ });
328
+ let items = [...listResult.memories];
329
+ if (input.sessionId) {
330
+ items = items.filter(m => m.sessionId === input.sessionId);
331
+ }
332
+ if (input.date) {
333
+ const date = input.date;
334
+ items = items.filter(m => m.createdAt.startsWith(date));
335
+ }
336
+ return { items, total: items.length };
337
+ }
338
+ /**
339
+ * memory_update unified write API (append/upsert)
340
+ */
341
+ async memoryUpdate(input) {
342
+ const now = new Date().toISOString();
343
+ const sessionId = input.sessionId ?? randomUUID();
344
+ if (input.id) {
345
+ const updatedResult = await this.update({
346
+ id: input.id,
347
+ title: input.title,
348
+ content: input.content,
349
+ tags: input.tags,
350
+ category: input.category,
351
+ importance: input.importance,
352
+ });
353
+ const updatedMemory = {
354
+ ...updatedResult.memory,
355
+ sessionId,
356
+ entryType: input.entryType,
357
+ };
358
+ const filePath = await this.storage.write(updatedMemory);
359
+ return {
360
+ id: updatedMemory.id,
361
+ sessionId,
362
+ filePath,
363
+ created: false,
364
+ updated: true,
365
+ memory: updatedMemory,
366
+ };
367
+ }
368
+ const id = randomUUID();
369
+ const createdMemory = {
370
+ id,
371
+ createdAt: now,
372
+ updatedAt: now,
373
+ sessionId,
374
+ entryType: input.entryType,
375
+ tags: input.tags ?? [],
376
+ category: input.category ?? 'general',
377
+ importance: input.importance ?? 3,
378
+ title: input.title ?? 'memory note',
379
+ content: input.content,
380
+ };
381
+ const filePath = await this.storage.write(createdMemory);
382
+ return {
383
+ id,
384
+ sessionId,
385
+ filePath,
386
+ created: true,
387
+ updated: false,
388
+ memory: createdMemory,
389
+ };
390
+ }
391
+ /**
392
+ * Gets all unique categories
393
+ *
394
+ * @returns Array of category names
395
+ */
396
+ async getCategories() {
397
+ try {
398
+ const listResult = await this.list({ limit: 1000 });
399
+ const categories = new Set();
400
+ for (const memory of listResult.memories) {
401
+ categories.add(memory.category);
402
+ }
403
+ return {
404
+ categories: Array.from(categories).sort(),
405
+ };
406
+ }
407
+ catch (error) {
408
+ throw new ServiceError(`Failed to get categories: ${error instanceof Error ? error.message : 'Unknown error'}`, ErrorCode.STORAGE_ERROR);
409
+ }
410
+ }
411
+ /**
412
+ * Gets all unique tags
413
+ *
414
+ * @returns Array of tag names
415
+ */
416
+ async getTags() {
417
+ try {
418
+ const listResult = await this.list({ limit: 1000 });
419
+ const tags = new Set();
420
+ for (const memory of listResult.memories) {
421
+ for (const tag of memory.tags) {
422
+ tags.add(tag);
423
+ }
424
+ }
425
+ return {
426
+ tags: Array.from(tags).sort(),
427
+ };
428
+ }
429
+ catch (error) {
430
+ throw new ServiceError(`Failed to get tags: ${error instanceof Error ? error.message : 'Unknown error'}`, ErrorCode.STORAGE_ERROR);
431
+ }
432
+ }
433
+ /**
434
+ * Extracts ID from file content
435
+ *
436
+ * @param content - File content
437
+ * @returns ID string
438
+ */
439
+ extractIdFromContent(content) {
440
+ const match = content.match(/id:\s*"?([^"\n]+)"?/);
441
+ if (!match) {
442
+ throw new Error('Could not extract ID from content');
443
+ }
444
+ return match[1].trim();
445
+ }
446
+ }
447
+ //# sourceMappingURL=memory-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-service.js","sourceRoot":"","sources":["../../../src/services/memory-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * FrontMatter Parser - Handles YAML Front Matter and Markdown content
3
+ */
4
+ import type { Memory, MemoryFrontMatter } from '../contracts/types.js';
5
+ import { slugify } from '../utils/slugify.js';
6
+ /**
7
+ * Result of parsing a markdown file
8
+ */
9
+ export interface ParseResult {
10
+ frontMatter: MemoryFrontMatter;
11
+ title: string;
12
+ content: string;
13
+ }
14
+ /**
15
+ * Custom error for front matter parsing
16
+ */
17
+ export declare class FrontMatterError extends Error {
18
+ readonly cause?: unknown | undefined;
19
+ constructor(message: string, cause?: unknown | undefined);
20
+ }
21
+ /**
22
+ * Parses a markdown file with YAML front matter
23
+ *
24
+ * Expected format:
25
+ * ---
26
+ * id: "uuid"
27
+ * created_at: "ISO8601"
28
+ * updated_at: "ISO8601"
29
+ * tags: ["tag1", "tag2"]
30
+ * category: "category"
31
+ * importance: 3
32
+ * ---
33
+ *
34
+ * # Title
35
+ *
36
+ * Content...
37
+ *
38
+ * @param markdown - The markdown content to parse
39
+ * @returns Parsed front matter, title, and content
40
+ * @throws FrontMatterError if parsing fails
41
+ */
42
+ export declare function parseFrontMatter(markdown: string): ParseResult;
43
+ /**
44
+ * Converts front matter and content to markdown string
45
+ *
46
+ * @param frontMatter - The front matter data
47
+ * @param title - The title (H1 heading)
48
+ * @param content - The markdown content
49
+ * @returns Complete markdown string
50
+ */
51
+ export declare function stringifyFrontMatter(frontMatter: MemoryFrontMatter, title: string, content: string): string;
52
+ /**
53
+ * Converts a Memory object to front matter format
54
+ *
55
+ * @param memory - The memory object
56
+ * @returns Memory in front matter format
57
+ */
58
+ export declare function memoryToFrontMatter(memory: Memory): MemoryFrontMatter;
59
+ /**
60
+ * Converts front matter format to Memory object
61
+ *
62
+ * @param frontMatter - The front matter data
63
+ * @param title - The memory title
64
+ * @param content - The memory content
65
+ * @returns Complete Memory object
66
+ */
67
+ export declare function frontMatterToMemory(frontMatter: MemoryFrontMatter, title: string, content: string): Memory;
68
+ export { slugify };
69
+ //# sourceMappingURL=frontmatter-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter-parser.d.ts","sourceRoot":"","sources":["../../../src/storage/frontmatter-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;aAGvB,KAAK,CAAC,EAAE,OAAO;gBAD/B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAoC9D;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,iBAAiB,EAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,MAAM,CAwCR;AAsDD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAWrE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,iBAAiB,EAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,MAAM,CAaR;AAGD,OAAO,EAAE,OAAO,EAAE,CAAC"}