emdash-emit 0.1.18 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +249 -1
- package/README.md +22 -11
- package/dist/cli/commands/conflicts.d.ts.map +1 -1
- package/dist/cli/commands/conflicts.js +2 -22
- package/dist/cli/commands/conflicts.js.map +1 -1
- package/dist/cli/commands/delete.d.ts.map +1 -1
- package/dist/cli/commands/delete.js +1 -13
- package/dist/cli/commands/delete.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +1 -13
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/media.d.ts.map +1 -1
- package/dist/cli/commands/media.js +1 -13
- package/dist/cli/commands/media.js.map +1 -1
- package/dist/cli/commands/new.d.ts.map +1 -1
- package/dist/cli/commands/new.js +31 -13
- package/dist/cli/commands/new.js.map +1 -1
- package/dist/cli/commands/pull.d.ts +1 -1
- package/dist/cli/commands/pull.d.ts.map +1 -1
- package/dist/cli/commands/pull.js +110 -79
- package/dist/cli/commands/pull.js.map +1 -1
- package/dist/cli/commands/push.d.ts +1 -1
- package/dist/cli/commands/push.d.ts.map +1 -1
- package/dist/cli/commands/push.js +32 -90
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +7 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/context.d.ts +12 -0
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +27 -1
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/report-failure.d.ts +6 -0
- package/dist/cli/report-failure.d.ts.map +1 -0
- package/dist/cli/report-failure.js +71 -0
- package/dist/cli/report-failure.js.map +1 -0
- package/dist/client/api.d.ts +20 -0
- package/dist/client/api.d.ts.map +1 -1
- package/dist/client/api.js +90 -1
- package/dist/client/api.js.map +1 -1
- package/dist/client/lock.js.map +1 -1
- package/dist/client/mapper.js.map +1 -1
- package/dist/client/media.d.ts.map +1 -1
- package/dist/client/media.js.map +1 -1
- package/dist/db/baseline.d.ts +19 -3
- package/dist/db/baseline.d.ts.map +1 -1
- package/dist/db/baseline.js +27 -2
- package/dist/db/baseline.js.map +1 -1
- package/dist/db/cache.d.ts +7 -3
- package/dist/db/cache.d.ts.map +1 -1
- package/dist/db/cache.js +24 -295
- package/dist/db/cache.js.map +1 -1
- package/dist/db/migrations.d.ts +7 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +320 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/mcp/heartbeat.d.ts +1 -34
- package/dist/mcp/heartbeat.d.ts.map +1 -1
- package/dist/mcp/heartbeat.js +1 -113
- package/dist/mcp/heartbeat.js.map +1 -1
- package/dist/mcp/tool-errors.d.ts +12 -1
- package/dist/mcp/tool-errors.d.ts.map +1 -1
- package/dist/mcp/tool-errors.js +29 -0
- package/dist/mcp/tool-errors.js.map +1 -1
- package/dist/mcp/tools/sync-conflicts.d.ts.map +1 -1
- package/dist/mcp/tools/sync-conflicts.js +46 -58
- package/dist/mcp/tools/sync-conflicts.js.map +1 -1
- package/dist/mcp/tools/sync-delete.d.ts.map +1 -1
- package/dist/mcp/tools/sync-delete.js +18 -30
- package/dist/mcp/tools/sync-delete.js.map +1 -1
- package/dist/mcp/tools/sync-diff.d.ts.map +1 -1
- package/dist/mcp/tools/sync-diff.js +10 -31
- package/dist/mcp/tools/sync-diff.js.map +1 -1
- package/dist/mcp/tools/sync-doctor.d.ts.map +1 -1
- package/dist/mcp/tools/sync-doctor.js +18 -30
- package/dist/mcp/tools/sync-doctor.js.map +1 -1
- package/dist/mcp/tools/sync-media-search.d.ts.map +1 -1
- package/dist/mcp/tools/sync-media-search.js +40 -52
- package/dist/mcp/tools/sync-media-search.js.map +1 -1
- package/dist/mcp/tools/sync-new.d.ts.map +1 -1
- package/dist/mcp/tools/sync-new.js +54 -34
- package/dist/mcp/tools/sync-new.js.map +1 -1
- package/dist/mcp/tools/sync-pull.d.ts.map +1 -1
- package/dist/mcp/tools/sync-pull.js +194 -220
- package/dist/mcp/tools/sync-pull.js.map +1 -1
- package/dist/mcp/tools/sync-push.d.ts.map +1 -1
- package/dist/mcp/tools/sync-push.js +64 -84
- package/dist/mcp/tools/sync-push.js.map +1 -1
- package/dist/mcp/tools/sync-status.d.ts.map +1 -1
- package/dist/mcp/tools/sync-status.js +4 -13
- package/dist/mcp/tools/sync-status.js.map +1 -1
- package/dist/sync/baseline-reconstruction.d.ts +43 -0
- package/dist/sync/baseline-reconstruction.d.ts.map +1 -0
- package/dist/sync/baseline-reconstruction.js +103 -0
- package/dist/sync/baseline-reconstruction.js.map +1 -0
- package/dist/sync/bylines.d.ts +5 -0
- package/dist/sync/bylines.d.ts.map +1 -1
- package/dist/sync/bylines.js +29 -0
- package/dist/sync/bylines.js.map +1 -1
- package/dist/sync/conflicts.d.ts.map +1 -1
- package/dist/sync/conflicts.js +21 -4
- package/dist/sync/conflicts.js.map +1 -1
- package/dist/sync/delete.d.ts.map +1 -1
- package/dist/sync/delete.js +12 -1
- package/dist/sync/delete.js.map +1 -1
- package/dist/sync/diff.d.ts.map +1 -1
- package/dist/sync/diff.js +62 -26
- package/dist/sync/diff.js.map +1 -1
- package/dist/sync/doctor.d.ts.map +1 -1
- package/dist/sync/doctor.js +13 -3
- package/dist/sync/doctor.js.map +1 -1
- package/dist/sync/guards.d.ts +1 -1
- package/dist/sync/guards.d.ts.map +1 -1
- package/dist/sync/guards.js +3 -2
- package/dist/sync/guards.js.map +1 -1
- package/dist/sync/media/companions.d.ts.map +1 -1
- package/dist/sync/media/companions.js.map +1 -1
- package/dist/sync/media/naming_mirror.d.ts.map +1 -1
- package/dist/sync/media/naming_mirror.js +11 -2
- package/dist/sync/media/naming_mirror.js.map +1 -1
- package/dist/sync/media/pull_article.d.ts +2 -0
- package/dist/sync/media/pull_article.d.ts.map +1 -1
- package/dist/sync/media/pull_article.js +74 -25
- package/dist/sync/media/pull_article.js.map +1 -1
- package/dist/sync/media/pull_library.d.ts.map +1 -1
- package/dist/sync/media/pull_library.js +34 -61
- package/dist/sync/media/pull_library.js.map +1 -1
- package/dist/sync/media/remote_index.d.ts +16 -1
- package/dist/sync/media/remote_index.d.ts.map +1 -1
- package/dist/sync/media/remote_index.js +2 -2
- package/dist/sync/media/remote_index.js.map +1 -1
- package/dist/sync/merge.d.ts +1 -1
- package/dist/sync/merge.d.ts.map +1 -1
- package/dist/sync/merge.js +50 -17
- package/dist/sync/merge.js.map +1 -1
- package/dist/sync/new.d.ts +11 -0
- package/dist/sync/new.d.ts.map +1 -1
- package/dist/sync/new.js +81 -3
- package/dist/sync/new.js.map +1 -1
- package/dist/sync/orchestrator.d.ts +34 -0
- package/dist/sync/orchestrator.d.ts.map +1 -1
- package/dist/sync/orchestrator.js +89 -80
- package/dist/sync/orchestrator.js.map +1 -1
- package/dist/sync/preflight/image_probe.d.ts +28 -0
- package/dist/sync/preflight/image_probe.d.ts.map +1 -0
- package/dist/sync/preflight/image_probe.js +70 -0
- package/dist/sync/preflight/image_probe.js.map +1 -0
- package/dist/sync/preflight.d.ts +7 -0
- package/dist/sync/preflight.d.ts.map +1 -1
- package/dist/sync/preflight.js +127 -31
- package/dist/sync/preflight.js.map +1 -1
- package/dist/sync/pull/fast_path.d.ts +9 -0
- package/dist/sync/pull/fast_path.d.ts.map +1 -0
- package/dist/sync/pull/fast_path.js +341 -0
- package/dist/sync/pull/fast_path.js.map +1 -0
- package/dist/sync/pull/index.d.ts +15 -0
- package/dist/sync/pull/index.d.ts.map +1 -0
- package/dist/sync/pull/index.js +363 -0
- package/dist/sync/pull/index.js.map +1 -0
- package/dist/sync/pull/list.d.ts +22 -0
- package/dist/sync/pull/list.d.ts.map +1 -0
- package/dist/sync/pull/list.js +175 -0
- package/dist/sync/pull/list.js.map +1 -0
- package/dist/sync/pull/media_stage.d.ts +67 -0
- package/dist/sync/pull/media_stage.d.ts.map +1 -0
- package/dist/sync/pull/media_stage.js +599 -0
- package/dist/sync/pull/media_stage.js.map +1 -0
- package/dist/sync/pull/quarantine.d.ts +22 -0
- package/dist/sync/pull/quarantine.d.ts.map +1 -0
- package/dist/sync/pull/quarantine.js +174 -0
- package/dist/sync/pull/quarantine.js.map +1 -0
- package/dist/sync/pull/types.d.ts +125 -0
- package/dist/sync/pull/types.d.ts.map +1 -0
- package/dist/sync/pull/types.js +23 -0
- package/dist/sync/pull/types.js.map +1 -0
- package/dist/sync/pull.d.ts +1 -114
- package/dist/sync/pull.d.ts.map +1 -1
- package/dist/sync/pull.js +1 -806
- package/dist/sync/pull.js.map +1 -1
- package/dist/sync/push/commit.d.ts +1 -0
- package/dist/sync/push/commit.d.ts.map +1 -1
- package/dist/sync/push/commit.js +58 -31
- package/dist/sync/push/commit.js.map +1 -1
- package/dist/sync/push/index.d.ts.map +1 -1
- package/dist/sync/push/index.js +30 -8
- package/dist/sync/push/index.js.map +1 -1
- package/dist/sync/push/media_stage.d.ts +17 -2
- package/dist/sync/push/media_stage.d.ts.map +1 -1
- package/dist/sync/push/media_stage.js +31 -2
- package/dist/sync/push/media_stage.js.map +1 -1
- package/dist/sync/push/merge_stage.d.ts.map +1 -1
- package/dist/sync/push/merge_stage.js +36 -22
- package/dist/sync/push/merge_stage.js.map +1 -1
- package/dist/sync/push/transport.d.ts +6 -2
- package/dist/sync/push/transport.d.ts.map +1 -1
- package/dist/sync/push/transport.js +5 -5
- package/dist/sync/push/transport.js.map +1 -1
- package/dist/sync/status.d.ts +3 -0
- package/dist/sync/status.d.ts.map +1 -1
- package/dist/sync/status.js +18 -55
- package/dist/sync/status.js.map +1 -1
- package/dist/sync/taxonomies.d.ts +25 -0
- package/dist/sync/taxonomies.d.ts.map +1 -1
- package/dist/sync/taxonomies.js +180 -127
- package/dist/sync/taxonomies.js.map +1 -1
- package/dist/sync/workspace/commit.d.ts +46 -0
- package/dist/sync/workspace/commit.d.ts.map +1 -0
- package/dist/sync/workspace/commit.js +85 -0
- package/dist/sync/workspace/commit.js.map +1 -0
- package/dist/sync/workspace/index.d.ts +1 -0
- package/dist/sync/workspace/index.d.ts.map +1 -1
- package/dist/sync/workspace/index.js +1 -0
- package/dist/sync/workspace/index.js.map +1 -1
- package/dist/utils/disk-spelling.d.ts +26 -0
- package/dist/utils/disk-spelling.d.ts.map +1 -0
- package/dist/utils/disk-spelling.js +51 -0
- package/dist/utils/disk-spelling.js.map +1 -0
- package/dist/utils/draft-revision.d.ts +15 -0
- package/dist/utils/draft-revision.d.ts.map +1 -0
- package/dist/utils/draft-revision.js +36 -0
- package/dist/utils/draft-revision.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +21 -2
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +70 -7
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/mcp-heartbeat.d.ts +36 -0
- package/dist/utils/mcp-heartbeat.d.ts.map +1 -0
- package/dist/utils/mcp-heartbeat.js +126 -0
- package/dist/utils/mcp-heartbeat.js.map +1 -0
- package/dist/utils/media-body-refs.d.ts.map +1 -1
- package/dist/utils/media-body-refs.js +2 -2
- package/dist/utils/media-body-refs.js.map +1 -1
- package/dist/utils/taxonomy-key.d.ts +25 -0
- package/dist/utils/taxonomy-key.d.ts.map +1 -0
- package/dist/utils/taxonomy-key.js +51 -0
- package/dist/utils/taxonomy-key.js.map +1 -0
- package/package.json +1 -1
|
@@ -21,13 +21,15 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import fs from 'node:fs';
|
|
23
23
|
import path from 'node:path';
|
|
24
|
-
import { listRemoteArticles, pullArticle,
|
|
24
|
+
import { listRemoteArticles, pullArticle, createMediaMirrorSession, } from './pull.js';
|
|
25
|
+
import { findLocalFilesByUlid } from './workspace/index.js';
|
|
25
26
|
import { pushArticle } from './push.js';
|
|
26
27
|
import { getWorkspaceStatus } from './status.js';
|
|
28
|
+
import { isLocalFileUnmodified } from './baseline-reconstruction.js';
|
|
27
29
|
import { syncRemoteBylines } from './bylines.js';
|
|
30
|
+
import { loadLocalTaxonomyCandidates, pullTaxonomies } from './taxonomies.js';
|
|
31
|
+
import { pullMedia } from './media.js';
|
|
28
32
|
import { updateConfigSyncedVersion } from '../utils/config.js';
|
|
29
|
-
import { collectRemoteStorageKeys, mirrorReferencedAssetsFromIndex, collectArticleStorageKeys, } from './media.js';
|
|
30
|
-
import { localizeArticleMediaRefs } from '../utils/media-body-refs.js';
|
|
31
33
|
export class SyncPruneConflictError extends Error {
|
|
32
34
|
conflictItems;
|
|
33
35
|
limit;
|
|
@@ -38,6 +40,59 @@ export class SyncPruneConflictError extends Error {
|
|
|
38
40
|
this.limit = limit;
|
|
39
41
|
}
|
|
40
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Orchestrates single article pull including optional taxonomy sync and media library sync.
|
|
45
|
+
* Reusable across CLI and MCP servers to ensure consistent single-article workflow.
|
|
46
|
+
*/
|
|
47
|
+
export async function pullSingleArticle(options) {
|
|
48
|
+
let taxonomiesResult = undefined;
|
|
49
|
+
if (!options.postsOnly) {
|
|
50
|
+
try {
|
|
51
|
+
const taxRes = await pullTaxonomies({
|
|
52
|
+
workspaceRoot: options.workspaceRoot,
|
|
53
|
+
origin: options.origin,
|
|
54
|
+
token: options.token,
|
|
55
|
+
refreshToken: options.refreshToken,
|
|
56
|
+
fetchFn: options.fetchFn,
|
|
57
|
+
});
|
|
58
|
+
if (taxRes.categoriesFailed || taxRes.tagsFailed) {
|
|
59
|
+
taxonomiesResult = {
|
|
60
|
+
categoriesFailed: taxRes.categoriesFailed,
|
|
61
|
+
tagsFailed: taxRes.tagsFailed,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
taxonomiesResult = { error: err.message };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const article = await pullArticle(options.collection, options.targetId, {
|
|
70
|
+
workspaceRoot: options.workspaceRoot,
|
|
71
|
+
cache: options.cache,
|
|
72
|
+
origin: options.origin,
|
|
73
|
+
token: options.token,
|
|
74
|
+
refreshToken: options.refreshToken,
|
|
75
|
+
force: options.force,
|
|
76
|
+
localMediaRefs: options.localMediaRefs,
|
|
77
|
+
mediaSync: options.mediaSync,
|
|
78
|
+
mediaSyncLimit: options.mediaSyncLimit,
|
|
79
|
+
fetchFn: options.fetchFn,
|
|
80
|
+
});
|
|
81
|
+
let libraryMedia = undefined;
|
|
82
|
+
if (options.includeMedia) {
|
|
83
|
+
libraryMedia = await pullMedia({
|
|
84
|
+
workspaceRoot: options.workspaceRoot,
|
|
85
|
+
origin: options.origin,
|
|
86
|
+
token: options.token,
|
|
87
|
+
refreshToken: options.refreshToken,
|
|
88
|
+
limit: options.mediaSyncLimit,
|
|
89
|
+
downloadFiles: options.metadataOnly !== true,
|
|
90
|
+
cache: options.cache,
|
|
91
|
+
fetchFn: options.fetchFn,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return { article, taxonomies: taxonomiesResult, libraryMedia };
|
|
95
|
+
}
|
|
41
96
|
/**
|
|
42
97
|
* Orchestrates batch pulling of articles for a collection.
|
|
43
98
|
* Reusable across CLI and MCP servers to ensure consistent behavior.
|
|
@@ -51,6 +106,20 @@ export async function pullBatch(options) {
|
|
|
51
106
|
cache: options.cache,
|
|
52
107
|
fetchFn: options.fetchFn,
|
|
53
108
|
}).catch(() => options.cache.getBylineMaps());
|
|
109
|
+
const candidates = loadLocalTaxonomyCandidates(options.workspaceRoot);
|
|
110
|
+
const mediaSession = options.mediaSync !== false
|
|
111
|
+
? createMediaMirrorSession({
|
|
112
|
+
workspaceRoot: options.workspaceRoot,
|
|
113
|
+
origin: options.origin,
|
|
114
|
+
token: options.token,
|
|
115
|
+
refreshToken: options.refreshToken,
|
|
116
|
+
cache: options.cache,
|
|
117
|
+
fetchFn: options.fetchFn,
|
|
118
|
+
downloadFiles: true,
|
|
119
|
+
isSharedSession: true,
|
|
120
|
+
limit: options.mediaSyncLimit,
|
|
121
|
+
})
|
|
122
|
+
: undefined;
|
|
54
123
|
const remoteList = await listRemoteArticles(options.collection, {
|
|
55
124
|
origin: options.origin,
|
|
56
125
|
token: options.token,
|
|
@@ -93,8 +162,16 @@ export async function pullBatch(options) {
|
|
|
93
162
|
if (fs.existsSync(fullPath)) {
|
|
94
163
|
try {
|
|
95
164
|
const content = fs.readFileSync(fullPath, 'utf8');
|
|
96
|
-
|
|
97
|
-
|
|
165
|
+
if (!isLocalFileUnmodified({
|
|
166
|
+
workspaceRoot: options.workspaceRoot,
|
|
167
|
+
cache: options.cache,
|
|
168
|
+
id: candidate.id,
|
|
169
|
+
relPath,
|
|
170
|
+
localContent: content,
|
|
171
|
+
syncState: candidate,
|
|
172
|
+
candidates,
|
|
173
|
+
healOnSpellingMatch: false,
|
|
174
|
+
})) {
|
|
98
175
|
unpushedConflicts.push({
|
|
99
176
|
id: candidate.id,
|
|
100
177
|
slug: candidate.slug,
|
|
@@ -147,6 +224,9 @@ export async function pullBatch(options) {
|
|
|
147
224
|
fetchFn: options.fetchFn,
|
|
148
225
|
bylineIdToSlug: bylineMaps.idToSlug,
|
|
149
226
|
bylineSlugToId: bylineMaps.slugToId,
|
|
227
|
+
candidates,
|
|
228
|
+
mediaSync: options.mediaSync,
|
|
229
|
+
mediaSession,
|
|
150
230
|
});
|
|
151
231
|
results.push(res);
|
|
152
232
|
if (res.skipped)
|
|
@@ -207,82 +287,11 @@ export async function pullBatch(options) {
|
|
|
207
287
|
}
|
|
208
288
|
}
|
|
209
289
|
}
|
|
210
|
-
// Local-first media mirror stage
|
|
211
|
-
//
|
|
212
|
-
// only, no binaries — then downloads binaries for exactly those referenced keys, reusing each walked
|
|
213
|
-
// record instead of paying a per-asset `GET /_emdash/api/media/{id}`. Only assets an article actually
|
|
214
|
-
// references are downloaded; the rest of the library is left to `emit pull-media --all`.
|
|
290
|
+
// Local-first media mirror stage: mediaSession mirrors referenced assets during each pullArticle
|
|
291
|
+
// and aggregates deduplicated results. If mediaSync is enabled, finalize batch media summary.
|
|
215
292
|
let mediaResult;
|
|
216
|
-
if (
|
|
217
|
-
|
|
218
|
-
workspaceRoot: options.workspaceRoot,
|
|
219
|
-
origin: options.origin,
|
|
220
|
-
token: options.token,
|
|
221
|
-
refreshToken: options.refreshToken,
|
|
222
|
-
fetchFn: options.fetchFn,
|
|
223
|
-
});
|
|
224
|
-
const referencedKeys = new Set();
|
|
225
|
-
for (const res of results) {
|
|
226
|
-
if (res.deleted || !res.filePath)
|
|
227
|
-
continue;
|
|
228
|
-
const fullPath = path.join(options.workspaceRoot, res.filePath);
|
|
229
|
-
if (!fs.existsSync(fullPath))
|
|
230
|
-
continue;
|
|
231
|
-
for (const descriptor of collectArticleStorageKeys(fs.readFileSync(fullPath, 'utf8'))) {
|
|
232
|
-
referencedKeys.add(descriptor.storageKey);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
const mirrored = await mirrorReferencedAssetsFromIndex(referencedKeys, index, {
|
|
236
|
-
workspaceRoot: options.workspaceRoot,
|
|
237
|
-
origin: options.origin,
|
|
238
|
-
token: options.token,
|
|
239
|
-
refreshToken: options.refreshToken,
|
|
240
|
-
fetchFn: options.fetchFn,
|
|
241
|
-
cache: options.cache,
|
|
242
|
-
});
|
|
243
|
-
// Binaries now exist under `media/`, so re-apply the local-ref spelling to every article that mirrors
|
|
244
|
-
// images. pullArticle wrote them canonical because no mirror existed yet; this pass resolves them to
|
|
245
|
-
// article-relative references only when the mirror is actually present, keeping disk and preview in step
|
|
246
|
-
// without ever touching the baseline hash (which stays canonical). Each file is localized at the depth of
|
|
247
|
-
// its own path, so an article written by a legacy workspace keeps the spelling its bytes already carry.
|
|
248
|
-
if (options.localMediaRefs) {
|
|
249
|
-
for (const res of results) {
|
|
250
|
-
if (res.deleted || !res.filePath)
|
|
251
|
-
continue;
|
|
252
|
-
const fullPath = path.join(options.workspaceRoot, res.filePath);
|
|
253
|
-
if (!fs.existsSync(fullPath))
|
|
254
|
-
continue;
|
|
255
|
-
const current = fs.readFileSync(fullPath, 'utf8');
|
|
256
|
-
const localized = localizeArticleMediaRefs(current, {
|
|
257
|
-
workspaceRoot: options.workspaceRoot,
|
|
258
|
-
articleRelPath: res.filePath,
|
|
259
|
-
fs,
|
|
260
|
-
preferLegacyRef: carriesDepthFreeMediaRef(current),
|
|
261
|
-
});
|
|
262
|
-
if (localized === current)
|
|
263
|
-
continue;
|
|
264
|
-
fs.writeFileSync(fullPath, localized, 'utf8');
|
|
265
|
-
// The pass rewrote the bytes on disk, so the tracked hash must follow them. `sync_state.local_hash`
|
|
266
|
-
// records exactly what the file carries, and a re-spelled article whose hash still describes the
|
|
267
|
-
// canonical form it held moments ago reports itself as an edit nobody made — every status pass would
|
|
268
|
-
// call it modified while diff shows nothing. Only a tracked article needs re-tracking: an untracked
|
|
269
|
-
// one has no baseline to stay honest with. Values are untouched; only the recorded hash advances.
|
|
270
|
-
const tracked = options.cache.getSyncState(res.id);
|
|
271
|
-
if (tracked) {
|
|
272
|
-
options.cache.saveSyncState({ ...tracked, localHash: calculateHash(localized) });
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
mediaResult = {
|
|
277
|
-
walkedCount: index.scannedCount,
|
|
278
|
-
remoteTotalCount: index.totalCount,
|
|
279
|
-
complete: index.complete,
|
|
280
|
-
downloaded: mirrored.downloaded,
|
|
281
|
-
skipped: mirrored.skipped,
|
|
282
|
-
mirroredStorageKeys: [...mirrored.mirroredStorageKeys],
|
|
283
|
-
verifiedStorageKeys: mirrored.verifiedStorageKeys,
|
|
284
|
-
orphanStorageKeys: mirrored.orphanStorageKeys,
|
|
285
|
-
};
|
|
293
|
+
if (mediaSession && results.some((r) => !r.deleted)) {
|
|
294
|
+
mediaResult = await mediaSession.finalizeBatchMediaResult();
|
|
286
295
|
}
|
|
287
296
|
updateConfigSyncedVersion(options.workspaceRoot);
|
|
288
297
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/sync/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,wBAAwB,EACxB,oBAAoB,GAGrB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,WAAW,EAAqC,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,yBAAyB,GAG1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAQvE,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACxC,aAAa,CAAyB;IACtC,KAAK,CAAU;IAEtB,YAAY,OAAe,EAAE,aAAqC,EAAE,KAAc;QAChF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AA+CD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,6EAA6E;IAC7E,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC;QACzC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;IAE9C,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,UAAU,EAAE;QAC9D,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC;IAC5C,MAAM,iBAAiB,GAAgB,EAAE,CAAC;IAE1C,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACvD,MAAM,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QAE7C,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;YACtC,MAAM,mBAAmB,GACvB,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;gBACjE,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;YAE/D,IAAI,CAAC,mBAAmB;gBAAE,SAAS;YAEnC,IAAI,YAAY,KAAK,KAAK,IAAI,SAAS,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBAChE,SAAS;YACX,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,kHAAkH;QAClH,MAAM,iBAAiB,GAA2B,EAAE,CAAC;QACrD,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;YAC1C,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS;gBACrC,SAAS,CAAC,aAAa;gBACvB,GAAG,oBAAoB,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;aACjF,CAAC,CAAC;YACH,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;wBAClD,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;wBAC3C,IAAI,WAAW,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC;4BACxC,iBAAiB,CAAC,IAAI,CAAC;gCACrB,EAAE,EAAE,SAAS,CAAC,EAAE;gCAChB,IAAI,EAAE,SAAS,CAAC,IAAI;gCACpB,QAAQ,EAAE,OAAO;6BAClB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,+BAA+B;oBACjC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1E,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3F,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,MAAM,OAAO,GACX,iBAAiB,iBAAiB,CAAC,MAAM,yBAAyB,gBAAgB,oEAAoE;gBACtJ,sFAAsF;gBACtF,sFAAsF,SAAS,MAAM;gBACrG,2BAA2B;gBAC3B,mEAAmE,SAAS,OAAO;gBACnF,wBAAwB;gBACxB,mDAAmD;gBACnD,wGAAwG;gBACxG,sGAAsG,CAAC;YAEzG,MAAM,IAAI,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,OAAO,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;YACtC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;gBACzD,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,cAAc,EAAE,UAAU,CAAC,QAAQ;gBACnC,cAAc,EAAE,UAAU,CAAC,QAAQ;aACpC,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,IAAI,GAAG,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;;gBACtB,OAAO,EAAE,CAAC;YACf,IAAI,GAAG,CAAC,mBAAmB;gBAAE,SAAS,EAAE,CAAC;YACzC,IAAI,GAAG,CAAC,WAAW;gBAAE,WAAW,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC;YAE3D,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,OAAO,CAAC,UAAU,CAAC;oBACjB,OAAO,EAAE,OAAO,CAAC,MAAM;oBACvB,KAAK,EAAE,UAAU,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM;oBACnD,IAAI,EAAE,GAAG;iBACV,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9F,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAExB,kFAAkF;IAClF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;YAC1C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS;gBACpC,SAAS,CAAC,aAAa;gBACvB,GAAG,oBAAoB,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;aACjF,CAAC,CAAC;YACH,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;gBAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,IAAI,CAAC;wBACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAC1B,CAAC;oBAAC,MAAM,CAAC;wBACP,SAAS;oBACX,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACxC,OAAO,EAAE,CAAC;YAEV,MAAM,aAAa,GAAe;gBAChC,EAAE,EAAE,SAAS,CAAC,EAAE;gBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,QAAQ,EAAE,SAAS,CAAC,aAAa;gBACjC,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;aACd,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAE5B,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,OAAO,CAAC,UAAU,CAAC;oBACjB,OAAO,EAAE,OAAO,CAAC,MAAM;oBACvB,KAAK,EAAE,UAAU,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM;oBACnD,IAAI,EAAE,aAAa;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,wGAAwG;IACxG,uGAAuG;IACvG,qGAAqG;IACrG,sGAAsG;IACtG,yFAAyF;IACzF,IAAI,WAAqC,CAAC;IAC1C,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACnE,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC;YAC3C,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ;gBAAE,SAAS;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACvC,KAAK,MAAM,UAAU,IAAI,yBAAyB,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBACtF,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAwB,MAAM,+BAA+B,CACzE,cAAc,EACd,KAAK,EACL;YACE,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CACF,CAAC;QAEF,sGAAsG;QACtG,qGAAqG;QACrG,yGAAyG;QACzG,0GAA0G;QAC1G,wGAAwG;QACxG,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ;oBAAE,SAAS;gBAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACvC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAClD,MAAM,SAAS,GAAG,wBAAwB,CAAC,OAAO,EAAE;oBAClD,aAAa,EAAE,OAAO,CAAC,aAAa;oBACpC,cAAc,EAAE,GAAG,CAAC,QAAQ;oBAC5B,EAAE;oBACF,eAAe,EAAE,wBAAwB,CAAC,OAAO,CAAC;iBACnD,CAAC,CAAC;gBACH,IAAI,SAAS,KAAK,OAAO;oBAAE,SAAS;gBACpC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBAC9C,oGAAoG;gBACpG,iGAAiG;gBACjG,qGAAqG;gBACrG,oGAAoG;gBACpG,kGAAkG;gBAClG,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnD,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC;QACH,CAAC;QAED,WAAW,GAAG;YACZ,WAAW,EAAE,KAAK,CAAC,YAAY;YAC/B,gBAAgB,EAAE,KAAK,CAAC,UAAU;YAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,mBAAmB,EAAE,CAAC,GAAG,QAAQ,CAAC,mBAAmB,CAAC;YACtD,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;YACjD,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;SAC9C,CAAC;IACJ,CAAC;IAED,yBAAyB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEjD,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,MAAM;QACxB,OAAO;QACP,OAAO;QACP,OAAO;QACP,SAAS;QACT,WAAW;QACX,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,OAAO;KACf,CAAC;AACJ,CAAC;AAqBD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAuB;IACnD,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5F,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,UAAU,KAAK,WAAW,CACnE,CAAC;IAEF,MAAM,YAAY,GAIb,EAAE,CAAC;IACR,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACxC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;YACpB,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACpF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;YACtB,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACtF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAC;YAC3B,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;YAC5F,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC3C,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,yGAAyG;YACzG,+EAA+E;YAC/E,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,MAAM,EAAE,CAAC;IACX,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,MAAM;QACN,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;QAC5C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;QAC/B,OAAO;QACP,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/sync/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
export type LocalImageProbeFailureReason = {
|
|
3
|
+
code: 'MISSING_LOCAL_IMAGE_FILE';
|
|
4
|
+
reason: 'not_found' | 'not_regular_file';
|
|
5
|
+
} | {
|
|
6
|
+
code: 'INVALID_LOCAL_IMAGE_TYPE';
|
|
7
|
+
} | {
|
|
8
|
+
code: 'LOCAL_IMAGE_SIZE_EXCEEDED';
|
|
9
|
+
sizeBytes: number;
|
|
10
|
+
maxBytes: number;
|
|
11
|
+
};
|
|
12
|
+
export type LocalImageProbeResult = {
|
|
13
|
+
ok: true;
|
|
14
|
+
sizeBytes: number;
|
|
15
|
+
} | {
|
|
16
|
+
ok: false;
|
|
17
|
+
failure: LocalImageProbeFailureReason;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Probes a local draft image path for existence, regular file type, supported image MIME extension,
|
|
21
|
+
* and upload size limit (`MAX_MEDIA_UPLOAD_BYTES`, default 50 MiB).
|
|
22
|
+
*
|
|
23
|
+
* Callers that need to check `findAlreadyPromotedMedia` on missing files (such as `runPreflightChecks`)
|
|
24
|
+
* may check `fs.existsSync(absPath)` before invoking this helper; if `absPath` does not exist when
|
|
25
|
+
* `statSync` runs, `ENOENT` is caught and returned as `{ code: 'MISSING_LOCAL_IMAGE_FILE', reason: 'not_found' }`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function probeLocalImageFile(absPath: string, filename: string, maxBytes?: number, customFs?: typeof fs): LocalImageProbeResult;
|
|
28
|
+
//# sourceMappingURL=image_probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image_probe.d.ts","sourceRoot":"","sources":["../../../src/sync/preflight/image_probe.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,MAAM,MAAM,4BAA4B,GACpC;IAAE,IAAI,EAAE,0BAA0B,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,kBAAkB,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,0BAA0B,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,2BAA2B,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,MAAM,MAAM,qBAAqB,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,4BAA4B,CAAA;CAAE,CAAC;AAEzF;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAA+B,EACzC,QAAQ,GAAE,OAAO,EAAO,GACvB,qBAAqB,CAoCvB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
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 { MAX_MEDIA_UPLOAD_BYTES, resolveImageMimeType } from '../../client/media.js';
|
|
24
|
+
/**
|
|
25
|
+
* Probes a local draft image path for existence, regular file type, supported image MIME extension,
|
|
26
|
+
* and upload size limit (`MAX_MEDIA_UPLOAD_BYTES`, default 50 MiB).
|
|
27
|
+
*
|
|
28
|
+
* Callers that need to check `findAlreadyPromotedMedia` on missing files (such as `runPreflightChecks`)
|
|
29
|
+
* may check `fs.existsSync(absPath)` before invoking this helper; if `absPath` does not exist when
|
|
30
|
+
* `statSync` runs, `ENOENT` is caught and returned as `{ code: 'MISSING_LOCAL_IMAGE_FILE', reason: 'not_found' }`.
|
|
31
|
+
*/
|
|
32
|
+
export function probeLocalImageFile(absPath, filename, maxBytes = MAX_MEDIA_UPLOAD_BYTES, customFs = fs) {
|
|
33
|
+
let stat;
|
|
34
|
+
try {
|
|
35
|
+
stat = customFs.statSync(absPath);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
if (err?.code === 'ENOENT') {
|
|
39
|
+
return {
|
|
40
|
+
ok: false,
|
|
41
|
+
failure: { code: 'MISSING_LOCAL_IMAGE_FILE', reason: 'not_found' },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
if (!stat.isFile()) {
|
|
47
|
+
return {
|
|
48
|
+
ok: false,
|
|
49
|
+
failure: { code: 'MISSING_LOCAL_IMAGE_FILE', reason: 'not_regular_file' },
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (!resolveImageMimeType(filename)) {
|
|
53
|
+
return {
|
|
54
|
+
ok: false,
|
|
55
|
+
failure: { code: 'INVALID_LOCAL_IMAGE_TYPE' },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (stat.size > maxBytes) {
|
|
59
|
+
return {
|
|
60
|
+
ok: false,
|
|
61
|
+
failure: {
|
|
62
|
+
code: 'LOCAL_IMAGE_SIZE_EXCEEDED',
|
|
63
|
+
sizeBytes: stat.size,
|
|
64
|
+
maxBytes,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return { ok: true, sizeBytes: stat.size };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=image_probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image_probe.js","sourceRoot":"","sources":["../../../src/sync/preflight/image_probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAUrF;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,QAAgB,EAChB,QAAQ,GAAW,sBAAsB,EACzC,QAAQ,GAAc,EAAE;IAExB,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,MAAM,EAAE,WAAW,EAAE;aACnE,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,MAAM,EAAE,kBAAkB,EAAE;SAC1E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE;SAC9C,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE;gBACP,IAAI,EAAE,2BAA2B;gBACjC,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC"}
|
package/dist/sync/preflight.d.ts
CHANGED
|
@@ -46,6 +46,13 @@ export interface PreflightError {
|
|
|
46
46
|
message: string;
|
|
47
47
|
suggestion?: string;
|
|
48
48
|
}
|
|
49
|
+
export interface ResolvedDraftPathInfo {
|
|
50
|
+
isInsideDraftsDir: boolean;
|
|
51
|
+
isInsideMediaDir: boolean;
|
|
52
|
+
candidateAbs: string;
|
|
53
|
+
filename: string;
|
|
54
|
+
}
|
|
55
|
+
export declare function resolveDraftImagePath(articleFilePath: string, rawImagePath: string, workspaceRoot?: string): ResolvedDraftPathInfo;
|
|
49
56
|
/**
|
|
50
57
|
* Runs Preflight Guards G2 through G11 against the article to prevent AI misbehavior.
|
|
51
58
|
* (G1 is enforced at the MCP / CLI invocation layer).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/sync/preflight.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/sync/preflight.ts"],"names":[],"mappings":"AAkCA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAOtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,eAAe,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,eAAe,CAAC,EAAE,kBAAkB,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,uFAAuF;IACvF,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AASD,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,MAAM,GACrB,qBAAqB,CAuCvB;AA0MD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,gBAAgB,GACzB,eAAe,CAobjB"}
|
package/dist/sync/preflight.js
CHANGED
|
@@ -24,7 +24,8 @@ import path from 'node:path';
|
|
|
24
24
|
import yaml from 'js-yaml';
|
|
25
25
|
import { extractUlidFromFilename, storageKeyToMarkdownRef } from '../utils/naming.js';
|
|
26
26
|
import { extractMediaUlid } from '../client/mapper.js';
|
|
27
|
-
import {
|
|
27
|
+
import { toRootRelativeMediaUrl } from '../client/media.js';
|
|
28
|
+
import { probeLocalImageFile } from './preflight/image_probe.js';
|
|
28
29
|
import { stripCodeBlocks, verifyOpaqueBlocksUntampered, detectUnsupportedMarkdownSyntax, } from '../client/portable-text.js';
|
|
29
30
|
import { sanitizeTitleForFilename, } from '../utils/frontmatter.js';
|
|
30
31
|
import { MEDIA_FILE_ROUTE_PREFIX, storageKeyFromMirrorRef } from '../utils/media-body-refs.js';
|
|
@@ -37,7 +38,7 @@ const OPAQUE_FENCE_LINE_REGEX = /^<!--ec:block .+ -->$/;
|
|
|
37
38
|
const STANDALONE_IMAGE_LINE_REGEX = /^!\[([^\]]*)\]\(([^)]+)\)$/;
|
|
38
39
|
const REMOTE_OR_DATA_URL_REGEX = /^(?:https?:\/\/|data:|\/_emdash\/api\/media\/file\/)/i;
|
|
39
40
|
const ANY_LOCAL_IMAGE_REGEX = /!\[([^\]]*)\]\((?!https?:\/\/|data:|\/_emdash\/api\/media\/file\/)([^)]+)\)/g;
|
|
40
|
-
function resolveDraftImagePath(articleFilePath, rawImagePath, workspaceRoot) {
|
|
41
|
+
export function resolveDraftImagePath(articleFilePath, rawImagePath, workspaceRoot) {
|
|
41
42
|
const root = workspaceRoot ? path.resolve(workspaceRoot) : '/__emit_virtual_workspace__';
|
|
42
43
|
const articleAbs = path.isAbsolute(articleFilePath)
|
|
43
44
|
? articleFilePath
|
|
@@ -423,29 +424,29 @@ export function runPreflightChecks(filePath, parsed, options) {
|
|
|
423
424
|
});
|
|
424
425
|
continue;
|
|
425
426
|
}
|
|
426
|
-
const
|
|
427
|
-
if (!
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
}
|
|
427
|
+
const probe = probeLocalImageFile(resolved.candidateAbs, resolved.filename);
|
|
428
|
+
if (!probe.ok) {
|
|
429
|
+
if (probe.failure.code === 'MISSING_LOCAL_IMAGE_FILE') {
|
|
430
|
+
errors.push({
|
|
431
|
+
code: 'MISSING_LOCAL_IMAGE_FILE',
|
|
432
|
+
message: `Draft image path is not a regular file: '${rawPath}'.`,
|
|
433
|
+
suggestion: `Ensure "${resolved.filename}" is a valid image file inside "media/drafts/".`,
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
else if (probe.failure.code === 'INVALID_LOCAL_IMAGE_TYPE') {
|
|
437
|
+
errors.push({
|
|
438
|
+
code: 'INVALID_LOCAL_IMAGE_TYPE',
|
|
439
|
+
message: `Unsupported image file extension for draft image: '${resolved.filename}'.`,
|
|
440
|
+
suggestion: 'Use a supported image format (.jpg, .jpeg, .png, .webp, .gif, .avif, .svg).',
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
errors.push({
|
|
445
|
+
code: 'LOCAL_IMAGE_SIZE_EXCEEDED',
|
|
446
|
+
message: `Draft image '${resolved.filename}' (${probe.failure.sizeBytes} bytes) exceeds the maximum allowed upload size of ${probe.failure.maxBytes} bytes (50 MiB).`,
|
|
447
|
+
suggestion: 'Compress or resize the image below 50 MiB before pushing.',
|
|
448
|
+
});
|
|
449
|
+
}
|
|
449
450
|
continue;
|
|
450
451
|
}
|
|
451
452
|
}
|
|
@@ -480,7 +481,7 @@ export function runPreflightChecks(filePath, parsed, options) {
|
|
|
480
481
|
}
|
|
481
482
|
}
|
|
482
483
|
}
|
|
483
|
-
// G10: featuredImage must reference a canonical 26-character media ULID
|
|
484
|
+
// G10: featuredImage must reference a canonical 26-character media ULID, a local draft image, or null.
|
|
484
485
|
// A root-relative or absolute media URL that unambiguously contains a media ULID is
|
|
485
486
|
// accepted with a warning, because Emit resolves it to the canonical ULID on push.
|
|
486
487
|
if (frontmatter.featuredImage !== undefined && frontmatter.featuredImage !== null) {
|
|
@@ -491,11 +492,106 @@ export function runPreflightChecks(filePath, parsed, options) {
|
|
|
491
492
|
warnings.push(`featuredImage '${rawFeaturedImage}' was resolved to the canonical media ULID '${resolved}'. Prefer writing the bare 26-character ULID in frontmatter.`);
|
|
492
493
|
}
|
|
493
494
|
else {
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
495
|
+
const resolvedPath = resolveDraftImagePath(filePath, rawFeaturedImage, options?.workspaceRoot);
|
|
496
|
+
if (resolvedPath.isInsideDraftsDir || resolvedPath.isInsideMediaDir) {
|
|
497
|
+
if (options?.workspaceRoot) {
|
|
498
|
+
// Check if this image was already scanned from body (R2 dedup)
|
|
499
|
+
const existingDraft = draftImages.find((d) => d.resolvedAbsPath === resolvedPath.candidateAbs);
|
|
500
|
+
if (!existingDraft) {
|
|
501
|
+
if (resolvedPath.isInsideDraftsDir) {
|
|
502
|
+
if (!fs.existsSync(resolvedPath.candidateAbs)) {
|
|
503
|
+
const promotedMatch = findAlreadyPromotedMedia(resolvedPath.filename, options.workspaceRoot, options.cache);
|
|
504
|
+
if (promotedMatch) {
|
|
505
|
+
draftImages.push({
|
|
506
|
+
line: `featuredImage: ${rawFeaturedImage}`,
|
|
507
|
+
alt: 'featured image',
|
|
508
|
+
rawPath: rawFeaturedImage,
|
|
509
|
+
filename: resolvedPath.filename,
|
|
510
|
+
resolvedAbsPath: resolvedPath.candidateAbs,
|
|
511
|
+
alreadyPromoted: promotedMatch,
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
errors.push({
|
|
516
|
+
code: 'MISSING_LOCAL_IMAGE_FILE',
|
|
517
|
+
message: `Draft image file specified in featuredImage not found on disk: '${rawFeaturedImage}' (resolved to '${resolvedPath.candidateAbs}', and no promoted asset matching '${resolvedPath.filename}' was found in media/).`,
|
|
518
|
+
suggestion: `Place "${resolvedPath.filename}" inside "media/drafts/", or if it was already promoted, look for a mirror in "media/".`,
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
else {
|
|
523
|
+
const probe = probeLocalImageFile(resolvedPath.candidateAbs, resolvedPath.filename);
|
|
524
|
+
if (!probe.ok) {
|
|
525
|
+
if (probe.failure.code === 'MISSING_LOCAL_IMAGE_FILE') {
|
|
526
|
+
errors.push({
|
|
527
|
+
code: 'MISSING_LOCAL_IMAGE_FILE',
|
|
528
|
+
message: `Draft image path specified in featuredImage is not a regular file: '${rawFeaturedImage}'.`,
|
|
529
|
+
suggestion: `Ensure "${resolvedPath.filename}" is a valid image file inside "media/drafts/".`,
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
else if (probe.failure.code === 'INVALID_LOCAL_IMAGE_TYPE') {
|
|
533
|
+
errors.push({
|
|
534
|
+
code: 'INVALID_LOCAL_IMAGE_TYPE',
|
|
535
|
+
message: `Unsupported image file extension for featuredImage: '${resolvedPath.filename}'.`,
|
|
536
|
+
suggestion: 'Use a supported image format (.jpg, .jpeg, .png, .webp, .gif, .avif, .svg).',
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
errors.push({
|
|
541
|
+
code: 'LOCAL_IMAGE_SIZE_EXCEEDED',
|
|
542
|
+
message: `Draft image specified in featuredImage exceeds the 50 MiB limit: '${resolvedPath.filename}' (${probe.failure.sizeBytes} bytes).`,
|
|
543
|
+
suggestion: 'Compress or resize the image before pushing.',
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
else {
|
|
548
|
+
draftImages.push({
|
|
549
|
+
line: `featuredImage: ${rawFeaturedImage}`,
|
|
550
|
+
alt: 'featured image',
|
|
551
|
+
rawPath: rawFeaturedImage,
|
|
552
|
+
filename: resolvedPath.filename,
|
|
553
|
+
resolvedAbsPath: resolvedPath.candidateAbs,
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
else if (resolvedPath.isInsideMediaDir) {
|
|
559
|
+
// Already-promoted mirror lookup (R3: two-stage lookup)
|
|
560
|
+
let promotedMatch = findAlreadyPromotedMedia(resolvedPath.filename, options.workspaceRoot, options.cache);
|
|
561
|
+
if (!promotedMatch) {
|
|
562
|
+
const directKey = storageKeyFromMirrorRef(rawFeaturedImage, confirmedStorageKeys(options));
|
|
563
|
+
if (directKey) {
|
|
564
|
+
promotedMatch = findPromotedMediaByStorageKey(directKey, options);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
if (promotedMatch) {
|
|
568
|
+
draftImages.push({
|
|
569
|
+
line: `featuredImage: ${rawFeaturedImage}`,
|
|
570
|
+
alt: 'featured image',
|
|
571
|
+
rawPath: rawFeaturedImage,
|
|
572
|
+
filename: resolvedPath.filename,
|
|
573
|
+
resolvedAbsPath: resolvedPath.candidateAbs,
|
|
574
|
+
alreadyPromoted: promotedMatch,
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
errors.push({
|
|
579
|
+
code: 'MISSING_LOCAL_IMAGE_FILE',
|
|
580
|
+
message: `Mirrored media asset specified in featuredImage not found: '${rawFeaturedImage}' (no promoted asset matching '${resolvedPath.filename}' was found in media/ or recorded metadata).`,
|
|
581
|
+
suggestion: 'Ensure the image is mirrored under media/ or run "emit pull-media".',
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
errors.push({
|
|
590
|
+
code: 'INVALID_FEATURED_IMAGE',
|
|
591
|
+
message: `Invalid featuredImage in frontmatter: '${frontmatter.featuredImage}'. It must be a valid 26-character Crockford media ULID, a local draft image path inside "media/drafts/", or null.`,
|
|
592
|
+
suggestion: 'Place the image in "media/drafts/<filename>" (e.g. ../../media/drafts/eyecatch.jpg), or upload first using EmDash Admin or MCP "media_upload" and specify the returned 26-character ULID. To remove the featured image, set featuredImage: null. Local file paths outside "media/" are never allowed.',
|
|
593
|
+
});
|
|
594
|
+
}
|
|
499
595
|
}
|
|
500
596
|
}
|
|
501
597
|
}
|