emdash-emit 0.1.8 → 0.1.10

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 (148) hide show
  1. package/README.md +132 -28
  2. package/dist/bin/emit.d.ts.map +1 -1
  3. package/dist/bin/emit.js +6 -0
  4. package/dist/bin/emit.js.map +1 -1
  5. package/dist/cli/commands/conflicts.d.ts +4 -0
  6. package/dist/cli/commands/conflicts.d.ts.map +1 -0
  7. package/dist/cli/commands/conflicts.js +153 -0
  8. package/dist/cli/commands/conflicts.js.map +1 -0
  9. package/dist/cli/commands/delete.d.ts +4 -0
  10. package/dist/cli/commands/delete.d.ts.map +1 -0
  11. package/dist/cli/commands/delete.js +89 -0
  12. package/dist/cli/commands/delete.js.map +1 -0
  13. package/dist/cli/commands/doctor.d.ts +4 -0
  14. package/dist/cli/commands/doctor.d.ts.map +1 -0
  15. package/dist/cli/commands/doctor.js +82 -0
  16. package/dist/cli/commands/doctor.js.map +1 -0
  17. package/dist/cli/commands/new.d.ts.map +1 -1
  18. package/dist/cli/commands/new.js +52 -22
  19. package/dist/cli/commands/new.js.map +1 -1
  20. package/dist/cli/commands/profile.d.ts.map +1 -1
  21. package/dist/cli/commands/profile.js +67 -13
  22. package/dist/cli/commands/profile.js.map +1 -1
  23. package/dist/cli/commands/pull.d.ts +5 -0
  24. package/dist/cli/commands/pull.d.ts.map +1 -1
  25. package/dist/cli/commands/pull.js +119 -39
  26. package/dist/cli/commands/pull.js.map +1 -1
  27. package/dist/cli/commands/push.d.ts.map +1 -1
  28. package/dist/cli/commands/push.js +38 -1
  29. package/dist/cli/commands/push.js.map +1 -1
  30. package/dist/cli/commands/status.d.ts +19 -0
  31. package/dist/cli/commands/status.d.ts.map +1 -1
  32. package/dist/cli/commands/status.js +87 -5
  33. package/dist/cli/commands/status.js.map +1 -1
  34. package/dist/cli/context.d.ts +38 -1
  35. package/dist/cli/context.d.ts.map +1 -1
  36. package/dist/cli/context.js +129 -16
  37. package/dist/cli/context.js.map +1 -1
  38. package/dist/client/auth.d.ts +1 -0
  39. package/dist/client/auth.d.ts.map +1 -1
  40. package/dist/client/auth.js +1 -0
  41. package/dist/client/auth.js.map +1 -1
  42. package/dist/client/http.d.ts.map +1 -1
  43. package/dist/client/http.js +27 -10
  44. package/dist/client/http.js.map +1 -1
  45. package/dist/db/cache.d.ts +3 -0
  46. package/dist/db/cache.d.ts.map +1 -1
  47. package/dist/db/cache.js +39 -0
  48. package/dist/db/cache.js.map +1 -1
  49. package/dist/mcp/context.d.ts +8 -0
  50. package/dist/mcp/context.d.ts.map +1 -1
  51. package/dist/mcp/server.d.ts +8 -0
  52. package/dist/mcp/server.d.ts.map +1 -1
  53. package/dist/mcp/server.js +91 -15
  54. package/dist/mcp/server.js.map +1 -1
  55. package/dist/mcp/tool-errors.d.ts +16 -0
  56. package/dist/mcp/tool-errors.d.ts.map +1 -0
  57. package/dist/mcp/tool-errors.js +137 -0
  58. package/dist/mcp/tool-errors.js.map +1 -0
  59. package/dist/mcp/tools/profile.d.ts +9 -2
  60. package/dist/mcp/tools/profile.d.ts.map +1 -1
  61. package/dist/mcp/tools/profile.js +53 -36
  62. package/dist/mcp/tools/profile.js.map +1 -1
  63. package/dist/mcp/tools/sync-conflicts.d.ts +4 -0
  64. package/dist/mcp/tools/sync-conflicts.d.ts.map +1 -0
  65. package/dist/mcp/tools/sync-conflicts.js +100 -0
  66. package/dist/mcp/tools/sync-conflicts.js.map +1 -0
  67. package/dist/mcp/tools/sync-delete.d.ts +4 -0
  68. package/dist/mcp/tools/sync-delete.d.ts.map +1 -0
  69. package/dist/mcp/tools/sync-delete.js +77 -0
  70. package/dist/mcp/tools/sync-delete.js.map +1 -0
  71. package/dist/mcp/tools/sync-diff.d.ts.map +1 -1
  72. package/dist/mcp/tools/sync-diff.js +22 -8
  73. package/dist/mcp/tools/sync-diff.js.map +1 -1
  74. package/dist/mcp/tools/sync-doctor.d.ts +4 -0
  75. package/dist/mcp/tools/sync-doctor.d.ts.map +1 -0
  76. package/dist/mcp/tools/sync-doctor.js +57 -0
  77. package/dist/mcp/tools/sync-doctor.js.map +1 -0
  78. package/dist/mcp/tools/sync-new.d.ts.map +1 -1
  79. package/dist/mcp/tools/sync-new.js +49 -23
  80. package/dist/mcp/tools/sync-new.js.map +1 -1
  81. package/dist/mcp/tools/sync-pull.d.ts.map +1 -1
  82. package/dist/mcp/tools/sync-pull.js +132 -73
  83. package/dist/mcp/tools/sync-pull.js.map +1 -1
  84. package/dist/mcp/tools/sync-push.d.ts.map +1 -1
  85. package/dist/mcp/tools/sync-push.js +39 -33
  86. package/dist/mcp/tools/sync-push.js.map +1 -1
  87. package/dist/mcp/tools/sync-status.d.ts.map +1 -1
  88. package/dist/mcp/tools/sync-status.js +103 -11
  89. package/dist/mcp/tools/sync-status.js.map +1 -1
  90. package/dist/sync/conflicts.d.ts +89 -0
  91. package/dist/sync/conflicts.d.ts.map +1 -0
  92. package/dist/sync/conflicts.js +374 -0
  93. package/dist/sync/conflicts.js.map +1 -0
  94. package/dist/sync/delete.d.ts +58 -0
  95. package/dist/sync/delete.d.ts.map +1 -0
  96. package/dist/sync/delete.js +221 -0
  97. package/dist/sync/delete.js.map +1 -0
  98. package/dist/sync/diff.d.ts.map +1 -1
  99. package/dist/sync/diff.js +6 -3
  100. package/dist/sync/diff.js.map +1 -1
  101. package/dist/sync/doctor.d.ts +31 -0
  102. package/dist/sync/doctor.d.ts.map +1 -0
  103. package/dist/sync/doctor.js +224 -0
  104. package/dist/sync/doctor.js.map +1 -0
  105. package/dist/sync/media.d.ts +22 -0
  106. package/dist/sync/media.d.ts.map +1 -1
  107. package/dist/sync/media.js +342 -94
  108. package/dist/sync/media.js.map +1 -1
  109. package/dist/sync/new.d.ts +31 -0
  110. package/dist/sync/new.d.ts.map +1 -1
  111. package/dist/sync/new.js +139 -2
  112. package/dist/sync/new.js.map +1 -1
  113. package/dist/sync/orchestrator.d.ts +6 -0
  114. package/dist/sync/orchestrator.d.ts.map +1 -1
  115. package/dist/sync/orchestrator.js +54 -27
  116. package/dist/sync/orchestrator.js.map +1 -1
  117. package/dist/sync/preflight.d.ts.map +1 -1
  118. package/dist/sync/preflight.js +29 -3
  119. package/dist/sync/preflight.js.map +1 -1
  120. package/dist/sync/pull.d.ts +51 -0
  121. package/dist/sync/pull.d.ts.map +1 -1
  122. package/dist/sync/pull.js +289 -58
  123. package/dist/sync/pull.js.map +1 -1
  124. package/dist/sync/push.d.ts +12 -0
  125. package/dist/sync/push.d.ts.map +1 -1
  126. package/dist/sync/push.js +69 -24
  127. package/dist/sync/push.js.map +1 -1
  128. package/dist/sync/status.d.ts +21 -1
  129. package/dist/sync/status.d.ts.map +1 -1
  130. package/dist/sync/status.js +66 -6
  131. package/dist/sync/status.js.map +1 -1
  132. package/dist/sync/taxonomies.d.ts +14 -5
  133. package/dist/sync/taxonomies.d.ts.map +1 -1
  134. package/dist/sync/taxonomies.js +142 -9
  135. package/dist/sync/taxonomies.js.map +1 -1
  136. package/dist/utils/config.d.ts +23 -0
  137. package/dist/utils/config.d.ts.map +1 -1
  138. package/dist/utils/config.js +41 -4
  139. package/dist/utils/config.js.map +1 -1
  140. package/dist/utils/frontmatter.d.ts +51 -2
  141. package/dist/utils/frontmatter.d.ts.map +1 -1
  142. package/dist/utils/frontmatter.js +234 -9
  143. package/dist/utils/frontmatter.js.map +1 -1
  144. package/dist/utils/profile.d.ts +3 -3
  145. package/dist/utils/profile.d.ts.map +1 -1
  146. package/dist/utils/profile.js +105 -8
  147. package/dist/utils/profile.js.map +1 -1
  148. package/package.json +1 -1
@@ -0,0 +1,221 @@
1
+ /*
2
+ * Copyright (C) 2026 SPORT-SERVICE RS★R
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ * of this software and associated documentation files (the "Software"), to deal
6
+ * in the Software without restriction, including without limitation the rights
7
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ * copies of the Software, and to permit persons to whom the Software is
9
+ * furnished to do so, subject to the following conditions:
10
+ *
11
+ * The above copyright notice and this permission notice shall be included in all
12
+ * copies or substantial portions of the Software.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ * SOFTWARE.
21
+ */
22
+ import fs from 'node:fs';
23
+ import path from 'node:path';
24
+ import { parseMarkdown } from '../utils/frontmatter.js';
25
+ import { calculateHash, CONFLICTS_SUBDIR } from './pull.js';
26
+ import { resolveArticleTarget } from './diff.js';
27
+ import { ApiError } from '../client/error.js';
28
+ export class UnpushedModificationsError extends Error {
29
+ code = 'UNPUSHED_CHANGES_PROTECTION';
30
+ filePath;
31
+ id;
32
+ suggestion;
33
+ constructor(details) {
34
+ const msg = [
35
+ `❌ ABORT: File contains unpushed local modifications: ${details.filePath}`,
36
+ ` Local changes would be lost permanently.`,
37
+ ` 💡 Suggestion: Run "emit push" (or sync_push) to save changes, or discard them first.`,
38
+ ].join('\n');
39
+ super(msg);
40
+ this.name = 'UnpushedModificationsError';
41
+ this.filePath = details.filePath;
42
+ this.id = details.id;
43
+ this.suggestion = 'Run "emit push" (or sync_push) to save changes, or discard them first.';
44
+ }
45
+ }
46
+ export class PublishedArticleDeletionForbiddenError extends Error {
47
+ code = 'PUBLISHED_ARTICLE_PROTECTION';
48
+ filePath;
49
+ id;
50
+ suggestion;
51
+ constructor(details) {
52
+ const msg = [
53
+ `❌ ABORT: Article is published: ${details.filePath}`,
54
+ ` Deleting a live published article is an irreversible public action.`,
55
+ ` 💡 Suggestion: Pass --allow-delete-published (or allowDeletePublished: true in MCP) to confirm.`,
56
+ ].join('\n');
57
+ super(msg);
58
+ this.name = 'PublishedArticleDeletionForbiddenError';
59
+ this.filePath = details.filePath;
60
+ this.id = details.id;
61
+ this.suggestion =
62
+ 'Pass --allow-delete-published (or allowDeletePublished: true in MCP) to confirm.';
63
+ }
64
+ }
65
+ /**
66
+ * Scans article Markdown body to detect referenced media files in media/.
67
+ */
68
+ export function scanArticleMediaReferences(bodyMarkdown) {
69
+ const references = new Set();
70
+ // 1. Markdown image syntax: ![alt](url)
71
+ const mdRegex = /!\[.*?\]\(([^)\s]+)(?:\s+["'].*?["'])?\)/g;
72
+ let match;
73
+ while ((match = mdRegex.exec(bodyMarkdown)) !== null) {
74
+ const url = match[1].trim();
75
+ if (!url.startsWith('http://') && !url.startsWith('https://') && !url.startsWith('data:')) {
76
+ references.add(url);
77
+ }
78
+ }
79
+ // 2. HTML <img> tags: <img src="...">
80
+ const htmlRegex = /<img[^>]+src=["']([^"']+)["']/gi;
81
+ while ((match = htmlRegex.exec(bodyMarkdown)) !== null) {
82
+ const url = match[1].trim();
83
+ if (!url.startsWith('http://') && !url.startsWith('https://') && !url.startsWith('data:')) {
84
+ references.add(url);
85
+ }
86
+ }
87
+ return Array.from(references).sort();
88
+ }
89
+ /**
90
+ * Safely deletes an article with strict unpushed modification protection,
91
+ * published article protection, automatic rescue backup, and remote API deletion.
92
+ */
93
+ export async function deleteArticle(options) {
94
+ const collection = options.collection || 'posts';
95
+ const { id: targetId, filePath: targetFile } = resolveArticleTarget({
96
+ workspaceRoot: options.workspaceRoot,
97
+ cache: options.cache,
98
+ filePath: options.filePath,
99
+ id: options.id,
100
+ });
101
+ if (!targetFile) {
102
+ throw new Error(`❌ Could not resolve article file path for deletion (id: "${options.id || ''}", filePath: "${options.filePath || ''}").`);
103
+ }
104
+ const fullLocalPath = path.join(options.workspaceRoot, targetFile);
105
+ if (!fs.existsSync(fullLocalPath)) {
106
+ throw new Error(`❌ Local file not found: ${targetFile}`);
107
+ }
108
+ const rawContent = fs.readFileSync(fullLocalPath, 'utf8');
109
+ const parsed = parseMarkdown(rawContent);
110
+ const articleId = parsed.frontmatter.id || targetId || 'unknown';
111
+ const articleStatus = parsed.frontmatter.status || 'draft';
112
+ const articleSlug = parsed.frontmatter.slug || '';
113
+ const articleTitle = parsed.frontmatter.title || articleSlug;
114
+ const bodyLineCount = parsed.body.split('\n').length;
115
+ const referencedMedia = scanArticleMediaReferences(parsed.body);
116
+ // Safety Guard 1: Unpushed Modifications Protection
117
+ const syncState = options.cache.getSyncState(articleId);
118
+ const currentHash = calculateHash(rawContent);
119
+ if (syncState && syncState.localHash !== currentHash) {
120
+ throw new UnpushedModificationsError({ filePath: targetFile, id: articleId });
121
+ }
122
+ // Safety Guard 2: Published Article Deletion Protection
123
+ if (articleStatus === 'published' && !options.allowDeletePublished) {
124
+ throw new PublishedArticleDeletionForbiddenError({ filePath: targetFile, id: articleId });
125
+ }
126
+ // Dry-run mode: return preview without modifying anything
127
+ if (options.dryRun) {
128
+ const mediaNote = referencedMedia.length > 0
129
+ ? ` Note: ${referencedMedia.length} referenced media file(s) would be preserved in media/.`
130
+ : '';
131
+ return {
132
+ success: true,
133
+ dryRun: true,
134
+ id: articleId,
135
+ slug: articleSlug,
136
+ title: articleTitle,
137
+ status: articleStatus,
138
+ filePath: targetFile,
139
+ bodyLineCount,
140
+ referencedMedia,
141
+ remoteDeleted: false,
142
+ message: `[DRY-RUN] Article ${articleId} (${targetFile}) would be deleted.${mediaNote}`,
143
+ };
144
+ }
145
+ // Remote API deletion (DELETE /_emdash/api/content/{collection}/{id})
146
+ // Attempt remote deletion first before touching local files or rescue directories
147
+ let remoteDeleted = false;
148
+ if (options.origin && options.token && articleId && articleId !== 'unknown') {
149
+ const fetchFn = options.fetchFn || globalThis.fetch;
150
+ const url = new URL(`/_emdash/api/content/${collection}/${articleId}`, options.origin);
151
+ let res;
152
+ try {
153
+ res = await fetchFn(url.toString(), {
154
+ method: 'DELETE',
155
+ headers: {
156
+ Authorization: `Bearer ${options.token}`,
157
+ Accept: 'application/json',
158
+ },
159
+ });
160
+ }
161
+ catch (fetchErr) {
162
+ throw new ApiError({
163
+ endpoint: url.pathname,
164
+ code: 'REMOTE_DELETE_FAILED',
165
+ status: 0,
166
+ message: `Network error during remote DELETE: ${fetchErr instanceof Error ? fetchErr.message : String(fetchErr)}`,
167
+ suggestion: 'Verify network connectivity, origin URL, and remote server status.',
168
+ });
169
+ }
170
+ if (res.ok || res.status === 204) {
171
+ remoteDeleted = true;
172
+ }
173
+ else if (res.status === 404) {
174
+ // Already absent on remote server
175
+ remoteDeleted = false;
176
+ }
177
+ else {
178
+ // Remote deletion failed: abort before deleting local file or writing rescue to prevent desync
179
+ const errText = await res.text().catch(() => '');
180
+ throw new ApiError({
181
+ endpoint: url.pathname,
182
+ code: 'REMOTE_DELETE_FAILED',
183
+ status: res.status,
184
+ message: errText || `Remote DELETE failed with status ${res.status}`,
185
+ suggestion: 'Verify network connectivity, token permissions, and article status.',
186
+ });
187
+ }
188
+ }
189
+ // Rescue Backup: save copy to <collection>/conflicts/<name>.deleted.md only after remote is confirmed
190
+ const conflictsDir = path.join(options.workspaceRoot, collection, CONFLICTS_SUBDIR);
191
+ fs.mkdirSync(conflictsDir, { recursive: true });
192
+ const filenameBase = path.basename(targetFile, '.md');
193
+ const rescueRelPath = path.join(collection, CONFLICTS_SUBDIR, `${filenameBase}.deleted.md`);
194
+ const rescueFullPath = path.join(options.workspaceRoot, rescueRelPath);
195
+ fs.writeFileSync(rescueFullPath, rawContent, 'utf8');
196
+ // Delete local file from disk
197
+ fs.unlinkSync(fullLocalPath);
198
+ // Remove cache DB records (entries, base_snapshots, sync_state)
199
+ options.cache.deleteEntry(articleId);
200
+ const mediaMsg = referencedMedia.length > 0
201
+ ? `\nℹ️ Note: ${referencedMedia.length} referenced media file(s) remain safely preserved in media/.`
202
+ : '';
203
+ return {
204
+ success: true,
205
+ dryRun: false,
206
+ id: articleId,
207
+ slug: articleSlug,
208
+ title: articleTitle,
209
+ status: articleStatus,
210
+ filePath: targetFile,
211
+ bodyLineCount,
212
+ referencedMedia,
213
+ rescueFilePath: rescueRelPath,
214
+ remoteDeleted,
215
+ message: `✅ Successfully deleted article ${articleId} (${targetFile}).` +
216
+ `\n🩹 Rescue backup saved to: ${rescueRelPath}` +
217
+ (remoteDeleted ? '\n🌐 Remote article deleted from server.' : '') +
218
+ mediaMsg,
219
+ };
220
+ }
221
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/sync/delete.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/sync/diff.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAKpD,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,qBAAqB,CAkBhG;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,cAAc,GAAG,WAAW,CAAC;IAC3E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,qBAAqB,CAqGxB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3E,UAAU,CAiDZ"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/sync/diff.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAMpD,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,qBAAqB,CAkBhG;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,cAAc,GAAG,WAAW,CAAC;IAC3E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,qBAAqB,CAwGxB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3E,UAAU,CAiDZ"}
package/dist/sync/diff.js CHANGED
@@ -25,6 +25,7 @@ import { diffPatch } from 'node-diff3';
25
25
  import { extractUlidFromFilename } from '../utils/naming.js';
26
26
  import { serializeMarkdown } from '../utils/frontmatter.js';
27
27
  import { calculateHash } from './pull.js';
28
+ import { loadLocalTaxonomyCandidates } from './taxonomies.js';
28
29
  /**
29
30
  * Resolves a paired article ULID and workspace-relative file path from either `filePath` or `id`.
30
31
  * Shared across CLI (`emit diff`) and MCP (`sync_diff`, `sync_pull`).
@@ -108,9 +109,11 @@ export function inspectArticleDiff(options) {
108
109
  const currentHash = calculateHash(localContent);
109
110
  const isModified = syncState ? syncState.localHash !== currentHash : true;
110
111
  // base_snapshots.frontmatterYaml stores a JSON-encoded Frontmatter (see pull.ts / push.ts).
111
- // Rebuild the base document with the exact same serializer used to write the local file so the
112
- // diff compares canonical Markdown against canonical Markdown instead of JSON against YAML.
113
- const baseFullMarkdown = serializeMarkdown(JSON.parse(baseSnapshot.frontmatterYaml), baseSnapshot.bodyMarkdown);
112
+ // Rebuild the base document with the exact same serializer and taxonomy candidates used to write the local file so the
113
+ // diff compares canonical Markdown against canonical Markdown instead of JSON against YAML,
114
+ // preventing phantom diffs caused by taxonomy inline comments.
115
+ const candidates = loadLocalTaxonomyCandidates(options.workspaceRoot);
116
+ const baseFullMarkdown = serializeMarkdown(JSON.parse(baseSnapshot.frontmatterYaml), baseSnapshot.bodyMarkdown, candidates);
114
117
  const diffResult = computeContextDiff(baseFullMarkdown, localContent, {
115
118
  baseLabel: `base [rev: ${baseSnapshot.rev}]`,
116
119
  localLabel: `local [${targetFile}]`,
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/sync/diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/sync/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { CacheDatabase } from '../db/cache.js';
2
+ import type { EmitConfig } from '../utils/config.js';
3
+ export type CheckStatus = 'ok' | 'warning' | 'error';
4
+ export interface DoctorCheckResult {
5
+ id: string;
6
+ name: string;
7
+ status: CheckStatus;
8
+ message: string;
9
+ details?: Record<string, unknown> | Array<unknown>;
10
+ }
11
+ export interface DoctorReport {
12
+ workspace: string;
13
+ emitVersion: string;
14
+ createdWithVersion?: string;
15
+ lastSyncedVersion?: string;
16
+ overallStatus: 'healthy' | 'warnings' | 'errors';
17
+ checks: DoctorCheckResult[];
18
+ }
19
+ export interface RunWorkspaceDoctorOptions {
20
+ workspaceRoot: string;
21
+ cache: CacheDatabase;
22
+ config: EmitConfig;
23
+ profileName?: string;
24
+ profileOrigin?: string;
25
+ collection?: string;
26
+ }
27
+ /**
28
+ * Runs a comprehensive health diagnostic across the workspace.
29
+ */
30
+ export declare function runWorkspaceDoctor(options: RunWorkspaceDoctorOptions): Promise<DoctorReport>;
31
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/sync/doctor.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOrD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjD,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,YAAY,CAAC,CAgMvB"}
@@ -0,0 +1,224 @@
1
+ /*
2
+ * Copyright (C) 2026 SPORT-SERVICE RS★R
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ * of this software and associated documentation files (the "Software"), to deal
6
+ * in the Software without restriction, including without limitation the rights
7
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ * copies of the Software, and to permit persons to whom the Software is
9
+ * furnished to do so, subject to the following conditions:
10
+ *
11
+ * The above copyright notice and this permission notice shall be included in all
12
+ * copies or substantial portions of the Software.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ * SOFTWARE.
21
+ */
22
+ import fs from 'node:fs';
23
+ import path from 'node:path';
24
+ import { getPackageVersion } from '../utils/version.js';
25
+ import { parseMarkdown, lenientRepairMarkdownFrontmatter } from '../utils/frontmatter.js';
26
+ import { listConflicts } from './conflicts.js';
27
+ import { getWorkspaceStatus } from './status.js';
28
+ import { scanArticleMediaReferences } from './delete.js';
29
+ /**
30
+ * Runs a comprehensive health diagnostic across the workspace.
31
+ */
32
+ export async function runWorkspaceDoctor(options) {
33
+ const collection = options.collection || options.config.defaultCollection || 'posts';
34
+ const checks = [];
35
+ const currentVersion = getPackageVersion();
36
+ // 1. Version Compatibility Check
37
+ const createdWith = options.config.createdWithVersion;
38
+ const lastSynced = options.config.lastSyncedVersion;
39
+ checks.push({
40
+ id: 'version_compatibility',
41
+ name: 'Version Compatibility',
42
+ status: 'ok',
43
+ message: createdWith
44
+ ? `Workspace running v${currentVersion} (created with v${createdWith}, last synced with v${lastSynced || createdWith})`
45
+ : `Workspace running v${currentVersion} (compatible)`,
46
+ details: {
47
+ currentVersion,
48
+ createdWithVersion: createdWith,
49
+ lastSyncedVersion: lastSynced,
50
+ },
51
+ });
52
+ // 2. Origin & Profile Consistency Check
53
+ const configOrigin = options.config.origin;
54
+ const profileOrigin = options.profileOrigin;
55
+ if (profileOrigin && configOrigin && configOrigin !== profileOrigin) {
56
+ checks.push({
57
+ id: 'origin_consistency',
58
+ name: 'Origin Consistency',
59
+ status: 'warning',
60
+ message: `Config origin (${configOrigin}) differs from resolved profile origin (${profileOrigin}). Profile origin will be preferred for sync.`,
61
+ details: { configOrigin, profileOrigin, profileName: options.profileName },
62
+ });
63
+ }
64
+ else {
65
+ checks.push({
66
+ id: 'origin_consistency',
67
+ name: 'Origin Consistency',
68
+ status: 'ok',
69
+ message: `Origins are consistent (${profileOrigin || configOrigin || 'default'}).`,
70
+ });
71
+ }
72
+ // 3. Frontmatter Syntax & Schema Integrity Check
73
+ const invalidFiles = [];
74
+ let totalArticles = 0;
75
+ for (const status of ['draft', 'published']) {
76
+ const dir = path.join(options.workspaceRoot, collection, status);
77
+ if (!fs.existsSync(dir))
78
+ continue;
79
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith('.md'));
80
+ for (const file of files) {
81
+ totalArticles++;
82
+ const fullPath = path.join(dir, file);
83
+ try {
84
+ const content = fs.readFileSync(fullPath, 'utf8');
85
+ try {
86
+ parseMarkdown(content);
87
+ }
88
+ catch {
89
+ // Attempt lenient parse
90
+ const healed = lenientRepairMarkdownFrontmatter(content);
91
+ if (healed) {
92
+ parseMarkdown(healed);
93
+ }
94
+ else {
95
+ throw new Error('Unrecoverable parse error');
96
+ }
97
+ }
98
+ }
99
+ catch {
100
+ invalidFiles.push(path.join(collection, status, file));
101
+ }
102
+ }
103
+ }
104
+ if (invalidFiles.length > 0) {
105
+ checks.push({
106
+ id: 'frontmatter_integrity',
107
+ name: 'Frontmatter Integrity',
108
+ status: 'error',
109
+ message: `${invalidFiles.length} article(s) have unrecoverable frontmatter syntax errors.`,
110
+ details: invalidFiles,
111
+ });
112
+ }
113
+ else {
114
+ checks.push({
115
+ id: 'frontmatter_integrity',
116
+ name: 'Frontmatter Integrity',
117
+ status: 'ok',
118
+ message: `All ${totalArticles} article(s) have valid frontmatter syntax.`,
119
+ });
120
+ }
121
+ // 4. Conflicts & Quarantine Check
122
+ const conflictItems = listConflicts(options.workspaceRoot, collection);
123
+ if (conflictItems.length > 0) {
124
+ const conflictCount = conflictItems.filter((i) => i.type === 'conflict').length;
125
+ const deletedCount = conflictItems.filter((i) => i.type === 'deleted').length;
126
+ checks.push({
127
+ id: 'conflicts_quarantine',
128
+ name: 'Conflicts & Quarantine',
129
+ status: 'warning',
130
+ message: `${conflictItems.length} quarantined file(s) found in ${collection}/conflicts/ (${conflictCount} sync conflicts, ${deletedCount} deletion rescue copies). Run "emit conflicts list" to inspect.`,
131
+ details: conflictItems.map((c) => ({
132
+ filePath: c.filePath,
133
+ type: c.type,
134
+ slug: c.slug,
135
+ })),
136
+ });
137
+ }
138
+ else {
139
+ checks.push({
140
+ id: 'conflicts_quarantine',
141
+ name: 'Conflicts & Quarantine',
142
+ status: 'ok',
143
+ message: `No unresolved conflicts or rescue backups in ${collection}/conflicts/.`,
144
+ });
145
+ }
146
+ // 5. Sync Status & Pending Modifications Check
147
+ const wsStatus = getWorkspaceStatus(options.workspaceRoot, options.cache, collection);
148
+ if (wsStatus.summary.modified > 0 || wsStatus.summary.untracked > 0) {
149
+ checks.push({
150
+ id: 'sync_status',
151
+ name: 'Sync Status',
152
+ status: 'warning',
153
+ message: `${wsStatus.summary.modified} modified and ${wsStatus.summary.untracked} untracked article(s) pending push.`,
154
+ details: {
155
+ total: wsStatus.summary.total,
156
+ synced: wsStatus.summary.synced,
157
+ modified: wsStatus.summary.modified,
158
+ untracked: wsStatus.summary.untracked,
159
+ invalid: wsStatus.summary.invalid,
160
+ },
161
+ });
162
+ }
163
+ else {
164
+ checks.push({
165
+ id: 'sync_status',
166
+ name: 'Sync Status',
167
+ status: 'ok',
168
+ message: `All ${wsStatus.summary.synced} tracked article(s) in sync with base snapshots.`,
169
+ });
170
+ }
171
+ // 6. Media References Integrity Check
172
+ const missingMedia = [];
173
+ for (const status of ['draft', 'published']) {
174
+ const dir = path.join(options.workspaceRoot, collection, status);
175
+ if (!fs.existsSync(dir))
176
+ continue;
177
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith('.md'));
178
+ for (const file of files) {
179
+ try {
180
+ const content = fs.readFileSync(path.join(dir, file), 'utf8');
181
+ const refs = scanArticleMediaReferences(content);
182
+ for (const ref of refs) {
183
+ const mediaFullPath = path.join(options.workspaceRoot, ref);
184
+ if (!fs.existsSync(mediaFullPath)) {
185
+ missingMedia.push(`${ref} (referenced by ${path.join(collection, status, file)})`);
186
+ }
187
+ }
188
+ }
189
+ catch {
190
+ // Skip unreadable files
191
+ }
192
+ }
193
+ }
194
+ if (missingMedia.length > 0) {
195
+ checks.push({
196
+ id: 'media_references',
197
+ name: 'Media References',
198
+ status: 'warning',
199
+ message: `${missingMedia.length} referenced media file(s) are missing from disk.`,
200
+ details: missingMedia,
201
+ });
202
+ }
203
+ else {
204
+ checks.push({
205
+ id: 'media_references',
206
+ name: 'Media References',
207
+ status: 'ok',
208
+ message: 'All referenced local media files exist on disk.',
209
+ });
210
+ }
211
+ // Determine overall status
212
+ const hasErrors = checks.some((c) => c.status === 'error');
213
+ const hasWarnings = checks.some((c) => c.status === 'warning');
214
+ const overallStatus = hasErrors ? 'errors' : hasWarnings ? 'warnings' : 'healthy';
215
+ return {
216
+ workspace: options.workspaceRoot,
217
+ emitVersion: currentVersion,
218
+ createdWithVersion: createdWith,
219
+ lastSyncedVersion: lastSynced,
220
+ overallStatus,
221
+ checks,
222
+ };
223
+ }
224
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/sync/doctor.ts"],"names":[],"mappings":"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"}
@@ -27,11 +27,17 @@ export interface PromoteDraftMediaOptions {
27
27
  * Returns the workspace-relative path of the promoted binary file.
28
28
  */
29
29
  export declare function promoteDraftMediaFile(options: PromoteDraftMediaOptions): string;
30
+ /**
31
+ * Collects all media ULIDs referenced by an article content (frontmatter featuredImage + body images).
32
+ */
33
+ export declare function collectArticleReferencedMediaIds(content: string): string[];
30
34
  export interface PullMediaOptions {
31
35
  workspaceRoot: string;
32
36
  origin: string;
33
37
  token: string;
34
38
  refreshToken?: string;
39
+ article?: string;
40
+ collection?: string;
35
41
  limit?: number;
36
42
  all?: boolean;
37
43
  downloadFiles?: boolean;
@@ -43,7 +49,23 @@ export interface PullMediaResult {
43
49
  downloaded: number;
44
50
  skipped: number;
45
51
  deleted?: number;
52
+ failed?: number;
53
+ articleId?: string;
54
+ mediaIds?: string[];
46
55
  }
56
+ /**
57
+ * Pulls media referenced by a specific article (by ULID or file path).
58
+ */
59
+ export declare function pullArticleMedia(options: {
60
+ workspaceRoot: string;
61
+ origin: string;
62
+ token: string;
63
+ refreshToken?: string;
64
+ article: string;
65
+ collection?: string;
66
+ downloadFiles?: boolean;
67
+ fetchFn?: typeof fetch;
68
+ }): Promise<PullMediaResult>;
47
69
  /**
48
70
  * Pulls media metadata and files from EmDash API into media/ directory with cursor pagination.
49
71
  * media/<id>-<filename>.yaml
@@ -1 +1 @@
1
- {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/sync/media.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAC5C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoDzB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA4CD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CA0C/E;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAsNnF"}
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/sync/media.ts"],"names":[],"mappings":"AAsCA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAC5C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoDzB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA4CD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CA0C/E;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAwE1E;AAoID,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,GAAG,OAAO,CAAC,eAAe,CAAC,CA2I3B;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkInF"}