fix: recover WeChat page thumbnail delivery
Memind CI / Test, build, and release guards (pull_request) Successful in 5m1s

This commit is contained in:
john
2026-07-22 11:51:15 +08:00
parent 57d2c14fca
commit cb62b36cd5
13 changed files with 366 additions and 26 deletions
+46 -4
View File
@@ -6,7 +6,11 @@ import { developerToolsFromPolicy } from './capabilities.mjs';
import { mergeMessageContent } from './message-stream.mjs';
import { reconcileAgentSession } from './session-reconcile.mjs';
import { resolveSessionAccess } from './session-broker.mjs';
import { isStubPublicHtmlContent, materializeMissingPublicHtmlWrites } from './mindspace-public-finish-sync.mjs';
import {
extractPublicHtmlWriteArtifacts,
isStubPublicHtmlContent,
materializeMissingPublicHtmlWrites,
} from './mindspace-public-finish-sync.mjs';
import { loadWechatMpConfig } from './wechat-mp-config.mjs';
import { buildPublicUrl, PUBLISH_ROOT_DIR } from './user-publish.mjs';
import {
@@ -41,6 +45,8 @@ import {
import { selectSendableHtmlArtifacts } from './wechat/verify/page-artifact.mjs';
import {
collectWechatGeneratedImages,
repairUnambiguousFreshWechatPageThumbnail,
summarizeFreshWechatThumbnailVerification,
verifyFreshWechatPageThumbnails,
} from './wechat/verify/generated-thumbnail.mjs';
import { resolveBillingTokenState } from './billing-token-state.mjs';
@@ -1513,6 +1519,7 @@ export function createWechatMpService({
};
}
const requireFreshPageThumbnail = config.requireFreshPageThumbnail === true;
const repairFreshPageThumbnail = config.repairFreshPageThumbnail === true;
config = {
...loadWechatMpConfig({}),
...config,
@@ -1531,6 +1538,7 @@ export function createWechatMpService({
? config.mediaAnalysisGrayUsers
: [],
requireFreshPageThumbnail,
repairFreshPageThumbnail,
asrTarget: config.asrTarget || DEFAULT_ASR_TARGET,
};
@@ -1845,7 +1853,38 @@ export function createWechatMpService({
}) => {
if (imagePolicy?.pageThumbnailMode !== WECHAT_PAGE_THUMBNAIL_MODE.REQUIRED_FRESH) return;
const images = collectWechatGeneratedImages(reply?.messages ?? []);
const verification = verifyFreshWechatPageThumbnails(artifacts, images);
let verification = verifyFreshWechatPageThumbnails(artifacts, images);
if (!verification.ok) {
logger.warn?.(
'WeChat MP fresh thumbnail verification failed:',
summarizeFreshWechatThumbnailVerification(verification, images),
);
if (config.repairFreshPageThumbnail) {
const repair = repairUnambiguousFreshWechatPageThumbnail({
artifacts,
images,
currentRunHtmlArtifacts: extractPublicHtmlWriteArtifacts(reply?.messages ?? [], {
publishDir,
}),
verificationReason: verification.reason,
});
if (repair.ok) {
verification = verifyFreshWechatPageThumbnails(artifacts, images);
logger.info?.('WeChat MP fresh thumbnail repaired:', {
relativePath: String(repair.artifact?.relativePath ?? ''),
jobId: String(repair.image?.jobId ?? ''),
cover: repair.cover,
verified: verification.ok,
});
} else {
logger.warn?.('WeChat MP fresh thumbnail repair skipped:', {
reason: repair.reason,
artifactCount: repair.artifactCount,
imageCount: repair.imageCount,
});
}
}
}
if (verification.ok) {
try {
for (const match of verification.matches) {
@@ -1857,8 +1896,11 @@ export function createWechatMpService({
}
return;
} catch (error) {
verification.ok = false;
verification.reason = `thumbnail_render_failed:${error instanceof Error ? error.message : String(error)}`;
verification = {
...verification,
ok: false,
reason: `thumbnail_render_failed:${error instanceof Error ? error.message : String(error)}`,
};
}
}
const text = buildPagePublishFailureText({ missingFreshThumbnail: true });