@stoneforge/quarry 1.13.0 → 1.14.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 (124) hide show
  1. package/dist/api/quarry-api.d.ts +9 -1
  2. package/dist/api/quarry-api.d.ts.map +1 -1
  3. package/dist/api/quarry-api.js +21 -2
  4. package/dist/api/quarry-api.js.map +1 -1
  5. package/dist/api/types.d.ts +8 -1
  6. package/dist/api/types.d.ts.map +1 -1
  7. package/dist/api/types.js.map +1 -1
  8. package/dist/cli/commands/auto-link-helper.d.ts.map +1 -1
  9. package/dist/cli/commands/auto-link-helper.js +1 -0
  10. package/dist/cli/commands/auto-link-helper.js.map +1 -1
  11. package/dist/cli/commands/crud.d.ts +2 -0
  12. package/dist/cli/commands/crud.d.ts.map +1 -1
  13. package/dist/cli/commands/crud.js +100 -10
  14. package/dist/cli/commands/crud.js.map +1 -1
  15. package/dist/cli/commands/docs.js +2 -2
  16. package/dist/cli/commands/docs.js.map +1 -1
  17. package/dist/cli/commands/document.js +1 -1
  18. package/dist/cli/commands/document.js.map +1 -1
  19. package/dist/cli/commands/entity.js +1 -1
  20. package/dist/cli/commands/entity.js.map +1 -1
  21. package/dist/cli/commands/external-sync.d.ts +6 -5
  22. package/dist/cli/commands/external-sync.d.ts.map +1 -1
  23. package/dist/cli/commands/external-sync.js +1032 -180
  24. package/dist/cli/commands/external-sync.js.map +1 -1
  25. package/dist/cli/commands/library.js +1 -1
  26. package/dist/cli/commands/library.js.map +1 -1
  27. package/dist/cli/commands/message.js +2 -2
  28. package/dist/cli/commands/message.js.map +1 -1
  29. package/dist/cli/commands/serve.d.ts.map +1 -1
  30. package/dist/cli/commands/serve.js +2 -0
  31. package/dist/cli/commands/serve.js.map +1 -1
  32. package/dist/cli/commands/task.d.ts.map +1 -1
  33. package/dist/cli/commands/task.js +7 -4
  34. package/dist/cli/commands/task.js.map +1 -1
  35. package/dist/cli/commands/team.js +1 -1
  36. package/dist/cli/commands/team.js.map +1 -1
  37. package/dist/cli/commands/workflow.js +1 -1
  38. package/dist/cli/commands/workflow.js.map +1 -1
  39. package/dist/cli/utils/progress.d.ts +30 -0
  40. package/dist/cli/utils/progress.d.ts.map +1 -0
  41. package/dist/cli/utils/progress.js +47 -0
  42. package/dist/cli/utils/progress.js.map +1 -0
  43. package/dist/config/config.d.ts.map +1 -1
  44. package/dist/config/config.js +6 -0
  45. package/dist/config/config.js.map +1 -1
  46. package/dist/config/defaults.d.ts.map +1 -1
  47. package/dist/config/defaults.js +1 -0
  48. package/dist/config/defaults.js.map +1 -1
  49. package/dist/config/file.d.ts.map +1 -1
  50. package/dist/config/file.js +10 -0
  51. package/dist/config/file.js.map +1 -1
  52. package/dist/config/merge.d.ts.map +1 -1
  53. package/dist/config/merge.js +7 -1
  54. package/dist/config/merge.js.map +1 -1
  55. package/dist/config/types.d.ts +7 -2
  56. package/dist/config/types.d.ts.map +1 -1
  57. package/dist/config/types.js +3 -0
  58. package/dist/config/types.js.map +1 -1
  59. package/dist/config/validation.d.ts.map +1 -1
  60. package/dist/config/validation.js +13 -0
  61. package/dist/config/validation.js.map +1 -1
  62. package/dist/external-sync/adapters/document-sync-adapter.d.ts +150 -0
  63. package/dist/external-sync/adapters/document-sync-adapter.d.ts.map +1 -0
  64. package/dist/external-sync/adapters/document-sync-adapter.js +325 -0
  65. package/dist/external-sync/adapters/document-sync-adapter.js.map +1 -0
  66. package/dist/external-sync/index.d.ts +3 -0
  67. package/dist/external-sync/index.d.ts.map +1 -1
  68. package/dist/external-sync/index.js +4 -0
  69. package/dist/external-sync/index.js.map +1 -1
  70. package/dist/external-sync/provider-registry.d.ts +7 -3
  71. package/dist/external-sync/provider-registry.d.ts.map +1 -1
  72. package/dist/external-sync/provider-registry.js +20 -3
  73. package/dist/external-sync/provider-registry.js.map +1 -1
  74. package/dist/external-sync/providers/folder/folder-document-adapter.d.ts +97 -0
  75. package/dist/external-sync/providers/folder/folder-document-adapter.d.ts.map +1 -0
  76. package/dist/external-sync/providers/folder/folder-document-adapter.js +261 -0
  77. package/dist/external-sync/providers/folder/folder-document-adapter.js.map +1 -0
  78. package/dist/external-sync/providers/folder/folder-fs.d.ts +146 -0
  79. package/dist/external-sync/providers/folder/folder-fs.d.ts.map +1 -0
  80. package/dist/external-sync/providers/folder/folder-fs.js +300 -0
  81. package/dist/external-sync/providers/folder/folder-fs.js.map +1 -0
  82. package/dist/external-sync/providers/folder/folder-provider.d.ts +28 -0
  83. package/dist/external-sync/providers/folder/folder-provider.d.ts.map +1 -0
  84. package/dist/external-sync/providers/folder/folder-provider.js +87 -0
  85. package/dist/external-sync/providers/folder/folder-provider.js.map +1 -0
  86. package/dist/external-sync/providers/folder/index.d.ts +11 -0
  87. package/dist/external-sync/providers/folder/index.d.ts.map +1 -0
  88. package/dist/external-sync/providers/folder/index.js +13 -0
  89. package/dist/external-sync/providers/folder/index.js.map +1 -0
  90. package/dist/external-sync/providers/index.d.ts +4 -0
  91. package/dist/external-sync/providers/index.d.ts.map +1 -1
  92. package/dist/external-sync/providers/index.js +5 -0
  93. package/dist/external-sync/providers/index.js.map +1 -1
  94. package/dist/external-sync/providers/notion/index.d.ts +19 -0
  95. package/dist/external-sync/providers/notion/index.d.ts.map +1 -0
  96. package/dist/external-sync/providers/notion/index.js +20 -0
  97. package/dist/external-sync/providers/notion/index.js.map +1 -0
  98. package/dist/external-sync/providers/notion/notion-api.d.ts +253 -0
  99. package/dist/external-sync/providers/notion/notion-api.d.ts.map +1 -0
  100. package/dist/external-sync/providers/notion/notion-api.js +492 -0
  101. package/dist/external-sync/providers/notion/notion-api.js.map +1 -0
  102. package/dist/external-sync/providers/notion/notion-blocks.d.ts +93 -0
  103. package/dist/external-sync/providers/notion/notion-blocks.d.ts.map +1 -0
  104. package/dist/external-sync/providers/notion/notion-blocks.js +773 -0
  105. package/dist/external-sync/providers/notion/notion-blocks.js.map +1 -0
  106. package/dist/external-sync/providers/notion/notion-document-adapter.d.ts +176 -0
  107. package/dist/external-sync/providers/notion/notion-document-adapter.d.ts.map +1 -0
  108. package/dist/external-sync/providers/notion/notion-document-adapter.js +413 -0
  109. package/dist/external-sync/providers/notion/notion-document-adapter.js.map +1 -0
  110. package/dist/external-sync/providers/notion/notion-provider.d.ts +57 -0
  111. package/dist/external-sync/providers/notion/notion-provider.d.ts.map +1 -0
  112. package/dist/external-sync/providers/notion/notion-provider.js +159 -0
  113. package/dist/external-sync/providers/notion/notion-provider.js.map +1 -0
  114. package/dist/external-sync/providers/notion/notion-types.d.ts +388 -0
  115. package/dist/external-sync/providers/notion/notion-types.d.ts.map +1 -0
  116. package/dist/external-sync/providers/notion/notion-types.js +47 -0
  117. package/dist/external-sync/providers/notion/notion-types.js.map +1 -0
  118. package/dist/external-sync/sync-engine.d.ts +70 -4
  119. package/dist/external-sync/sync-engine.d.ts.map +1 -1
  120. package/dist/external-sync/sync-engine.js +436 -67
  121. package/dist/external-sync/sync-engine.js.map +1 -1
  122. package/dist/server/index.js +8 -8
  123. package/dist/server/index.js.map +1 -1
  124. package/package.json +4 -12
@@ -0,0 +1,325 @@
1
+ /**
2
+ * Document Sync Adapter Utilities
3
+ *
4
+ * Shared field mapping logic for converting between Stoneforge documents and
5
+ * external document representations (e.g., Notion pages, Obsidian notes).
6
+ *
7
+ * These utilities are provider-agnostic — they handle the common conversion
8
+ * logic that all document sync providers need.
9
+ *
10
+ * Key functions:
11
+ * - documentToExternalDocumentInput: Convert a Stoneforge Document → ExternalDocumentInput for push
12
+ * - externalDocumentToDocumentUpdates: Convert an ExternalDocument → Partial<Document> for pull
13
+ * - diffDocumentUpdates: Return only changed fields between existing and updated document
14
+ * - computeExternalDocumentHash: Deterministic hash for change detection
15
+ */
16
+ import { createHash } from 'crypto';
17
+ // ============================================================================
18
+ // System Categories
19
+ // ============================================================================
20
+ /**
21
+ * Document categories that are system-managed and should be excluded from
22
+ * external sync. These documents are structural (task descriptions, message
23
+ * content) and are synced through their parent element's sync adapter.
24
+ */
25
+ export const SYSTEM_CATEGORIES = new Set([
26
+ 'task-description',
27
+ 'message-content',
28
+ ]);
29
+ /**
30
+ * Checks whether a document category is a system category that should
31
+ * be excluded from document sync.
32
+ */
33
+ export function isSystemCategory(category) {
34
+ return SYSTEM_CATEGORIES.has(category);
35
+ }
36
+ /**
37
+ * Checks whether a document should be included in external sync operations
38
+ * (link-all, push, pull). A document is syncable if:
39
+ * - It does not have a system category (task-description, message-content)
40
+ * - It has a non-empty title (null, undefined, or whitespace-only titles are excluded)
41
+ *
42
+ * Documents without titles are typically system-generated (messages, task descriptions)
43
+ * that happen to not have the system category set, or scratch documents. They all
44
+ * slugify to "untitled.md" and overwrite each other, so they must be excluded.
45
+ */
46
+ export function isSyncableDocument(doc) {
47
+ if (isSystemCategory(doc.category))
48
+ return false;
49
+ if (!doc.title || doc.title.trim().length === 0)
50
+ return false;
51
+ return true;
52
+ }
53
+ // ============================================================================
54
+ // Content Type Mapping
55
+ // ============================================================================
56
+ /**
57
+ * Maps Stoneforge ContentType to external document content type.
58
+ *
59
+ * Stoneforge uses 'markdown', 'text', and 'json'.
60
+ * External systems use 'markdown', 'text', and 'html'.
61
+ * JSON content is mapped to 'text' for external systems since most
62
+ * document providers don't have a native JSON content type.
63
+ */
64
+ export function mapContentTypeToExternal(contentType) {
65
+ switch (contentType) {
66
+ case 'markdown':
67
+ return 'markdown';
68
+ case 'text':
69
+ return 'text';
70
+ case 'json':
71
+ // JSON doesn't have a direct external equivalent; map to text
72
+ return 'text';
73
+ default:
74
+ return 'text';
75
+ }
76
+ }
77
+ /**
78
+ * Maps external document content type to Stoneforge ContentType.
79
+ *
80
+ * External systems use 'markdown', 'text', and 'html'.
81
+ * HTML content is mapped to 'text' since Stoneforge doesn't have an HTML
82
+ * content type — the content is stored as-is, just categorized as text.
83
+ */
84
+ export function mapContentTypeFromExternal(contentType) {
85
+ switch (contentType) {
86
+ case 'markdown':
87
+ return 'markdown';
88
+ case 'text':
89
+ return 'text';
90
+ case 'html':
91
+ // HTML doesn't have a direct Stoneforge equivalent; map to text
92
+ return 'text';
93
+ default:
94
+ return 'text';
95
+ }
96
+ }
97
+ /**
98
+ * Slugifies a library name for use as a directory name.
99
+ * Uses the same algorithm as the folder adapter's slugify function:
100
+ * lowercase, replace non-alphanumeric chars with hyphens, collapse
101
+ * consecutive hyphens, trim leading/trailing hyphens.
102
+ *
103
+ * @param name - Library name to slugify
104
+ * @returns Slugified directory name
105
+ */
106
+ function slugifyLibraryName(name) {
107
+ const slug = name
108
+ .toLowerCase()
109
+ .replace(/[^a-z0-9-]/g, '-')
110
+ .replace(/-+/g, '-')
111
+ .replace(/^-|-$/g, '');
112
+ return slug || 'untitled';
113
+ }
114
+ /**
115
+ * Resolves the library path for a document by querying its parent-child
116
+ * dependencies. Builds a hierarchical path from the root library down
117
+ * to the document's immediate parent library.
118
+ *
119
+ * For example, if a document belongs to library "API Reference" which
120
+ * is a child of library "Documentation", the returned path would be
121
+ * "documentation/api-reference".
122
+ *
123
+ * Design decisions:
124
+ * - If a document belongs to multiple libraries, the first one found is used
125
+ * - Library names are slugified for directory names
126
+ * - If the document has no library parent, returns undefined
127
+ *
128
+ * @param api - API for querying dependencies and elements
129
+ * @param documentId - The document's element ID
130
+ * @returns The slugified library path (e.g., 'documentation/api-reference'), or undefined if not in a library
131
+ */
132
+ export async function resolveDocumentLibraryPath(api, documentId) {
133
+ // Find parent-child dependencies where document is the child (blockedId)
134
+ const deps = await api.getDependencies(documentId, ['parent-child']);
135
+ if (deps.length === 0) {
136
+ return undefined;
137
+ }
138
+ // Find the first library parent
139
+ let libraryId;
140
+ for (const dep of deps) {
141
+ const parent = await api.get(dep.blockerId);
142
+ if (parent && parent.type === 'library') {
143
+ libraryId = dep.blockerId;
144
+ break;
145
+ }
146
+ }
147
+ if (!libraryId) {
148
+ return undefined;
149
+ }
150
+ // Walk up the library hierarchy to build the full path
151
+ const pathSegments = [];
152
+ let currentId = libraryId;
153
+ const visited = new Set(); // Prevent infinite loops from cycles
154
+ while (currentId && !visited.has(currentId)) {
155
+ visited.add(currentId);
156
+ const library = await api.get(currentId);
157
+ if (!library || library.type !== 'library') {
158
+ break;
159
+ }
160
+ pathSegments.unshift(slugifyLibraryName(library.name));
161
+ // Find the parent library of this library
162
+ const parentDeps = await api.getDependencies(currentId, ['parent-child']);
163
+ let foundParentLibrary = false;
164
+ for (const dep of parentDeps) {
165
+ const parent = await api.get(dep.blockerId);
166
+ if (parent && parent.type === 'library') {
167
+ currentId = dep.blockerId;
168
+ foundParentLibrary = true;
169
+ break;
170
+ }
171
+ }
172
+ if (!foundParentLibrary) {
173
+ break;
174
+ }
175
+ }
176
+ return pathSegments.length > 0 ? pathSegments.join('/') : undefined;
177
+ }
178
+ /**
179
+ * Batch-resolves library paths for multiple documents.
180
+ * More efficient than calling resolveDocumentLibraryPath individually
181
+ * since it can reuse cached library lookups.
182
+ *
183
+ * @param api - API for querying dependencies and elements
184
+ * @param documentIds - Array of document element IDs
185
+ * @returns Map from document ID to library path (undefined entries omitted)
186
+ */
187
+ export async function resolveDocumentLibraryPaths(api, documentIds) {
188
+ const result = new Map();
189
+ for (const docId of documentIds) {
190
+ const libraryPath = await resolveDocumentLibraryPath(api, docId);
191
+ if (libraryPath) {
192
+ result.set(docId, libraryPath);
193
+ }
194
+ }
195
+ return result;
196
+ }
197
+ // ============================================================================
198
+ // Push: Stoneforge Document → External Document
199
+ // ============================================================================
200
+ /**
201
+ * Converts a Stoneforge Document into an ExternalDocumentInput for
202
+ * creating/updating a page in an external system.
203
+ *
204
+ * Handles:
205
+ * - Title mapping (1:1, falls back to empty string if undefined)
206
+ * - Content mapping (1:1)
207
+ * - ContentType mapping (markdown/text → markdown/text, json → text)
208
+ * - Optional library path for directory-based organization
209
+ *
210
+ * @param doc - The Stoneforge document to convert
211
+ * @param libraryPath - Optional pre-computed library path for the document
212
+ * @returns ExternalDocumentInput ready for the provider adapter
213
+ */
214
+ export function documentToExternalDocumentInput(doc, libraryPath) {
215
+ return {
216
+ title: doc.title ?? '',
217
+ content: doc.content,
218
+ contentType: mapContentTypeToExternal(doc.contentType),
219
+ ...(doc.category !== undefined && { category: doc.category }),
220
+ ...(doc.tags !== undefined && doc.tags.length > 0 && { tags: doc.tags }),
221
+ ...(libraryPath !== undefined && { libraryPath }),
222
+ };
223
+ }
224
+ // ============================================================================
225
+ // Pull: External Document → Stoneforge Document Updates
226
+ // ============================================================================
227
+ /**
228
+ * Converts an ExternalDocument into a partial Document update object for
229
+ * applying external changes to a local Stoneforge document.
230
+ *
231
+ * Handles:
232
+ * - Title mapping (1:1)
233
+ * - Content mapping (1:1)
234
+ * - ContentType mapping (markdown/text/html → markdown/text/text)
235
+ *
236
+ * If existingDoc is provided, only changed fields are returned (diff mode).
237
+ * If existingDoc is undefined, all mappable fields are returned (create mode).
238
+ *
239
+ * @param externalDoc - The external document to convert
240
+ * @param existingDoc - The existing local document (undefined for new documents)
241
+ * @returns Partial<Document> with only the changed fields (or all fields if no existingDoc)
242
+ */
243
+ export function externalDocumentToDocumentUpdates(externalDoc, existingDoc) {
244
+ const contentType = mapContentTypeFromExternal(externalDoc.contentType);
245
+ const fullUpdate = {
246
+ title: externalDoc.title,
247
+ content: externalDoc.content,
248
+ contentType,
249
+ };
250
+ // If no existing document, return full create input
251
+ if (!existingDoc) {
252
+ return fullUpdate;
253
+ }
254
+ // Diff mode: only return changed fields
255
+ return diffDocumentUpdates(existingDoc, fullUpdate);
256
+ }
257
+ // ============================================================================
258
+ // Diff Utilities
259
+ // ============================================================================
260
+ /**
261
+ * Compares a full update against an existing document and returns only
262
+ * the fields that actually changed.
263
+ *
264
+ * This prevents unnecessary updates when pulling changes from external
265
+ * systems where the data hasn't actually changed.
266
+ *
267
+ * Compared fields: title, content, contentType, category, tags
268
+ */
269
+ export function diffDocumentUpdates(existing, updates) {
270
+ const diff = {};
271
+ if (updates.title !== undefined && updates.title !== existing.title) {
272
+ diff.title = updates.title;
273
+ }
274
+ if (updates.content !== undefined && updates.content !== existing.content) {
275
+ diff.content = updates.content;
276
+ }
277
+ if (updates.contentType !== undefined &&
278
+ updates.contentType !== existing.contentType) {
279
+ diff.contentType = updates.contentType;
280
+ }
281
+ if (updates.category !== undefined &&
282
+ updates.category !== existing.category) {
283
+ diff.category = updates.category;
284
+ }
285
+ if (updates.tags !== undefined && !arraysEqual(updates.tags, existing.tags)) {
286
+ diff.tags = updates.tags;
287
+ }
288
+ return diff;
289
+ }
290
+ // ============================================================================
291
+ // Hash Computation
292
+ // ============================================================================
293
+ /**
294
+ * Computes a deterministic hash of an ExternalDocument for change detection.
295
+ *
296
+ * The hash is based on the document's title, content, and contentType.
297
+ * Used by the sync engine to detect whether an external document has
298
+ * changed since the last sync, avoiding unnecessary pull operations.
299
+ *
300
+ * @param doc - The external document to hash
301
+ * @returns A hex-encoded SHA-256 hash string
302
+ */
303
+ export function computeExternalDocumentHash(doc) {
304
+ const hash = createHash('sha256');
305
+ hash.update(doc.title);
306
+ hash.update('\0'); // null byte separator to avoid collisions
307
+ hash.update(doc.content);
308
+ hash.update('\0');
309
+ hash.update(doc.contentType);
310
+ return hash.digest('hex');
311
+ }
312
+ // ============================================================================
313
+ // Internal Helpers
314
+ // ============================================================================
315
+ /**
316
+ * Compares two arrays for equality (order-independent).
317
+ */
318
+ function arraysEqual(a, b) {
319
+ if (a.length !== b.length)
320
+ return false;
321
+ const sortedA = [...a].sort();
322
+ const sortedB = [...b].sort();
323
+ return sortedA.every((val, idx) => val === sortedB[idx]);
324
+ }
325
+ //# sourceMappingURL=document-sync-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-sync-adapter.js","sourceRoot":"","sources":["../../../src/external-sync/adapters/document-sync-adapter.ts"],"names":[],"mappings":"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"}
@@ -17,4 +17,7 @@ export { autoLinkTask } from './auto-link.js';
17
17
  export type { AutoLinkTaskParams, AutoLinkTaskResult } from './auto-link.js';
18
18
  export { createLinearProvider, createLinearPlaceholderProvider, } from './providers/linear/index.js';
19
19
  export type { CreateLinearProviderOptions } from './providers/linear/index.js';
20
+ export { createNotionProvider, createNotionPlaceholderProvider, NotionDocumentAdapter, createNotionDocumentAdapter, extractTitleFromProperties, buildPageProperties, markdownToNotionBlocks, notionBlocksToMarkdown, NotionApiClient, NotionApiError, isNotionApiError, } from './providers/notion/index.js';
21
+ export type { CreateNotionProviderOptions, NotionApiClientOptions, RateLimitState as NotionRateLimitState, NotionPage, NotionBlock, NotionBlockInput, NotionRichText, NotionAnnotations, NotionProperty, NotionDatabase, NotionDatabaseProperty, NotionDatabaseSchema, NotionUpdateDatabaseInput, } from './providers/notion/index.js';
22
+ export { createFolderProvider, FolderDocumentAdapter, createFolderDocumentAdapter, slugify, } from './providers/folder/index.js';
20
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/external-sync/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,6BAA6B,EAC7B,gCAAgC,GACjC,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,OAAO,EACL,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,YAAY,EACZ,eAAe,EACf,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,GACd,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAG7E,OAAO,EACL,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/external-sync/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,6BAA6B,EAC7B,gCAAgC,GACjC,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,OAAO,EACL,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,YAAY,EACZ,eAAe,EACf,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,GACd,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAG7E,OAAO,EACL,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAG/E,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,2BAA2B,EAC3B,sBAAsB,EACtB,cAAc,IAAI,oBAAoB,EACtC,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,2BAA2B,EAC3B,OAAO,GACR,MAAM,6BAA6B,CAAC"}
@@ -17,4 +17,8 @@ export { createGitHubProvider, createGitHubPlaceholderProvider, GitHubTaskAdapte
17
17
  export { autoLinkTask } from './auto-link.js';
18
18
  // Linear provider
19
19
  export { createLinearProvider, createLinearPlaceholderProvider, } from './providers/linear/index.js';
20
+ // Notion provider
21
+ export { createNotionProvider, createNotionPlaceholderProvider, NotionDocumentAdapter, createNotionDocumentAdapter, extractTitleFromProperties, buildPageProperties, markdownToNotionBlocks, notionBlocksToMarkdown, NotionApiClient, NotionApiError, isNotionApiError, } from './providers/notion/index.js';
22
+ // Folder provider
23
+ export { createFolderProvider, FolderDocumentAdapter, createFolderDocumentAdapter, slugify, } from './providers/folder/index.js';
20
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/external-sync/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,6BAA6B,EAC7B,gCAAgC,GACjC,MAAM,wBAAwB,CAAC;AAGhC,oBAAoB;AACpB,OAAO,EACL,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAOhC,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAUhE,kBAAkB;AAClB,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAYrC,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,kBAAkB;AAClB,OAAO,EACL,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/external-sync/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,6BAA6B,EAC7B,gCAAgC,GACjC,MAAM,wBAAwB,CAAC;AAGhC,oBAAoB;AACpB,OAAO,EACL,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAOhC,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAUhE,kBAAkB;AAClB,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAYrC,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,kBAAkB;AAClB,OAAO,EACL,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,6BAA6B,CAAC;AAGrC,kBAAkB;AAClB,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAiBrC,kBAAkB;AAClB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,2BAA2B,EAC3B,OAAO,GACR,MAAM,6BAA6B,CAAC"}
@@ -87,8 +87,9 @@ export declare function createProviderRegistry(): ProviderRegistry;
87
87
  /**
88
88
  * Create a ProviderRegistry with default providers registered.
89
89
  *
90
- * Registers placeholder providers for GitHub and Linear by default.
91
- * The actual provider implementations replace these when configured with API keys.
90
+ * Registers placeholder providers for GitHub, Linear, and Notion by default,
91
+ * plus the Folder provider (which needs no authentication and is always ready).
92
+ * The actual provider implementations replace placeholders when configured with API keys.
92
93
  *
93
94
  * @returns A ProviderRegistry with default providers
94
95
  */
@@ -96,12 +97,15 @@ export declare function createDefaultProviderRegistry(): ProviderRegistry;
96
97
  /**
97
98
  * Create a ProviderRegistry with real configured providers.
98
99
  *
99
- * Starts with placeholder providers for all known providers (GitHub, Linear),
100
+ * Starts with placeholder providers for all known providers (GitHub, Linear, Notion, Folder),
100
101
  * then replaces placeholders with real configured providers for any configs
101
102
  * that have a token set. This ensures providers without tokens remain as
102
103
  * placeholders (which throw descriptive errors), while configured providers
103
104
  * are ready for actual sync operations.
104
105
  *
106
+ * Note: The Folder provider is always ready (no token needed), so it is
107
+ * never replaced — it remains as-is from the default registry.
108
+ *
105
109
  * @param providerConfigs - Array of provider configurations (from settings)
106
110
  * @returns A ProviderRegistry with configured providers replacing placeholders
107
111
  */
@@ -1 +1 @@
1
- {"version":3,"file":"provider-registry.d.ts","sourceRoot":"","sources":["../../src/external-sync/provider-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAQ1B;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;CAC9E;AAMD;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IAEjE;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAU1C;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI/C;;;;OAIG;IACH,IAAI,IAAI,gBAAgB,EAAE;IAI1B;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,oBAAoB,EAAE;IAiBhE;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AA6BD;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,IAAI,gBAAgB,CAKhE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gCAAgC,CAC9C,eAAe,EAAE,SAAS,cAAc,EAAE,GACzC,gBAAgB,CAkClB"}
1
+ {"version":3,"file":"provider-registry.d.ts","sourceRoot":"","sources":["../../src/external-sync/provider-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAU1B;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;CAC9E;AAMD;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IAEjE;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAU1C;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI/C;;;;OAIG;IACH,IAAI,IAAI,gBAAgB,EAAE;IAI1B;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,oBAAoB,EAAE;IAiBhE;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AA6BD;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,IAAI,gBAAgB,CAOhE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gCAAgC,CAC9C,eAAe,EAAE,SAAS,cAAc,EAAE,GACzC,gBAAgB,CA8ClB"}
@@ -17,6 +17,8 @@
17
17
  */
18
18
  import { createGitHubProvider, createGitHubPlaceholderProvider } from './providers/github/index.js';
19
19
  import { createLinearProvider, createLinearPlaceholderProvider } from './providers/linear/index.js';
20
+ import { createNotionProvider, createNotionPlaceholderProvider } from './providers/notion/index.js';
21
+ import { createFolderProvider } from './providers/folder/index.js';
20
22
  // ============================================================================
21
23
  // ProviderRegistry
22
24
  // ============================================================================
@@ -135,8 +137,9 @@ export function createProviderRegistry() {
135
137
  /**
136
138
  * Create a ProviderRegistry with default providers registered.
137
139
  *
138
- * Registers placeholder providers for GitHub and Linear by default.
139
- * The actual provider implementations replace these when configured with API keys.
140
+ * Registers placeholder providers for GitHub, Linear, and Notion by default,
141
+ * plus the Folder provider (which needs no authentication and is always ready).
142
+ * The actual provider implementations replace placeholders when configured with API keys.
140
143
  *
141
144
  * @returns A ProviderRegistry with default providers
142
145
  */
@@ -144,23 +147,32 @@ export function createDefaultProviderRegistry() {
144
147
  const registry = new ProviderRegistry();
145
148
  registry.register(createGitHubPlaceholderProvider());
146
149
  registry.register(createLinearPlaceholderProvider());
150
+ registry.register(createNotionPlaceholderProvider());
151
+ registry.register(createFolderProvider());
147
152
  return registry;
148
153
  }
149
154
  /**
150
155
  * Create a ProviderRegistry with real configured providers.
151
156
  *
152
- * Starts with placeholder providers for all known providers (GitHub, Linear),
157
+ * Starts with placeholder providers for all known providers (GitHub, Linear, Notion, Folder),
153
158
  * then replaces placeholders with real configured providers for any configs
154
159
  * that have a token set. This ensures providers without tokens remain as
155
160
  * placeholders (which throw descriptive errors), while configured providers
156
161
  * are ready for actual sync operations.
157
162
  *
163
+ * Note: The Folder provider is always ready (no token needed), so it is
164
+ * never replaced — it remains as-is from the default registry.
165
+ *
158
166
  * @param providerConfigs - Array of provider configurations (from settings)
159
167
  * @returns A ProviderRegistry with configured providers replacing placeholders
160
168
  */
161
169
  export function createConfiguredProviderRegistry(providerConfigs) {
162
170
  const registry = createDefaultProviderRegistry();
163
171
  for (const config of providerConfigs) {
172
+ // Folder provider doesn't need a token — it's always ready
173
+ if (config.provider === 'folder') {
174
+ continue;
175
+ }
164
176
  if (!config.token) {
165
177
  continue;
166
178
  }
@@ -180,6 +192,11 @@ export function createConfiguredProviderRegistry(providerConfigs) {
180
192
  apiKey: config.token,
181
193
  }));
182
194
  break;
195
+ case 'notion':
196
+ registry.register(createNotionProvider({
197
+ token: config.token,
198
+ }));
199
+ break;
183
200
  // Unknown providers are silently skipped — their placeholders remain
184
201
  }
185
202
  }
@@ -1 +1 @@
1
- {"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/external-sync/provider-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/external-sync/provider-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Folder Document Sync Adapter
3
+ *
4
+ * Implements the DocumentSyncAdapter interface for local folder-based
5
+ * document synchronization. Maps between Stoneforge documents and
6
+ * markdown files with YAML frontmatter in a local directory tree.
7
+ *
8
+ * Uses folder-fs.ts for all filesystem operations (read, write, list).
9
+ *
10
+ * Conventions:
11
+ * - project = absolute folder path (base directory)
12
+ * - externalId = relative file path within the folder (e.g., 'notes/meeting.md')
13
+ * - URL format: file:///absolute/path/to/file.md
14
+ * - Filenames are generated from titles using slugification
15
+ */
16
+ import type { DocumentSyncAdapter, ExternalDocument, ExternalDocumentInput, Timestamp } from '@stoneforge/core';
17
+ /**
18
+ * Converts a title string into a filename-safe slug.
19
+ *
20
+ * - Lowercases the string
21
+ * - Replaces non-alphanumeric characters (except hyphens) with hyphens
22
+ * - Collapses consecutive hyphens
23
+ * - Trims leading/trailing hyphens
24
+ * - Falls back to 'untitled' for empty results
25
+ *
26
+ * @param title - The document title to slugify
27
+ * @returns A filename-safe slug string (without extension)
28
+ */
29
+ export declare function slugify(title: string): string;
30
+ /**
31
+ * DocumentSyncAdapter implementation for local folder-based sync.
32
+ *
33
+ * Maps between Stoneforge ExternalDocument and markdown files with YAML
34
+ * frontmatter on the local filesystem.
35
+ *
36
+ * Usage:
37
+ * ```typescript
38
+ * const adapter = new FolderDocumentAdapter();
39
+ * const doc = await adapter.getPage('/path/to/docs', 'notes/meeting.md');
40
+ * ```
41
+ */
42
+ export declare class FolderDocumentAdapter implements DocumentSyncAdapter {
43
+ /**
44
+ * Fetch a single document by its relative file path.
45
+ *
46
+ * @param project - Absolute path to the base directory
47
+ * @param externalId - Relative file path (e.g., 'notes/meeting.md')
48
+ * @returns The document as an ExternalDocument, or null if not found
49
+ */
50
+ getPage(project: string, externalId: string): Promise<ExternalDocument | null>;
51
+ /**
52
+ * List documents modified since a given timestamp.
53
+ *
54
+ * Reads each file to extract title and content, returning full
55
+ * ExternalDocument objects.
56
+ *
57
+ * @param project - Absolute path to the base directory
58
+ * @param since - ISO 8601 timestamp; only files modified after this are returned
59
+ * @returns Array of ExternalDocument objects for modified files
60
+ */
61
+ listPagesSince(project: string, since: Timestamp): Promise<ExternalDocument[]>;
62
+ /**
63
+ * Create a new document file in the folder.
64
+ *
65
+ * Generates a filename from the title using slugification, writes
66
+ * the content with frontmatter, and returns the created document.
67
+ *
68
+ * If the page has a `libraryPath`, the file is placed in the
69
+ * corresponding subdirectory. For example, a libraryPath of
70
+ * 'documentation/api' results in the file being created at
71
+ * 'documentation/api/my-doc.md'.
72
+ *
73
+ * @param project - Absolute path to the base directory
74
+ * @param page - Document input with title, content, and optional contentType
75
+ * @returns The created ExternalDocument
76
+ */
77
+ createPage(project: string, page: ExternalDocumentInput): Promise<ExternalDocument>;
78
+ /**
79
+ * Update an existing document file in the folder.
80
+ *
81
+ * Reads the existing file, merges the updates (preserving existing
82
+ * frontmatter), and writes back. Returns the updated document.
83
+ *
84
+ * @param project - Absolute path to the base directory
85
+ * @param externalId - Relative file path of the existing document
86
+ * @param updates - Partial document input with fields to update
87
+ * @returns The updated ExternalDocument
88
+ */
89
+ updatePage(project: string, externalId: string, updates: Partial<ExternalDocumentInput>): Promise<ExternalDocument>;
90
+ }
91
+ /**
92
+ * Creates a new FolderDocumentAdapter instance.
93
+ *
94
+ * @returns A configured FolderDocumentAdapter
95
+ */
96
+ export declare function createFolderDocumentAdapter(): FolderDocumentAdapter;
97
+ //# sourceMappingURL=folder-document-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-document-adapter.d.ts","sourceRoot":"","sources":["../../../../src/external-sync/providers/folder/folder-document-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,SAAS,EACV,MAAM,kBAAkB,CAAC;AAe1B;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAsBD;;;;;;;;;;;GAWG;AACH,qBAAa,qBAAsB,YAAW,mBAAmB;IAC/D;;;;;;OAMG;IACG,OAAO,CACX,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IA8BnC;;;;;;;;;OASG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAuB9B;;;;;;;;;;;;;;OAcG;IACG,UAAU,CACd,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,gBAAgB,CAAC;IAqC5B;;;;;;;;;;OAUG;IACG,UAAU,CACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACtC,OAAO,CAAC,gBAAgB,CAAC;CAsC7B;AA6CD;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,qBAAqB,CAEnE"}